frostfs-s3-lifecycler/internal/metrics/metrics.go
Denis Kirillov 8b6d93c94d
All checks were successful
/ DCO (pull_request) Successful in 48s
/ Builds (pull_request) Successful in 1m19s
/ Vulncheck (pull_request) Successful in 1m20s
/ Lint (pull_request) Successful in 1m40s
/ Tests (pull_request) Successful in 1m20s
[#20] Add metric to see number of dropped logs
Add new metric frostfs_s3_lifecycler_statistic_dropped_logs
Also, configuration sampling interval is added

Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
2024-09-24 17:47:03 +03:00

104 lines
2.2 KiB
Go

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
statisticMetrics
}
// stateMetrics are metrics of application state.
stateMetrics struct {
healthCheck prometheus.Gauge
versionInfo *prometheus.GaugeVec
}
statisticMetrics struct {
droppedLogs prometheus.Counter
}
)
const (
namespace = "frostfs_s3_lifecycler"
stateSubsystem = "state"
healthMetric = "health"
versionInfoMetric = "version_info"
statisticSubsystem = "statistic"
droppedLogs = "dropped_logs"
)
func (m stateMetrics) register() {
prometheus.MustRegister(m.healthCheck)
prometheus.MustRegister(m.versionInfo)
}
func (m stateMetrics) SetHealth(s int32) {
m.healthCheck.Set(float64(s))
}
func (m stateMetrics) SetVersion(ver string) {
m.versionInfo.WithLabelValues(ver).Set(1)
}
func (m statisticMetrics) register() {
prometheus.MustRegister(m.droppedLogs)
}
func (m statisticMetrics) DroppedLogsInc() {
m.droppedLogs.Inc()
}
// NewAppMetrics creates an instance of application.
func NewAppMetrics() *AppMetrics {
stateMetric := newStateMetrics()
stateMetric.register()
statisticMetric := newStatisticMetrics()
statisticMetric.register()
return &AppMetrics{
stateMetrics: *stateMetric,
statisticMetrics: *statisticMetric,
}
}
func newStateMetrics() *stateMetrics {
return &stateMetrics{
healthCheck: mustNewGauge(appMetricsDesc[stateSubsystem][healthMetric]),
versionInfo: mustNewGaugeVec(appMetricsDesc[stateSubsystem][versionInfoMetric]),
}
}
func newStatisticMetrics() *statisticMetrics {
return &statisticMetrics{
droppedLogs: mustNewCounter(appMetricsDesc[statisticSubsystem][droppedLogs]),
}
}
// 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")),
}
}