From d06637667bc33c5f3b2f86277eb48ccfcfcccc43 Mon Sep 17 00:00:00 2001 From: Anders Swanson Date: Wed, 8 Oct 2025 11:26:03 -0700 Subject: [PATCH] Fix metrics cache Signed-off-by: Anders Swanson --- collector/cache.go | 8 ++++++-- collector/collector.go | 4 +++- collector/types.go | 2 +- site/docs/releases/changelog.md | 3 ++- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/collector/cache.go b/collector/cache.go index 226d05ca..74ca8f8e 100644 --- a/collector/cache.go +++ b/collector/cache.go @@ -13,7 +13,7 @@ func NewMetricsCache(metrics map[string]*Metric) *MetricsCache { for _, metric := range metrics { c[metric] = &MetricCacheRecord{ - PrometheusMetrics: map[string]prometheus.Metric{}, + PrometheusMetrics: nil, LastScraped: nil, } } @@ -36,7 +36,11 @@ func (c *MetricsCache) SendAll(ch chan<- prometheus.Metric, m *Metric) { } } +func (c *MetricsCache) Reset(m *Metric) { + c.cache[m].PrometheusMetrics = nil +} + func (c *MetricsCache) CacheAndSend(ch chan<- prometheus.Metric, m *Metric, metric prometheus.Metric) { - c.cache[m].PrometheusMetrics[metric.Desc().String()] = metric + c.cache[m].PrometheusMetrics = append(c.cache[m].PrometheusMetrics, metric) ch <- metric } diff --git a/collector/collector.go b/collector/collector.go index 5bb6b6ef..7bd70bfa 100644 --- a/collector/collector.go +++ b/collector/collector.go @@ -428,8 +428,9 @@ func (e *Exporter) scrapeGenericValues(d *Database, ch chan<- prometheus.Metric, // Build metric desc suffix := metricNameSuffix(row, metric, m.FieldToAppend) + fqname := prometheus.BuildFQName(namespace, m.Context, suffix) desc := prometheus.NewDesc( - prometheus.BuildFQName(namespace, m.Context, suffix), + fqname, metricHelp, m.GetLabels(), constLabels, @@ -467,6 +468,7 @@ func (e *Exporter) scrapeGenericValues(d *Database, ch chan<- prometheus.Metric, return nil } e.logger.Debug("Calling function GeneratePrometheusMetrics()") + d.MetricsCache.Reset(m) err := e.generatePrometheusMetrics(d, genericParser, m.Request, getQueryTimeout(e.logger, m, d)) e.logger.Debug("ScrapeGenericValues() - metricsCount: " + strconv.Itoa(metricsCount)) if err != nil { diff --git a/collector/types.go b/collector/types.go index b86f2259..af66a267 100644 --- a/collector/types.go +++ b/collector/types.go @@ -49,7 +49,7 @@ type MetricsCache struct { type MetricCacheRecord struct { // PrometheusMetrics stores cached prometheus metric values. // Used when custom scrape intervals are used, and the metric must be returned to the collector, but not scraped. - PrometheusMetrics map[string]prometheus.Metric + PrometheusMetrics []prometheus.Metric // LastScraped is the collector tick time when the metric was last computed. LastScraped *time.Time } diff --git a/site/docs/releases/changelog.md b/site/docs/releases/changelog.md index c699013f..4735bfad 100644 --- a/site/docs/releases/changelog.md +++ b/site/docs/releases/changelog.md @@ -12,7 +12,8 @@ List of upcoming and historic changes to the exporter. Our current priorities to support metrics for advanced database features and use cases, like Exadata, GoldenGate, and views included in the Oracle Diagnostics Pack. - Move `oracledb_dbtype` metric to the default metrics. You may now disable or override this metric like any other database metric. -- Document required database permissions for the exporter +- Document required database permissions for the exporter. +- Fix an issue where some metrics would not be cached when using a per-metric scrape interval with a global scrape interval. Thank you to the following people for their suggestions and contributions: - [@MansuyDavid](https://github.com/MansuyDavid)