diff --git a/pkg/labels.go b/pkg/labels.go index c6053719..749034bb 100644 --- a/pkg/labels.go +++ b/pkg/labels.go @@ -23,4 +23,5 @@ const ( MetricKeyOperation = "operation" MetricKeyQueue = "queue" MetricKeyResource = "resource" + MetricKeyVersion = "version" ) diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go index 7af68569..e6dace5b 100644 --- a/pkg/metrics/metrics.go +++ b/pkg/metrics/metrics.go @@ -45,6 +45,8 @@ var ( ModulesAbsentResourcesTotal = "{PREFIX}modules_absent_resources_total" // ModuleInfoMetricName tracks module information ModuleInfoMetricName = "{PREFIX}mm_module_info" + // ModuleVersionEnabledMetricName tracks enabled modules with their deployed version + ModuleVersionEnabledMetricName = "{PREFIX}mm_module_enabled" // ModuleMaintenanceMetricName tracks module maintenance state ModuleMaintenanceMetricName = "{PREFIX}mm_module_maintenance" @@ -152,6 +154,7 @@ func InitMetrics(prefix string) { ModulesHelmReleaseRedeployedTotal = ReplacePrefix(ModulesHelmReleaseRedeployedTotal, prefix) ModulesAbsentResourcesTotal = ReplacePrefix(ModulesAbsentResourcesTotal, prefix) ModuleInfoMetricName = ReplacePrefix(ModuleInfoMetricName, prefix) + ModuleVersionEnabledMetricName = ReplacePrefix(ModuleVersionEnabledMetricName, prefix) ModuleMaintenanceMetricName = ReplacePrefix(ModuleMaintenanceMetricName, prefix) // ============================================================================ diff --git a/pkg/module_manager/models/modules/basic.go b/pkg/module_manager/models/modules/basic.go index 5cbbfcf0..b5a1ca98 100644 --- a/pkg/module_manager/models/modules/basic.go +++ b/pkg/module_manager/models/modules/basic.go @@ -55,6 +55,8 @@ type BasicModule struct { // required Path string + version string + critical bool crdsExist bool @@ -121,6 +123,14 @@ func (bm *BasicModule) SetCritical(value bool) { bm.critical = value } +func (bm *BasicModule) SetVersion(v string) { + bm.version = v +} + +func (bm *BasicModule) GetVersion() string { + return bm.version +} + // getCRDsFromPath scan path/crds directory and store yaml file in slice // if file name do not start with `_` or `doc-` prefix func getCRDsFromPath(path string, crdsFilters string) []string { diff --git a/pkg/module_manager/module_manager.go b/pkg/module_manager/module_manager.go index f294dbb2..ae69a729 100644 --- a/pkg/module_manager/module_manager.go +++ b/pkg/module_manager/module_manager.go @@ -54,6 +54,8 @@ var ( moduleInfoMetricGroup = "mm_module_info" moduleInfoMetricName = metrics.ModuleInfoMetricName + moduleVersionEnabledMetricGroup = "mm_module_enabled" + moduleMaintenanceMetricGroup = "mm_module_maintenance" moduleMaintenanceMetricName = metrics.ModuleMaintenanceMetricName @@ -205,6 +207,26 @@ func (mm *ModuleManager) SetModuleLoader(ld loader.ModuleLoader) { mm.moduleLoader = ld } +// RefreshModuleTelemetry expires and re-populates the mm_module_enabled +// metric group. For each enabled module with a known version, a gauge of 1 +// is emitted with module name and version labels. +func (mm *ModuleManager) RefreshModuleTelemetry() { + mm.dependencies.MetricStorage.Grouped().ExpireGroupMetrics(moduleVersionEnabledMetricGroup) + for _, name := range mm.GetModuleNames() { + if !mm.IsModuleEnabled(name) { + continue + } + mod := mm.GetModule(name) + if mod == nil || mod.GetVersion() == "" { + continue + } + mm.dependencies.MetricStorage.Grouped().GaugeSet(moduleVersionEnabledMetricGroup, metrics.ModuleVersionEnabledMetricName, 1, map[string]string{ + pkg.MetricKeyModule: name, + pkg.MetricKeyVersion: mod.GetVersion(), + }) + } +} + // GetDependencies fetch dependencies struct from ModuleManager // note: not the best way but it's required in some hooks func (mm *ModuleManager) GetDependencies() *ModuleManagerDependencies { @@ -504,8 +526,13 @@ func (mm *ModuleManager) UpdateModulesMetrics() { if mm.IsModuleEnabled(module) { enabled = "true" } - mm.dependencies.MetricStorage.Grouped().GaugeSet(moduleInfoMetricGroup, moduleInfoMetricName, 1, map[string]string{pkg.MetricKeyModule: module, "enabled": enabled}) + version := "" + if mod := mm.GetModule(module); mod != nil { + version = mod.GetVersion() + } + mm.dependencies.MetricStorage.Grouped().GaugeSet(moduleInfoMetricGroup, moduleInfoMetricName, 1, map[string]string{pkg.MetricKeyModule: module, "enabled": enabled, pkg.MetricKeyVersion: version}) } + mm.RefreshModuleTelemetry() } func (mm *ModuleManager) SetModuleMaintenanceState(moduleName string, state utils.Maintenance) {