Skip to content

Commit

Permalink
feat(inputs.stackdriver): allow filtering by resource metadata labels
Browse files Browse the repository at this point in the history
  • Loading branch information
redbaron committed Dec 12, 2022
1 parent c3562ae commit b1fdc11
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 3 deletions.
16 changes: 15 additions & 1 deletion plugins/inputs/stackdriver/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,11 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
##
## The logical operators when combining filters are defined statically using
## the following values:
## filter ::= <resource_labels> {AND <metric_labels>}
## filter ::= <resource_labels> {AND <metric_labels> AND <user_labels> AND <system_labels>}
## resource_labels ::= <resource_labels> {OR <resource_label>}
## metric_labels ::= <metric_labels> {OR <metric_label>}
## user_labels ::= <user_labels> {OR <user_label>}
## system_labels ::= <system_labels> {OR <system_label>}
##
## For more details, see https://cloud.google.com/monitoring/api/v3/filters
#
Expand All @@ -96,6 +98,18 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
# [[inputs.stackdriver.filter.metric_labels]]
# key = "device_name"
# value = 'one_of("sda", "sdb")'
#
## User labels refine the time series selection with the following expression:
## metadata.user_labels."<key>" = <value>
# [[inputs.stackdriver.filter.user_labels]]
# key = "environment"
# value = 'one_of("prod", "staging")'
#
## User labels refine the time series selection with the following expression:
## metadata.system_labels."<key>" = <value>
# [[inputs.stackdriver.filter.system_labels]]
# key = "machine_type"
# value = 'starts_with("e2-")'
```

### Authentication
Expand Down
16 changes: 15 additions & 1 deletion plugins/inputs/stackdriver/sample.conf
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,11 @@
##
## The logical operators when combining filters are defined statically using
## the following values:
## filter ::= <resource_labels> {AND <metric_labels>}
## filter ::= <resource_labels> {AND <metric_labels> AND <user_labels> AND <system_labels>}
## resource_labels ::= <resource_labels> {OR <resource_label>}
## metric_labels ::= <metric_labels> {OR <metric_label>}
## user_labels ::= <user_labels> {OR <user_label>}
## system_labels ::= <system_labels> {OR <system_label>}
##
## For more details, see https://cloud.google.com/monitoring/api/v3/filters
#
Expand All @@ -76,3 +78,15 @@
# [[inputs.stackdriver.filter.metric_labels]]
# key = "device_name"
# value = 'one_of("sda", "sdb")'
#
## User labels refine the time series selection with the following expression:
## metadata.user_labels."<key>" = <value>
# [[inputs.stackdriver.filter.user_labels]]
# key = "environment"
# value = 'one_of("prod", "staging")'
#
## System labels refine the time series selection with the following expression:
## metadata.system_labels."<key>" = <value>
# [[inputs.stackdriver.filter.system_labels]]
# key = "machine_type"
# value = 'starts_with("e2-")'
38 changes: 38 additions & 0 deletions plugins/inputs/stackdriver/stackdriver.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ type (
ListTimeSeriesFilter struct {
ResourceLabels []*Label `json:"resource_labels"`
MetricLabels []*Label `json:"metric_labels"`
UserLabels []*Label `json:"user_labels"`
SystemLabels []*Label `json:"system_labels"`
}

// Label contains key and value
Expand Down Expand Up @@ -305,6 +307,42 @@ func (s *Stackdriver) newListTimeSeriesFilter(metricType string) string {
}
}

if len(s.Filter.UserLabels) > 0 {
UserLabelsFilter := make([]string, len(s.Filter.UserLabels))
for i, metricLabel := range s.Filter.UserLabels {
// check if metric label value contains function
if includeExcludeHelper(metricLabel.Value, functions, nil) {
valueFmt = `metadata.user_labels."%s" = %s`
} else {
valueFmt = `metadata.user_labels."%s" = "%s"`
}
UserLabelsFilter[i] = fmt.Sprintf(valueFmt, metricLabel.Key, metricLabel.Value)
}
if len(UserLabelsFilter) == 1 {
filterString += fmt.Sprintf(" AND %s", UserLabelsFilter[0])
} else {
filterString += fmt.Sprintf(" AND (%s)", strings.Join(UserLabelsFilter, " OR "))
}
}

if len(s.Filter.SystemLabels) > 0 {
SystemLabelsFilter := make([]string, len(s.Filter.SystemLabels))
for i, metricLabel := range s.Filter.SystemLabels {
// check if metric label value contains function
if includeExcludeHelper(metricLabel.Value, functions, nil) {
valueFmt = `metadata.system_labels."%s" = %s`
} else {
valueFmt = `metadata.system_labels."%s" = "%s"`
}
SystemLabelsFilter[i] = fmt.Sprintf(valueFmt, metricLabel.Key, metricLabel.Value)
}
if len(SystemLabelsFilter) == 1 {
filterString += fmt.Sprintf(" AND %s", SystemLabelsFilter[0])
} else {
filterString += fmt.Sprintf(" AND (%s)", strings.Join(SystemLabelsFilter, " OR "))
}
}

return filterString
}

Expand Down
24 changes: 23 additions & 1 deletion plugins/inputs/stackdriver/stackdriver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1126,6 +1126,26 @@ func TestListMetricDescriptorFilter(t *testing.T) {
Value: `starts_with("abc-")`,
},
},
UserLabels: []*Label{
{
Key: "team",
Value: "badgers",
},
{
Key: "environment",
Value: `starts_with("prod-")`,
},
},
SystemLabels: []*Label{
{
Key: "machine_type",
Value: "e2",
},
{
Key: "machine_type",
Value: `starts_with("n2")`,
},
},
},
RateLimit: 1,
},
Expand All @@ -1141,7 +1161,9 @@ func TestListMetricDescriptorFilter(t *testing.T) {
name: "ListTimeSeries",
filter: `metric.type = "telegraf/cpu/usage" AND ` +
`(resource.labels.instance_name = "localhost" OR resource.labels.zone = starts_with("us-")) AND ` +
`(metric.labels.resource_type = "instance" OR metric.labels.resource_id = starts_with("abc-"))`,
`(metric.labels.resource_type = "instance" OR metric.labels.resource_id = starts_with("abc-")) AND ` +
`(metadata.user_labels."team" = "badgers" OR metadata.user_labels."environment" = starts_with("prod-")) AND ` +
`(metadata.system_labels."machine_type" = "e2" OR metadata.system_labels."machine_type" = starts_with("n2"))`,
},
},
},
Expand Down

0 comments on commit b1fdc11

Please sign in to comment.