From 4509c9e5a6ba71a83c21223d7a0811176cac8685 Mon Sep 17 00:00:00 2001 From: Kevin Petremann Date: Thu, 21 Sep 2023 09:29:44 +0200 Subject: [PATCH 1/3] feat(metrics): add build duration metrics --- internal/job/job.go | 9 ++++++- internal/metrics/registry.go | 50 +++++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/internal/job/job.go b/internal/job/job.go index 1687ea3..46cc279 100644 --- a/internal/job/job.go +++ b/internal/job/job.go @@ -157,8 +157,10 @@ func StartBuildLoop(deviceRepo router.DevicesRepository, reports *report.Reposit reports.Watch(reportCh) }() + // Start the build reports.UpdateStatus(report.InProgress) - if devs, stats, err := RunBuild(reportCh); err != nil { + devs, stats, err := RunBuild(reportCh) + if err != nil { metricsRegistry.BuildFailed() reports.UpdateStatus(report.Failed) @@ -178,6 +180,11 @@ func StartBuildLoop(deviceRepo router.DevicesRepository, reports *report.Reposit log.Info().Msg("build successful") } + metricsRegistry.SetBuildDataFetchingDuration(stats.Performance.DataFetchingDuration.Seconds()) + metricsRegistry.SetBuildPrecomputeDuration(stats.Performance.PrecomputeDuration.Seconds()) + metricsRegistry.SetBuildComputeDuration(stats.Performance.ComputeDuration.Seconds()) + metricsRegistry.SetBuildTotalDuration(stats.Performance.BuildDuration.Seconds()) + reports.MarkAsComplete() close(reportCh) wg.Wait() diff --git a/internal/metrics/registry.go b/internal/metrics/registry.go index 3dc0102..f1ce46a 100644 --- a/internal/metrics/registry.go +++ b/internal/metrics/registry.go @@ -11,6 +11,11 @@ type Registry struct { BuiltDevicesNumber *prometheus.GaugeVec lastBuildStatus *prometheus.GaugeVec buildTotal *prometheus.CounterVec + + buildTotalDuration prometheus.Gauge + buildDataFetchingDuration prometheus.Gauge + buildPrecomputeDuration prometheus.Gauge + buildComputeDuration prometheus.Gauge } func NewRegistry() Registry { @@ -40,7 +45,6 @@ func NewRegistry() Registry { }, []string{}, ), - buildTotal: promauto.NewCounterVec( prometheus.CounterOpts{ Name: "completed_build_total", @@ -48,6 +52,30 @@ func NewRegistry() Registry { }, []string{"success"}, ), + buildTotalDuration: promauto.NewGauge( + prometheus.GaugeOpts{ + Name: "build_total_duration_seconds", + Help: "Total duration of the build", + }, + ), + buildDataFetchingDuration: promauto.NewGauge( + prometheus.GaugeOpts{ + Name: "build_data_fetching_duration_seconds", + Help: "Duration of the data fetching step", + }, + ), + buildPrecomputeDuration: promauto.NewGauge( + prometheus.GaugeOpts{ + Name: "build_precompute_duration_seconds", + Help: "Duration of the precompute step", + }, + ), + buildComputeDuration: promauto.NewGauge( + prometheus.GaugeOpts{ + Name: "build_compute_duration_seconds", + Help: "Duration of the compute step", + }, + ), } } @@ -73,3 +101,23 @@ func (r *Registry) BuildFailed() { func (r *Registry) SetBuiltDevices(count uint32) { r.BuiltDevicesNumber.WithLabelValues().Set(float64(count)) } + +// SetBuildTotalDuration updates the `build_total_duration_seconds` gauge. +func (r *Registry) SetBuildTotalDuration(duration float64) { + r.buildTotalDuration.Set(duration) +} + +// SetBuildDataFetchingDuration updates the `build_data_fetching_duration_seconds` gauge. +func (r *Registry) SetBuildDataFetchingDuration(duration float64) { + r.buildDataFetchingDuration.Set(duration) +} + +// SetBuildPrecomputeDuration updates the `build_precompute_duration_seconds` gauge. +func (r *Registry) SetBuildPrecomputeDuration(duration float64) { + r.buildPrecomputeDuration.Set(duration) +} + +// SetBuildComputeDuration updates the `build_compute_duration_seconds` gauge. +func (r *Registry) SetBuildComputeDuration(duration float64) { + r.buildComputeDuration.Set(duration) +} From 07900f414b75b2bc1b1cee2831c330fb44b2b42e Mon Sep 17 00:00:00 2001 From: Kevin Petremann Date: Thu, 21 Sep 2023 09:42:42 +0200 Subject: [PATCH 2/3] refactor(metrics): simple gauge when no labels There is no need to use GaugeVec when there is no label. --- internal/metrics/registry.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/internal/metrics/registry.go b/internal/metrics/registry.go index f1ce46a..fe4b95e 100644 --- a/internal/metrics/registry.go +++ b/internal/metrics/registry.go @@ -8,9 +8,9 @@ import ( type Registry struct { AppInfo *prometheus.GaugeVec - BuiltDevicesNumber *prometheus.GaugeVec - lastBuildStatus *prometheus.GaugeVec buildTotal *prometheus.CounterVec + BuiltDevicesNumber prometheus.Gauge + lastBuildStatus prometheus.Gauge buildTotalDuration prometheus.Gauge buildDataFetchingDuration prometheus.Gauge @@ -30,20 +30,18 @@ func NewRegistry() Registry { return Registry{ AppInfo: appInfo, - BuiltDevicesNumber: promauto.NewGaugeVec( + BuiltDevicesNumber: promauto.NewGauge( prometheus.GaugeOpts{ Name: "built_devices_number", Help: "Number of devices built during last successful build", }, - []string{}, ), - lastBuildStatus: promauto.NewGaugeVec( + lastBuildStatus: promauto.NewGauge( prometheus.GaugeOpts{ Name: "build_status", Help: "Last completed build status, 0=Failed, 1=Success", }, - []string{}, ), buildTotal: promauto.NewCounterVec( prometheus.CounterOpts{ @@ -84,7 +82,7 @@ func NewRegistry() Registry { // `build_status` counter is set to 1. // `completed_build_total` increases with success label set to true. func (r *Registry) BuildSuccessful() { - r.lastBuildStatus.WithLabelValues().Set(1) + r.lastBuildStatus.Set(1) r.buildTotal.WithLabelValues("true").Inc() } @@ -93,13 +91,13 @@ func (r *Registry) BuildSuccessful() { // `build_status` counter is set to 0. // `completed_build_total` increases with success label set to false. func (r *Registry) BuildFailed() { - r.lastBuildStatus.WithLabelValues().Set(0) + r.lastBuildStatus.Set(0) r.buildTotal.WithLabelValues("false").Inc() } // SetBuiltDevices updates the `built_devices` gauge. func (r *Registry) SetBuiltDevices(count uint32) { - r.BuiltDevicesNumber.WithLabelValues().Set(float64(count)) + r.BuiltDevicesNumber.Set(float64(count)) } // SetBuildTotalDuration updates the `build_total_duration_seconds` gauge. From 26fc84cae92f488ee02a7dd44ab0312c8afb2ea9 Mon Sep 17 00:00:00 2001 From: Kevin Petremann Date: Thu, 21 Sep 2023 09:43:41 +0200 Subject: [PATCH 3/3] refactor(metrics): registry.appInfo is now private --- internal/metrics/registry.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/metrics/registry.go b/internal/metrics/registry.go index fe4b95e..124f6fa 100644 --- a/internal/metrics/registry.go +++ b/internal/metrics/registry.go @@ -7,7 +7,7 @@ import ( ) type Registry struct { - AppInfo *prometheus.GaugeVec + appInfo *prometheus.GaugeVec buildTotal *prometheus.CounterVec BuiltDevicesNumber prometheus.Gauge lastBuildStatus prometheus.Gauge @@ -29,7 +29,7 @@ func NewRegistry() Registry { appInfo.WithLabelValues(app.Info.Version, app.Info.Commit, app.Info.BuildTime, app.Info.BuildUser).Set(1) return Registry{ - AppInfo: appInfo, + appInfo: appInfo, BuiltDevicesNumber: promauto.NewGauge( prometheus.GaugeOpts{ Name: "built_devices_number",