diff --git a/auditbeat/docs/fields.asciidoc b/auditbeat/docs/fields.asciidoc index 306ec628e26d..4228f88e213d 100644 --- a/auditbeat/docs/fields.asciidoc +++ b/auditbeat/docs/fields.asciidoc @@ -3312,7 +3312,7 @@ Kubernetes pod name -- type: keyword -Kubernetes pod uid +Kubernetes Pod UID -- diff --git a/auditbeat/include/fields.go b/auditbeat/include/fields.go index f770685af99f..f82584b44860 100644 --- a/auditbeat/include/fields.go +++ b/auditbeat/include/fields.go @@ -31,5 +31,5 @@ func init() { // Asset returns asset data func Asset() string { - return "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" + return "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" } diff --git a/deploy/kubernetes/metricbeat-kubernetes.yaml b/deploy/kubernetes/metricbeat-kubernetes.yaml index d8ef660cf255..1d85641a0203 100644 --- a/deploy/kubernetes/metricbeat-kubernetes.yaml +++ b/deploy/kubernetes/metricbeat-kubernetes.yaml @@ -262,15 +262,22 @@ metadata: labels: k8s-app: metricbeat rules: -- apiGroups: [""] # "" indicates the core API group +- apiGroups: [""] resources: + - nodes - namespaces - events - pods - verbs: - - get - - watch - - list + verbs: ["get", "list", "watch"] +- apiGroups: ["extensions"] + resources: + - deployments + - replicasets + verbs: ["get", "list", "watch"] +- apiGroups: ["apps"] + resources: + - statefulsets + verbs: ["get", "list", "watch"] --- apiVersion: v1 kind: ServiceAccount diff --git a/deploy/kubernetes/metricbeat/metricbeat-role.yaml b/deploy/kubernetes/metricbeat/metricbeat-role.yaml index ebc9039cb549..64bdb0205fa8 100644 --- a/deploy/kubernetes/metricbeat/metricbeat-role.yaml +++ b/deploy/kubernetes/metricbeat/metricbeat-role.yaml @@ -5,12 +5,19 @@ metadata: labels: k8s-app: metricbeat rules: -- apiGroups: [""] # "" indicates the core API group +- apiGroups: [""] resources: + - nodes - namespaces - events - pods - verbs: - - get - - watch - - list + verbs: ["get", "list", "watch"] +- apiGroups: ["extensions"] + resources: + - deployments + - replicasets + verbs: ["get", "list", "watch"] +- apiGroups: ["apps"] + resources: + - statefulsets + verbs: ["get", "list", "watch"] diff --git a/filebeat/docs/fields.asciidoc b/filebeat/docs/fields.asciidoc index 2263de0d818e..338463e443b3 100644 --- a/filebeat/docs/fields.asciidoc +++ b/filebeat/docs/fields.asciidoc @@ -2343,7 +2343,7 @@ Kubernetes pod name -- type: keyword -Kubernetes pod uid +Kubernetes Pod UID -- diff --git a/filebeat/include/fields.go b/filebeat/include/fields.go index ee23d6f036e0..93a1d10da3eb 100644 --- a/filebeat/include/fields.go +++ b/filebeat/include/fields.go @@ -31,5 +31,5 @@ func init() { // Asset returns asset data func Asset() string { - return "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" + return "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" } diff --git a/heartbeat/docs/fields.asciidoc b/heartbeat/docs/fields.asciidoc index c9a58b068cc6..03144a26ed00 100644 --- a/heartbeat/docs/fields.asciidoc +++ b/heartbeat/docs/fields.asciidoc @@ -664,7 +664,7 @@ Kubernetes pod name -- type: keyword -Kubernetes pod uid +Kubernetes Pod UID -- diff --git a/heartbeat/include/fields.go b/heartbeat/include/fields.go index 5b6db281fccb..26e46ac2a824 100644 --- a/heartbeat/include/fields.go +++ b/heartbeat/include/fields.go @@ -31,5 +31,5 @@ func init() { // Asset returns asset data func Asset() string { - return "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" + return "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" } diff --git a/libbeat/common/kubernetes/metadata.go b/libbeat/common/kubernetes/metadata.go index 321618d77e92..cc997d5c6d5f 100644 --- a/libbeat/common/kubernetes/metadata.go +++ b/libbeat/common/kubernetes/metadata.go @@ -26,6 +26,9 @@ import ( // MetaGenerator builds metadata objects for pods and containers type MetaGenerator interface { + // ResourceMetadata generates metadata for the given kubernetes object taking to account certain filters + ResourceMetadata(obj Resource) common.MapStr + // PodMetadata generates metadata for the given pod taking to account certain filters PodMetadata(pod *Pod) common.MapStr @@ -33,14 +36,19 @@ type MetaGenerator interface { ContainerMetadata(pod *Pod, container string) common.MapStr } -type metaGenerator struct { - IncludeLabels []string `config:"include_labels"` - ExcludeLabels []string `config:"exclude_labels"` - IncludeAnnotations []string `config:"include_annotations"` - IncludePodUID bool `config:"include_pod_uid"` - IncludeCreatorMetadata bool `config:"include_creator_metadata"` +// MetaGeneratorConfig settings +type MetaGeneratorConfig struct { + IncludeLabels []string `config:"include_labels"` + ExcludeLabels []string `config:"exclude_labels"` + IncludeAnnotations []string `config:"include_annotations"` + + // Undocumented settings, to be deprecated in favor of `drop_fields` processor: + IncludePodUID bool `config:"include_pod_uid"` + IncludeCreatorMetadata bool `config:"include_creator_metadata"` } +type metaGenerator = MetaGeneratorConfig + // NewMetaGenerator initializes and returns a new kubernetes metadata generator func NewMetaGenerator(cfg *common.Config) (MetaGenerator, error) { // default settings: @@ -52,15 +60,21 @@ func NewMetaGenerator(cfg *common.Config) (MetaGenerator, error) { return &generator, err } -// PodMetadata generates metadata for the given pod taking to account certain filters -func (g *metaGenerator) PodMetadata(pod *Pod) common.MapStr { +// NewMetaGeneratorFromConfig initializes and returns a new kubernetes metadata generator +func NewMetaGeneratorFromConfig(cfg *MetaGeneratorConfig) MetaGenerator { + return cfg +} + +// ResourceMetadata generates metadata for the given kubernetes object taking to account certain filters +func (g *metaGenerator) ResourceMetadata(obj Resource) common.MapStr { + objMeta := obj.GetMetadata() labelMap := common.MapStr{} if len(g.IncludeLabels) == 0 { - for k, v := range pod.Metadata.Labels { + for k, v := range obj.GetMetadata().Labels { safemapstr.Put(labelMap, k, v) } } else { - labelMap = generateMapSubset(pod.Metadata.Labels, g.IncludeLabels) + labelMap = generateMapSubset(objMeta.Labels, g.IncludeLabels) } // Exclude any labels that are present in the exclude_labels config @@ -68,25 +82,15 @@ func (g *metaGenerator) PodMetadata(pod *Pod) common.MapStr { delete(labelMap, label) } - annotationsMap := generateMapSubset(pod.Metadata.Annotations, g.IncludeAnnotations) - meta := common.MapStr{ - "pod": common.MapStr{ - "name": pod.Metadata.GetName(), - }, - "node": common.MapStr{ - "name": pod.Spec.GetNodeName(), - }, - "namespace": pod.Metadata.GetNamespace(), - } - - // Add Pod UID metadata if enabled - if g.IncludePodUID { - safemapstr.Put(meta, "pod.uid", pod.Metadata.GetUid()) + annotationsMap := generateMapSubset(objMeta.Annotations, g.IncludeAnnotations) + meta := common.MapStr{} + if objMeta.GetNamespace() != "" { + meta["namespace"] = objMeta.GetNamespace() } // Add controller metadata if present if g.IncludeCreatorMetadata { - for _, ref := range pod.Metadata.OwnerReferences { + for _, ref := range objMeta.OwnerReferences { if ref.GetController() { switch ref.GetKind() { // TODO grow this list as we keep adding more `state_*` metricsets @@ -110,6 +114,21 @@ func (g *metaGenerator) PodMetadata(pod *Pod) common.MapStr { return meta } +// PodMetadata generates metadata for the given pod taking to account certain filters +func (g *metaGenerator) PodMetadata(pod *Pod) common.MapStr { + podMeta := g.ResourceMetadata(pod) + + // Add UID metadata if enabled + if g.IncludePodUID { + safemapstr.Put(podMeta, "pod.uid", pod.GetMetadata().GetUid()) + } + + safemapstr.Put(podMeta, "pod.name", pod.GetMetadata().GetName()) + safemapstr.Put(podMeta, "node.name", pod.Spec.GetNodeName()) + + return podMeta +} + // Containermetadata generates metadata for the given container of a pod func (g *metaGenerator) ContainerMetadata(pod *Pod, container string) common.MapStr { podMeta := g.PodMetadata(pod) diff --git a/libbeat/common/kubernetes/metadata_test.go b/libbeat/common/kubernetes/metadata_test.go index 9a7e8cbebfec..31e7b3e8c5bf 100644 --- a/libbeat/common/kubernetes/metadata_test.go +++ b/libbeat/common/kubernetes/metadata_test.go @@ -28,7 +28,7 @@ import ( ) func TestPodMetadataDeDot(t *testing.T) { - withPodUID, _ := common.NewConfigFrom(map[string]interface{}{"include_pod_uid": true}) + withUID, _ := common.NewConfigFrom(map[string]interface{}{"include_pod_uid": true}) UID := "005f3b90-4b9d-12f8-acf0-31020a840133" Deployment := "Deployment" @@ -44,8 +44,9 @@ func TestPodMetadataDeDot(t *testing.T) { { pod: &Pod{ Metadata: &metav1.ObjectMeta{ - Labels: map[string]string{"a.key": "foo", "a": "bar"}, - Uid: &UID, + Labels: map[string]string{"a.key": "foo", "a": "bar"}, + Uid: &UID, + Namespace: &test, }, Spec: &v1.PodSpec{ NodeName: &test, @@ -53,8 +54,8 @@ func TestPodMetadataDeDot(t *testing.T) { }, meta: common.MapStr{ "pod": common.MapStr{"name": ""}, - "namespace": "", "node": common.MapStr{"name": "test"}, + "namespace": "test", "labels": common.MapStr{"a": common.MapStr{"value": "bar", "key": "foo"}}, }, config: common.NewConfig(), @@ -70,12 +71,14 @@ func TestPodMetadataDeDot(t *testing.T) { }, }, meta: common.MapStr{ - "pod": common.MapStr{"name": "", "uid": "005f3b90-4b9d-12f8-acf0-31020a840133"}, - "namespace": "", - "node": common.MapStr{"name": "test"}, - "labels": common.MapStr{"a": common.MapStr{"value": "bar", "key": "foo"}}, + "pod": common.MapStr{ + "name": "", + "uid": "005f3b90-4b9d-12f8-acf0-31020a840133", + }, + "node": common.MapStr{"name": "test"}, + "labels": common.MapStr{"a": common.MapStr{"value": "bar", "key": "foo"}}, }, - config: withPodUID, + config: withUID, }, { pod: &Pod{ @@ -101,7 +104,6 @@ func TestPodMetadataDeDot(t *testing.T) { }, meta: common.MapStr{ "pod": common.MapStr{"name": ""}, - "namespace": "", "node": common.MapStr{"name": "test"}, "labels": common.MapStr{"a": common.MapStr{"value": "bar", "key": "foo"}}, "deployment": common.MapStr{"name": "test"}, diff --git a/libbeat/common/kubernetes/types.go b/libbeat/common/kubernetes/types.go index 8494ff6338c4..fd7cc95faf66 100644 --- a/libbeat/common/kubernetes/types.go +++ b/libbeat/common/kubernetes/types.go @@ -22,7 +22,9 @@ import ( "time" "github.com/ericchiang/k8s" + appsv1 "github.com/ericchiang/k8s/apis/apps/v1beta1" "github.com/ericchiang/k8s/apis/core/v1" + extv1 "github.com/ericchiang/k8s/apis/extensions/v1beta1" metav1 "github.com/ericchiang/k8s/apis/meta/v1" ) @@ -46,6 +48,9 @@ type PodSpec = v1.PodSpec // PodStatus data type PodStatus = v1.PodStatus +// Node data +type Node = v1.Node + // Container data type Container = v1.Container @@ -58,6 +63,15 @@ type Event = v1.Event // PodContainerStatus data type PodContainerStatus = v1.ContainerStatus +// Deployment data +type Deployment = appsv1.Deployment + +// ReplicaSet data +type ReplicaSet = extv1.ReplicaSet + +// StatefulSet data +type StatefulSet = appsv1.StatefulSet + // Time extracts time from k8s.Time type func Time(t *metav1.Time) time.Time { return time.Unix(t.GetSeconds(), int64(t.GetNanos())) diff --git a/libbeat/common/kubernetes/watcher.go b/libbeat/common/kubernetes/watcher.go index a872541023c8..27b1bd338c8e 100644 --- a/libbeat/common/kubernetes/watcher.go +++ b/libbeat/common/kubernetes/watcher.go @@ -24,7 +24,9 @@ import ( "time" "github.com/ericchiang/k8s" + appsv1 "github.com/ericchiang/k8s/apis/apps/v1beta1" "github.com/ericchiang/k8s/apis/core/v1" + extv1 "github.com/ericchiang/k8s/apis/extensions/v1beta1" "github.com/elastic/beats/libbeat/logp" ) @@ -109,6 +111,50 @@ func NewWatcher(client *k8s.Client, resource Resource, options WatchOptions) (Wa } return rs } + case *Node: + list := &v1.NodeList{} + w.resourceList = list + w.k8sResourceFactory = func() k8s.Resource { return &v1.Node{} } + w.items = func() []k8s.Resource { + rs := make([]k8s.Resource, 0, len(list.Items)) + for _, item := range list.Items { + rs = append(rs, item) + } + return rs + } + case *Deployment: + list := &appsv1.DeploymentList{} + w.resourceList = list + w.k8sResourceFactory = func() k8s.Resource { return &appsv1.Deployment{} } + w.items = func() []k8s.Resource { + rs := make([]k8s.Resource, 0, len(list.Items)) + for _, item := range list.Items { + rs = append(rs, item) + } + return rs + } + case *ReplicaSet: + list := &extv1.ReplicaSetList{} + w.resourceList = list + w.k8sResourceFactory = func() k8s.Resource { return &extv1.ReplicaSet{} } + w.items = func() []k8s.Resource { + rs := make([]k8s.Resource, 0, len(list.Items)) + for _, item := range list.Items { + rs = append(rs, item) + } + return rs + } + case *StatefulSet: + list := &appsv1.StatefulSetList{} + w.resourceList = list + w.k8sResourceFactory = func() k8s.Resource { return &appsv1.StatefulSet{} } + w.items = func() []k8s.Resource { + rs := make([]k8s.Resource, 0, len(list.Items)) + for _, item := range list.Items { + rs = append(rs, item) + } + return rs + } default: return nil, fmt.Errorf("unsupported resource type for watching %T", resource) } @@ -163,7 +209,6 @@ func (w *watcher) onDelete(obj Resource) { // Start watching pods func (w *watcher) Start() error { - // Make sure that events don't flow into the annotator before informer is fully set up // Sync initial state: err := w.sync() diff --git a/libbeat/processors/add_kubernetes_metadata/_meta/fields.yml b/libbeat/processors/add_kubernetes_metadata/_meta/fields.yml index 6a7f58758713..623c0795a9d1 100644 --- a/libbeat/processors/add_kubernetes_metadata/_meta/fields.yml +++ b/libbeat/processors/add_kubernetes_metadata/_meta/fields.yml @@ -16,7 +16,7 @@ - name: pod.uid type: keyword description: > - Kubernetes pod uid + Kubernetes Pod UID - name: namespace type: keyword diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index 48e9bbe0c391..806fe76b584d 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -6945,7 +6945,7 @@ Kubernetes pod name -- type: keyword -Kubernetes pod uid +Kubernetes Pod UID -- diff --git a/metricbeat/docs/modules/kubernetes.asciidoc b/metricbeat/docs/modules/kubernetes.asciidoc index 11cce59d264d..e4ad44911099 100644 --- a/metricbeat/docs/modules/kubernetes.asciidoc +++ b/metricbeat/docs/modules/kubernetes.asciidoc @@ -41,6 +41,13 @@ metricbeat.modules: #ssl.certificate: "/etc/pki/client/cert.pem" #ssl.key: "/etc/pki/client/cert.key" + # Enriching parameters: + add_metadata: true + in_cluster: true + # When used outside the cluster: + #host: node_name + #kube_config: ~/.kube/config + # State metrics from kube-state-metrics service: - module: kubernetes enabled: true @@ -54,6 +61,13 @@ metricbeat.modules: period: 10s hosts: ["kube-state-metrics:8080"] + # Enriching parameters: + add_metadata: true + in_cluster: true + # When used outside the cluster: + #host: node_name + #kube_config: ~/.kube/config + # Kubernetes events - module: kubernetes enabled: true diff --git a/metricbeat/include/fields/fields.go b/metricbeat/include/fields/fields.go index ad980b689b91..24002de7f8e2 100644 --- a/metricbeat/include/fields/fields.go +++ b/metricbeat/include/fields/fields.go @@ -31,5 +31,5 @@ func init() { // Asset returns asset data func Asset() string { - return "eJy0WN1y2zYTvfdT7OTq+2YoTmM3no4uOk2dTuNp02ba9FpZASsSNQkwWNCy+vQdAPw1qR9Haq5CYHHOAbB7FvLVAh5ot4Q1obsCcMoVtIQf45ckFlZVThm9hO+vAADujHaoNIMwZWl0WAcbRYVkwEdUBa4LAqUBiwLokbQDt6uI0ytowpZXAWgBGkuKxKn/bxid5fT/PuUUFoDZgMspKAQmLZXOwkBhMiiJGTPiFO4HUWGZ4g6KyXmBfl4YvVFZbdHTwUYVlPhxP4kOHrGo/UqomWTAVM5/auOGYGEJ5IZdw9TEfzKBaqQj8XNh6LP//NzhmLDj/brS6aG1jMcPrtOGDJZcbTVJWO8ClanI0+gMeMeOSjAatrkSeS98cHa21lrpbEaNUyX9Y/QJatrI/1LNI1lWRh8X0wS2aRXSOVx+RtpLIQkuVxxTOR2n7qsf/FbYYVm9akB9ri9BomvPwdKXWlmSS3C2bgc3xpboRnH0hGXlS+9tndXs4PrW5XD9zevbBF5fL2/eLN/cpDc316edbpAE25jI1JShLxBLwlgJW+R+f8825TDjwyxv7Vo5i3YXYuNpCfRWEPK9IhsvCrUMH86iZhSuv494Ts+IozuMztGs/ybR1lr8WMWZB9ptjZWHhXZeVTPZvqa8QUWyZwrIWmNHAjJr6uowyU9+UeuAIjL6/EUplY/FApTeGF/ZAjn4V+DhtE2GxhVbwFZNY2bdeKvJ0ZMbDO6R1UtrcNIJgTByil4Ynb0E3YNMoT3WBHp8ZyehxzRpWpQoTC37HnXnP6Gy5lFJ8tt0KNHhfNv60MzCxpoyInVL2d9Vb0Eo5SoErFpIHymI2di9XcyHpmFV2sI+L2wSR6r3t0F7GytM4aNhVj5xQ09iQEseMIFMUALGglSZclgYQajTvdqUZoda0EodKZ37JhDu37WSfBOBEkWu9PPSnWM43pk6jmFfP42lCVgN8qw7Z3edliRVXR5m/xAhQoq9jLx55qhCud1q0PI6BTUvCNktXosjRjoAgtARVd/tFEc5ivs2dyDlgjd2t9pJaWYWT6enXrPEa/nZmKygWGn72S1lR1vtHyHm2P6aQpdGPIT6aSr9Xfs9Ax7ngB06b79FQcL37FDmcc7XLOfGulXsAEvYYMH+0lCL3NiWb9FV+dXYlNstd7Jgtj/s8/GmJ5BNlTzPE//S6ktNPSAoOefqHV051z5exDjMiwDXvk4bAf4hsa5V4cDoQ1IGZvCVSu46To91iKvANRU8YRu9JeDwe+KIlvtwEpGnS1qfzH3Kvo9fMyD3/jEwSFTf5SbW0+emHz+amQ33y/Ly/Dt53/ysmN7GhTI9GsRMkqMVuXIkXG0vsIcRHPyP0iyFp+9uV7ffJoC2TKCqRAKlqvj/UymG06pA55/05yn5/U9ogRoNgrQznEC9rrWrE9gqLc12j4jxL56v19DgzHJssFTF7myKCNNs0pLM0SUgaa1QJ7CxRGuWh3arqomE0dAB9l8VO29o9x8XKKUlZuIpQYnivE22NDlauUVLPVkCNddYFDv48PZuqKH1kYd6TVaTI+7d5Jfh2AxtP989g8dv2h4Uhl5yuC32i44a0Eg0vMiGKiMv0B4GJ1AZGb1tlqo+15qeMXm8WWvlCsXlNtUjTsn8L7CLnqBH3HOEpzbX04giGpRYTZlQa+PC378uRjeAnOe85INlwCtGb5dDtBd4ss3yRtx/AwAA//+2tWh1" + return "eJy0WF1v3LYSffevGOTpXkAr3Ng3RrEPRVOnaBZt2qBNnjez5KzEWiIVDuX19tcXJPVpaT8cb/1gmF/nHJIzZyhfLeCe9kvYELorAKdcQUv4MbYksbCqcsroJXx/BQBwZ7RDpRmEKUujwzrYKiokAz6gKnBTECgNWBRAD6QduH1FnF5BM215FYAWoLGkSJz6P0PvLKf/+ZRTWABmCy6noBCYtFQ6Cx2FyaAkZsyIU1gNZoVlijsoJucF+nFh9FZltUVPB1tVUOL7/SA6eMCi9iuhZpIBUznf1MYNwcISyA27hqmZ/8kEqpGOxI+Fri+++aXDMWHHh3Wl00NrGU8fXKcNGSy52mqSsNkHKlORp9EZ8J4dlWA07HIl8l744OxsrbXS2Ywap0r62+gz1LQz/001D2RZGX1aTDOxDasQzuHyM9JeCklwueIYyuk4dF/94LfCDsvqVQPqY30JEl17Dpa+1sqSXIKzddu5NbZEN5pHj1hWPvXe1lnNDq5vXQ7X/3t9m8Dr6+XNm+Wbm/Tm5vq80w2SYBcDmZo09AliSRgrYYfc7+/JphxmfJzlrd0oZ9Huw9x4WgK9FYR4r8jGi0ItQ8NZ1IzC9fcRz+kJcXSH0TmazV8k2lyLjXUcuaf9zlh5XGjnVTWT7XPKG1Qke6KArDV2JCCzpq6Ok/zkF7UOKCKjj1+UUvm5WIDSW+MzWyAH/wo8nLbB0LhiC9iqacys6281OXp0g84DsnppDU46IRBGTtELo7PnoHuQKbTHmkCP7+ws9BgmTYkShallX6PufBMqax6UJL9NhxIdzpetD80obK0pI1K3lP1d9RaEUq7DhHUL6WcKYjb2YBXzU9OwKm1hnyY2iRPZ+9ugvI0VpvDRMCsfuKEmMaAlD5hAJigBY0GqTDksjCDU6UFtSrNDLWitTqTOqpkIq3etJF9EoESRK/00decYTlemjmNY189jaSasB3HWnbO7TkuSqi6Ps3+IECHEnkfePHNUodx+PSh5nYKaF4TsFq/FCSMdAEGoiKqvdoqjHMV9mTsScsEbu1vtpDQji8fzQ69Z4rX8bExWUMy0w+yWspOl9o8w59T+mkSXRtyH/Gky/V3bngGPY8AOnbffoiDha3ZI8zjmc5ZzY906VoAlbLFgf2moRW5sy7fosvxqbMrtljtZMFsfDvl4UxPIpkq+zBM/a/W1ph4QlJxz9Y6unCsfz2IcxkWAa1+njQD/kNjUqnBg9DEpAzP4RiV3HafHOsZV4IYKnrCN3hJw/D1xQssqnETk6YLWB3Mfsu9jawZk5R8Dg0D1VW5iPX1s+v6TkdlwPy8uX34n75vPiultXCjSo0HMBDlakStHwtX2AnsYwcF/KM1SePzudn37/wTQlglUlUigVBX/dyrFcFoV6PyT/mVKfv8TWqBGgyDtDCdQb2rt6gR2SkuzOyBi/MXz7RoanFmOLZaq2L+YIsI0m7Qkc3QJSNoo1AlsLdGG5bHdqmoiYdR1hP1Xxc4b2urjAqW0xEw8JShRvGyTLU2OVu7QUk+WQM01FsUePry9G2pofeS+3pDV5Ih7N/ll2DdD2493z+Dxm7YHhaGXHC+L/aKTBjQSDc+yocrIC5SHwQlURkZvm6WqX2pNA6aPRsLn1bspkf/NFYrLbapHnJL5L7CLnqBHPHCE5xbX84giGpRYTZlQa+PC/78uRjeAnOe85INlwCtGb5djtBd4ss3yRtx/AgAA//9ghmf1" } diff --git a/metricbeat/metricbeat.reference.yml b/metricbeat/metricbeat.reference.yml index 750ebeb6e153..aa53b24b06fc 100644 --- a/metricbeat/metricbeat.reference.yml +++ b/metricbeat/metricbeat.reference.yml @@ -367,6 +367,13 @@ metricbeat.modules: #ssl.certificate: "/etc/pki/client/cert.pem" #ssl.key: "/etc/pki/client/cert.key" + # Enriching parameters: + add_metadata: true + in_cluster: true + # When used outside the cluster: + #host: node_name + #kube_config: ~/.kube/config + # State metrics from kube-state-metrics service: - module: kubernetes enabled: true @@ -380,6 +387,13 @@ metricbeat.modules: period: 10s hosts: ["kube-state-metrics:8080"] + # Enriching parameters: + add_metadata: true + in_cluster: true + # When used outside the cluster: + #host: node_name + #kube_config: ~/.kube/config + # Kubernetes events - module: kubernetes enabled: true diff --git a/metricbeat/module/kubernetes/_meta/config.reference.yml b/metricbeat/module/kubernetes/_meta/config.reference.yml index 5b87632596b8..bc24b4e16cf7 100644 --- a/metricbeat/module/kubernetes/_meta/config.reference.yml +++ b/metricbeat/module/kubernetes/_meta/config.reference.yml @@ -15,6 +15,13 @@ #ssl.certificate: "/etc/pki/client/cert.pem" #ssl.key: "/etc/pki/client/cert.key" + # Enriching parameters: + add_metadata: true + in_cluster: true + # When used outside the cluster: + #host: node_name + #kube_config: ~/.kube/config + # State metrics from kube-state-metrics service: - module: kubernetes enabled: true @@ -28,6 +35,13 @@ period: 10s hosts: ["kube-state-metrics:8080"] + # Enriching parameters: + add_metadata: true + in_cluster: true + # When used outside the cluster: + #host: node_name + #kube_config: ~/.kube/config + # Kubernetes events - module: kubernetes enabled: true diff --git a/metricbeat/module/kubernetes/_meta/config.yml b/metricbeat/module/kubernetes/_meta/config.yml index 896092f7b371..1cbd85294612 100644 --- a/metricbeat/module/kubernetes/_meta/config.yml +++ b/metricbeat/module/kubernetes/_meta/config.yml @@ -7,6 +7,8 @@ # - container # - volume period: 10s + hosts: ["localhost:10255"] + hosts: ["localhost:10250"] bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token ssl.certificate_authorities: @@ -14,6 +16,14 @@ #username: "user" #password: "secret" + # Enriching parameters: + #add_metadata: true + #in_cluster: true + # When used outside the cluster: + #in_cluster: false + #host: node_name + #kube_config: ~/.kube/config + # State metrics from kube-state-metrics service: #- module: kubernetes # metricsets: @@ -25,6 +35,8 @@ # - state_container # period: 10s # hosts: ["kube-state-metrics:8080"] +# add_metadata: true +# in_cluster: true # Kubernetes events #- module: kubernetes diff --git a/metricbeat/module/kubernetes/container/container.go b/metricbeat/module/kubernetes/container/container.go index ff555ff91e5a..83896472d429 100644 --- a/metricbeat/module/kubernetes/container/container.go +++ b/metricbeat/module/kubernetes/container/container.go @@ -52,7 +52,8 @@ func init() { // multiple fetch calls. type MetricSet struct { mb.BaseMetricSet - http *helper.HTTP + http *helper.HTTP + enricher util.Enricher } // New create a new instance of the MetricSet @@ -66,6 +67,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { return &MetricSet{ BaseMetricSet: base, http: http, + enricher: util.NewContainerMetadataEnricher(base, true), }, nil } @@ -73,6 +75,8 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // It returns the event which is then forward to the output. In case of an error, a // descriptive error must be returned. func (m *MetricSet) Fetch() ([]common.MapStr, error) { + m.enricher.Start() + body, err := m.http.FetchContent() if err != nil { return nil, err @@ -83,5 +87,13 @@ func (m *MetricSet) Fetch() ([]common.MapStr, error) { return nil, err } + m.enricher.Enrich(events) + return events, nil } + +// Close stops this metricset +func (m *MetricSet) Close() error { + m.enricher.Stop() + return nil +} diff --git a/metricbeat/module/kubernetes/node/node.go b/metricbeat/module/kubernetes/node/node.go index e5c387288ea4..f625667090ca 100644 --- a/metricbeat/module/kubernetes/node/node.go +++ b/metricbeat/module/kubernetes/node/node.go @@ -19,9 +19,11 @@ package node import ( "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/common/kubernetes" "github.com/elastic/beats/metricbeat/helper" "github.com/elastic/beats/metricbeat/mb" "github.com/elastic/beats/metricbeat/mb/parse" + "github.com/elastic/beats/metricbeat/module/kubernetes/util" ) const ( @@ -51,7 +53,8 @@ func init() { // multiple fetch calls. type MetricSet struct { mb.BaseMetricSet - http *helper.HTTP + http *helper.HTTP + enricher util.Enricher } // New create a new instance of the MetricSet @@ -62,9 +65,11 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { if err != nil { return nil, err } + return &MetricSet{ BaseMetricSet: base, http: http, + enricher: util.NewResourceMetadataEnricher(base, &kubernetes.Node{}, false), }, nil } @@ -72,6 +77,8 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // It returns the event which is then forward to the output. In case of an error, a // descriptive error must be returned. func (m *MetricSet) Fetch() (common.MapStr, error) { + m.enricher.Start() + body, err := m.http.FetchContent() if err != nil { return nil, err @@ -82,5 +89,13 @@ func (m *MetricSet) Fetch() (common.MapStr, error) { return nil, err } + m.enricher.Enrich([]common.MapStr{event}) + return event, nil } + +// Close stops this metricset +func (m *MetricSet) Close() error { + m.enricher.Stop() + return nil +} diff --git a/metricbeat/module/kubernetes/pod/pod.go b/metricbeat/module/kubernetes/pod/pod.go index 863c5ddabae5..daae3a36f777 100644 --- a/metricbeat/module/kubernetes/pod/pod.go +++ b/metricbeat/module/kubernetes/pod/pod.go @@ -19,6 +19,7 @@ package pod import ( "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/common/kubernetes" "github.com/elastic/beats/metricbeat/helper" "github.com/elastic/beats/metricbeat/mb" "github.com/elastic/beats/metricbeat/mb/parse" @@ -52,7 +53,8 @@ func init() { // multiple fetch calls. type MetricSet struct { mb.BaseMetricSet - http *helper.HTTP + http *helper.HTTP + enricher util.Enricher } // New create a new instance of the MetricSet @@ -63,9 +65,11 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { if err != nil { return nil, err } + return &MetricSet{ BaseMetricSet: base, http: http, + enricher: util.NewResourceMetadataEnricher(base, &kubernetes.Pod{}, true), }, nil } @@ -73,6 +77,8 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // It returns the event which is then forward to the output. In case of an error, a // descriptive error must be returned. func (m *MetricSet) Fetch() ([]common.MapStr, error) { + m.enricher.Start() + body, err := m.http.FetchContent() if err != nil { return nil, err @@ -83,5 +89,13 @@ func (m *MetricSet) Fetch() ([]common.MapStr, error) { return nil, err } + m.enricher.Enrich(events) + return events, nil } + +// Close stops this metricset +func (m *MetricSet) Close() error { + m.enricher.Stop() + return nil +} diff --git a/metricbeat/module/kubernetes/state_container/state_container.go b/metricbeat/module/kubernetes/state_container/state_container.go index e796851caa30..59c490b2502e 100644 --- a/metricbeat/module/kubernetes/state_container/state_container.go +++ b/metricbeat/module/kubernetes/state_container/state_container.go @@ -22,6 +22,7 @@ import ( p "github.com/elastic/beats/metricbeat/helper/prometheus" "github.com/elastic/beats/metricbeat/mb" "github.com/elastic/beats/metricbeat/mb/parse" + "github.com/elastic/beats/metricbeat/module/kubernetes/util" ) const ( @@ -87,6 +88,7 @@ func init() { type MetricSet struct { mb.BaseMetricSet prometheus p.Prometheus + enricher util.Enricher } // New create a new instance of the MetricSet @@ -100,6 +102,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { return &MetricSet{ BaseMetricSet: base, prometheus: prometheus, + enricher: util.NewContainerMetadataEnricher(base, false), }, nil } @@ -107,11 +110,16 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // It returns the event which is then forward to the output. In case of an error, a // descriptive error must be returned. func (m *MetricSet) Fetch() ([]common.MapStr, error) { + m.enricher.Start() + events, err := m.prometheus.GetProcessedMetrics(mapping) if err != nil { return nil, err } + m.enricher.Enrich(events) + + // Calculate deprecated nanocores values for _, event := range events { if request, ok := event["cpu.request.cores"]; ok { if requestCores, ok := request.(float64); ok { @@ -128,3 +136,9 @@ func (m *MetricSet) Fetch() ([]common.MapStr, error) { return events, err } + +// Close stops this metricset +func (m *MetricSet) Close() error { + m.enricher.Stop() + return nil +} diff --git a/metricbeat/module/kubernetes/state_deployment/state_deployment.go b/metricbeat/module/kubernetes/state_deployment/state_deployment.go index 904784a49680..28e7b70c841a 100644 --- a/metricbeat/module/kubernetes/state_deployment/state_deployment.go +++ b/metricbeat/module/kubernetes/state_deployment/state_deployment.go @@ -20,9 +20,11 @@ package state_deployment import ( "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/common/kubernetes" p "github.com/elastic/beats/metricbeat/helper/prometheus" "github.com/elastic/beats/metricbeat/mb" "github.com/elastic/beats/metricbeat/mb/parse" + "github.com/elastic/beats/metricbeat/module/kubernetes/util" ) const ( @@ -72,6 +74,7 @@ func init() { type MetricSet struct { mb.BaseMetricSet prometheus p.Prometheus + enricher util.Enricher } // New create a new instance of the MetricSet @@ -85,6 +88,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { return &MetricSet{ BaseMetricSet: base, prometheus: prometheus, + enricher: util.NewResourceMetadataEnricher(base, &kubernetes.Deployment{}, false), }, nil } @@ -92,5 +96,18 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // It returns the event which is then forward to the output. In case of an error, a // descriptive error must be returned. func (m *MetricSet) Fetch() ([]common.MapStr, error) { - return m.prometheus.GetProcessedMetrics(mapping) + m.enricher.Start() + + events, err := m.prometheus.GetProcessedMetrics(mapping) + if err == nil { + m.enricher.Enrich(events) + } + + return events, err +} + +// Close stops this metricset +func (m *MetricSet) Close() error { + m.enricher.Stop() + return nil } diff --git a/metricbeat/module/kubernetes/state_node/state_node.go b/metricbeat/module/kubernetes/state_node/state_node.go index 5ecaf74c7521..b77cc7207ed3 100644 --- a/metricbeat/module/kubernetes/state_node/state_node.go +++ b/metricbeat/module/kubernetes/state_node/state_node.go @@ -19,9 +19,11 @@ package state_node import ( "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/common/kubernetes" p "github.com/elastic/beats/metricbeat/helper/prometheus" "github.com/elastic/beats/metricbeat/mb" "github.com/elastic/beats/metricbeat/mb/parse" + "github.com/elastic/beats/metricbeat/module/kubernetes/util" ) const ( @@ -73,6 +75,7 @@ func init() { type MetricSet struct { mb.BaseMetricSet prometheus p.Prometheus + enricher util.Enricher } // New create a new instance of the MetricSet @@ -83,9 +86,11 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { if err != nil { return nil, err } + return &MetricSet{ BaseMetricSet: base, prometheus: prometheus, + enricher: util.NewResourceMetadataEnricher(base, &kubernetes.Node{}, false), }, nil } @@ -93,5 +98,18 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // It returns the event which is then forward to the output. In case of an error, a // descriptive error must be returned. func (m *MetricSet) Fetch() ([]common.MapStr, error) { - return m.prometheus.GetProcessedMetrics(mapping) + m.enricher.Start() + + events, err := m.prometheus.GetProcessedMetrics(mapping) + if err == nil { + m.enricher.Enrich(events) + } + + return events, err +} + +// Close stops this metricset +func (m *MetricSet) Close() error { + m.enricher.Stop() + return nil } diff --git a/metricbeat/module/kubernetes/state_pod/state_pod.go b/metricbeat/module/kubernetes/state_pod/state_pod.go index 391fa3664b01..6f6236cb8f51 100644 --- a/metricbeat/module/kubernetes/state_pod/state_pod.go +++ b/metricbeat/module/kubernetes/state_pod/state_pod.go @@ -19,9 +19,11 @@ package state_pod import ( "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/common/kubernetes" p "github.com/elastic/beats/metricbeat/helper/prometheus" "github.com/elastic/beats/metricbeat/mb" "github.com/elastic/beats/metricbeat/mb/parse" + "github.com/elastic/beats/metricbeat/module/kubernetes/util" ) const ( @@ -73,6 +75,7 @@ func init() { type MetricSet struct { mb.BaseMetricSet prometheus p.Prometheus + enricher util.Enricher } // New create a new instance of the MetricSet @@ -83,9 +86,11 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { if err != nil { return nil, err } + return &MetricSet{ BaseMetricSet: base, prometheus: prometheus, + enricher: util.NewResourceMetadataEnricher(base, &kubernetes.Pod{}, false), }, nil } @@ -93,5 +98,17 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // It returns the event which is then forward to the output. In case of an error, a // descriptive error must be returned. func (m *MetricSet) Fetch() ([]common.MapStr, error) { - return m.prometheus.GetProcessedMetrics(mapping) + m.enricher.Start() + + events, err := m.prometheus.GetProcessedMetrics(mapping) + if err == nil { + m.enricher.Enrich(events) + } + return events, err +} + +// Close stops this metricset +func (m *MetricSet) Close() error { + m.enricher.Stop() + return nil } diff --git a/metricbeat/module/kubernetes/state_replicaset/state_replicaset.go b/metricbeat/module/kubernetes/state_replicaset/state_replicaset.go index 886458fcab77..aaa23414d50b 100644 --- a/metricbeat/module/kubernetes/state_replicaset/state_replicaset.go +++ b/metricbeat/module/kubernetes/state_replicaset/state_replicaset.go @@ -19,9 +19,11 @@ package state_replicaset import ( "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/common/kubernetes" p "github.com/elastic/beats/metricbeat/helper/prometheus" "github.com/elastic/beats/metricbeat/mb" "github.com/elastic/beats/metricbeat/mb/parse" + "github.com/elastic/beats/metricbeat/module/kubernetes/util" ) const ( @@ -71,6 +73,7 @@ func init() { type MetricSet struct { mb.BaseMetricSet prometheus p.Prometheus + enricher util.Enricher } // New create a new instance of the MetricSet @@ -84,6 +87,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { return &MetricSet{ BaseMetricSet: base, prometheus: prometheus, + enricher: util.NewResourceMetadataEnricher(base, &kubernetes.ReplicaSet{}, false), }, nil } @@ -91,5 +95,18 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // It returns the event which is then forward to the output. In case of an error, a // descriptive error must be returned. func (m *MetricSet) Fetch() ([]common.MapStr, error) { - return m.prometheus.GetProcessedMetrics(mapping) + m.enricher.Start() + + events, err := m.prometheus.GetProcessedMetrics(mapping) + if err == nil { + m.enricher.Enrich(events) + } + + return events, err +} + +// Close stops this metricset +func (m *MetricSet) Close() error { + m.enricher.Stop() + return nil } diff --git a/metricbeat/module/kubernetes/state_statefulset/state_statefulset.go b/metricbeat/module/kubernetes/state_statefulset/state_statefulset.go index 35bdec589603..38e4971d85a3 100644 --- a/metricbeat/module/kubernetes/state_statefulset/state_statefulset.go +++ b/metricbeat/module/kubernetes/state_statefulset/state_statefulset.go @@ -19,9 +19,11 @@ package state_statefulset import ( "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/common/kubernetes" p "github.com/elastic/beats/metricbeat/helper/prometheus" "github.com/elastic/beats/metricbeat/mb" "github.com/elastic/beats/metricbeat/mb/parse" + "github.com/elastic/beats/metricbeat/module/kubernetes/util" ) const ( @@ -70,6 +72,7 @@ func init() { type MetricSet struct { mb.BaseMetricSet prometheus p.Prometheus + enricher util.Enricher } // New create a new instance of the MetricSet @@ -83,6 +86,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { return &MetricSet{ BaseMetricSet: base, prometheus: prometheus, + enricher: util.NewResourceMetadataEnricher(base, &kubernetes.StatefulSet{}, false), }, nil } @@ -90,5 +94,18 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // It returns the event which is then forward to the output. In case of an error, a // descriptive error must be returned. func (m *MetricSet) Fetch() ([]common.MapStr, error) { - return m.prometheus.GetProcessedMetrics(mapping) + m.enricher.Start() + + events, err := m.prometheus.GetProcessedMetrics(mapping) + if err == nil { + m.enricher.Enrich(events) + } + + return events, err +} + +// Close stops this metricset +func (m *MetricSet) Close() error { + m.enricher.Stop() + return nil } diff --git a/metricbeat/module/kubernetes/util/kubernetes.go b/metricbeat/module/kubernetes/util/kubernetes.go new file mode 100644 index 000000000000..2a223a70c85c --- /dev/null +++ b/metricbeat/module/kubernetes/util/kubernetes.go @@ -0,0 +1,276 @@ +// 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 util + +import ( + "strings" + "sync" + "time" + + "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/common/kubernetes" + "github.com/elastic/beats/libbeat/logp" + "github.com/elastic/beats/metricbeat/mb" +) + +// Enricher takes Kubernetes events and enrich them with k8s metadata +type Enricher interface { + // Start will start the Kubernetes watcher on the first call, does nothing on the rest + // errors are logged as warning + Start() + + // Stop will stop the Kubernetes watcher + Stop() + + // Enrich the given list of events + Enrich([]common.MapStr) +} + +type kubernetesConfig struct { + // AddMetadata enables enriching metricset events with metadata from the API server + AddMetadata bool `config:"add_metadata"` + InCluster bool `config:"in_cluster"` + KubeConfig string `config:"kube_config"` + Host string `config:"host"` + SyncPeriod time.Duration `config:"sync_period"` +} + +type enricher struct { + sync.RWMutex + metadata map[string]common.MapStr + index func(common.MapStr) string + watcher kubernetes.Watcher + watcherStarted bool + watcherStartedLock sync.Mutex +} + +// GetWatcher initializes a kubernetes watcher with the given +// scope (node or cluster), and resource type +func GetWatcher(base mb.BaseMetricSet, resource kubernetes.Resource, nodeScope bool) (kubernetes.Watcher, error) { + config := kubernetesConfig{ + AddMetadata: true, + InCluster: true, + } + if err := base.Module().UnpackConfig(&config); err != nil { + return nil, err + } + + // Return nil if metadata enriching is disabled: + if !config.AddMetadata { + return nil, nil + } + + client, err := kubernetes.GetKubernetesClient(config.InCluster, config.KubeConfig) + if err != nil { + return nil, err + } + + options := kubernetes.WatchOptions{ + SyncTimeout: config.SyncPeriod, + } + + // Watch objects in the node only + if nodeScope { + options.Node = kubernetes.DiscoverKubernetesNode(config.Host, config.InCluster, client) + } + + return kubernetes.NewWatcher(client, resource, options) +} + +// NewResourceMetadataEnricher returns an Enricher configured for kubernetes resource events +func NewResourceMetadataEnricher( + base mb.BaseMetricSet, + resource kubernetes.Resource, + nodeScope bool) Enricher { + + watcher, err := GetWatcher(base, resource, nodeScope) + if err != nil { + logp.Err("Error initializing Kubernetes metadata enricher: %s", err) + return &nilEnricher{} + } + + if watcher == nil { + logp.Info("Kubernetes metricset enriching is disabled") + return &nilEnricher{} + } + + metaConfig := kubernetes.MetaGeneratorConfig{} + if err := base.Module().UnpackConfig(&metaConfig); err != nil { + logp.Err("Error initializing Kubernetes metadata enricher: %s", err) + return &nilEnricher{} + } + + metaGen := kubernetes.NewMetaGeneratorFromConfig(&metaConfig) + enricher := buildMetadataEnricher(watcher, + // update + func(m map[string]common.MapStr, r kubernetes.Resource) { + id := join(r.GetMetadata().GetNamespace(), r.GetMetadata().GetName()) + switch r := r.(type) { + case *kubernetes.Pod: + m[id] = metaGen.PodMetadata(r) + default: + m[id] = metaGen.ResourceMetadata(r) + } + }, + // delete + func(m map[string]common.MapStr, r kubernetes.Resource) { + id := join(r.GetMetadata().GetNamespace(), r.GetMetadata().GetName()) + delete(m, id) + }, + // index + func(e common.MapStr) string { + return join(getString(e, mb.ModuleDataKey+".namespace"), getString(e, "name")) + }, + ) + + return enricher +} + +// NewContainerMetadataEnricher returns an Enricher configured for container events +func NewContainerMetadataEnricher( + base mb.BaseMetricSet, + nodeScope bool) Enricher { + + watcher, err := GetWatcher(base, &kubernetes.Pod{}, nodeScope) + if err != nil { + logp.Err("Error initializing Kubernetes metadata enricher: %s", err) + return &nilEnricher{} + } + + if watcher == nil { + logp.Info("Kubernetes metricset enriching is disabled") + return &nilEnricher{} + } + + metaConfig := kubernetes.MetaGeneratorConfig{} + if err := base.Module().UnpackConfig(&metaConfig); err != nil { + logp.Err("Error initializing Kubernetes metadata enricher: %s", err) + return &nilEnricher{} + } + + metaGen := kubernetes.NewMetaGeneratorFromConfig(&metaConfig) + enricher := buildMetadataEnricher(watcher, + // update + func(m map[string]common.MapStr, r kubernetes.Resource) { + pod := r.(*kubernetes.Pod) + meta := metaGen.PodMetadata(pod) + for _, container := range append(pod.GetSpec().GetContainers(), pod.GetSpec().GetInitContainers()...) { + id := join(r.GetMetadata().GetNamespace(), r.GetMetadata().GetName(), container.GetName()) + m[id] = meta + } + }, + // delete + func(m map[string]common.MapStr, r kubernetes.Resource) { + pod := r.(*kubernetes.Pod) + for _, container := range append(pod.GetSpec().GetContainers(), pod.GetSpec().GetInitContainers()...) { + id := join(r.GetMetadata().GetNamespace(), r.GetMetadata().GetName(), container.GetName()) + delete(m, id) + } + }, + // index + func(e common.MapStr) string { + return join(getString(e, mb.ModuleDataKey+".namespace"), getString(e, mb.ModuleDataKey+".pod.name"), getString(e, "name")) + }, + ) + + return enricher +} + +func getString(m common.MapStr, key string) string { + val, err := m.GetValue(key) + if err != nil { + return "" + } + + str, _ := val.(string) + return str +} + +func join(fields ...string) string { + return strings.Join(fields, ":") +} + +func buildMetadataEnricher( + watcher kubernetes.Watcher, + update func(map[string]common.MapStr, kubernetes.Resource), + delete func(map[string]common.MapStr, kubernetes.Resource), + index func(e common.MapStr) string) Enricher { + + enricher := enricher{ + metadata: map[string]common.MapStr{}, + index: index, + watcher: watcher, + } + + watcher.AddEventHandler(kubernetes.ResourceEventHandlerFuncs{ + AddFunc: func(obj kubernetes.Resource) { + enricher.Lock() + defer enricher.Unlock() + update(enricher.metadata, obj) + }, + UpdateFunc: func(obj kubernetes.Resource) { + enricher.Lock() + defer enricher.Unlock() + update(enricher.metadata, obj) + }, + DeleteFunc: func(obj kubernetes.Resource) { + enricher.Lock() + defer enricher.Unlock() + delete(enricher.metadata, obj) + }, + }) + + return &enricher +} + +func (m *enricher) Start() { + m.watcherStartedLock.Lock() + defer m.watcherStartedLock.Unlock() + if !m.watcherStarted { + err := m.watcher.Start() + if err != nil { + logp.Warn("Error starting Kubernetes watcher: %s", err) + } + m.watcherStarted = true + } +} + +func (m *enricher) Stop() { + m.watcherStartedLock.Lock() + defer m.watcherStartedLock.Unlock() + if m.watcherStarted { + m.watcher.Stop() + m.watcherStarted = false + } +} + +func (m *enricher) Enrich(events []common.MapStr) { + for _, event := range events { + if meta := m.metadata[m.index(event)]; meta != nil { + event.DeepUpdate(common.MapStr{ + mb.ModuleDataKey: meta, + }) + } + } +} + +type nilEnricher struct{} + +func (*nilEnricher) Start() {} +func (*nilEnricher) Stop() {} +func (*nilEnricher) Enrich([]common.MapStr) {} diff --git a/metricbeat/module/kubernetes/util/kubernetes_test.go b/metricbeat/module/kubernetes/util/kubernetes_test.go new file mode 100644 index 000000000000..c04f0ab4f591 --- /dev/null +++ b/metricbeat/module/kubernetes/util/kubernetes_test.go @@ -0,0 +1,135 @@ +// 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 util + +import ( + "testing" + + "github.com/ericchiang/k8s/apis/meta/v1" + "github.com/stretchr/testify/assert" + + "github.com/elastic/beats/libbeat/common" + "github.com/elastic/beats/libbeat/common/kubernetes" +) + +func TestBuildMetadataEnricher(t *testing.T) { + watcher := mockWatcher{} + funcs := mockFuncs{} + resource := &mockResource{ + name: "enrich", + namespace: "default", + labels: map[string]string{ + "label": "value", + }, + } + + enricher := buildMetadataEnricher(&watcher, funcs.update, funcs.delete, funcs.index) + assert.NotNil(t, watcher.handler) + + enricher.Start() + assert.True(t, watcher.started) + + // Emit an event + watcher.handler.OnAdd(resource) + assert.Equal(t, resource, funcs.updated) + + // Test enricher + events := []common.MapStr{ + {"name": "unknown"}, + {"name": "enrich"}, + } + enricher.Enrich(events) + + assert.Equal(t, []common.MapStr{ + {"name": "unknown"}, + { + "name": "enrich", + "_module": common.MapStr{"label": "value"}, + }, + }, events) + + // Emit delete event + watcher.handler.OnDelete(resource) + assert.Equal(t, resource, funcs.deleted) + + events = []common.MapStr{ + {"name": "unknown"}, + {"name": "enrich"}, + } + enricher.Enrich(events) + + assert.Equal(t, []common.MapStr{ + {"name": "unknown"}, + {"name": "enrich"}, + }, events) +} + +type mockFuncs struct { + updated kubernetes.Resource + deleted kubernetes.Resource + indexed common.MapStr +} + +func (f *mockFuncs) update(m map[string]common.MapStr, obj kubernetes.Resource) { + f.updated = obj + meta := common.MapStr{} + for k, v := range obj.GetMetadata().Labels { + meta[k] = v + } + m[obj.GetMetadata().GetName()] = meta +} + +func (f *mockFuncs) delete(m map[string]common.MapStr, obj kubernetes.Resource) { + f.deleted = obj + delete(m, obj.GetMetadata().GetName()) +} + +func (f *mockFuncs) index(m common.MapStr) string { + f.indexed = m + return m["name"].(string) +} + +type mockResource struct { + name, namespace string + labels map[string]string +} + +func (r *mockResource) GetMetadata() *v1.ObjectMeta { + return &v1.ObjectMeta{ + Name: &r.name, + Namespace: &r.namespace, + Labels: r.labels, + } +} + +type mockWatcher struct { + handler kubernetes.ResourceEventHandler + started bool +} + +func (m *mockWatcher) Start() error { + m.started = true + return nil +} + +func (m *mockWatcher) Stop() { + +} +func (m *mockWatcher) AddEventHandler(r kubernetes.ResourceEventHandler) { + m.handler = r +} diff --git a/metricbeat/modules.d/kubernetes.yml.disabled b/metricbeat/modules.d/kubernetes.yml.disabled index c78dfa15d472..1d0746905429 100644 --- a/metricbeat/modules.d/kubernetes.yml.disabled +++ b/metricbeat/modules.d/kubernetes.yml.disabled @@ -10,6 +10,8 @@ # - container # - volume period: 10s + hosts: ["localhost:10255"] + hosts: ["localhost:10250"] bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token ssl.certificate_authorities: @@ -17,6 +19,14 @@ #username: "user" #password: "secret" + # Enriching parameters: + #add_metadata: true + #in_cluster: true + # When used outside the cluster: + #in_cluster: false + #host: node_name + #kube_config: ~/.kube/config + # State metrics from kube-state-metrics service: #- module: kubernetes # metricsets: @@ -28,6 +38,8 @@ # - state_container # period: 10s # hosts: ["kube-state-metrics:8080"] +# add_metadata: true +# in_cluster: true # Kubernetes events #- module: kubernetes diff --git a/metricbeat/tests/system/test_kubernetes.py b/metricbeat/tests/system/test_kubernetes.py index 0c9e6b792c40..75f94dbd3317 100644 --- a/metricbeat/tests/system/test_kubernetes.py +++ b/metricbeat/tests/system/test_kubernetes.py @@ -53,7 +53,10 @@ def _test_metricset(self, metricset, expected_events, hosts): "enabled": "true", "metricsets": [metricset], "hosts": hosts, - "period": "5s" + "period": "5s", + "extras": { + "add_metadata": "false", + } }]) proc = self.start_beat() diff --git a/packetbeat/docs/fields.asciidoc b/packetbeat/docs/fields.asciidoc index f5c109086ce4..b1394c6bfb57 100644 --- a/packetbeat/docs/fields.asciidoc +++ b/packetbeat/docs/fields.asciidoc @@ -2518,7 +2518,7 @@ Kubernetes pod name -- type: keyword -Kubernetes pod uid +Kubernetes Pod UID -- diff --git a/packetbeat/include/fields.go b/packetbeat/include/fields.go index 387b2af11139..004cba6f6fa4 100644 --- a/packetbeat/include/fields.go +++ b/packetbeat/include/fields.go @@ -31,5 +31,5 @@ func init() { // Asset returns asset data func Asset() string { - return "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" + return "eJzsvW1zGzmSIPy9fwVCz0S0HA9J2W6399Zxc3caSe7Rji1rJHlnem42aLAqSWJVBVQDKNHsi/vvF0i8FOqVpEi73bHyh26RrMpMJBKZicxE4rsxuYf1GzIDqr8jRDOdwRvyJ/spBZVIVmgm+BvyP74jhJAzwTVlXJFE5Lng+B6ZM8hSRegDZRmdZUAYJzTLCDwA10SvC1CT74h77M13CGhMOM3BIp6YP/HbTpzm390S8AUi5kQvASkkCnjK+AK/yMSC5KAUXYCakMvoKXyNqQBKgTYEmt8TwedsUUpq0JE5y2Bkvjc/Uk0eaFaaN0mpIEWYTJuPXOgYGL5ClkJph8k9fycQVY2OkfkNv/pkPn4KcASOuJ+uSZtpHuNmxgXaqCISdCk5pGS2RlSiAIOGL4haKw05EZyslixZVoRHvJMl54wvOqjRLIdfBd+CGv/kl6TmAaRigm8mxj3oxQrFGSd/AdyQAinRS6asKE/qonv0v8xQlKZ5ceSAGll/Q1KqPR8k/FIyCekbomXpv5wLmVNdew4+07wwS++0XJRKk5ev9ZK8fP7i9Yi8ePnmhx/f/PjD5IcfXm7HXSSJrKwgg1uGZoFISIRMyYqqanyNQWm6UMNYTuWMaUnlGp+13EqoUQUo7wVIO1GUp/hBS8oVTXQ1H5ZPDcRWO9T4KGb/CYlfa/bD1P5yD+uVkOkwoUFXlQpktaaMgrLIGhSAlELWCFhIURbDSC7MS14DJhajkV+apsw8SzPC+FyYlZ1QhfoL8aiJFwanFT1AT41TZuF7T5OGzzr6soesijQHZ9JCkIi0DT0TfLELdAOkDdrAaoGuz9lW0K2YOBOVZKJMKxt1Zj6SQooHloIZpqYp1bTbbL13v5K5FLmFFF5VZq4qFUTTdIoPTD1I82QCSgnZa8XMoxN8a+LBNhc2JBtW71Vk3uoUTsi1UIoZwUWbpAiVYACOyCKBERGSpGzBNM1EApRPemljXGnKE5iyDUvn0j1ILs89ScaIkJwmS8abS7cLw2bLFHDEdn07LO6BaSRngc/65SSHlJX5MPb3FgSK2G7InZvDMqbX08jkBQpKNQaq9PhFskGRRoAIWkRWWTumLDlMVWZuQORQN4ZZDaS4X8aftxc994qh5SchFhnYldaPXcJio6m9wWc2jc8t9FQk97h+3Eo/9587gNvfiNJUG/WbZZAYm43L3P5m1qxaCqmn1gK8IXOaKTNplCdLIT2+cVjl39WVsh9yIIt02oc+Pe5sAsgJS/fTiR85+6WECiBhaZdWD+jyLvOxE8ZYLhCc904dAcaRmJUs00TwIVIiZfBISs4CTgNrCFdGZ5CpFraaL0GG/YkNtFwiJyyeILRGmCuR/bP91AHk0jgDkaAaK9dSPZVsmu83SqbDvZtc7j8nf3bbivZsHEjSrYLoEHIqkyXTkOhSHmAMNXDkGCaLCfn8315PX78aESrzESmKZERyVqhnbVKEmhQZ1cal34+SD7fEA3I0JMC1UCNSzkquyxFZMZ6KVQ8R9R3P42lwcDpxzGnOsvXeKCwYN0gJ6ZLqEUlhxigfkbkEmKl0aLSsaJFQ+2oA+zumtFFol9djmqYSlALVRpDTZL9BejRLKtMVlVAhG5FSlTTL1uT96VlMg9cj9+UMJAcNqtImf4m/60Bb/R7c4LpPWwElsS4ZNovVSxsVUI1ospMaKkR6APMQcaAQqdVtnajKfVVThOlapOTj5XkbkfmvKmhyuEFVENvIzA7soBw0EHtYuK1x3Q6RhUZyWrQxUc6FxvjXwdBFILtxHtJhifAmNd9lCO0BXLZOvBau30dj5DbaSPvPnVDvlqCgEd8gVsPMRGnDm8AfmBQ8B65jF9+PJAoAma3qPBMr9BwTWhiLm056tIoC+RAc7i3jwvYdG5TCv1P8OiKhsZFJMgZcT/fFxTjTzIULh9CZd1iyY7A7EwuW0My//LjRHQbrtuNkG8JmBtnlNXEGcJfZs++HEKrQhhi/sLuHvz8xA8PehR4JNNtIzWUNvcPs0xzxWmKKYGzq83pkN9S4iAKcxIc/MbAu2YJxmjmWRMOt3J+3QpI/391dj3BX4mIINrsRcQc+a0mrTTatBVYDLAOHLIGmIEfGC0lhTstMk09/H78VckVlCqn569Ok0ocfeWYQVEMxI0yZMoDTEWGa0GxF14osqRk5hsJGGGZmZu+kkyVUtgJzLGH+P+GQuOCWX44Lqjl759tI0wJE9xQaMfoJxOU1RnwNxCizYF+e7OwfZSKhusuxX4CYFoLx2A6GuM//ycxwfnwxIpmh7F//73bGoxqBR+vJj1npBYfc1WYqpP9qIAXP1oTNyVqURggYB0JrDyy1LtSbk5PVajWBjCrNkkkiThYlS+EE+In7ToHZpZ0UWblgXJ3kVGmQJ6VifDFmfAFKj3FiJkudZ//bDuLau63/QVBiClZAxmycrTJPByCjTcAlfuOYGdxnYt/7D2MGkXTyTiyUpmrZLWqFkHqz6sroGiR5RczTURQvsYvpcNoLX9yOpPCoIUSLRGSYFA3hjpgGo/C40EQVkLA5M0tdLyHKFSUFipdSZQ4hGFBFW9OiQWYVFB6iMIr7xkr1uKb7rDp8v77967sRuYGUKYy233x8/8z8/8j4Mkdxbsd8EdRKI/lXo/JAU3sIK2kA7uYabEVCp0Dvh2pb70NCBlRtIQVKzLXZoPs3YttvfB78f9v0TiIgTPnsp42N5jnThKVGPChRkFOuWVKFVbwXjoIyxdRs5YofvTW+8YX58qjbId/GHUcHm2kF2bzPtT5Smko91SyHx6Wuf/7555/H79+Pz8/v/vznN+/fv7m9neQsy9g/muvz5fMXP46fvxi/fHX34tWb56/fPP9x8vxfXvxjiyXKcud+zJlUmhQ0uQcddAgO07gCMwBOFEBTCo6Myv7djDEXShMJifHOnNBDuvOY58bJ2+Bf8pQl1GwQ2dzVBjCzF1faf+KIBxUzwjO/Y3RoVNUTBHASjHIyu2vCuAaZQ2qWqCVVafOn8QGadGZitUUWUoM0+K1Ep2RGDU8EN5LPwSrsHDR1K4CnlVNbw/aQ0Q0JqkvOQeIU/Pu706vg7KLRYpxw0Csh7910NMGLUoOcbkZyC4kw3uquuOo7SFHKsJXbukzhWooCpGZQbW8QTpw76K1EqIVDB9zHWwvy/elZGBRVhDl5w2hkbSUb+Q2inZRSGulD0WsHSbaN8FYTeXn98MqPcmdyajA3kjZ9nJd+9Or55F9e/Dgi4395NXn+4sXR3l46K6Z2xJ/iHR6+UfnpRGnJamUeJK5cwb0/1UyXKeCaygRf2E8KCio97ygaO9rBELsetp2x1qp41MTVQG4pU57Ob2b6AkGbJ7EG0k7oYSeRFQ+vH7HkXn+lJffw+rGz9jrM2utDLbqH19/Sstt23roW3u7Tt8/C+4YmMSLpG1h80e5w0yTa6cINIi/zGcjD2VysqmlPTORtbCDuAyZqyIrppZcrLcwLmnFX22w8uxyoKiXkcUiOdDgkMW0c9NR5SFMtdHB667Q2yhk3kIsiYmB5Toq598K+6yVittbwZUlADN813EDDxP2dwHgqDukJnkdwvyV3MB7vfyGf0Az7mzBN+3iEu85dXUnvIFvfrlu4aR6/XafwKy68b8ipQGK+mcW3n1/41ZffNzSPEUm/+RLc3jWMjfC37x/G8qWFdxef/MNt/cMYL0vyYnN09ez9NWFpiDviZxthjeY7KlJyEdeNgO1ZRpqRu7PrOFLL0pD9wFxKK/txF+Xh9k2C1AolWrmQuivNJMTH0zqTAhuD6asl6CW00ptGKTA+EyVPyTHkTLtFZ8s7nlVMk0bxtZ+rageeTci/29M/Lt/EuHtrQq6Er7AIC6RwR4am9shQ7MwzHn0QpW4EmDXV5YYzgHiqlC2WJIMHyNwrHelUqx1XdG2WdCLyotSABR4Bkj1km0IBPFVEcJ/0w6TxiMzcdEpQZaZd5UcOlMcWk3H7vlFVVdoQIfSkYjey6MNfog8X0cFA8/nWluY0vz6zpTX26xpLc9BLsWHV3LnsIeXpyQPI2Yl9qZOpVaUOFsswVfOS3IuYRT3+6eJuRK4/3Jr/fryz5TJKEMGf2TKf27++i4EQg5oc3168uzi7GwWQH6/PT+8uRuT84t2F+X8FpZV5reUnhlLbrrzMv2EzvEhKvHwkzEEqokXHqAM8Q/jHm3ekoHpJysIImzW0ShOVUbUkxyfPLICQ2mfz8BpT5NNJqUCqkxefRjWogbrqmU8WkNE3RluqUetBvS7M0LJ1bVo0njzFAxN1n4ELTeYsy1x9BM2yGgfc+fkam81AH6GtDFrkUVNJDXHZs6leKGbkpsaC6tl4oObRe1iP7TJXWkj/dLV67Vv30MwR/lKCXNdiHFsd+zWDxFexDQFZljk1A6SpPfmLyd14mMw4IIbnYdZm1aQpYVaT8dwydg/k008Xd8SJytTWAv1PQ+wftXELLVRXLcJqR9WbcOwCM+YXq+gQojEh0jLOwWtOuqR5vcI+Ogw8wA0jIoAunqQ5aJCqPs3GmlJpCxiMqjBmxQw0er4293dLyeZ6fHN91ny7esOOS1fYG4Phojot0HdE07VzsKCu0dHCA/rOnsf1Z/5URSh6hPjwszLTHpkLDbKQEIoqJV2hLDuIcfWeM7VLyIp5mVnHWIpyloFaCqHtsUzn1Ei6qpyZG/zQrA9suy0ef7wakZaeyg3HzR2lwMyaeSrYxcaS9RJCld0AODu8YtH5qmNaFBlzOyNbmCR4tnZ6dcY4lesKfgAvyorzEgoJCriuba+6BUSCKgRXcPCRWrC/9VBrjnC8wYn84ffR1+Q48o7Vs1084xg6kZDZAirRVdTULXGWY5pt02tkZcxXkonkHmtbjBrUQtx7/y8DDUPVVMZzg4Sp4DkTrLhRGJJQ9fJZ3DnVNylFOe0j08A+u/64M1V9uOy+jm3RY6SxU2vKArkSOvZ+FPsVms5NWx6dZiMZ8IVejnAP7fc+9juP5/KaRMrP7MlsXXYXN+0XvgDKJR7aozZ7hscP24rT72vcKVeRYLXe3FDhhfJG78F4WM430b7O0dX5o+dHFuwBeKUlKjhOgQUXJVTT3nx8T44l0GxsfIhxLjjTQjK+eIZ7p4RWez2aKUGW9CF0kTDvW/RjLcaOELMHKblnOjaROb+6jb21gNtXSaZMJeIB5HrTSk6kCCu5K7pwEBb74FUj+qCFMeSgjHfK1NIOoSZslvk7KKbe4WSCpgcdi1Hl2EsLB2HAY4epplgESNuKB7Ote3J6bwTRmEXGidBLqDiTGAffWMsVZNmjOZKK/JFMueQDg7B7LwyudXMugDn/8L7BvUtONMg8KKa//UCu6ANbWMG/Y7lxD0+vL7u3mymbz0ECT4DMQK+MJ/EpFfmZnah3iOOCp5/MVjm82HriVlOJfr5zB2j+SxE5AKfv/3rdsvTmS18sn7iSTd/PqNuCO6hkp4MnEopsPd6zSRDSipCwU5CZAcqtbz4iiuUso9J8udS66MYYovqvnr9qR6DtK42WSI84NXlnPEb4XGRRmB6p7Ih6JxlVatxxjnh7trylLDNoXKQGIXZgsj8fFNXleQce+JwsKT9ksxAPcQDZ+ABNohwo1yeq+iEIzZzyEN8kta20UuyhjX4mRAaUb4f+cm7b/6UCQziJBKqroZ/8UkLZxYC0cVRuL9xh4+bBbsYPn5OsPNzoAwW8gkz6cNNSi3EKxt8+DPYIoEVqPZaSYw/GrtPy4xVlbW3xKOTRMU2MIBkpsO5t2F/ZZdelRQRXZW48L7rlSr5MgWs2Z85ZdG4BAhkZj46l6Az7FpIudWeEgUPWJYeQMeO0NSjYVcHcBSaMzaJacEgxPOwQj4Ol8viIpotOZYeO/TgRJW/Pz270VFuPEABybEEZGbkj6jhpMyC/ghQ1b9D847DK1uMUkoxKSO2LXUo6TORhCfdg0T2hvQtKilIzvhjfw559WVywzQOMwrGkvnxocn/w1ZMKsGFw+FxAoglN7rlYZZAuXNRiHsXyusnKRFJLsB54WSvgaSVMbnHHu4slrVc8FKXfZugl5F2FKvOx1VL7EX1udZ8/Ztur+Nh8DHmh21KyDzaE2IEMpXVPj8wvVrtLZl75qWoZx+ruYSlCBJHUHESndvblc5XodRELCKGIcB6rkPDARKmyNQlYrawwVQNm9voct1nhXHhbH5aZZsW+fsJptZICxKGVROWi9GHIOtpdmq588BUAURfUABmdL8sYJXJvItWEnNlYu5jXYD1QaXhaS4PV+ER5SrWQe0p2Nb8BoNeFXaspd8fc9kN643ynAC4YyW5DYzaOB/Cb31++v6hCCn2+s9lVneCOqJ8W4IlI68Vr+9LjQXZwwMXvNovm43v7eTNoUbnkEiY0hzyovGuXvNvmSfBxAVIxhUw4foHny+NvXj7rKgaTTEjWodW3dzv8iD2oEXlulua/dkqgxPQBE7xrU7rTgE+jyG4Et1L0XVtvt90Xe6J21YtauNCEFp3bpILJ7urDR0lUBS8Eb+LD+KTDFT4kj72xGuRvaB5+mCEHcF2o9tdiHsu6cNUGbSwYL9yXjWdmY298Yuwjzrq8K1oUh0MTJz0Qm2/cRZWiPJU0ihCe+e9aYcLwC3l4dfLDbgHDGBPZfMLkMkqYVxV4FQFViCCt0j8OUH/4Mc5zdxPRIqSFcttq0bZl6ce4GWsz0TREQUxFu4dnnZKOUtEWMR2XGjRr4dqI51nV9b+Nti3FnZjfGiAovGsMoQrXyUnWWsQ2USstgeb74ianFo8rELRAzeLBXR31Xa8UFhlW8+SVIhYg47bPv0j+7ip4yKKkknINuJNznn/1WCOpaUdNY8g2xPD3fg6IpnDtPPpT7i/OcOViloaUKaNPSrMNtdsmmuiSZu0rAZok2UTqXnJ4imU2C5BVJUSof6+laWciXfu/7RweU/cHUyRjOXPlCi9/fP3+T4Rx9/6zSedKjovGtmFmu0bgr+9citYGiSLRwXIBv9g73ZNayQrZXWnVdSP5WlrLCa+DN/IyXtqOyNh8iahwgQyune+Ve/xJyT0puScl9+WUXPfJElsP/7iVfw6askxFrlq4hsmC3XVJN3z5R01vTR2VWTsu0Ri/WPWv5S4ObMOFqHXbNsOP6eFlPu2hiWwSqRZpN01hqtICBgdxv9qcBlM9s1YnMAdNB4nrY1qLujORFwL7MM39XPmu490kDHMwJvIe1s2+2d3E9gtVJ8kfeLYOXKNzDRKvqvopEzOaTTG8o6ZmhzTypehIhttVbqJat5pefn2So5r7jfT2GcK96L22dxXVq6ddba39AqU5mJLcVVpEj2+mPBHZtJlm66Z+YKm1SB9YbonIypwrosDd1+FOZPkaPop1xmmZ+HvihpZiPJLiHtZTB/3LDub6L2EUjKfw2SZnDRM7lV2DTLpgfDHFNm6Hlhh7GKWCbw9D21pRe1zEtpdcijJLjXvhDyr+9ePFzc8nF3+/OPt4d2FLeM1wSw/OxRm0ZPAAkbildk6j42Q2j86Unc9+azOgl3Yyci7JEOQsqpgJOgcHHbX46xCm4FYmS8jptFW8U6dtK2t4VzFFC+NcxqD7fantjGMvgdswsEVqW8R9L1eLx8jIg8geIB22iBuMzc50YTWm/WaG50HN7jFMq5lRR98wWUPW5DA0WVuxNUGt7MohKYqXgaIsJXQ+t5rWoiXHwKpjtYbwkQ3DGsQjMi855t+xKy9dLCQsjCYxEJ9tYrNcwOFGhdCMWrWq6ujtx6uzu8sPV0fYJvj0p59uLn46vbs4GlVZ2JAQHSaU16+i2JP5EFh2UmfXMBFU9noMOxPxgYNvjIC9lmmyDLywS/mYKgzDmA8d01glv6Cg9cR+nahHab7rm4vr05uLfXWeJ27K+piyM+Naes/jcO7I5fnwJEr4ZXq4bUDHQq4iDk/bgd+W5KftQJ36p+3A03Zg/+0AacT6v6w2DVe5+WpfR2XnlsD+e1KsT4r1SbGSJ8X6jSvWzpSGKotCSN3y53tq/MjmOr8WK2rtmsxWGK/BKAvXssreqx7o8EJoa8HdcUuf80pEbo9F0lpejHLy4dps/G6rDUTnaGmpl0Z6Wg3uyPaJnK6iZFe47rrCqAYe27nHjr3+C8khWVLOVG6GUaqWfuu2LbVDcS2JHJbXrtCYs33zErsIUKVqQbLL04pmIY2Mlgp6MmQrKo3i686Ob1kLgI0kHG4Pb2Sr30WSlNIeNvqb/QX1PV5siBa6k6j61Rk7TTY2RCNFiWcKGpJ56nO/mIlF+iQkwB7cZR3VQWKsoibMRhhvLn66vL27uMHU42+R9GspUVucNpz62xDu3BL1XVTAj/WneGzL0GH+hESzB8DS0I4II5mLLBOrah4aNwdyWJ1IyMUD3rmUDowl6rl8OCbi/a2sGAic1FtI1rFuk/fuRmnAfrVgtZPr1GVxo7YmFhHxB1DbsJ5C1k8h66eQ9VPI+guGrHusf61hZEzLRutfuUe+f4K/JAwd8aqZ0F2j2qhZo0U5ce9jQ4bYktF60zSExUeuNyduKrk/3A+FFeFcyKo5SU7XDt6uvkSj50OdN9sWBEajcmPvqqzspSFXXVh29ilqLHwUIYdwrCpKdHTP5U5kOMu6v6X2Jtq3hrBtNdovbmOWJdB0mghuT0UlzULfbXnVorNtoCMkrsmtoz8KSWjJFgt7yDNeFh1MJY2TDaw7bUV2LhUbCqoYp0w1N/c0M7sCPPqEbm57oBvIRwBfnHYJeAbGkb8CCeSei5Vv42RHgbuvOPG0pKk/iesvUDxWjCeo9koebiiu5qqqtAiT+Wzj/OHO6mvN35LiDaTRkfi0o2tiH7GzTCT3zdYGX3TCVkuhoHmCnzAV5B7DJMkSg0a7Ct9KMg3THg1JHrXyz51jV3PLccNvcLmFznLj3pWbuJ1STaeORYMEtk8J9xN4qbHhtU+xIpvdsqCKUHXvWn1hrsCsALeXrbUB6KL20LsJ1PZh9+CrnSnDxsbOhdtA0kF3EgegR+lcHzCD315AJbdqrdaXqYsSXuZTQ3sp4WBu7ZbGAz4XIBm2OqPE0WD2ZahHISmrPrpbqSTP+oNOcxwl3G2KqVygQjkcV3fcLfST7Q9+pjzuCnt+dds67Hl+dTve6YRnyuuNpLfpCLdXHzIzSedXt/6akeoYMgldg1wwrZBiIWluZW8BHKS/8bsG0KYSEG4EjCmSiIJVDW47PN3qTMq0sfHYgv7qDIptaIfelbu53jUyZxxr40MP8mgbNmnAZD4FwzBq7FkgJFswjjFu3/1Hrl1CCQfHuB1eDVzX8bHQzQGTOW0eYI5yQku9FJJpqvduC3aKXMJQuGWLPSfl0xNRnNVlKhhuaT0F61YfJmy2KHLKuF3kPjvlfHHVc4beDkxCUuIxsWnw/b7E8PzdHw7dg98luFQSjjH4npb2GlReNYLdYigpKLZ3P5sN8+TyCfZqFBVnlrQgRSlVCY27juyIAwey9YTc9LPD3xHTO9yQnZoav+YLy6QnM7TA5YqleCFCpEFqIAN5vQNIlpDcM76YpkyZef9K84W44gmrQTGaluKhTmwYV+tN3szN1oejZcnxxqhp7ynXQ40H81c6XPv/44uXzQ7SRbbGPWFD/dlDbAMHcwf1vdfw7jKbpJG4CZr06sPFzc2Hm86uV1YbNeKfG6xKrNxmYLhgZoJhi9p5FW22rWjC/QZc8HEhGW97zMmSSprgHQzHM8jEivzwEmPNM/EA5MXL17ZrrtFCZqcWPU4lVAcZGxtcqgiohBZgb+EnL577s4+KHP/z/Pz82YT8iSb39r4VjFOm5JdSYMhSgn+5YQDpTI1IQqVk2HsOZ1DZJHXGOJA5QGrfTwR/AOlSPP/UI/JPOar11jX//slr2bvO6VutVpOFEIsMJonoaswWprGxzWxnh91mUUIiZKoak9eF+/T09HQAYTOJ3sJoM+JivhvWy6sBnKCzdFpkpZoKPjhawCyHDR4VYxsSc6J7DHfvzp8RA4UIDjYqnNEZNE5j1+7fwZDZ3bvz//8FeslHcyEmMyonC5FRvpgIuZgcGUtxFH/R9J+AhAq5FDTIPGrfe/fu3FVp4P0hlBPIZ5CmgF6UD5DXAFpg5uml1sWbkxPs4peocj5nn5GCLv7SnP5qZk9Myvuu3jBcrbbqWjWkLTmhUtJ1fJUgJSnDnQI1viGeYrVbDcRHFPirfdzZ3tm65Vf1uhyO5lYR2GO8/jhG5O5I8rLrRlM5dJ9SriYO+Ser8uJkSoO8QUXbVK1a+Fyiqx+LSSEFSNSrnRPs/ujRF56YbdUFCllj5G2KOgl5//d+9NsrD2Pk9iCiS50EHuhse8GwDdu5BvlAM0OCax0f3QnRnKacrskMSEKTZcM+zWButA6LY90pUwmV2Oz9HyCFv/YgB8orzwk5Yd+p++RCV6gm3Wuglw8Nn3WTB2BIcAnmKpZiRz5xlSp4453VWUz5N/DSvBo4l6JDWcP9op/0GGaY3Tb9bhvG4AvrqyowEjZ+XmH5i6Pq7gcydpji30hbVQQEjdUE2vMgirOQ+D8nbownWWlMVDPrWnfxBJ+zRSmD/15djjXMom9EY0YEfQWteXU7TMJvqzlDh9SvtuKqnqyPXHIVyb/RkqsI2LDkWg9+rSVXIf5GllxE0G+15CISvpUl9+SwRLz4vTototCTdlexlkhdGFFyz3XKytHzo27gabvh7IZYV9xKPr7ZsVSgjEjfXpz1DAQ+66kcClNdfNbAU6g6abpCrqYarIb1p9Pzf7+4ue0ZXJkWU8V+3e2WH9e4WsjvFfl4fk0Kus4ETe0dbseM24Dds6p3qdlPRzmsP9/dtS82Ml/ulsVyUMljW5QajAfqTtoaydYdTIc6/NWufO1E1XE9fChSim5jFXhpSO40yqT7ISqhlafwUz3+eHPZQmVY5g+eeWWFR2hA+9eRFViQGKp14kbmPvGlBfn0ebxarcYG1riUGfYBh/RTd5vHodaHBzkq1ObrKclpEbtXOBZa6FJCWmsY3nX5bRPa39DMu2HYxpKF77YYfI1ZBhgE9o9VLfy6KmwdCehImFmotQkLKUhUSutQD6rACIBux4cIOj15TlX3DJg57WR/4zauFmebFarxYtmuqWbXWtuy8+bQYuuoQm0Rjth6MgSk97qyGEuxlFTthMe+0YvpSmgyFyVvlvv8/pZKO31t/+21VlrQsJHpfmulBXO2/qprJZQ0OOvKkjy2rpdn79vW1c6S+Wm3XuAONtmpVGQLd6zRvxUJ62riWgil2CyDqbUvzaX7qvH5dZcGsbrFTWpLR2zo0n7adYV8993VXVh1V6P7Id8qvrHdnoTrhb3z7YwxbKu+evXtF2JXbzVO+OmRDPNncPs45qA/kmWRq10tuxxy3G3Vruy2X7WWn/8h7fZwexZfhIHstAD9SmrWym41he3NnqcjwCXMGJ/c329uHUpbyuSuzD+y16Qf1WDNw/Xp4xlVkI7IkVGBR/Z8KnzW/mshyZGrjbQ/YgE3fq4BbBO2YclkjB+AH5KurMIPiWohQy2n+0GRD1fvfh5cvfjcAWfHk2Rzwg5PFTwLz9UuyO/N0ZIjBdqeBluA7si9Ni7CJ6JIsGrUGFTc9dozmVis1o27EWKzfBtevgfg2UV0Ps9QgzJXDSOs9jy6YaQesJCk2b/Rl+xFjCds3mKRuz57V3uxv0hgTKW6dCauPfQL9uPVX64+/O3qaESO3gmaHo1qUI9utZBgfrSXwJm/zkTJNUjzp9lgm//fZnR2pmWGUG4+nkm6yswTTVhUK3y8TBJQ+OdbysxbePiw1MujnW3Ef00mNQfVJdHowEJeZGJNKPfepMKLMEECHrOpS7iT2y44ObMHy2quhNN4WLp1rKAO7JNn9CRMoN3afIoMQsDSdc9VeA9Pj03rZ/UeOfu+BLFxZK+pK4M2OO7irBlwN8F2NVuVuD+xTT0SDhgifHcctp9tvzUZMTOsI7+TD7YzIYhiM0N+W1I8U+gvB6fBAvW7XKvBsHB6jkdk3XVrlamqAcSdc9MIDlrl3/UY7DQ8zMrkHvZNZToorgNUHFFwo2s3BWox06rG/deqUVclzaqKzlq1b+BNdWy6BuG4NR29mq5Gd7PE9jFcjOJrbt5DERvjdep3INPO8z2s27zFzPn29GVMYVsgA6s2ycpYf2OcMRmyjT97cHICp3zHn5gUcszmPtQ1xCTM6ruAy55zWSX3XX4AQ5UdVrZ2WU3drXFl0H4Q4bZovJPJ+DMp1XTkbuLBLD9TJGfYG2F4M/H1h1nXSF94nE61dQ/wkVJmHKDXr4hLz/jhKtt9yqUn/GxuFDc3Eb8FhV6BbLciMJ+5SUZsivENaT68yfCtNdhOgV45O5LtNh530nOQcvBow7dMoWVhClnHQZ7dllli91KE8URi9OkkBfcXQfgb3S3GmWYdN8Ufjg6HwVmukF7d3VQ9gJwJtd/tvlVYLvSDcaroKIA/8hpngBZJV9NGR5093JIo1kJX0c3g3mYdGQ9AkclkcoQ55qNMliQxu2T73aBltQTbopFps9DoUe6IrT+xVSkMlfr3KqMzYnbOii3491swMAWlD0KNAYSBJsH3JImWWuSi48DnTnNqqfKwSI7N56zZsyT5nwJJBD4bjWtceX+RHRqwJtRW7EVpytPZ+uj4j8+fjciRysTq6PiPL8zf2BlKKfYAR8d/fPls5EN0Rr7cCdt5A0FQYxiUs7HbAW41u/k+Zu5aAScEWnMhdzWdByXLb127yNrNXsLnQrN8340AVozhxdlrX3wXau7q9rzF2TqdMeDLeX3q//sPz0lK1+7ayxo211fQdcw54mJlY2+QKSCsvuN055hnSmSlBvKRs88tmo9/eDmesUHGqQygmHbs/3bUWQYMUWC7QTNOcpZI4enwevb7TJbTxEYf7SvDeiN21w5kQRv7O2xD5n8LZ+0H+MUFHgdtUbPTYdRbW4GkJeoJ4mD6Xq6NpdlRa9yKb/pqY185sNlJ/6VkHdGHfUahB2JTTLlGSloC5mhQESMNgyEKtz2kalpytn/I5+z0lhwnIi+ohDHl6VitaPGs1s8hrOLBjdzXI8iyDeNQqHzOTm9tzpKURUp1o43Itloc/Z1D7X8MMKY0S7yXHk5GkwuaLAlwLde2C3h0PqCzXsbV6BwZcp0rhjAHkzPt4o/HZlm9Vgja3ReNeJchZOIFX4h0FifizTfns54yGPvrn3qqTQ1yBX7wLt+RZEKBUzT2cLotX3Kq1EEkKyajy4hxGEu2WIJ0XeRCup+Q43l8HvYTlmN+QiZ/8kXPn57Zu4aN2HkMrvMtVWQFWdZXtlNxhOxUONDsUTkwRc6QerqqJmy+Pb+N1/mGlbXARTjH3pS4ejImtgvxgdUm1fMyy85EltnzLFc7nb+3vcbDyy6Jsc1TqEZtQWtCNfBagNX4LnhSHp8MjkoDRD3lV7punqnQ5HjyLAhXDcHAmWr/fMA9FyIU6UaYZ1Rab6dvVP4wdovRNs51J27vWbGHrr0F11SkipulInG7QC2IyJkmY9ueH/so+SJB2xLCPxt5p2WGD5qRG5M9rqHD0mMrS9FRhTLTjd4XfaO9wVf3tC1VOUZOP7O8zPsGP4Ool0U3STfu94NFLSsCAkuLrIMjfkbeSpFvh+dvS5BhR5iUUvm7IKyPxVSA2cbWvMx/sJ/Iv91+uKokA4/LhNSH6pplUiuWR1fNqSXsYmDUkJBAwNY5qRGhGXYBtSe08lJpklOdLG19UkBdg2+nMxwxq8lr+yafa1frGHD6N8kfkMgR+YOQKciZ+WvJuB6RP8DnIqPM3ezwB8VpoZZCt3lpReotqv1bvGZlWz3fyVq8s1zFljCMzansIFJtjnfRUpmEbubj2cXAfVbvw02dWWk0O/W01LWsV4j+7na7BXnRIew7sulPbTbVW4NZSTPiYkF7ZVS9I5wbSbCjRQYa2mTZJw5GlENoJbUAORcybzZqeYu3bdQuHIq69jjPd0QU2DaaHy3ID37/pgIBtHbeNPgO7ykvadYeqtUXlzv4jE7DRB57M3f44Xp6c3H97md/oYtZx679Z3QdzorGuTRPrzeszv0Na6tIeh2tGr0feHJzfdZfgE0GPLPPrJcNBmYoVouOm1Vc6PDXE5pljzj5dX2Gb9qjXujW+Pht556gyNaPQ2LNw1ZYWhnzXuY4oPh8B6CdQ1Yx7Kgfu4HTA36qdK8+GYBmhLejrrrncP10ntGHfr1l8DRu/7EvdEmJhHRS7tj60QsJyO+VvfuApSMzhMQ4pUZfl3o5Ljn73IdxsQ9GXH6PQTkoQwG8jaKZPbNHpHbDpDTNd/OeT+WMaUnxktdwQhwcSSSnyZJxwMPGvmFmH2737KZD6XFpaxi4ezfadq/VL1m86V7f/vVd35bb/Lbb8U4PnuzWplQ197C7x9L81tbQHDobYnOy7u1sdYpRy870o78jZCrFap/Ybo0wH+s22G2J6LzMerfZgYYawKj5gliFQ9cZVRrVJPSoXMYVyEZr5M1kX17dXtzc+c6o21HN0q5OXRxWZvOAVEBqaO8gEnsmV/GWbam8vXh3cbaZymjOw1aqBk7MvWs80JrQ0NiQia9KIc76AH07bMHQsxcru2x9z1qFBqvyoCL35Hs1cHzKFvoeoJgsuhYkjibhCurF2z77tBUW4yJ3xq48Nqc3+Txu6Hz1tt3Q+ertLXl4dfLDbmf1LFyy51G9zVw21IWcgo/JWvnqYGnOuJDTvfEgmM3YNB0E9/CKnH14f/3h49V51MtZ067cTKtqekAIDOwKHob2bJ8ZxlvfR76Cp6UGyxjcLvd02M+tU9DwdL3kFYu6xb4WSi8k9Jvt6oHdbLdHtJswPkLbIKJ9tc0hfAavnK8Xh3IaOnVgy1WrZijSddv2f9lK3XVi6U8TWpgKHkDWi5c2A/Uv7XAA2DbjrX/39vTu9F3ju+vTq8uzL+QjzL95H2EvCps+gtMlElIW27Eb87lHjeBvu2kQD57spEEsma2DHVtlGuuVckhy5WNzQrt24J3tv3ZPotWRfckUmsUUOr+6udRLyeY6msw7/GJ8c33WM6PVA7v5KAHTbvPa6oSzYUZtLEUvRWrDVVGbm4GpDBuV87r6mLMMGv1xbAItAlu6XJ/CdJNRZEF11YOpH/QS5IopB+LyPGqC4WfNoOo5KGqmjiU7CHe8l49nzcIxRjOFedxk7/L8nR1xZ0TvMeurXeXTIMbMkQvIMhVKt6uZqkHcYgH6+71205koKfHCq+D0b1CrZ7an16+6LNafd+/a+wC31t7teL2LznbXnEvKU7Wk9zBNRF5koPe9suBv7lYMnOp3t4TDQmhm3dNw7VpllkJeRoFS7pkaPHTmsFud7QIPPJHrAhOqva0synzfUTjRMAOICLPEOwSuwTgpJDwwUSr/YB9JiGdqtVOLuJ2qZBxxfYRZBVPyFGSGmRqnEVGz4D1Fol4Ve8RS224hHu7lOZ431iy5B139bD8T+KyB94zW3koxTUBqe6oapiELfjjZcrd2WKPpc+y6uhRDizjaDYRpBVl93L7wwr0REdw/qiVkWbsx4C4Np9pb4iEx2MAR4lVtva+OmamwhZ6t4+CxvzIer2vQogXNeCMltzxLS2mTlaxLuuNBuUteIJ0mrFj2NZ5qlrZtMbh3rrzNgY3HwBSm75FCgYZ47qsMArFNcLcA2D9QvTk5Wa1WE0Y5nQi5OLEF9Jh1PtGZGlcmvvFx8nmp8+z/q3857mn7FbFF5Fj+XumAg7EorgKM0LhlX2OZo6fjJuetGGOgjw3YMUsbnyxburkQlEX3kDdeg4zldGbdRZCMeD+wtHIr7Ah3vYPYapGp+TBl9rbl7kvqhtZni2AvtEuhNDqH7cvoQoqgwKsd0TZkdA1yGpr4RJZzX4LaQkOitRXRMEYagu4YXm8D9wi7BTi15uILkQ98oZde5Xm7ZTGObA2xFRF76TonkBd67apIOyEam5E+GDOgINxbhUoFgXZG56wA/Q7NAhY8uM40W2jOS+3Lb7CyVemqLNcruXq9Jh5iNW4ypF381hF5rZ5FTuKQq30WB2tpgsE5LN8sTKJKpiFgagwv7N5Q93pZa4GbrR81qJa5OPAAW3Ziq2G2YAUtvP0Yv4o1aJYM23+brMGeyrjLdrfIv3KAII3Rkbre/W0V60fl7mvmXJQ8cbVRtKFiwzGXXtEnVvyj+SCn2YquVVMZb7WJ2KhdayM7q17scRVsAWetIGbSoat3VtYd92rXKPv7j8//1cUEqsbkPdpAMppNO8KzO6x/XO0VM7CSxYBt59Ji1Fzoqe1V34m3UYrYQnpu2O563Ud7j2hOmG1ygBcSDtBA57pn6FuRgK/3UIBn/mrRrhi5vQNseg/rKc0WQjK9zA+rggPYhgWuT5alw2Bpm2S7lSc3t6cjcn57aryci7Pz29PNQ2rU5pGthfeW/RqiijFp3fLr7538qixsibunoodKmmmQHM97Tq2z3kXjxn3ZbYkNlMlpBY5cYWC4a2Z7aJF0tc86xwaV8SLj5PrifTtgWpuksqsb9Ja22A86uj/SKtnmaOswNtlhPAoqu0zpTtbtzIJp9rxtYhNyQTn79SAbrQ8RLHemaCu8NJuWnO1tzz9yZo9HM14DP0AFGkeedN2/vxPqawfHaCEJCzN+R4ibzQEaEpHngk95V3/7Hcm4wrSHxK23O9jky6Er+79xHTKlyh67s3FNXHDN9Npvr1RpHD2eEnfd+dPSeFoav5ul0Rft+CJeud9vPnnlT175k1deG82TV/7klZMnr/zRKJ9cj9+d69FF0JNX/rQ0npbGFk75NFlS1j50MdhZ6GyJhxbmRMtS6WC1nVe+VW3Ml6Fgq+ocmoG0l5ft2ayy60ZlnzpFJAjU3qv8gKcP8EsJCbCHzsrNOeMLkIVkvKPZ0+Bu6W30ZuWvREVaW++M/pP+8Di1+W+nPyBCnzKpKOrRkL1LZknVct+10p2uMj6WoTMiDrE1JUixQa1aP6L9BeizuS7rFON1dllSZtiEYQlI8OS7/xcAAP//idOd/g==" } diff --git a/winlogbeat/docs/fields.asciidoc b/winlogbeat/docs/fields.asciidoc index 576ab8ede170..835d69bf44ed 100644 --- a/winlogbeat/docs/fields.asciidoc +++ b/winlogbeat/docs/fields.asciidoc @@ -679,7 +679,7 @@ Kubernetes pod name -- type: keyword -Kubernetes pod uid +Kubernetes Pod UID -- diff --git a/winlogbeat/include/fields.go b/winlogbeat/include/fields.go index 2c615dca20b6..72b66f72c282 100644 --- a/winlogbeat/include/fields.go +++ b/winlogbeat/include/fields.go @@ -31,5 +31,5 @@ func init() { // Asset returns asset data func Asset() string { - return "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" + return "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" }