74 lines
1.5 KiB
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
|
|
}
|
|
|