Skip to content

Commit 1cc5e3f

Browse files
committed
feat(googlecloudmonitoring): filter metric via regex
1 parent 0788185 commit 1cc5e3f

File tree

2 files changed

+22
-15
lines changed

2 files changed

+22
-15
lines changed

receiver/googlecloudmonitoringreceiver/config.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ type Config struct {
2424
}
2525

2626
type MetricConfig struct {
27-
MetricName string `mapstructure:"metric_name"`
27+
MetricName string `mapstructure:"metric_name"`
28+
MetricNameRegex string `mapstructure:"metric_name_regex"`
2829
}
2930

3031
func (config *Config) Validate() error {
@@ -46,6 +47,14 @@ func (config *Config) Validate() error {
4647
}
4748

4849
func (metric MetricConfig) Validate() error {
50+
if metric.MetricName != "" && metric.MetricNameRegex != "" {
51+
return errors.New("fields \"metric_name\" and \"metric_name_regex\" cannot both have value")
52+
}
53+
54+
if metric.MetricName == "" && metric.MetricNameRegex == "" {
55+
return errors.New("fields \"metric_name\" and \"metric_name_regex\" cannot both be empty")
56+
}
57+
4958
if metric.MetricName == "" {
5059
return errors.New("field \"metric_name\" is required and cannot be empty for metric configuration")
5160
}

receiver/googlecloudmonitoringreceiver/receiver.go

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,9 @@ func (mr *monitoringReceiver) Scrape(ctx context.Context) (pmetric.Metrics, erro
8989
metrics := pmetric.NewMetrics()
9090

9191
// Iterate over each metric in the configuration to calculate start/end times and construct the filter query.
92-
for _, metric := range mr.config.MetricsList {
93-
// Acquire read lock to safely read metricDescriptors
94-
mr.mutex.RLock()
95-
metricDesc, exists := mr.metricDescriptors[metric.MetricName]
96-
mr.mutex.RUnlock()
97-
if !exists {
98-
mr.logger.Warn("Metric descriptor not found", zap.String("metric_name", metric.MetricName))
99-
continue
100-
}
101-
92+
mr.mutex.RLock()
93+
defer mr.mutex.RUnlock()
94+
for metricType, metricDesc := range mr.metricDescriptors {
10295
// Set interval and delay times, using defaults if not provided
10396
gInternal = mr.config.CollectionInterval
10497
if gInternal <= 0 {
@@ -114,7 +107,7 @@ func (mr *monitoringReceiver) Scrape(ctx context.Context) (pmetric.Metrics, erro
114107
calStartTime, calEndTime = calculateStartEndTime(gInternal, gDelay)
115108

116109
// Get the filter query for the metric
117-
filterQuery = getFilterQuery(metric)
110+
filterQuery = fmt.Sprintf(`metric.type = "%s"`, metricType)
118111

119112
// Define the request to list time series data
120113
tsReq := &monitoringpb.ListTimeSeriesRequest{
@@ -243,8 +236,13 @@ func getFilterQuery(metric MetricConfig) string {
243236
var filterQuery string
244237
const baseQuery = `metric.type =`
245238

246-
// If a specific metric name is provided, use it in the filter query
247-
filterQuery = fmt.Sprintf(`%s "%s"`, baseQuery, metric.MetricName)
239+
if metric.MetricName != "" {
240+
// If a specific metric name is provided, use it in the filter query
241+
filterQuery = fmt.Sprintf(`%s "%s"`, baseQuery, metric.MetricName)
242+
} else {
243+
filterQuery = fmt.Sprintf(`%s monitoring.regex.full_match("%s")`, baseQuery, metric.MetricName)
244+
}
245+
248246
return filterQuery
249247
}
250248

@@ -322,7 +320,7 @@ func (mr *monitoringReceiver) convertGCPTimeSeriesToMetrics(metrics pmetric.Metr
322320
// TODO: Add support for EXPONENTIAL_HISTOGRAM
323321
default:
324322
metricError := fmt.Sprintf("\n Unsupported metric kind: %v\n", timeSeries.GetMetricKind())
325-
mr.logger.Info(metricError)
323+
mr.logger.Warn(metricError)
326324
}
327325
}
328326

0 commit comments

Comments
 (0)