diff --git a/.changelog/3126.changed.txt b/.changelog/3126.changed.txt new file mode 100644 index 0000000000..b7e224d18c --- /dev/null +++ b/.changelog/3126.changed.txt @@ -0,0 +1 @@ +feat(helm/metrics): route metrics using job attribute instead of endpoint \ No newline at end of file diff --git a/deploy/helm/sumologic/conf/metrics/otelcol/pipeline.yaml b/deploy/helm/sumologic/conf/metrics/otelcol/pipeline.yaml index 94f6244be2..f04e65e103 100644 --- a/deploy/helm/sumologic/conf/metrics/otelcol/pipeline.yaml +++ b/deploy/helm/sumologic/conf/metrics/otelcol/pipeline.yaml @@ -22,7 +22,11 @@ processors: - resource/remove_k8s_pod_pod_name - resource/delete_source_metadata - sumologic_schema + - transform/set_name + - groupbyattrs/group_by_name + - transform/remove_name - batch + - transform/prepare_routing - routing receivers: - telegraf diff --git a/deploy/helm/sumologic/conf/metrics/otelcol/processors.yaml b/deploy/helm/sumologic/conf/metrics/otelcol/processors.yaml index 6d6596fa00..963251fecd 100644 --- a/deploy/helm/sumologic/conf/metrics/otelcol/processors.yaml +++ b/deploy/helm/sumologic/conf/metrics/otelcol/processors.yaml @@ -16,6 +16,11 @@ groupbyattrs: - pod - service +groupbyattrs/group_by_name: + keys: + - __name__ + - job + ## The Kubernetes sprocessor automatically tags logs, metrics and traces with Kubernetes metadata like pod name, namespace name etc. k8s_tagger: extract: @@ -124,10 +129,6 @@ routing: - exporters: - sumologic/apiserver value: /prometheus.metrics.apiserver - ## container metrics - - exporters: - - sumologic/kubelet - value: /prometheus.metrics.container ## control-plane metrics - exporters: - sumologic/control_plane @@ -166,6 +167,34 @@ source: sumologic_schema: add_cloud_namespace: false +transform/prepare_routing: + error_mode: ignore + metric_statements: + - context: metric + statements: + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.apiserver") where resource.attributes["job"] == "apiserver" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.control-plane.coredns") where resource.attributes["job"] == "coredns" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.control-plane.kube-etcd") where resource.attributes["job"] == "kube-etcd" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.controller-manager") where resource.attributes["job"] == "kubelet" and IsMatch(name, "^cloudprovider_.*") + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.kubelet") where resource.attributes["job"] == "kubelet" and not IsMatch(name, "^cloudprovider_.*") + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.node") where resource.attributes["job"] == "node-exporter" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.scheduler") where resource.attributes["job"] == "kube-scheduler" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.state") where resource.attributes["job"] == "kube-state-metrics" + +transform/remove_name: + error_mode: ignore + metric_statements: + - context: resource + statements: + - delete_key(attributes, "__name__") + +transform/set_name: + error_mode: ignore + metric_statements: + - context: datapoint + statements: + - set(attributes["__name__"], metric.name) where IsMatch(metric.name, "^cloudprovider_.*") + {{- if .Values.sumologic.metrics.otelcol.extraProcessors }} {{- range $processor := .Values.sumologic.metrics.otelcol.extraProcessors }} {{ toYaml $processor }} diff --git a/tests/helm/metrics_test.go b/tests/helm/metrics_test.go index efab8305f6..65286f7888 100644 --- a/tests/helm/metrics_test.go +++ b/tests/helm/metrics_test.go @@ -131,7 +131,11 @@ func TestMetadataMetricsOtelConfigExtraProcessors(t *testing.T) { "resource/remove_k8s_pod_pod_name", "resource/delete_source_metadata", "sumologic_schema", + "transform/set_name", + "groupbyattrs/group_by_name", + "transform/remove_name", "batch", + "transform/prepare_routing", "routing", } diff --git a/tests/helm/testdata/goldenfile/metadata_metrics_otc/additional_endpoints.output.yaml b/tests/helm/testdata/goldenfile/metadata_metrics_otc/additional_endpoints.output.yaml index bdbda8fbd3..d79a92fbdb 100644 --- a/tests/helm/testdata/goldenfile/metadata_metrics_otc/additional_endpoints.output.yaml +++ b/tests/helm/testdata/goldenfile/metadata_metrics_otc/additional_endpoints.output.yaml @@ -113,6 +113,10 @@ data: - namespace - pod - service + groupbyattrs/group_by_name: + keys: + - __name__ + - job k8s_tagger: extract: delimiter: _ @@ -195,9 +199,6 @@ data: - exporters: - sumologic/apiserver value: /prometheus.metrics.apiserver - - exporters: - - sumologic/kubelet - value: /prometheus.metrics.container - exporters: - sumologic/control_plane value: /prometheus.metrics.control-plane.coredns @@ -223,6 +224,39 @@ data: collector: kubernetes sumologic_schema: add_cloud_namespace: false + transform/prepare_routing: + error_mode: ignore + metric_statements: + - context: metric + statements: + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.apiserver") + where resource.attributes["job"] == "apiserver" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.control-plane.coredns") + where resource.attributes["job"] == "coredns" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.control-plane.kube-etcd") + where resource.attributes["job"] == "kube-etcd" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.controller-manager") + where resource.attributes["job"] == "kubelet" and IsMatch(name, "^cloudprovider_.*") + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.kubelet") + where resource.attributes["job"] == "kubelet" and not IsMatch(name, "^cloudprovider_.*") + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.node") + where resource.attributes["job"] == "node-exporter" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.scheduler") + where resource.attributes["job"] == "kube-scheduler" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.state") + where resource.attributes["job"] == "kube-state-metrics" + transform/remove_name: + error_mode: ignore + metric_statements: + - context: resource + statements: + - delete_key(attributes, "__name__") + transform/set_name: + error_mode: ignore + metric_statements: + - context: datapoint + statements: + - set(attributes["__name__"], metric.name) where IsMatch(metric.name, "^cloudprovider_.*") receivers: otlp: protocols: @@ -303,7 +337,11 @@ data: - resource/remove_k8s_pod_pod_name - resource/delete_source_metadata - sumologic_schema + - transform/set_name + - groupbyattrs/group_by_name + - transform/remove_name - batch + - transform/prepare_routing - routing receivers: - telegraf diff --git a/tests/helm/testdata/goldenfile/metadata_metrics_otc/basic.output.yaml b/tests/helm/testdata/goldenfile/metadata_metrics_otc/basic.output.yaml index 5341aa7d66..d10f6b3feb 100644 --- a/tests/helm/testdata/goldenfile/metadata_metrics_otc/basic.output.yaml +++ b/tests/helm/testdata/goldenfile/metadata_metrics_otc/basic.output.yaml @@ -113,6 +113,10 @@ data: - namespace - pod - service + groupbyattrs/group_by_name: + keys: + - __name__ + - job k8s_tagger: extract: delimiter: _ @@ -195,9 +199,6 @@ data: - exporters: - sumologic/apiserver value: /prometheus.metrics.apiserver - - exporters: - - sumologic/kubelet - value: /prometheus.metrics.container - exporters: - sumologic/control_plane value: /prometheus.metrics.control-plane.coredns @@ -223,6 +224,39 @@ data: collector: kubernetes sumologic_schema: add_cloud_namespace: false + transform/prepare_routing: + error_mode: ignore + metric_statements: + - context: metric + statements: + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.apiserver") + where resource.attributes["job"] == "apiserver" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.control-plane.coredns") + where resource.attributes["job"] == "coredns" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.control-plane.kube-etcd") + where resource.attributes["job"] == "kube-etcd" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.controller-manager") + where resource.attributes["job"] == "kubelet" and IsMatch(name, "^cloudprovider_.*") + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.kubelet") + where resource.attributes["job"] == "kubelet" and not IsMatch(name, "^cloudprovider_.*") + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.node") + where resource.attributes["job"] == "node-exporter" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.scheduler") + where resource.attributes["job"] == "kube-scheduler" + - set(resource.attributes["http_listener_v2_path"], "/prometheus.metrics.state") + where resource.attributes["job"] == "kube-state-metrics" + transform/remove_name: + error_mode: ignore + metric_statements: + - context: resource + statements: + - delete_key(attributes, "__name__") + transform/set_name: + error_mode: ignore + metric_statements: + - context: datapoint + statements: + - set(attributes["__name__"], metric.name) where IsMatch(metric.name, "^cloudprovider_.*") receivers: otlp: protocols: @@ -301,7 +335,11 @@ data: - resource/remove_k8s_pod_pod_name - resource/delete_source_metadata - sumologic_schema + - transform/set_name + - groupbyattrs/group_by_name + - transform/remove_name - batch + - transform/prepare_routing - routing receivers: - telegraf