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) } } }