metrics-counter/main.go
2025-04-13 12:49:25 +03:00

63 lines
1.3 KiB
Go

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