feat(inputs.stackdriver): Allow filtering by resource metadata labels (#12377)
This commit is contained in:
parent
75175d7752
commit
fe9a0eb6f5
|
|
@ -79,9 +79,11 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
|
||||||
##
|
##
|
||||||
## The logical operators when combining filters are defined statically using
|
## The logical operators when combining filters are defined statically using
|
||||||
## the following values:
|
## 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>}
|
## resource_labels ::= <resource_labels> {OR <resource_label>}
|
||||||
## metric_labels ::= <metric_labels> {OR <metric_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
|
## For more details, see https://cloud.google.com/monitoring/api/v3/filters
|
||||||
#
|
#
|
||||||
|
|
@ -96,6 +98,18 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
|
||||||
# [[inputs.stackdriver.filter.metric_labels]]
|
# [[inputs.stackdriver.filter.metric_labels]]
|
||||||
# key = "device_name"
|
# key = "device_name"
|
||||||
# value = 'one_of("sda", "sdb")'
|
# 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-")'
|
||||||
```
|
```
|
||||||
|
|
||||||
### Authentication
|
### Authentication
|
||||||
|
|
|
||||||
|
|
@ -59,9 +59,11 @@
|
||||||
##
|
##
|
||||||
## The logical operators when combining filters are defined statically using
|
## The logical operators when combining filters are defined statically using
|
||||||
## the following values:
|
## 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>}
|
## resource_labels ::= <resource_labels> {OR <resource_label>}
|
||||||
## metric_labels ::= <metric_labels> {OR <metric_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
|
## For more details, see https://cloud.google.com/monitoring/api/v3/filters
|
||||||
#
|
#
|
||||||
|
|
@ -76,3 +78,15 @@
|
||||||
# [[inputs.stackdriver.filter.metric_labels]]
|
# [[inputs.stackdriver.filter.metric_labels]]
|
||||||
# key = "device_name"
|
# key = "device_name"
|
||||||
# value = 'one_of("sda", "sdb")'
|
# 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-")'
|
||||||
|
|
|
||||||
|
|
@ -66,6 +66,8 @@ type (
|
||||||
ListTimeSeriesFilter struct {
|
ListTimeSeriesFilter struct {
|
||||||
ResourceLabels []*Label `json:"resource_labels"`
|
ResourceLabels []*Label `json:"resource_labels"`
|
||||||
MetricLabels []*Label `json:"metric_labels"`
|
MetricLabels []*Label `json:"metric_labels"`
|
||||||
|
UserLabels []*Label `json:"user_labels"`
|
||||||
|
SystemLabels []*Label `json:"system_labels"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Label contains key and value
|
// Label contains key and value
|
||||||
|
|
@ -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
|
return filterString
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1126,6 +1126,26 @@ func TestListMetricDescriptorFilter(t *testing.T) {
|
||||||
Value: `starts_with("abc-")`,
|
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,
|
RateLimit: 1,
|
||||||
},
|
},
|
||||||
|
|
@ -1141,7 +1161,9 @@ func TestListMetricDescriptorFilter(t *testing.T) {
|
||||||
name: "ListTimeSeries",
|
name: "ListTimeSeries",
|
||||||
filter: `metric.type = "telegraf/cpu/usage" AND ` +
|
filter: `metric.type = "telegraf/cpu/usage" AND ` +
|
||||||
`(resource.labels.instance_name = "localhost" OR resource.labels.zone = starts_with("us-")) 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"))`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue