Skip to content

Commit 466bf7c

Browse files
feat(containerinsights): Add karpenter metrics pipeline for config translation
1 parent 79d8e98 commit 466bf7c

2 files changed

Lines changed: 225 additions & 0 deletions

File tree

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
receivers:
2+
prometheus/cw_k8s_ci_v0_karpenter:
3+
config:
4+
global:
5+
scrape_interval: {{.CollectionInterval}}
6+
scrape_timeout: {{.ScrapeTimeout}}
7+
scrape_configs:
8+
- job_name: karpenter
9+
scrape_interval: {{.CollectionInterval}}
10+
scrape_timeout: {{.ScrapeTimeout}}
11+
metrics_path: /metrics
12+
kubernetes_sd_configs:
13+
- role: pod
14+
namespaces:
15+
names:
16+
- kube-system
17+
relabel_configs:
18+
- source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name]
19+
regex: karpenter
20+
action: keep
21+
- source_labels: [__meta_kubernetes_pod_container_port_name]
22+
regex: http-metrics
23+
action: keep
24+
- source_labels: [__meta_kubernetes_pod_name]
25+
target_label: pod
26+
- source_labels: [__meta_kubernetes_namespace]
27+
target_label: namespace
28+
- source_labels: [__meta_kubernetes_pod_node_name]
29+
target_label: node
30+
processors:
31+
filter/cw_k8s_ci_v0_scrape_metadata:
32+
error_mode: ignore
33+
metrics:
34+
metric:
35+
- IsMatch(name, "^(up|scrape_duration_seconds|scrape_samples_scraped|scrape_samples_post_metric_relabeling|scrape_series_added)$")
36+
transform/cw_k8s_ci_v0_set_unit:
37+
error_mode: ignore
38+
metric_statements:
39+
- context: metric
40+
statements:
41+
- set(unit, "s") where IsMatch(name, ".*_seconds(_total)?$")
42+
- set(unit, "ms") where IsMatch(name, ".*_milliseconds(_total)?$")
43+
- set(unit, "us") where IsMatch(name, ".*_microseconds(_total)?$")
44+
- set(unit, "ns") where IsMatch(name, ".*_nanoseconds(_total)?$")
45+
- set(unit, "By") where IsMatch(name, ".*_bytes(_total)?$")
46+
- set(unit, "KBy") where IsMatch(name, ".*_kilobytes(_total)?$")
47+
- set(unit, "MBy") where IsMatch(name, ".*_megabytes(_total)?$")
48+
- set(unit, "GBy") where IsMatch(name, ".*_gigabytes(_total)?$")
49+
- set(unit, "KiBy") where IsMatch(name, ".*_kibibytes(_total)?$")
50+
- set(unit, "MiBy") where IsMatch(name, ".*_mebibytes(_total)?$")
51+
- set(unit, "GiBy") where IsMatch(name, ".*_gibibytes(_total)?$")
52+
- set(unit, "Cel") where IsMatch(name, ".*_celsius$")
53+
- set(unit, "Hz") where IsMatch(name, ".*_hertz$")
54+
- set(unit, "1") where IsMatch(name, ".*_ratio$")
55+
- set(unit, "%") where IsMatch(name, ".*_percent$")
56+
- set(unit, "V") where IsMatch(name, ".*_volts$")
57+
- set(unit, "W") where IsMatch(name, ".*_watts$")
58+
- set(unit, "J") where IsMatch(name, ".*_joules$")
59+
- set(unit, "A") where IsMatch(name, ".*_amperes$")
60+
- set(unit, "m") where IsMatch(name, ".*_meters(_total)?$")
61+
- set(unit, "1") where unit == "" and IsMatch(name, ".*_total$")
62+
metricstarttime/cw_k8s_ci_v0: {}
63+
transform/cw_k8s_ci_v0_set_scope_karpenter:
64+
error_mode: ignore
65+
metric_statements:
66+
- context: scope
67+
statements:
68+
- set(scope.name, "github.com/aws/karpenter")
69+
- set(scope.schema_url, "")
70+
- set(attributes["cloudwatch.source"], "cloudwatch-agent")
71+
- set(attributes["cloudwatch.solution"], "k8s-otel-container-insights")
72+
- set(attributes["cloudwatch.pipeline"], "karpenter")
73+
transform/cw_k8s_ci_v0_set_cluster_name:
74+
error_mode: ignore
75+
metric_statements:
76+
- context: datapoint
77+
statements:
78+
- set(resource.attributes["k8s.cluster.name"], "{{.ClusterName}}")
79+
groupbyattrs/cw_k8s_ci_v0_karpenter:
80+
keys:
81+
- pod
82+
- namespace
83+
- node
84+
transform/cw_k8s_ci_v0_karpenter_promote:
85+
error_mode: ignore
86+
metric_statements:
87+
- context: resource
88+
statements:
89+
- set(attributes["k8s.pod.name"], attributes["pod"]) where attributes["pod"] != nil
90+
- set(attributes["k8s.namespace.name"], attributes["namespace"]) where attributes["namespace"] != nil
91+
- set(attributes["k8s.node.name"], attributes["node"]) where attributes["node"] != nil
92+
- delete_key(attributes, "net.host.name") where attributes["net.host.name"] != nil
93+
- delete_key(attributes, "net.host.port") where attributes["net.host.port"] != nil
94+
- delete_key(attributes, "url.scheme") where attributes["url.scheme"] != nil
95+
- context: datapoint
96+
statements:
97+
- set(attributes["pod"], resource.attributes["pod"]) where resource.attributes["pod"] != nil
98+
- set(attributes["namespace"], resource.attributes["namespace"]) where resource.attributes["namespace"] != nil
99+
- set(attributes["node"], resource.attributes["node"]) where resource.attributes["node"] != nil
100+
k8sattributes/cw_k8s_ci_v0_pod:
101+
auth_type: serviceAccount
102+
extract:
103+
labels:
104+
- from: pod
105+
key_regex: (.*)
106+
tag_name: k8s.pod.label.$1
107+
metadata:
108+
- k8s.pod.uid
109+
- k8s.node.name
110+
- k8s.deployment.name
111+
- k8s.statefulset.name
112+
- k8s.daemonset.name
113+
- k8s.replicaset.name
114+
- k8s.job.name
115+
- k8s.cronjob.name
116+
passthrough: false
117+
exclude:
118+
pods: []
119+
pod_association:
120+
- sources:
121+
- from: resource_attribute
122+
name: k8s.pod.name
123+
- from: resource_attribute
124+
name: k8s.namespace.name
125+
transform/cw_k8s_ci_v0_set_workload:
126+
error_mode: ignore
127+
metric_statements:
128+
- context: datapoint
129+
statements:
130+
- set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.deployment.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.deployment.name"] != nil
131+
- set(resource.attributes["k8s.workload.type"], "Deployment") where resource.attributes["k8s.workload.type"] == nil and resource.attributes["k8s.deployment.name"] != nil
132+
- set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.statefulset.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.statefulset.name"] != nil
133+
- set(resource.attributes["k8s.workload.type"], "StatefulSet") where resource.attributes["k8s.workload.type"] == nil and resource.attributes["k8s.statefulset.name"] != nil
134+
- set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.daemonset.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.daemonset.name"] != nil
135+
- set(resource.attributes["k8s.workload.type"], "DaemonSet") where resource.attributes["k8s.workload.type"] == nil and resource.attributes["k8s.daemonset.name"] != nil
136+
- set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.job.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.job.name"] != nil
137+
- set(resource.attributes["k8s.workload.type"], "Job") where resource.attributes["k8s.workload.type"] == nil and resource.attributes["k8s.job.name"] != nil
138+
- set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.cronjob.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.cronjob.name"] != nil
139+
- set(resource.attributes["k8s.workload.type"], "CronJob") where resource.attributes["k8s.workload.type"] == nil and resource.attributes["k8s.cronjob.name"] != nil
140+
- set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.replicaset.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.replicaset.name"] != nil
141+
- set(resource.attributes["k8s.workload.type"], "ReplicaSet") where resource.attributes["k8s.workload.type"] == nil and resource.attributes["k8s.replicaset.name"] != nil
142+
resourcedetection/cw_k8s_ci_v0_karpenter:
143+
detectors: [eks, ec2]
144+
override: false
145+
timeout: 2s
146+
ec2:
147+
resource_attributes:
148+
host.id:
149+
enabled: false
150+
host.type:
151+
enabled: false
152+
host.name:
153+
enabled: false
154+
host.image.id:
155+
enabled: false
156+
cloud.provider:
157+
enabled: true
158+
cloud.platform:
159+
enabled: true
160+
cloud.region:
161+
enabled: true
162+
cloud.availability_zone:
163+
enabled: false
164+
cloud.account.id:
165+
enabled: true
166+
transform/cw_k8s_ci_v0_clear_schema_url:
167+
error_mode: ignore
168+
metric_statements:
169+
- context: resource
170+
statements:
171+
- set(resource.schema_url, "")
172+
transform/cw_k8s_ci_v0_set_cloud_resource_id:
173+
error_mode: ignore
174+
metric_statements:
175+
- context: resource
176+
statements:
177+
- set(attributes["cloud.resource_id"], Concat(["arn:aws:eks:", attributes["cloud.region"], ":", attributes["cloud.account.id"], ":cluster/", attributes["k8s.cluster.name"]], "")) where attributes["cloud.region"] != nil and attributes["cloud.account.id"] != nil and attributes["k8s.cluster.name"] != nil
178+
awsattributelimit/cw_k8s_ci_v0:
179+
max_total_attributes: 150
180+
unconditional_removal_keys:
181+
- k8s.node.label.topology.kubernetes.io/region
182+
- k8s.node.label.topology.kubernetes.io/zone
183+
- k8s.node.label.topology.ebs.csi.aws.com/zone
184+
- k8s.node.label.node.kubernetes.io/instance-type
185+
- k8s.node.label.kubernetes.io/hostname
186+
- k8s.node.label.helm.sh/chart
187+
- k8s.node.label.release
188+
- k8s.node.label.eks.amazonaws.com/nodegroup-image
189+
- k8s.node.label.k8s.io/cloud-provider-aws
190+
- k8s.node.label.eks.amazonaws.com/sourceLaunchTemplateId
191+
- k8s.node.label.eks.amazonaws.com/sourceLaunchTemplateVersion
192+
- k8s.pod.label.pod-template-hash
193+
- k8s.pod.label.controller-revision-hash
194+
unconditional_removal_prefixes:
195+
- k8s.node.label.feature.node.kubernetes.io/
196+
- k8s.node.label.beta.kubernetes.io/
197+
- k8s.node.label.failure-domain.beta.kubernetes.io/
198+
- k8s.node.label.alpha.eksctl.io/
199+
service:
200+
pipelines:
201+
metrics/cw_k8s_ci_v0_karpenter:
202+
receivers:
203+
- prometheus/cw_k8s_ci_v0_karpenter
204+
processors:
205+
- filter/cw_k8s_ci_v0_scrape_metadata
206+
- transform/cw_k8s_ci_v0_set_unit
207+
- metricstarttime/cw_k8s_ci_v0
208+
- transform/cw_k8s_ci_v0_set_scope_karpenter
209+
- transform/cw_k8s_ci_v0_set_cluster_name
210+
- groupbyattrs/cw_k8s_ci_v0_karpenter
211+
- transform/cw_k8s_ci_v0_karpenter_promote
212+
- k8sattributes/cw_k8s_ci_v0_pod
213+
- transform/cw_k8s_ci_v0_set_workload
214+
- resourcedetection/cw_k8s_ci_v0_karpenter
215+
- transform/cw_k8s_ci_v0_clear_schema_url
216+
- transform/cw_k8s_ci_v0_set_cloud_resource_id
217+
- awsattributelimit/cw_k8s_ci_v0
218+
exporters:
219+
- forward/opentelemetry
220+
connectors:
221+
forward/opentelemetry: {}

translator/translate/otel/pipeline/opentelemetry/containerinsights/translator.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ var apiserverYAML string
7373
//go:embed kube_state_metrics.yaml
7474
var kubeStateMetricsYAML string
7575

76+
//go:embed karpenter.yaml
77+
var karpenterYAML string
78+
7679
// NewTranslators returns all container insights pipeline translators.
7780
// The pipelines generated depend on the "mode" config field:
7881
// - "node": daemonset pipelines (per-node metrics + logs)
@@ -104,6 +107,7 @@ func NewTranslators(conf *confmap.Conf) common.PipelineTranslatorMap {
104107
if mode == "cluster" {
105108
translators.Set(newYAMLPipeline("apiserver", pipeline.SignalMetrics, apiserverYAML))
106109
translators.Set(newYAMLPipeline("kube_state_metrics", pipeline.SignalMetrics, kubeStateMetricsYAML))
110+
translators.Set(newYAMLPipeline("karpenter", pipeline.SignalMetrics, karpenterYAML))
107111
}
108112

109113
return translators

0 commit comments

Comments
 (0)