package rushlink import ( "log" "net/http" "time" "gitea.hashru.nl/dsprenkels/rushlink/internal/db" "github.com/gorilla/mux" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" bolt "go.etcd.io/bbolt" ) func StartMetricsServer(addr string, db *db.Database) { var ( _ = promauto.NewGaugeFunc(prometheus.GaugeOpts{ Namespace: "rushlink", Subsystem: "pastes", Name: "urls_total", Help: "The current amount of pastes in the database.", }, func() float64 { var metric float64 if err := db.Bolt.View(func(tx *bolt.Tx) error { bucket := tx.Bucket([]byte("pastes")) if bucket == nil { return errors.New("bucket 'pastes' could not be found") } metric = float64(bucket.Stats().KeyN) return nil }); err != nil { log.Printf("error: %v", errors.Wrap(err, "fetching pastes_total metric")) return 0 } return metric }) ) router := mux.NewRouter() router.Handle("/metrics", promhttp.Handler()).Methods("GET") srv := &http.Server{ Handler: router, Addr: addr, WriteTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second, } log.Fatal(srv.ListenAndServe()) }