Skip to content

Commit aa3a2b3

Browse files
authored
[Metricbeat] gcp: use ServiceMetrixPrefix in field extractor too (#27286)
1 parent f144f63 commit aa3a2b3

4 files changed

Lines changed: 76 additions & 22 deletions

File tree

x-pack/metricbeat/module/gcp/metrics/metricset.go

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ package metrics
77
import (
88
"context"
99
"fmt"
10-
"path"
10+
"strings"
1111
"time"
1212

1313
monitoring "cloud.google.com/go/monitoring/apiv3"
@@ -53,24 +53,44 @@ type MetricSet struct {
5353
//metricsConfig holds a configuration specific for metrics metricset.
5454
type metricsConfig struct {
5555
ServiceName string `config:"service" validate:"required"`
56-
// MetricPrefix allows to specify the prefix string for MetricTypes
56+
// ServiceMetricPrefix allows to specify the prefix string for MetricTypes
5757
// Stackdriver requires metrics to be prefixed with a common prefix.
5858
// This prefix changes based on the services the metrics belongs to.
5959
ServiceMetricPrefix string `config:"service_metric_prefix"`
6060
MetricTypes []string `config:"metric_types" validate:"required"`
6161
Aligner string `config:"aligner"`
6262
}
6363

64-
func (mc metricsConfig) AddPrefixTo(metric string) string {
64+
// prefix returns the service metric prefix, falling back to the Google Cloud
65+
// monitoring service prefix when not specified.
66+
// The prefix is normalized to always end with '/'.
67+
func (mc metricsConfig) prefix() string {
6568
prefix := mc.ServiceMetricPrefix
69+
6670
// NOTE: fallback to Google Cloud prefix for backward compatibility
6771
// Prefix <service>.googleapis.com/ works only for Google Cloud metrics
6872
// List: https://cloud.google.com/monitoring/api/metrics_gcp
6973
if prefix == "" {
70-
prefix = mc.ServiceName + ".googleapis.com"
74+
prefix = mc.ServiceName + ".googleapis.com/"
7175
}
7276

73-
return path.Join(prefix, metric)
77+
// Final slash is part of prefix. Creating a prefix with final slash
78+
// normalize the prefix for other use cases
79+
if !strings.HasSuffix(prefix, "/") {
80+
prefix = prefix + "/"
81+
}
82+
83+
return prefix
84+
}
85+
86+
// AddPrefixTo adds the required service metric prefix to the given metric
87+
func (mc metricsConfig) AddPrefixTo(metric string) string {
88+
return mc.prefix() + metric
89+
}
90+
91+
// RemovePrefixFrom removes service metric prefix from the given metric
92+
func (mc metricsConfig) RemovePrefixFrom(metric string) string {
93+
return strings.TrimPrefix(metric, mc.prefix())
7494
}
7595

7696
type metricMeta struct {
@@ -152,7 +172,7 @@ func (m *MetricSet) Fetch(ctx context.Context, reporter mb.ReporterV2) (err erro
152172
return err
153173
}
154174

155-
events, err := m.eventMapping(ctx, responses, sdc.ServiceName)
175+
events, err := m.eventMapping(ctx, responses, sdc)
156176
if err != nil {
157177
err = errors.Wrap(err, "eventMapping failed")
158178
m.Logger().Error(err)
@@ -167,14 +187,14 @@ func (m *MetricSet) Fetch(ctx context.Context, reporter mb.ReporterV2) (err erro
167187
return nil
168188
}
169189

170-
func (m *MetricSet) eventMapping(ctx context.Context, tss []timeSeriesWithAligner, serviceName string) ([]mb.Event, error) {
171-
e := newIncomingFieldExtractor(m.Logger())
190+
func (m *MetricSet) eventMapping(ctx context.Context, tss []timeSeriesWithAligner, sdc metricsConfig) ([]mb.Event, error) {
191+
e := newIncomingFieldExtractor(m.Logger(), sdc)
172192

173193
var gcpService = gcp.NewStackdriverMetadataServiceForTimeSeries(nil)
174194
var err error
175195

176196
if !m.config.ExcludeLabels {
177-
if gcpService, err = NewMetadataServiceForConfig(m.config, serviceName); err != nil {
197+
if gcpService, err = NewMetadataServiceForConfig(m.config, sdc.ServiceName); err != nil {
178198
return nil, errors.Wrap(err, "error trying to create metadata service")
179199
}
180200
}
@@ -199,7 +219,7 @@ func (m *MetricSet) eventMapping(ctx context.Context, tss []timeSeriesWithAligne
199219
event.MetricSetFields.Put(singleEvent.Key, singleEvent.Value)
200220
}
201221

202-
if serviceName == "compute" {
222+
if sdc.ServiceName == "compute" {
203223
event.RootFields = addHostFields(groupedEvents)
204224
} else {
205225
event.RootFields = groupedEvents[0].ECS

x-pack/metricbeat/module/gcp/metrics/metricset_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,39 @@ func Test_metricsConfig_AddPrefixTo(t *testing.T) {
4343
})
4444
}
4545
}
46+
47+
func Test_metricsConfig_RemovePrefixFrom(t *testing.T) {
48+
metric := "awesome/metric"
49+
tests := []struct {
50+
name string
51+
fields metricsConfig
52+
metric string
53+
want string
54+
}{
55+
{
56+
name: "only service name",
57+
fields: fakeMetricsConfig[0],
58+
metric: "billing.googleapis.com/" + metric,
59+
want: metric,
60+
},
61+
{
62+
name: "service metric prefix override",
63+
fields: fakeMetricsConfig[1],
64+
metric: "foobar/" + metric,
65+
want: metric,
66+
},
67+
{
68+
name: "service metric prefix override (without trailing /)",
69+
fields: fakeMetricsConfig[2],
70+
metric: "foobar/" + metric,
71+
want: metric,
72+
},
73+
}
74+
for _, tt := range tests {
75+
t.Run(tt.name, func(t *testing.T) {
76+
if got := tt.fields.RemovePrefixFrom(metric); got != tt.want {
77+
t.Errorf("metricsConfig.RemovePrefixFrom(%s) = %v, want %v", metric, got, tt.want)
78+
}
79+
})
80+
}
81+
}

x-pack/metricbeat/module/gcp/metrics/response_parser.go

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package metrics
66

77
import (
8-
"regexp"
98
"strings"
109
"time"
1110

@@ -18,12 +17,13 @@ import (
1817
"github.com/elastic/beats/v7/x-pack/metricbeat/module/gcp"
1918
)
2019

21-
func newIncomingFieldExtractor(l *logp.Logger) *incomingFieldExtractor {
22-
return &incomingFieldExtractor{logger: l}
20+
func newIncomingFieldExtractor(l *logp.Logger, mc metricsConfig) *incomingFieldExtractor {
21+
return &incomingFieldExtractor{logger: l, mc: mc}
2322
}
2423

2524
type incomingFieldExtractor struct {
2625
logger *logp.Logger
26+
mc metricsConfig
2727
}
2828

2929
// KeyValuePoint is a struct to capture the information parsed in an instant of a single metric
@@ -48,7 +48,7 @@ func (e *incomingFieldExtractor) extractTimeSeriesMetricValues(resp *monitoring.
4848
}
4949

5050
p := KeyValuePoint{
51-
Key: cleanMetricNameString(resp.Metric.Type, aligner),
51+
Key: cleanMetricNameString(resp.Metric.Type, aligner, e.mc),
5252
Value: getValueFromPoint(point),
5353
Timestamp: ts,
5454
}
@@ -71,17 +71,13 @@ func (e *incomingFieldExtractor) getTimestamp(p *monitoring.Point) (ts time.Time
7171
return time.Time{}, errors.New("error trying to extract the timestamp from the point data")
7272
}
7373

74-
var rx = regexp.MustCompile(`^[a-z_-]+\.googleapis.com\/`)
75-
76-
func cleanMetricNameString(s string, aligner string) string {
74+
func cleanMetricNameString(s string, aligner string, mc metricsConfig) string {
7775
if s == "" {
7876
return "unknown"
7977
}
8078

81-
prefix := rx.FindString(s)
82-
83-
removedPrefix := strings.TrimPrefix(s, prefix)
84-
replacedChars := strings.Replace(removedPrefix, "/", ".", -1)
79+
unprefixedMetric := mc.RemovePrefixFrom(s)
80+
replacedChars := strings.Replace(unprefixedMetric, "/", ".", -1)
8581

8682
metricName := replacedChars + gcp.AlignersMapToSuffix[aligner]
8783
return metricName

x-pack/metricbeat/module/gcp/metrics/response_parser_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
)
1212

1313
func TestCleanMetricNameString(t *testing.T) {
14+
computeMC := metricsConfig{"compute", "", []string{}, ""}
15+
1416
cases := []struct {
1517
title string
1618
metricType string
@@ -33,7 +35,7 @@ func TestCleanMetricNameString(t *testing.T) {
3335

3436
for _, c := range cases {
3537
t.Run(c.title, func(t *testing.T) {
36-
metricName := cleanMetricNameString(c.metricType, c.aligner)
38+
metricName := cleanMetricNameString(c.metricType, c.aligner, computeMC)
3739
assert.Equal(t, c.expectedMetricName, metricName)
3840
})
3941
}

0 commit comments

Comments
 (0)