Skip to content

Commit 398365d

Browse files
fix(gcp_exporter): preserve colons in extra_filters filter expressions (#5018)
Co-authored-by: Kyle Eckhart <kgeckhart@users.noreply.github.com>
1 parent 416aebb commit 398365d

File tree

3 files changed

+20
-6
lines changed

3 files changed

+20
-6
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ Main (unreleased)
7777

7878
- Fix default values for relabel rules, this caused issues in e.g. `prometheus.operator.servicemonitors` when using labeldrop. (@kalleep)
7979

80+
- 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)
81+
8082
v1.12.0
8183
-----------------
8284

internal/static/integrations/gcp_exporter/gcp_exporter.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import (
1616
"github.com/grafana/dskit/multierror"
1717
"github.com/prometheus-community/stackdriver_exporter/collectors"
1818
"github.com/prometheus-community/stackdriver_exporter/delta"
19-
"github.com/prometheus-community/stackdriver_exporter/utils"
2019
"github.com/prometheus/client_golang/prometheus"
2120
"golang.org/x/oauth2/google"
2221
"google.golang.org/api/monitoring/v3"
@@ -165,7 +164,7 @@ func (c *Config) Validate() error {
165164
if len(c.ExtraFilters) > 0 {
166165
filterPrefixToFilter := map[string][]string{}
167166
for _, filter := range c.ExtraFilters {
168-
splitFilter := strings.Split(filter, ":")
167+
splitFilter := strings.SplitN(filter, ":", 2)
169168
if len(splitFilter) <= 1 {
170169
configErrors.Add(fmt.Errorf("%s is an invalid filter a filter must be of the form <metric_type>:<filter_expression>", filter))
171170
continue
@@ -222,11 +221,11 @@ func createMonitoringService(ctx context.Context, httpTimeout time.Duration) (*m
222221
func parseMetricExtraFilters(filters []string) []collectors.MetricFilter {
223222
var extraFilters []collectors.MetricFilter
224223
for _, ef := range filters {
225-
efPrefix, efModifier := utils.SplitExtraFilter(ef, ":")
226-
if efPrefix != "" {
224+
splitFilter := strings.SplitN(ef, ":", 2)
225+
if len(splitFilter) == 2 && splitFilter[0] != "" {
227226
extraFilter := collectors.MetricFilter{
228-
TargetedMetricPrefix: efPrefix,
229-
FilterQuery: efModifier,
227+
TargetedMetricPrefix: splitFilter[0],
228+
FilterQuery: splitFilter[1],
230229
}
231230
extraFilters = append(extraFilters, extraFilter)
232231
}

internal/static/integrations/gcp_exporter/gcp_exporter_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,19 @@ func TestConfig_Validate(t *testing.T) {
115115
},
116116
shouldError: false,
117117
},
118+
{
119+
name: "extra filter with colon in filter expression",
120+
configModifier: func(config gcp_exporter.Config) gcp_exporter.Config {
121+
config.MetricPrefixes = []string{
122+
"cloudsql.googleapis.com/database/cpu",
123+
}
124+
config.ExtraFilters = []string{
125+
`cloudsql.googleapis.com/database/cpu:resource.labels.database_id="project_id:database_name"`,
126+
}
127+
return config
128+
},
129+
shouldError: false,
130+
},
118131
}
119132
for _, tt := range tests {
120133
testName := tt.name

0 commit comments

Comments
 (0)