Files
explorer-monorepo/backend/metrics/collector.go

74 lines
1.5 KiB
Go

package metrics
import (
"context"
"fmt"
"time"
)
// Collector collects and exposes metrics
type Collector struct {
metrics map[string]Metric
}
// NewCollector creates a new metrics collector
func NewCollector() *Collector {
return &Collector{
metrics: make(map[string]Metric),
}
}
// Metric represents a metric
type Metric struct {
Name string
Value float64
Type string // "counter", "gauge", "histogram"
Labels map[string]string
Timestamp time.Time
}
// IncrementCounter increments a counter metric
func (c *Collector) IncrementCounter(ctx context.Context, name string, labels map[string]string) {
key := c.metricKey(name, labels)
if metric, ok := c.metrics[key]; ok {
metric.Value++
metric.Timestamp = time.Now()
c.metrics[key] = metric
} else {
c.metrics[key] = Metric{
Name: name,
Value: 1,
Type: "counter",
Labels: labels,
Timestamp: time.Now(),
}
}
}
// SetGauge sets a gauge metric
func (c *Collector) SetGauge(ctx context.Context, name string, value float64, labels map[string]string) {
key := c.metricKey(name, labels)
c.metrics[key] = Metric{
Name: name,
Value: value,
Type: "gauge",
Labels: labels,
Timestamp: time.Now(),
}
}
// GetMetrics gets all metrics
func (c *Collector) GetMetrics() map[string]Metric {
return c.metrics
}
// metricKey creates a key for a metric
func (c *Collector) metricKey(name string, labels map[string]string) string {
key := name
for k, v := range labels {
key += fmt.Sprintf(":%s=%s", k, v)
}
return key
}