Skip to content

Commit a1fafa1

Browse files
committed
Add collector example validation to CI
Run collector example validation in the collector workflow, propagate check-examples failures correctly, and refresh the daemonset-and-deployment rendered example output.
1 parent 668cd4a commit a1fafa1

7 files changed

Lines changed: 343 additions & 12 deletions

File tree

.github/workflows/validate-collector.yaml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@ name: Validate OpenTelemetry Collector Configurations
22

33
on:
44
pull_request:
5+
branches:
6+
- main
57
paths:
8+
- '.github/actions/setup/**'
9+
- '.github/workflows/validate-collector.yaml'
10+
- 'Makefile'
611
- 'charts/opentelemetry-collector/**'
712
workflow_dispatch:
813

@@ -15,6 +20,13 @@ jobs:
1520
with:
1621
fetch-depth: 0
1722

23+
- name: Setup
24+
uses: ./.github/actions/setup
25+
with:
26+
create-kind-cluster: "false"
27+
1828
- name: Validate OpenTelemetry Collector configurations
1929
run: make validate-examples
20-
working-directory: .
30+
31+
- name: Check rendered OpenTelemetry Collector examples
32+
run: make check-examples CHARTS=opentelemetry-collector

Makefile

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@ MAX_PARALLEL_EXAMPLES ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/n
55
# Reusable parallel execution with ordered logging utility
66
define run_parallel_with_logging
77
RUNNING_JOBS=0; \
8+
FAILED=0; \
89
EXAMPLE_ORDER=""; \
910
mkdir -p $(TMP_DIRECTORY)/logs; \
1011
for example in $(1); do \
1112
while [ $$RUNNING_JOBS -ge $(MAX_PARALLEL_EXAMPLES) ]; do \
12-
wait -n 2>/dev/null || true; \
13+
if ! wait -n 2>/dev/null; then \
14+
FAILED=1; \
15+
fi; \
1316
RUNNING_JOBS=$$(($$RUNNING_JOBS - 1)); \
1417
done; \
1518
EXAMPLE_ORDER="$${EXAMPLE_ORDER} $${example}"; \
@@ -19,7 +22,12 @@ define run_parallel_with_logging
1922
} & \
2023
RUNNING_JOBS=$$(($$RUNNING_JOBS + 1)); \
2124
done; \
22-
wait; \
25+
while [ $$RUNNING_JOBS -gt 0 ]; do \
26+
if ! wait -n 2>/dev/null; then \
27+
FAILED=1; \
28+
fi; \
29+
RUNNING_JOBS=$$(($$RUNNING_JOBS - 1)); \
30+
done; \
2331
for example in $${EXAMPLE_ORDER}; do \
2432
LOG_FILE="$(TMP_DIRECTORY)/logs/$(2)-$${example}.log"; \
2533
if [ -f "$${LOG_FILE}" ]; then \
@@ -28,7 +36,8 @@ define run_parallel_with_logging
2836
rm -f "$${LOG_FILE}"; \
2937
fi; \
3038
done; \
31-
rm -rf $(TMP_DIRECTORY)/logs
39+
rm -rf $(TMP_DIRECTORY)/logs; \
40+
test $$FAILED -eq 0
3241
endef
3342

3443
.PHONY: generate-examples
@@ -68,7 +77,6 @@ check-examples:
6877
EXAMPLES_DIR=charts/$${chart_name}/examples; \
6978
EXAMPLES=$$(find $${EXAMPLES_DIR} -type d -maxdepth 1 -mindepth 1 -exec basename \{\} \;); \
7079
helm dependency build charts/$${chart_name}; \
71-
EXIT_CODE=0; \
7280
$(call run_parallel_with_logging,$${EXAMPLES},$${chart_name}, \
7381
echo "Checking example: $${example}"; \
7482
EXAMPLE_TMP="${TMP_DIRECTORY}/check-$${chart_name}-$${example}"; \
@@ -88,14 +96,10 @@ check-examples:
8896
printf "Passed $${example}\n"; \
8997
else \
9098
printf "Failed $${example}. run 'make generate-examples' to re-render the example with the latest $${example}/values.yaml\n"; \
91-
EXIT_CODE=1; \
99+
exit 1; \
92100
fi; \
93101
rm -rf "$${EXAMPLE_TMP}" \
94102
); \
95-
if [ $$EXIT_CODE -ne 0 ]; then \
96-
echo "Some examples failed for chart: $${chart_name}"; \
97-
exit 1; \
98-
fi; \
99103
echo "All examples passed for chart: $${chart_name}"; \
100104
done
101105

charts/opentelemetry-collector/CHANGELOG.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
### v0.130.2 / 2026-03-12
3939

4040
- [Fix] Pass `command.extraArgs` to the managed Collector through the supervisor `agent.args` configuration instead of appending them to the `opampsupervisor` container command.
41-
- [Fix] Preserve `telemetry.sdk.*` resource attributes on traces when `reduceResourceAttributes` is enabled in provider-based mode, while continuing to remove them for logs and metrics.
4241

4342
### v0.130.1 / 2026-03-12
4443

charts/opentelemetry-collector/examples/daemonset-and-deployment/rendered/clusterrole.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ metadata:
1313

1414
rules:
1515
- apiGroups: [""]
16-
resources: ["nodes", "nodes/stats", "nodes/metrics"]
16+
resources: ["pods", "endpoints", "nodes/stats", "nodes/metrics", "nodes", "services"]
1717
verbs: ["get", "watch", "list"]
1818
- nonResourceURLs:
1919
- "/metrics"
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
---
2+
# Source: opentelemetry-collector/templates/configmap.yaml
3+
apiVersion: v1
4+
kind: ConfigMap
5+
metadata:
6+
name: example-opentelemetry-collector
7+
namespace: default
8+
labels:
9+
helm.sh/chart: opentelemetry-collector-0.130.10
10+
app.kubernetes.io/name: opentelemetry-collector
11+
app.kubernetes.io/instance: example
12+
app.kubernetes.io/version: "0.147.0"
13+
app.kubernetes.io/managed-by: Helm
14+
15+
data:
16+
relay: |
17+
exporters:
18+
debug: {}
19+
extensions:
20+
health_check:
21+
endpoint: ${env:MY_POD_IP}:13133
22+
k8s_observer:
23+
auth_type: serviceAccount
24+
observe_pods: true
25+
processors:
26+
filter/k8s_apiserver_metrics:
27+
metrics:
28+
metric:
29+
- resource.attributes["service.name"] == "kubernetes-apiserver" and name !=
30+
"kubernetes_build_info"
31+
memory_limiter:
32+
check_interval: 5s
33+
limit_percentage: 80
34+
spike_limit_percentage: 25
35+
resourcedetection/env:
36+
detectors:
37+
- system
38+
- env
39+
override: false
40+
system:
41+
resource_attributes:
42+
host.id:
43+
enabled: true
44+
timeout: 2s
45+
transform/prometheus:
46+
error_mode: ignore
47+
metric_statements:
48+
- context: metric
49+
statements:
50+
- replace_pattern(metric.name, "_total$", "") where resource.attributes["service.name"]
51+
== "opentelemetry-collector"
52+
- replace_pattern(metric.name, "^otelcol_process_cpu_seconds_seconds$", "otelcol_process_cpu_seconds")
53+
where resource.attributes["service.name"] == "opentelemetry-collector"
54+
- replace_pattern(metric.name, "^otelcol_process_memory_rss_bytes$", "otelcol_process_memory_rss_bytes")
55+
where resource.attributes["service.name"] == "opentelemetry-collector"
56+
- replace_pattern(metric.name, "^otelcol_process_runtime_heap_alloc_bytes_bytes$",
57+
"otelcol_process_runtime_heap_alloc_bytes") where resource.attributes["service.name"]
58+
== "opentelemetry-collector"
59+
- replace_pattern(metric.name, "^otelcol_process_runtime_total_alloc_bytes_bytes$",
60+
"otelcol_process_runtime_total_alloc_bytes") where resource.attributes["service.name"]
61+
== "opentelemetry-collector"
62+
- replace_pattern(metric.name, "^otelcol_process_runtime_total_sys_memory_bytes_bytes$",
63+
"otelcol_process_runtime_total_sys_memory_bytes") where resource.attributes["service.name"]
64+
== "opentelemetry-collector"
65+
- replace_pattern(metric.name, "^otelcol_fileconsumer_open_files$", "otelcol_fileconsumer_open_files_ratio")
66+
where resource.attributes["service.name"] == "opentelemetry-collector"
67+
- replace_pattern(metric.name, "^otelcol_fileconsumer_reading_files$", "otelcol_fileconsumer_reading_files_ratio")
68+
where resource.attributes["service.name"] == "opentelemetry-collector"
69+
- replace_pattern(metric.name, "^otelcol_otelsvc_k8s_ip_lookup_miss$", "otelcol_otelsvc_k8s_ip_lookup_miss_ratio")
70+
where resource.attributes["service.name"] == "opentelemetry-collector"
71+
- replace_pattern(metric.name, "^otelcol_otelsvc_k8s_pod_added$", "otelcol_otelsvc_k8s_pod_added_ratio")
72+
where resource.attributes["service.name"] == "opentelemetry-collector"
73+
- replace_pattern(metric.name, "^otelcol_otelsvc_k8s_pod_table_size_ratio$",
74+
"otelcol_otelsvc_k8s_pod_table_size_ratio") where resource.attributes["service.name"]
75+
== "opentelemetry-collector"
76+
- replace_pattern(metric.name, "^otelcol_otelsvc_k8s_pod_updated$", "otelcol_otelsvc_k8s_pod_updated_ratio")
77+
where resource.attributes["service.name"] == "opentelemetry-collector"
78+
- replace_pattern(metric.name, "^otelcol_otelsvc_k8s_pod_deleted$", "otelcol_otelsvc_k8s_pod_deleted_ratio")
79+
where resource.attributes["service.name"] == "opentelemetry-collector"
80+
- replace_pattern(metric.name, "^otelcol_processor_filter_spans\\.filtered$",
81+
"otelcol_processor_filter_spans.filtered_ratio") where resource.attributes["service.name"]
82+
== "opentelemetry-collector"
83+
- context: resource
84+
statements:
85+
- set(attributes["k8s.pod.ip"], attributes["net.host.name"]) where attributes["service.name"]
86+
== "opentelemetry-collector"
87+
- delete_key(attributes, "service_name") where attributes["service.name"] ==
88+
"opentelemetry-collector"
89+
- context: datapoint
90+
statements:
91+
- delete_key(attributes, "service_name") where resource.attributes["service.name"]
92+
== "opentelemetry-collector"
93+
- delete_key(attributes, "otel_scope_name") where attributes["service.name"]
94+
== "opentelemetry-collector"
95+
receivers:
96+
otlp:
97+
protocols:
98+
grpc:
99+
endpoint: ${env:MY_POD_IP}:4317
100+
max_recv_msg_size_mib: 20
101+
http:
102+
endpoint: ${env:MY_POD_IP}:4318
103+
prometheus:
104+
config:
105+
scrape_configs:
106+
- job_name: opentelemetry-collector
107+
scrape_interval: 30s
108+
static_configs:
109+
- targets:
110+
- ${env:MY_POD_IP}:8888
111+
prometheus/k8s_apiserver_metrics:
112+
config:
113+
scrape_configs:
114+
- bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
115+
honor_timestamps: true
116+
job_name: kubernetes-apiserver
117+
kubernetes_sd_configs:
118+
- role: endpoints
119+
relabel_configs:
120+
- action: keep
121+
regex: default;kubernetes;https
122+
source_labels:
123+
- __meta_kubernetes_namespace
124+
- __meta_kubernetes_service_name
125+
- __meta_kubernetes_endpoint_port_name
126+
scheme: https
127+
tls_config:
128+
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
129+
insecure_skip_verify: true
130+
service:
131+
extensions:
132+
- health_check
133+
- k8s_observer
134+
pipelines:
135+
logs:
136+
exporters:
137+
- debug
138+
processors:
139+
- memory_limiter
140+
receivers:
141+
- otlp
142+
metrics:
143+
exporters:
144+
- debug
145+
processors:
146+
- memory_limiter
147+
- resourcedetection/env
148+
- filter/k8s_apiserver_metrics
149+
- transform/prometheus
150+
receivers:
151+
- prometheus/k8s_apiserver_metrics
152+
- prometheus
153+
- otlp
154+
traces:
155+
exporters:
156+
- debug
157+
processors:
158+
- memory_limiter
159+
receivers:
160+
- otlp
161+
telemetry:
162+
logs:
163+
encoding: json
164+
metrics:
165+
readers:
166+
- pull:
167+
exporter:
168+
prometheus:
169+
host: ${env:MY_POD_IP}
170+
port: 8888
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
---
2+
# Source: opentelemetry-collector/templates/deployment.yaml
3+
apiVersion: apps/v1
4+
kind: Deployment
5+
metadata:
6+
name: example-opentelemetry-collector
7+
namespace: default
8+
labels:
9+
helm.sh/chart: opentelemetry-collector-0.130.10
10+
app.kubernetes.io/name: opentelemetry-collector
11+
app.kubernetes.io/instance: example
12+
app.kubernetes.io/version: "0.147.0"
13+
app.kubernetes.io/managed-by: Helm
14+
15+
spec:
16+
replicas: 1
17+
revisionHistoryLimit: 10
18+
selector:
19+
matchLabels:
20+
app.kubernetes.io/name: opentelemetry-collector
21+
app.kubernetes.io/instance: example
22+
component: standalone-collector
23+
strategy:
24+
type: RollingUpdate
25+
template:
26+
metadata:
27+
annotations:
28+
checksum/config: 2a48109b92d99359f0740d709b29d36e5cdd81c94294fad572a067c996826756
29+
30+
labels:
31+
app.kubernetes.io/name: opentelemetry-collector
32+
app.kubernetes.io/instance: example
33+
component: standalone-collector
34+
35+
spec:
36+
37+
serviceAccountName: example-opentelemetry-collector
38+
securityContext:
39+
{}
40+
containers:
41+
- name: opentelemetry-collector
42+
command:
43+
- /otelcol-contrib
44+
- --config=/conf/relay.yaml
45+
securityContext:
46+
{}
47+
image: "ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:0.147.0"
48+
imagePullPolicy: IfNotPresent
49+
ports:
50+
- name: otlp
51+
containerPort: 4317
52+
protocol: TCP
53+
- name: otlp-http
54+
containerPort: 4318
55+
protocol: TCP
56+
env:
57+
- name: MY_POD_IP
58+
valueFrom:
59+
fieldRef:
60+
apiVersion: v1
61+
fieldPath: status.podIP
62+
- name: K8S_NODE_NAME
63+
valueFrom:
64+
fieldRef:
65+
fieldPath: spec.nodeName
66+
- name: GOMEMLIMIT
67+
value: "152MiB"
68+
- name: OTEL_RESOURCE_ATTRIBUTES
69+
value: "k8s.node.name=$(K8S_NODE_NAME),deployment.environment.name=test"
70+
- name: KUBE_NODE_NAME
71+
valueFrom:
72+
fieldRef:
73+
apiVersion: v1
74+
fieldPath: spec.nodeName
75+
livenessProbe:
76+
httpGet:
77+
path: /
78+
port: 13133
79+
readinessProbe:
80+
httpGet:
81+
path: /
82+
port: 13133
83+
resources:
84+
limits:
85+
cpu: 100m
86+
memory: 200M
87+
volumeMounts:
88+
- mountPath: /conf
89+
name: opentelemetry-collector-configmap
90+
- mountPath: /etc/machine-id
91+
mountPropagation: HostToContainer
92+
name: etcmachineid
93+
readOnly: true
94+
- mountPath: /var/lib/dbus/machine-id
95+
mountPropagation: HostToContainer
96+
name: varlibdbusmachineid
97+
readOnly: true
98+
volumes:
99+
- name: opentelemetry-collector-configmap
100+
configMap:
101+
name: example-opentelemetry-collector
102+
items:
103+
- key: relay
104+
path: relay.yaml
105+
- name: etcmachineid
106+
hostPath:
107+
path: /etc/machine-id
108+
- name: varlibdbusmachineid
109+
hostPath:
110+
path: /var/lib/dbus/machine-id
111+
nodeSelector:
112+
kubernetes.io/os: linux
113+
hostNetwork: false

0 commit comments

Comments
 (0)