frostfs-s3-lifecycler/internal/metrics/metrics.go

77 lines
1.6 KiB
Go
Raw Permalink Normal View History

package metrics
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"go.uber.org/zap"
)
type (
// AppMetrics is a metrics container for all app specific data.
AppMetrics struct {
stateMetrics
}
// stateMetrics are metrics of application state.
stateMetrics struct {
healthCheck prometheus.Gauge
versionInfo *prometheus.GaugeVec
}
)
const (
namespace = "frostfs_s3_lifecycler"
stateSubsystem = "state"
healthMetric = "health"
versionInfoMetric = "version_info"
)
func (m stateMetrics) register() {
prometheus.MustRegister(m.healthCheck)
}
func (m stateMetrics) SetHealth(s int32) {
m.healthCheck.Set(float64(s))
}
func (m stateMetrics) SetVersion(ver string) {
m.versionInfo.WithLabelValues(ver).Set(1)
}
// NewAppMetrics creates an instance of application.
func NewAppMetrics() *AppMetrics {
stateMetric := newStateMetrics()
stateMetric.register()
return &AppMetrics{
stateMetrics: *stateMetric,
}
}
func newStateMetrics() *stateMetrics {
return &stateMetrics{
healthCheck: mustNewGauge(appMetricsDesc[stateSubsystem][healthMetric]),
versionInfo: mustNewGaugeVec(appMetricsDesc[stateSubsystem][versionInfoMetric]),
}
}
// NewPrometheusService creates a new service for gathering prometheus metrics.
func NewPrometheusService(log *zap.Logger, cfg Config) *Service {
if log == nil {
return nil
}
return &Service{
Server: &http.Server{
Addr: cfg.Address,
Handler: promhttp.Handler(),
},
enabled: cfg.Enabled,
serviceType: "Prometheus",
log: log.With(zap.String("service", "Prometheus")),
}
}