From 08b9afceca181250a02d7ad0f23fac481c074e6a Mon Sep 17 00:00:00 2001 From: Kim-Yukyung Date: Sat, 6 Dec 2025 01:33:31 +0900 Subject: [PATCH] fix(gcp_exporter): preserve colons in extra_filters filter expressions --- CHANGELOG.md | 2 ++ .../integrations/gcp_exporter/gcp_exporter.go | 11 +++++------ .../integrations/gcp_exporter/gcp_exporter_test.go | 13 +++++++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 464c60f857..d0763f34de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,8 @@ Main (unreleased) - Fix the `prometheus.operator.*` components internal scrape manager now having a way to enable ingesting native histograms. (@dehaansa) +- Fix an issue in the `prometheus.exporter.gcp` component where colons inside `extra_filters` were incorrectly removed. Filter expressions such as `database_id="project_id:database_name"` are now preserved as expected (@Kim-Yukyung) + v1.12.0 ----------------- diff --git a/internal/static/integrations/gcp_exporter/gcp_exporter.go b/internal/static/integrations/gcp_exporter/gcp_exporter.go index ceed8d1644..89f169295b 100644 --- a/internal/static/integrations/gcp_exporter/gcp_exporter.go +++ b/internal/static/integrations/gcp_exporter/gcp_exporter.go @@ -16,7 +16,6 @@ import ( "github.com/grafana/dskit/multierror" "github.com/prometheus-community/stackdriver_exporter/collectors" "github.com/prometheus-community/stackdriver_exporter/delta" - "github.com/prometheus-community/stackdriver_exporter/utils" "github.com/prometheus/client_golang/prometheus" "golang.org/x/oauth2/google" "google.golang.org/api/monitoring/v3" @@ -165,7 +164,7 @@ func (c *Config) Validate() error { if len(c.ExtraFilters) > 0 { filterPrefixToFilter := map[string][]string{} for _, filter := range c.ExtraFilters { - splitFilter := strings.Split(filter, ":") + splitFilter := strings.SplitN(filter, ":", 2) if len(splitFilter) <= 1 { configErrors.Add(fmt.Errorf("%s is an invalid filter a filter must be of the form :", filter)) continue @@ -222,11 +221,11 @@ func createMonitoringService(ctx context.Context, httpTimeout time.Duration) (*m func parseMetricExtraFilters(filters []string) []collectors.MetricFilter { var extraFilters []collectors.MetricFilter for _, ef := range filters { - efPrefix, efModifier := utils.SplitExtraFilter(ef, ":") - if efPrefix != "" { + splitFilter := strings.SplitN(ef, ":", 2) + if len(splitFilter) == 2 && splitFilter[0] != "" { extraFilter := collectors.MetricFilter{ - TargetedMetricPrefix: efPrefix, - FilterQuery: efModifier, + TargetedMetricPrefix: splitFilter[0], + FilterQuery: splitFilter[1], } extraFilters = append(extraFilters, extraFilter) } diff --git a/internal/static/integrations/gcp_exporter/gcp_exporter_test.go b/internal/static/integrations/gcp_exporter/gcp_exporter_test.go index ff3dfbb2c7..5f2c241cde 100644 --- a/internal/static/integrations/gcp_exporter/gcp_exporter_test.go +++ b/internal/static/integrations/gcp_exporter/gcp_exporter_test.go @@ -115,6 +115,19 @@ func TestConfig_Validate(t *testing.T) { }, shouldError: false, }, + { + name: "extra filter with colon in filter expression", + configModifier: func(config gcp_exporter.Config) gcp_exporter.Config { + config.MetricPrefixes = []string{ + "cloudsql.googleapis.com/database/cpu", + } + config.ExtraFilters = []string{ + `cloudsql.googleapis.com/database/cpu:resource.labels.database_id="project_id:database_name"`, + } + return config + }, + shouldError: false, + }, } for _, tt := range tests { testName := tt.name