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)