metrics-counter/main.go
2025-04-13 14:58:05 +03:00

64 lines
1.3 KiB
Go

package main
import (
"context"
"log"
"math/rand"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var counter = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "random_counter_total",
Help: "A counter that increments randomly from 1 to 30 seconds",
},
[]string{},
)
func main() {
// Register Prometheus metrics
prometheus.MustRegister(counter)
// Set up HTTP server
http.Handle("/metrics", promhttp.Handler())
server := &http.Server{Addr: ":8080"}
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stop()
go startCounting(ctx)
go func() {
log.Println("Starting server on :8080")
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("Server error: %v", err)
}
}()
<-ctx.Done()
log.Println("Shutdown the server")
// Give one more second for gracefully shutdown
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
server.Shutdown(ctx)
}
func startCounting(ctx context.Context) {
for {
select {
case <-ctx.Done():
return
default:
counter.WithLabelValues().Add(1)
sleepDuration := time.Duration(rand.Intn(29) + 1)
time.Sleep(sleepDuration * time.Second)
}
}
}