fix(outputs.stackdriver): Do not shallow copy map (#14009)

This commit is contained in:
Joshua Powers 2023-09-27 13:59:43 -06:00 committed by GitHub
parent 73a220f85c
commit 637b8f8721
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 68 additions and 1 deletions

View File

@ -223,7 +223,10 @@ func (s *Stackdriver) sendBatch(batch []telegraf.Metric) error {
// Convert any declared tag to a resource label and remove it from
// the metric
resourceLabels := s.ResourceLabels
resourceLabels := make(map[string]string, len(s.ResourceLabels)+len(s.TagsAsResourceLabels))
for k, v := range s.ResourceLabels {
resourceLabels[k] = v
}
for _, tag := range s.TagsAsResourceLabels {
if val, ok := m.GetTag(tag); ok {
resourceLabels[tag] = val

View File

@ -155,6 +155,70 @@ func TestWriteResourceTypeAndLabels(t *testing.T) {
require.Equal(t, request.TimeSeries[0].Resource.Labels["mylabel"], "myvalue")
}
func TestWriteTagsAsResourceLabels(t *testing.T) {
expectedResponse := &emptypb.Empty{}
mockMetric.err = nil
mockMetric.reqs = nil
mockMetric.resps = append(mockMetric.resps[:0], expectedResponse)
c, err := monitoring.NewMetricClient(context.Background(), clientOpt)
if err != nil {
t.Fatal(err)
}
s := &Stackdriver{
Project: fmt.Sprintf("projects/%s", "[PROJECT]"),
Namespace: "test",
ResourceType: "foo",
TagsAsResourceLabels: []string{"job_name"},
ResourceLabels: map[string]string{
"mylabel": "myvalue",
},
Log: testutil.Logger{},
client: c,
}
metrics := []telegraf.Metric{
testutil.MustMetric("cpu",
map[string]string{
"job_name": "cpu",
"mytag": "foo",
},
map[string]interface{}{
"value": 42,
},
time.Unix(2, 0),
),
testutil.MustMetric("mem",
map[string]string{
"job_name": "mem",
"mytag": "bar",
},
map[string]interface{}{
"value": 42,
},
time.Unix(2, 0),
),
}
require.NoError(t, s.Connect())
require.NoError(t, s.Write(metrics))
require.Len(t, mockMetric.reqs, 1)
request := mockMetric.reqs[0].(*monitoringpb.CreateTimeSeriesRequest)
require.Len(t, request.TimeSeries, 2)
for _, ts := range request.TimeSeries {
switch ts.Metric.Type {
case "test_mem_value/unknown":
require.Equal(t, "mem", ts.Resource.Labels["job_name"])
case "test_cpu_value/unknown":
require.Equal(t, "cpu", ts.Resource.Labels["job_name"])
default:
require.False(t, true, "Unknown metric type")
}
}
}
func TestWriteAscendingTime(t *testing.T) {
expectedResponse := &emptypb.Empty{}
mockMetric.err = nil