package main import ( "log" "net/http" "os" "os/signal" "sync/atomic" "syscall" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) var ( counter = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "custom_counter_total", Help: "A counter that increments every 30 seconds", }, []string{}, ) counterValue uint64 ) func main() { // Register Prometheus metrics prometheus.MustRegister(counter) // Start background counter incrementer go incrementCounterEvery30s() // Set up HTTP server http.Handle("/metrics", promhttp.Handler()) server := &http.Server{Addr: ":8080"} // Handle graceful shutdown stop := make(chan os.Signal, 1) signal.Notify(stop, os.Interrupt, syscall.SIGTERM) go func() { log.Println("Starting server on :8080") if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("Server error: %v", err) } }() <-stop log.Println("\nShutting down server...") } func incrementCounterEvery30s() { ticker := time.NewTicker(30 * time.Second) defer ticker.Stop() for range ticker.C { newVal := atomic.AddUint64(&counterValue, 1) counter.WithLabelValues().Add(1) log.Printf("Counter incremented to %d", newVal) } }