package logger import ( "strconv" "git.frostfs.info/TrueCloudLab/frostfs-observability/metrics" "github.com/prometheus/client_golang/prometheus" "go.uber.org/zap/zapcore" ) const ( logSubsystem = "logger" logLevelLabel = "level" logDroppedLabel = "dropped" ) type LogMetrics interface { Inc(level zapcore.Level, dropped bool) GetSamplingHook() func(e zapcore.Entry, sd zapcore.SamplingDecision) } type logMetrics struct { logCount *prometheus.CounterVec } func NewLogMetrics(namespace string) LogMetrics { return &logMetrics{ logCount: metrics.NewCounterVec(prometheus.CounterOpts{ Namespace: namespace, Subsystem: logSubsystem, Name: "entry_count", Help: "Total log entries emitted or dropped by severity level", }, []string{logLevelLabel, logDroppedLabel}), } } func (m *logMetrics) Inc(level zapcore.Level, dropped bool) { m.logCount.With(prometheus.Labels{ logLevelLabel: level.String(), logDroppedLabel: strconv.FormatBool(dropped), }).Inc() } func (m *logMetrics) GetSamplingHook() func(zapcore.Entry, zapcore.SamplingDecision) { return func(e zapcore.Entry, sd zapcore.SamplingDecision) { m.Inc(e.Level, sd == zapcore.LogDropped) } }