Skip to content

Commit cc418a7

Browse files
M4iteeMateusz
andauthored
Otel collector integration (#519)
* adding otel integration * fixing naming, configuration, mounts for netdata-otel feat * changes to docs, checks, otel values * fixing deployment template for otel * Removing debug log level from otel, testing doc checks * Updating documentation * values table in non-html * removing long desc from some values * changes to workflows - release and checks install steps in cheks now wait for resources, archive is no longer in the branch - it is pulled during the tests and release. * adding security context * removing helm install step from release (not needed) * updates to docs * streamlining port change for netdataopentelemetry --------- Co-authored-by: Mateusz <m4itee@bularz.net>
1 parent ec2f565 commit cc418a7

14 files changed

Lines changed: 3531 additions & 199 deletions

File tree

.github/workflows/checks.yml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,26 @@ jobs:
3232
echo "changed=true" >> $GITHUB_OUTPUT
3333
fi
3434
35+
- name: Install helm-docs
36+
run: |
37+
GOBIN=/usr/local/bin/ go install github.com/norwoodj/helm-docs/cmd/helm-docs@v1.14.2
38+
39+
- name: Add helm repo for otel
40+
run: |
41+
helm repo add opentelemetry-collector https://open-telemetry.github.io/opentelemetry-helm-charts
42+
43+
- name: Build chart dependencies
44+
run: |
45+
helm dependency build charts/netdata
46+
47+
- name: Check documentation is up-to-date
48+
run: |
49+
./generate-documentation.sh
50+
if ! git diff --exit-code charts/netdata/README.md; then
51+
echo "::error::README.md is out of date. Please run ./generate-documentation.sh and commit the changes."
52+
exit 1
53+
fi
54+
3555
- name: Run chart-testing (lint)
3656
run: ct lint --check-version-increment=false --validate-maintainers=false --target-branch ${{ github.event.repository.default_branch }}
3757

@@ -41,3 +61,6 @@ jobs:
4161

4262
- name: Run chart-testing (install)
4363
run: ct install --target-branch ${{ github.event.repository.default_branch }}
64+
65+
- name: Run chart-testing (install with OpenTelemetry)
66+
run: ct install --target-branch ${{ github.event.repository.default_branch }} --helm-extra-set-args "--set netdataOpentelemetry.enabled=true --set otel-collector.enabled=true"

.github/workflows/release.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ jobs:
2929
git config --global user.name Netdatabot
3030
git config --global user.email bot@netdata.cloud
3131
32+
- name: Add helm repo for dependencies
33+
run: |
34+
helm repo add opentelemetry-collector https://open-telemetry.github.io/opentelemetry-helm-charts
35+
36+
- name: Build chart dependencies
37+
run: |
38+
helm dependency build charts/netdata
39+
3240
- name: Get current version
3341
id: get_current_var
3442
run: echo "current_version=$(.github/scripts/update_versions.py get_chart_version)" >> $GITHUB_OUTPUT

charts/netdata/Chart.lock

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
dependencies:
2+
- name: opentelemetry-collector
3+
repository: https://open-telemetry.github.io/opentelemetry-helm-charts
4+
version: 0.144.0
5+
digest: sha256:4386d6f39c3aacd5eeb07d40dcc23404d33001d1c6a90e8843d5fa9bd1b34f24
6+
generated: "2026-01-29T13:37:43.621411516+01:00"

charts/netdata/Chart.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,9 @@ maintainers:
1616
email: cloud-sre@netdata.cloud
1717
icon: https://netdata.github.io/helmchart/logo.png
1818
appVersion: v2.9.0
19+
dependencies:
20+
- name: opentelemetry-collector
21+
alias: otel-collector
22+
version: "0.144.0"
23+
repository: "https://open-telemetry.github.io/opentelemetry-helm-charts"
24+
condition: otel-collector.enabled

charts/netdata/README.md

Lines changed: 2054 additions & 184 deletions
Large diffs are not rendered by default.

charts/netdata/templates/_helpers.tpl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,31 @@ Return the secret data for the k8s state configuration, when you setup storedTyp
160160
{{- end -}}
161161
{{- end -}}
162162
{{- end -}}
163+
164+
{{/*
165+
Return the configmap data for the netdata OpenTelemetry configuration. Configmap is the default choice for storing configuration.
166+
*/}}
167+
{{- define "netdata.netdataOpentelemetry.configs.configmap" -}}
168+
{{- range $name, $config := .Values.netdataOpentelemetry.configs -}}
169+
{{- $found := false -}}
170+
{{- if and $config.enabled (eq $config.storedType "configmap") -}}
171+
{{- $found = true -}}
172+
{{- else if and $config.enabled (ne $config.storedType "secret") -}}
173+
{{- $found = true -}}
174+
{{- end -}}
175+
{{- if $found }}
176+
{{ $name }}: {{ tpl $config.data $ | toYaml | indent 4 | trim }}
177+
{{- end -}}
178+
{{- end -}}
179+
{{- end -}}
180+
181+
{{/*
182+
Return the secret data for the netdata OpenTelemetry configuration, when you setup storedType as a secret.
183+
*/}}
184+
{{- define "netdata.netdataOpentelemetry.configs.secret" -}}
185+
{{- range $name, $config := .Values.netdataOpentelemetry.configs -}}
186+
{{- if and $config.enabled (eq $config.storedType "secret") }}
187+
{{ $name }}: {{ tpl $config.data $ | b64enc }}
188+
{{- end -}}
189+
{{- end -}}
190+
{{- end -}}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{{- $configmapOtel := include "netdata.netdataOpentelemetry.configs.configmap" . }}
2+
{{- if and .Values.netdataOpentelemetry.enabled $configmapOtel }}
3+
---
4+
apiVersion: v1
5+
kind: ConfigMap
6+
metadata:
7+
name: netdata-conf-otel
8+
namespace: {{ .Release.Namespace }}
9+
labels:
10+
app: {{ template "netdata.name" . }}
11+
chart: {{ template "netdata.chart" . }}
12+
release: {{ .Release.Name }}
13+
heritage: {{ .Release.Service }}
14+
data:
15+
{{ $configmapOtel | indent 2 }}
16+
{{- end }}
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
{{- if .Values.netdataOpentelemetry.enabled }}
2+
---
3+
apiVersion: apps/v1
4+
kind: Deployment
5+
metadata:
6+
name: {{ template "netdata.name" . }}-otel
7+
namespace: {{ .Release.Namespace }}
8+
labels:
9+
app: {{ template "netdata.name" . }}
10+
chart: {{ template "netdata.chart" . }}
11+
release: {{ .Release.Name }}
12+
heritage: {{ .Release.Service }}
13+
role: otel
14+
spec:
15+
strategy:
16+
type: Recreate
17+
selector:
18+
matchLabels:
19+
app: {{ template "netdata.name" . }}
20+
release: {{ .Release.Name }}
21+
role: otel
22+
template:
23+
metadata:
24+
annotations:
25+
{{- if .Values.netdataOpentelemetry.podAnnotationAppArmor.enabled }}
26+
container.apparmor.security.beta.kubernetes.io/{{ .Chart.Name }}: unconfined
27+
{{- end }}
28+
checksum/config: {{ print (include (print $.Template.BasePath "/netdata-otel/configmap.yaml") .) (include (print $.Template.BasePath "/netdata-otel/secrets.yaml") .) | sha256sum }}
29+
{{- with .Values.netdataOpentelemetry.podAnnotations }}
30+
{{ toYaml . | trim | indent 8 }}
31+
{{- end }}
32+
labels:
33+
app: {{ template "netdata.name" . }}
34+
release: {{ .Release.Name }}
35+
role: otel
36+
{{- with .Values.netdataOpentelemetry.podLabels }}
37+
{{ toYaml . | trim | indent 8 }}
38+
{{- end }}
39+
spec:
40+
securityContext:
41+
fsGroup: {{ .Values.netdataOpentelemetry.securityContext.fsGroup }}
42+
serviceAccountName: {{ .Values.serviceAccount.name }}
43+
restartPolicy: Always
44+
{{- if .Values.netdataOpentelemetry.priorityClassName }}
45+
priorityClassName: "{{ .Values.netdataOpentelemetry.priorityClassName }}"
46+
{{- end }}
47+
{{- if .Values.imagePullSecrets }}
48+
imagePullSecrets:
49+
{{ toYaml .Values.imagePullSecrets | indent 8 }}
50+
{{- end }}
51+
initContainers:
52+
{{- if .Values.sysctlInitContainer.enabled }}
53+
- name: init-sysctl
54+
image: "{{ .Values.initContainersImage.repository }}:{{ .Values.initContainersImage.tag }}"
55+
imagePullPolicy: {{ .Values.initContainersImage.pullPolicy }}
56+
command:
57+
{{ toYaml .Values.sysctlInitContainer.command | indent 12 }}
58+
securityContext:
59+
runAsNonRoot: false
60+
privileged: true
61+
runAsUser: 0
62+
resources:
63+
{{ toYaml .Values.sysctlInitContainer.resources | indent 12 }}
64+
{{- end }}
65+
containers:
66+
- name: {{ .Chart.Name }}
67+
image: "{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }}"
68+
imagePullPolicy: {{ .Values.image.pullPolicy }}
69+
env:
70+
- name: MY_POD_NAME
71+
valueFrom:
72+
fieldRef:
73+
fieldPath: metadata.name
74+
- name: MY_POD_NAMESPACE
75+
valueFrom:
76+
fieldRef:
77+
fieldPath: metadata.namespace
78+
{{- if .Values.netdataOpentelemetry.claiming.enabled }}
79+
- name: NETDATA_CLAIM_URL
80+
value: "{{ .Values.netdataOpentelemetry.claiming.url }}"
81+
{{- if .Values.netdataOpentelemetry.claiming.token }}
82+
- name: NETDATA_CLAIM_TOKEN
83+
value: "{{ .Values.netdataOpentelemetry.claiming.token }}"
84+
{{- end }}
85+
{{- if .Values.netdataOpentelemetry.claiming.rooms }}
86+
- name: NETDATA_CLAIM_ROOMS
87+
value: "{{ .Values.netdataOpentelemetry.claiming.rooms }}"
88+
{{- end }}
89+
{{- end }}
90+
- name: NETDATA_LISTENER_PORT
91+
value: '{{ tpl (.Values.netdataOpentelemetry.port | toString) . }}'
92+
{{- range $key, $value := .Values.netdataOpentelemetry.env }}
93+
- name: {{ $key }}
94+
value: {{ $value | quote }}
95+
{{- end }}
96+
{{- with .Values.netdataOpentelemetry.envFrom }}
97+
envFrom:
98+
{{ toYaml . | indent 12 }}
99+
{{- end }}
100+
ports:
101+
- name: http
102+
containerPort: {{ tpl (.Values.netdataOpentelemetry.port | toString) . }}
103+
protocol: TCP
104+
- name: otel
105+
containerPort: {{ tpl (.Values.netdataOpentelemetry.service.port | toString) . }}
106+
protocol: TCP
107+
livenessProbe:
108+
exec:
109+
command:
110+
- /usr/sbin/netdatacli
111+
- ping
112+
initialDelaySeconds: {{ .Values.netdataOpentelemetry.livenessProbe.initialDelaySeconds }}
113+
failureThreshold: {{ .Values.netdataOpentelemetry.livenessProbe.failureThreshold }}
114+
periodSeconds: {{ .Values.netdataOpentelemetry.livenessProbe.periodSeconds }}
115+
successThreshold: {{ .Values.netdataOpentelemetry.livenessProbe.successThreshold }}
116+
timeoutSeconds: {{ .Values.netdataOpentelemetry.livenessProbe.timeoutSeconds }}
117+
readinessProbe:
118+
exec:
119+
command:
120+
- /usr/sbin/netdatacli
121+
- ping
122+
initialDelaySeconds: {{ .Values.netdataOpentelemetry.readinessProbe.initialDelaySeconds }}
123+
failureThreshold: {{ .Values.netdataOpentelemetry.readinessProbe.failureThreshold }}
124+
periodSeconds: {{ .Values.netdataOpentelemetry.readinessProbe.periodSeconds }}
125+
successThreshold: {{ .Values.netdataOpentelemetry.readinessProbe.successThreshold }}
126+
timeoutSeconds: {{ .Values.netdataOpentelemetry.readinessProbe.timeoutSeconds }}
127+
securityContext:
128+
runAsUser: {{ .Values.netdataOpentelemetry.securityContext.runAsUser }}
129+
runAsGroup: {{ .Values.netdataOpentelemetry.securityContext.runAsGroup }}
130+
volumeMounts:
131+
- name: os-release
132+
mountPath: /host/etc/os-release
133+
{{- range $name, $config := .Values.netdataOpentelemetry.configs }}
134+
{{- if $config.enabled }}
135+
- name: {{ ternary "configmap" "configsecret" (ne $config.storedType "secret") }}
136+
mountPath: {{ $config.path }}
137+
subPath: {{ $name }}
138+
{{- end }}
139+
{{- end }}
140+
{{- if .Values.netdataOpentelemetry.persistence.enabled }}
141+
- name: varlog
142+
mountPath: /var/log/netdata/otel
143+
{{- end }}
144+
{{- if .Values.netdataOpentelemetry.extraVolumeMounts -}}
145+
{{ toYaml .Values.netdataOpentelemetry.extraVolumeMounts | nindent 12 }}
146+
{{- end }}
147+
resources:
148+
{{ toYaml .Values.netdataOpentelemetry.resources | indent 12 }}
149+
{{- with .Values.netdataOpentelemetry.nodeSelector }}
150+
nodeSelector:
151+
{{ toYaml . | indent 8 }}
152+
{{- end }}
153+
{{- with .Values.netdataOpentelemetry.affinity }}
154+
affinity:
155+
{{ toYaml . | indent 8 }}
156+
{{- end }}
157+
{{- with .Values.netdataOpentelemetry.tolerations }}
158+
tolerations:
159+
{{ toYaml . | indent 8 }}
160+
{{- end }}
161+
terminationGracePeriodSeconds: {{ .Values.netdataOpentelemetry.terminationGracePeriodSeconds }}
162+
volumes:
163+
- name: os-release
164+
hostPath:
165+
path: /etc/os-release
166+
- name: configmap
167+
configMap:
168+
name: netdata-conf-otel
169+
optional: true
170+
- name: configsecret
171+
secret:
172+
secretName: netdata-conf-otel
173+
optional: true
174+
{{- if .Values.netdataOpentelemetry.persistence.enabled }}
175+
- name: varlog
176+
persistentVolumeClaim:
177+
claimName: {{ template "netdata.name" . }}-otel-varlog
178+
{{- end }}
179+
{{- if .Values.netdataOpentelemetry.extraVolumes }}
180+
{{ toYaml .Values.netdataOpentelemetry.extraVolumes | indent 8}}
181+
{{- end }}
182+
dnsPolicy: {{ .Values.netdataOpentelemetry.dnsPolicy }}
183+
{{- end }}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{{- if and .Values.netdataOpentelemetry.enabled .Values.netdataOpentelemetry.persistence.enabled }}
2+
---
3+
apiVersion: v1
4+
kind: PersistentVolumeClaim
5+
metadata:
6+
name: {{ template "netdata.name" . }}-otel-varlog
7+
namespace: {{ .Release.Namespace }}
8+
labels:
9+
app: {{ template "netdata.name" . }}
10+
chart: {{ template "netdata.chart" . }}
11+
release: {{ .Release.Name }}
12+
heritage: {{ .Release.Service }}
13+
role: otel
14+
spec:
15+
accessModes: [ "ReadWriteOnce" ]
16+
{{- if (ne "-" .Values.netdataOpentelemetry.persistence.storageclass) }}
17+
storageClassName: "{{ .Values.netdataOpentelemetry.persistence.storageclass }}"
18+
{{- end }}
19+
resources:
20+
requests:
21+
storage: {{ .Values.netdataOpentelemetry.persistence.volumesize }}
22+
{{- end }}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{{- $secretOtel := include "netdata.netdataOpentelemetry.configs.secret" . }}
2+
{{- if and .Values.netdataOpentelemetry.enabled $secretOtel }}
3+
---
4+
apiVersion: v1
5+
kind: Secret
6+
metadata:
7+
name: netdata-conf-otel
8+
namespace: {{ .Release.Namespace }}
9+
labels:
10+
app: {{ template "netdata.name" . }}
11+
chart: {{ template "netdata.chart" . }}
12+
release: {{ .Release.Name }}
13+
heritage: {{ .Release.Service }}
14+
type: Opaque
15+
data:
16+
{{ $secretOtel | indent 2 }}
17+
{{- end }}

0 commit comments

Comments
 (0)