diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 515adf8a7b00..af55fc7ec297 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -41,6 +41,8 @@ https://github.com/elastic/beats/compare/v6.3.1...6.3[Check the HEAD diff] *Metricbeat* +- Ensure metadata updates don't replace existing pod metrics. {pull}7573[7573] + *Packetbeat* *Winlogbeat* diff --git a/libbeat/processors/add_kubernetes_metadata/kubernetes.go b/libbeat/processors/add_kubernetes_metadata/kubernetes.go index d5ec386d0f51..2455d7b01fa7 100644 --- a/libbeat/processors/add_kubernetes_metadata/kubernetes.go +++ b/libbeat/processors/add_kubernetes_metadata/kubernetes.go @@ -132,16 +132,9 @@ func (k *kubernetesAnnotator) Run(event *beat.Event) (*beat.Event, error) { return event, nil } - meta := common.MapStr{} - metaIface, ok := event.Fields["kubernetes"] - if !ok { - event.Fields["kubernetes"] = common.MapStr{} - } else { - meta = metaIface.(common.MapStr) - } - - meta.Update(metadata) - event.Fields["kubernetes"] = meta + event.Fields.DeepUpdate(common.MapStr{ + "kubernetes": metadata, + }) return event, nil } diff --git a/libbeat/processors/add_kubernetes_metadata/kubernetes_test.go b/libbeat/processors/add_kubernetes_metadata/kubernetes_test.go new file mode 100644 index 000000000000..de45c7ea1713 --- /dev/null +++ b/libbeat/processors/add_kubernetes_metadata/kubernetes_test.go @@ -0,0 +1,91 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package add_kubernetes_metadata + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + + "github.com/elastic/beats/libbeat/beat" + "github.com/elastic/beats/libbeat/common" +) + +// Test metadata updates don't replace existing pod metrics +func TestAnnotatorDeepUpdate(t *testing.T) { + cfg, err := common.NewConfigFrom(map[string]interface{}{ + "lookup_fields": []string{"kubernetes.pod.name"}, + }) + if err != nil { + t.Fatal(err) + } + matcher, err := NewFieldMatcher(*cfg) + if err != nil { + t.Fatal(err) + } + + processor := kubernetesAnnotator{ + cache: newCache(10 * time.Second), + matchers: &Matchers{ + matchers: []Matcher{matcher}, + }, + } + + processor.cache.set("foo", common.MapStr{ + "pod": common.MapStr{ + "labels": common.MapStr{ + "dont": "replace", + "original": "fields", + }, + }, + }) + + event, err := processor.Run(&beat.Event{ + Fields: common.MapStr{ + "kubernetes": common.MapStr{ + "pod": common.MapStr{ + "name": "foo", + "id": "pod_id", + "metrics": common.MapStr{ + "a": 1, + "b": 2, + }, + }, + }, + }, + }) + assert.NoError(t, err) + + assert.Equal(t, common.MapStr{ + "kubernetes": common.MapStr{ + "pod": common.MapStr{ + "name": "foo", + "id": "pod_id", + "metrics": common.MapStr{ + "a": 1, + "b": 2, + }, + "labels": common.MapStr{ + "dont": "replace", + "original": "fields", + }, + }, + }, + }, event.Fields) +}