Files
grafana/pkg/registry/apis/provisioning/webhooks/pullrequest/metrics.go
T
2025-09-22 16:53:50 -05:00

98 lines
2.8 KiB
Go

package pullrequest
import (
"sync"
"time"
"github.com/prometheus/client_golang/prometheus"
)
var (
pullRequestMetricsOnce sync.Once
pullRequestMetricsInstance pullRequestMetrics
)
type pullRequestMetrics struct {
registry prometheus.Registerer
processingDuration *prometheus.HistogramVec
commentsPosted *prometheus.CounterVec
}
func registerPullRequestMetrics(registry prometheus.Registerer) pullRequestMetrics {
// called by both ProvidePullRequestWorker and ProvideWebhooksWithImages
// this ensures we only register the metric once
pullRequestMetricsOnce.Do(func() {
processingDuration := prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "grafana_provisioning_pullrequest_processing_duration_seconds",
Help: "Duration of pull request processing",
Buckets: []float64{0.5, 1.0, 2.0, 5.0, 10.0, 30.0},
},
[]string{"outcome"},
)
registry.MustRegister(processingDuration)
commentsPosted := prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "grafana_provisioning_pullrequest_comments_posted_total",
Help: "Total number of comments posted to pull requests",
},
[]string{"outcome"},
)
registry.MustRegister(commentsPosted)
pullRequestMetricsInstance = pullRequestMetrics{
registry: registry,
processingDuration: processingDuration,
commentsPosted: commentsPosted,
}
})
return pullRequestMetricsInstance
}
func (m *pullRequestMetrics) recordProcessed(outcome string, duration time.Duration) {
m.processingDuration.WithLabelValues(outcome).Observe(duration.Seconds())
}
func (m *pullRequestMetrics) recordCommentPosted(outcome string) {
m.commentsPosted.WithLabelValues(outcome).Inc()
}
type screenshotMetrics struct {
registry prometheus.Registerer
screenshotDuration *prometheus.HistogramVec
}
var (
screenshotMetricsOnce sync.Once
screenshotMetricsInstance screenshotMetrics
)
func registerScreenshotMetrics(registry prometheus.Registerer) screenshotMetrics {
// called by both ProvidePullRequestWorker and ProvideWebhooksWithImages
// this ensures we only register the metric once
screenshotMetricsOnce.Do(func() {
screenshotDuration := prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "grafana_provisioning_pullrequest_screenshot_duration_seconds",
Help: "Duration of screenshot generation",
Buckets: []float64{1.0, 2.0, 5.0, 10.0, 30.0, 60.0},
},
[]string{"outcome"},
)
registry.MustRegister(screenshotDuration)
screenshotMetricsInstance = screenshotMetrics{
registry: registry,
screenshotDuration: screenshotDuration,
}
})
return screenshotMetricsInstance
}
func (m *screenshotMetrics) recordScreenshotDuration(outcome string, duration time.Duration) {
m.screenshotDuration.WithLabelValues(outcome).Observe(duration.Seconds())
}