67 lines
2.2 KiB
Go
67 lines
2.2 KiB
Go
package iam
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/grafana/grafana/pkg/infra/log"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
)
|
|
|
|
const (
|
|
metricsNamespace = "iam"
|
|
metricsSubSystem = "apiserver"
|
|
)
|
|
|
|
var (
|
|
registerOnce sync.Once
|
|
hooksWaitHistogram = prometheus.NewHistogramVec(prometheus.HistogramOpts{
|
|
Namespace: metricsNamespace,
|
|
Subsystem: metricsSubSystem,
|
|
Name: "hooks_wait_duration_seconds",
|
|
Help: "Time spent in the hooks waiting for a ticket to start processing",
|
|
Buckets: prometheus.ExponentialBuckets(0.001, 2, 5), // 1ms to ~16s
|
|
}, []string{"resource_type", "operation"})
|
|
|
|
// hooksDurationHistogram tracks the total duration of hook operations
|
|
hooksDurationHistogram = prometheus.NewHistogramVec(prometheus.HistogramOpts{
|
|
Namespace: metricsNamespace,
|
|
Subsystem: metricsSubSystem,
|
|
Name: "hooks_operation_duration_seconds",
|
|
Help: "Time spent executing hook operations (create, update, delete)",
|
|
Buckets: prometheus.ExponentialBuckets(0.001, 2, 10), // 1ms to ~1s
|
|
}, []string{"resource_type", "operation", "status"})
|
|
|
|
// hooksOperationCounter tracks the number of hook operations
|
|
hooksOperationCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
|
|
Namespace: metricsNamespace,
|
|
Subsystem: metricsSubSystem,
|
|
Name: "hooks_operations_total",
|
|
Help: "Total number of hook operations by resource type, operation, and status",
|
|
}, []string{"resource_type", "operation", "status"})
|
|
|
|
// hooksTuplesCounter tracks the number of tuples written/deleted
|
|
hooksTuplesCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
|
|
Namespace: metricsNamespace,
|
|
Subsystem: metricsSubSystem,
|
|
Name: "hooks_tuples_total",
|
|
Help: "Total number of tuples written or deleted by resource type and operation type",
|
|
}, []string{"resource_type", "operation", "action"})
|
|
)
|
|
|
|
func registerMetrics(reg prometheus.Registerer) {
|
|
registerOnce.Do(func() {
|
|
metrics := []prometheus.Collector{
|
|
hooksWaitHistogram,
|
|
hooksDurationHistogram,
|
|
hooksOperationCounter,
|
|
hooksTuplesCounter,
|
|
}
|
|
|
|
for _, metric := range metrics {
|
|
if err := reg.Register(metric); err != nil {
|
|
log.New("iam.apis").Warn("failed to register iam apiserver metrics", "error", err)
|
|
}
|
|
}
|
|
})
|
|
}
|