diff --git a/CHANGELOG-developer.next.asciidoc b/CHANGELOG-developer.next.asciidoc index 71ba0abecc2..f4d4d6f256e 100644 --- a/CHANGELOG-developer.next.asciidoc +++ b/CHANGELOG-developer.next.asciidoc @@ -89,6 +89,7 @@ The list below covers the major changes between 7.0.0-rc2 and main only. ==== Added +- Add new metricset in Kubernetes module, `state_namespace`. {pull}36406[36406] - Add configuration for APM instrumentation and expose the tracer trough the Beat object. {pull}17938[17938] - Make the behavior of clientWorker and netClientWorker consistent when error is returned from publisher pipeline - Metricset generator generates beta modules by default now. {pull}10657[10657] diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index 6e7e895a56d..f77b8cda714 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -46035,6 +46035,42 @@ type: keyword -- +[float] +=== state_namespace + +Kubernetes namespace metrics. + + + +*`kubernetes.state_namespace.created.sec`*:: ++ +-- +Unix creation timestamp. + + +type: double + +-- + + +*`kubernetes.state_namespace.status.active`*:: ++ +-- +Whether the namespace is active (true or false). + +type: boolean + +-- + +*`kubernetes.state_namespace.status.terminating`*:: ++ +-- +Whether the namespace is terminating (true or false). + +type: boolean + +-- + [float] === node diff --git a/metricbeat/helper/kubernetes/state_metricset.go b/metricbeat/helper/kubernetes/state_metricset.go index 458ccc1d2ed..51929d73509 100644 --- a/metricbeat/helper/kubernetes/state_metricset.go +++ b/metricbeat/helper/kubernetes/state_metricset.go @@ -44,7 +44,9 @@ var lock sync.RWMutex // Init registers the MetricSet with the central registry. // The New method will be called after the setup of the module and before starting to fetch data func Init(name string, mapping *prometheus.MetricsMapping) { - name = prefix + name + if name != util.NamespaceResource { + name = prefix + name + } lock.Lock() mappings[name] = mapping lock.Unlock() @@ -77,11 +79,16 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { mapping := mappings[base.Name()] lock.Unlock() + resourceName := base.Name() + if resourceName != util.NamespaceResource { + resourceName = strings.ReplaceAll(resourceName, prefix, "") + } + return &MetricSet{ BaseMetricSet: base, prometheusClient: prometheusClient, prometheusMapping: mapping, - enricher: util.NewResourceMetadataEnricher(base, strings.ReplaceAll(base.Name(), prefix, ""), mod.GetMetricsRepo(), false), + enricher: util.NewResourceMetadataEnricher(base, resourceName, mod.GetMetricsRepo(), false), mod: mod, }, nil } @@ -90,6 +97,17 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // format. It publishes the event which is then forwarded to the output. In case // of an error set the Error field of mb.Event or simply call report.Error(). func (m *MetricSet) Fetch(reporter mb.ReporterV2) { + // The name of the metric state can be obtained by using m.BaseMetricSet.Name(). However, names that start with state_* (e.g. state_cronjob) + // need to have that prefix removed. So, for example, strings.ReplaceAll("state_cronjob", "state_", "") would result in just cronjob. + // Exception is state_namespace, as field kubernetes.namespace already exists, and we need to create a new object + // for the state_namespace metricset. + resourceName := m.BaseMetricSet.Name() + if resourceName != util.NamespaceResource { + resourceName = strings.ReplaceAll(resourceName, prefix, "") + } else { + resourceName = "state_namespace" + } + m.enricher.Start() families, err := m.mod.GetStateMetricsFamilies(m.prometheusClient) @@ -107,9 +125,7 @@ func (m *MetricSet) Fetch(reporter mb.ReporterV2) { m.enricher.Enrich(events) for _, event := range events { - // The name of the metric state can be obtained by using m.BaseMetricSet.Name(). However, names that start with state_* (e.g. state_cronjob) - // need to have that prefix removed. So, for example, strings.ReplaceAll("state_cronjob", "state_", "") would result in just cronjob. - e, err := util.CreateEvent(event, "kubernetes."+strings.ReplaceAll(m.BaseMetricSet.Name(), "state_", "")) + e, err := util.CreateEvent(event, "kubernetes."+resourceName) if err != nil { m.Logger().Error(err) } diff --git a/metricbeat/include/list_docker.go b/metricbeat/include/list_docker.go index bd3e36dfd9e..fb79ffcca58 100644 --- a/metricbeat/include/list_docker.go +++ b/metricbeat/include/list_docker.go @@ -46,6 +46,7 @@ import ( _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes/state_daemonset" _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes/state_deployment" _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes/state_job" + _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes/state_namespace" _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes/state_node" _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes/state_persistentvolume" _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes/state_persistentvolumeclaim" diff --git a/metricbeat/module/kubernetes/_meta/test/docs/01_playground/metricbeat.yaml b/metricbeat/module/kubernetes/_meta/test/docs/01_playground/metricbeat.yaml index 204b4313e54..b65ea0734c9 100644 --- a/metricbeat/module/kubernetes/_meta/test/docs/01_playground/metricbeat.yaml +++ b/metricbeat/module/kubernetes/_meta/test/docs/01_playground/metricbeat.yaml @@ -40,6 +40,7 @@ data: - state_persistentvolume - state_persistentvolumeclaim - state_storageclass + - state_namespace - module: kubernetes metricsets: - apiserver diff --git a/metricbeat/module/kubernetes/fields.go b/metricbeat/module/kubernetes/fields.go index 3cbfdbde396..6cc7a4fe5bd 100644 --- a/metricbeat/module/kubernetes/fields.go +++ b/metricbeat/module/kubernetes/fields.go @@ -32,5 +32,5 @@ func init() { // AssetKubernetes returns asset data. // This is the base64 encoded zlib format compressed contents of module/kubernetes. func AssetKubernetes() string { - return "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" + return "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" } diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/data.json b/metricbeat/module/kubernetes/state_namespace/_meta/data.json new file mode 100644 index 00000000000..74a0918857c --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/data.json @@ -0,0 +1,28 @@ +{ + "@timestamp": "2019-03-01T08:05:34.853Z", + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "state_namespace": { + "created": { + "sec": 1691566338 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } +} \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/fields.yml b/metricbeat/module/kubernetes/state_namespace/_meta/fields.yml new file mode 100644 index 00000000000..f0d2c2f7ffa --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/fields.yml @@ -0,0 +1,19 @@ +- name: state_namespace + type: group + release: ga + description: > + Kubernetes namespace metrics. + fields: + - name: created.sec + type: double + description: > + Unix creation timestamp. + - name: status + type: group + fields: + - name: active + type: boolean + description: Whether the namespace is active (true or false). + - name: terminating + type: boolean + description: Whether the namespace is terminating (true or false). diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.7.0.plain.expected b/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.7.0.plain.expected new file mode 100644 index 00000000000..3f0f990707b --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.7.0.plain.expected @@ -0,0 +1,127 @@ +[ + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-node-lease" + }, + "MetricSetFields": { + "created": { + "sec": 1673879559 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "created": { + "sec": 1673879561 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-public" + }, + "MetricSetFields": { + "created": { + "sec": 1673879559 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "local-path-storage" + }, + "MetricSetFields": { + "created": { + "sec": 1673879567 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-system" + }, + "MetricSetFields": { + "created": { + "sec": 1673879559 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.8.2.plain.expected b/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.8.2.plain.expected new file mode 100644 index 00000000000..4469033344a --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.8.2.plain.expected @@ -0,0 +1,127 @@ +[ + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-node-lease" + }, + "MetricSetFields": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "local-path-storage" + }, + "MetricSetFields": { + "created": { + "sec": 1691566342 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-public" + }, + "MetricSetFields": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-system" + }, + "MetricSetFields": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "created": { + "sec": 1691566338 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.9.2.plain.expected b/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.9.2.plain.expected new file mode 100644 index 00000000000..4469033344a --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/test/ksm.v2.9.2.plain.expected @@ -0,0 +1,127 @@ +[ + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-node-lease" + }, + "MetricSetFields": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "local-path-storage" + }, + "MetricSetFields": { + "created": { + "sec": 1691566342 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-public" + }, + "MetricSetFields": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "kube-system" + }, + "MetricSetFields": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + }, + { + "RootFields": null, + "ModuleFields": { + "namespace": "default" + }, + "MetricSetFields": { + "created": { + "sec": 1691566338 + }, + "status": { + "active": true, + "terminating": false + } + }, + "Index": "", + "ID": "", + "Namespace": "kubernetes.state_namespace", + "Timestamp": "0001-01-01T00:00:00Z", + "Error": null, + "Host": "", + "Service": "", + "Took": 0, + "Period": 0, + "DisableTimeSeries": false + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/testdata/config.yml b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/config.yml new file mode 100644 index 00000000000..a44a8c52469 --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/config.yml @@ -0,0 +1,4 @@ +type: http +url: "/metrics" +suffix: plain +path: "../_meta/test" diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/testdata/docs.plain-expected.json b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/docs.plain-expected.json new file mode 100644 index 00000000000..aff21fa39bf --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/docs.plain-expected.json @@ -0,0 +1,137 @@ +[ + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "state_namespace": { + "created": { + "sec": 1691566338 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "local-path-storage", + "state_namespace": { + "created": { + "sec": 1691566342 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-system", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-public", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-node-lease", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.7.0.plain-expected.json b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.7.0.plain-expected.json new file mode 100644 index 00000000000..db10ea298f3 --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.7.0.plain-expected.json @@ -0,0 +1,137 @@ +[ + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-system", + "state_namespace": { + "created": { + "sec": 1673879559 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-node-lease", + "state_namespace": { + "created": { + "sec": 1673879559 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-public", + "state_namespace": { + "created": { + "sec": 1673879559 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "state_namespace": { + "created": { + "sec": 1673879561 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "local-path-storage", + "state_namespace": { + "created": { + "sec": 1673879567 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.8.2.plain-expected.json b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.8.2.plain-expected.json new file mode 100644 index 00000000000..aff21fa39bf --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.8.2.plain-expected.json @@ -0,0 +1,137 @@ +[ + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "state_namespace": { + "created": { + "sec": 1691566338 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "local-path-storage", + "state_namespace": { + "created": { + "sec": 1691566342 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-system", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-public", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-node-lease", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.9.2.plain-expected.json b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.9.2.plain-expected.json new file mode 100644 index 00000000000..aff21fa39bf --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/_meta/testdata/ksm.v2.9.2.plain-expected.json @@ -0,0 +1,137 @@ +[ + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "default", + "state_namespace": { + "created": { + "sec": 1691566338 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "local-path-storage", + "state_namespace": { + "created": { + "sec": 1691566342 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-system", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-public", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + }, + { + "event": { + "dataset": "kubernetes.state_namespace", + "duration": 115000, + "module": "kubernetes" + }, + "kubernetes": { + "namespace": "kube-node-lease", + "state_namespace": { + "created": { + "sec": 1691566337 + }, + "status": { + "active": true, + "terminating": false + } + } + }, + "metricset": { + "name": "state_namespace", + "period": 10000 + }, + "service": { + "address": "127.0.0.1:55555", + "type": "kubernetes" + } + } +] \ No newline at end of file diff --git a/metricbeat/module/kubernetes/state_namespace/docs.asciidoc b/metricbeat/module/kubernetes/state_namespace/docs.asciidoc new file mode 100644 index 00000000000..cccfc7c4f20 --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/docs.asciidoc @@ -0,0 +1 @@ +This is the `state_namespace` metricset of the Kubernetes module. diff --git a/metricbeat/module/kubernetes/state_namespace/state_namespace.go b/metricbeat/module/kubernetes/state_namespace/state_namespace.go new file mode 100644 index 00000000000..8459f446d43 --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/state_namespace.go @@ -0,0 +1,48 @@ +// 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 state_namespace + +import ( + "github.com/elastic/beats/v7/metricbeat/helper/kubernetes" + p "github.com/elastic/beats/v7/metricbeat/helper/prometheus" + "github.com/elastic/beats/v7/metricbeat/mb" + "github.com/elastic/beats/v7/metricbeat/module/kubernetes/util" +) + +// mapping stores the state metrics we want to fetch and will be used by this metricset +var mapping = &p.MetricsMapping{ + Metrics: map[string]p.MetricMap{ + "kube_namespace_created": p.Metric("created.sec"), + + "kube_namespace_status_phase": p.BooleanMetric("status", p.OpFilterMap( + "phase", map[string]string{ + "Active": "active", + "Terminating": "terminating", + }, + )), + }, + + Labels: map[string]p.LabelMap{ + "namespace": p.KeyLabel(mb.ModuleDataKey + ".namespace"), + }, +} + +// Register metricset +func init() { + kubernetes.Init(util.NamespaceResource, mapping) +} diff --git a/metricbeat/module/kubernetes/state_namespace/state_namespace_integration_test.go b/metricbeat/module/kubernetes/state_namespace/state_namespace_integration_test.go new file mode 100644 index 00000000000..138b15fde07 --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/state_namespace_integration_test.go @@ -0,0 +1,39 @@ +// 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. + +//go:build integration && linux + +package state_namespace + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" + "github.com/elastic/beats/v7/metricbeat/module/kubernetes/test" +) + +func TestFetchMetricset(t *testing.T) { + config := test.GetKubeStateMetricsConfig(t, "state_namespace") + metricSet := mbtest.NewFetcher(t, config) + events, errs := metricSet.FetchEvents() + if len(errs) > 0 { + t.Fatalf("Expected 0 error, had %d. %v\n", len(errs), errs) + } + assert.NotEmpty(t, events) +} diff --git a/metricbeat/module/kubernetes/state_namespace/state_namespace_test.go b/metricbeat/module/kubernetes/state_namespace/state_namespace_test.go new file mode 100644 index 00000000000..d8d2bd462a5 --- /dev/null +++ b/metricbeat/module/kubernetes/state_namespace/state_namespace_test.go @@ -0,0 +1,50 @@ +// 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. + +//go:build !integration + +package state_namespace + +import ( + "testing" + + k "github.com/elastic/beats/v7/metricbeat/helper/kubernetes/ktest" + "github.com/elastic/beats/v7/metricbeat/helper/prometheus/ptest" + mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" + _ "github.com/elastic/beats/v7/metricbeat/module/kubernetes" + "github.com/elastic/beats/v7/metricbeat/module/kubernetes/util" +) + +var files = []string{ + "../_meta/test/ksm.v2.7.0.plain", + "../_meta/test/ksm.v2.8.2.plain", + "../_meta/test/ksm.v2.9.2.plain", +} + +const name = util.NamespaceResource + +func TestEventMapping(t *testing.T) { + ptest.TestMetricSet(t, "kubernetes", name, k.GetTestCases(files)) +} + +func TestData(t *testing.T) { + mbtest.TestDataFiles(t, "kubernetes", name) +} + +func TestMetricsFamily(t *testing.T) { + k.TestMetricsFamily(t, files, mapping) +} diff --git a/metricbeat/module/kubernetes/util/kubernetes.go b/metricbeat/module/kubernetes/util/kubernetes.go index d87ff71f208..26728fccdae 100644 --- a/metricbeat/module/kubernetes/util/kubernetes.go +++ b/metricbeat/module/kubernetes/util/kubernetes.go @@ -93,6 +93,7 @@ const ( PersistentVolumeResource = "persistentvolume" PersistentVolumeClaimResource = "persistentvolumeclaim" StorageClassResource = "storageclass" + NamespaceResource = "state_namespace" ) func getResource(resourceName string) kubernetes.Resource { @@ -121,6 +122,8 @@ func getResource(resourceName string) kubernetes.Resource { return &kubernetes.StorageClass{} case NodeResource: return &kubernetes.Node{} + case NamespaceResource: + return &kubernetes.Namespace{} default: return nil } @@ -238,7 +241,7 @@ func NewResourceMetadataEnricher( case *kubernetes.StatefulSet: m[id] = metaGen.Generate(StatefulSetResource, r) case *kubernetes.Namespace: - m[id] = metaGen.Generate("namespace", r) + m[id] = metaGen.Generate(NamespaceResource, r) case *kubernetes.ReplicaSet: m[id] = metaGen.Generate(ReplicaSetResource, r) case *kubernetes.DaemonSet: diff --git a/metricbeat/module/openmetrics/collector/_meta/data.json b/metricbeat/module/openmetrics/collector/_meta/data.json index 425e2d297c0..f0551c6e73f 100644 --- a/metricbeat/module/openmetrics/collector/_meta/data.json +++ b/metricbeat/module/openmetrics/collector/_meta/data.json @@ -23,4 +23,4 @@ "address": "127.0.0.1:55555", "type": "openmetrics" } -} \ No newline at end of file +} diff --git a/metricbeat/module/prometheus/collector/_meta/data.json b/metricbeat/module/prometheus/collector/_meta/data.json index dba9f7771c4..da3bc943960 100644 --- a/metricbeat/module/prometheus/collector/_meta/data.json +++ b/metricbeat/module/prometheus/collector/_meta/data.json @@ -23,4 +23,4 @@ "address": "127.0.0.1:55555", "type": "prometheus" } -} \ No newline at end of file +}