Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions charts/netdata/Chart.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
dependencies:
- name: opentelemetry-collector
repository: https://open-telemetry.github.io/opentelemetry-helm-charts
version: 0.115.0
digest: sha256:64b58dabaaf8b4d9cac1a83f9e80ac632019843b2c42159051ecc5cb9700d8bb
generated: "2026-01-14T17:46:09.646928103+01:00"
7 changes: 7 additions & 0 deletions charts/netdata/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,10 @@ maintainers:
email: cloud-sre@netdata.cloud
icon: https://netdata.github.io/helmchart/logo.png
appVersion: v2.8.5

dependencies:
- name: opentelemetry-collector
alias: otel-collector
version: "0.115.0"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't this a very old version?

repository: "https://open-telemetry.github.io/opentelemetry-helm-charts"
condition: otel-collector.enabled
Binary file not shown.
28 changes: 28 additions & 0 deletions charts/netdata/templates/_helpers.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -160,3 +160,31 @@ Return the secret data for the k8s state configuration, when you setup storedTyp
{{- end -}}
{{- end -}}
{{- end -}}

{{/*
Return the configmap data for the netdata OpenTelemetry configuration. Configmap is the default choice for storing configuration.
*/}}
{{- define "netdata.netdataOpentelemetry.configs.configmap" -}}
{{- range $name, $config := .Values.netdataOpentelemetry.configs -}}
{{- $found := false -}}
{{- if and $config.enabled (eq $config.storedType "configmap") -}}
{{- $found = true -}}
{{- else if and $config.enabled (ne $config.storedType "secret") -}}
{{- $found = true -}}
{{- end -}}
{{- if $found }}
{{ $name }}: {{ tpl $config.data $ | toYaml | indent 4 | trim }}
{{- end -}}
{{- end -}}
{{- end -}}

{{/*
Return the secret data for the netdata OpenTelemetry configuration, when you setup storedType as a secret.
*/}}
{{- define "netdata.netdataOpentelemetry.configs.secret" -}}
{{- range $name, $config := .Values.netdataOpentelemetry.configs -}}
{{- if and $config.enabled (eq $config.storedType "secret") }}
{{ $name }}: {{ tpl $config.data $ | b64enc }}
{{- end -}}
{{- end -}}
{{- end -}}
16 changes: 16 additions & 0 deletions charts/netdata/templates/netdata-otel/configmap.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{{- $configmapOtel := include "netdata.netdataOpentelemetry.configs.configmap" . }}
{{- if and .Values.netdataOpentelemetry.enabled $configmapOtel }}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: netdata-conf-otel
namespace: {{ .Release.Namespace }}
labels:
app: {{ template "netdata.name" . }}
chart: {{ template "netdata.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
data:
{{ $configmapOtel | indent 2 }}
{{- end }}
177 changes: 177 additions & 0 deletions charts/netdata/templates/netdata-otel/deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
{{- if .Values.netdataOpentelemetry.enabled }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ template "netdata.name" . }}-otel
namespace: {{ .Release.Namespace }}
labels:
app: {{ template "netdata.name" . }}
chart: {{ template "netdata.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
role: otel
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: {{ template "netdata.name" . }}
release: {{ .Release.Name }}
role: otel
template:
metadata:
annotations:
{{- if .Values.netdataOpentelemetry.podAnnotationAppArmor.enabled }}
container.apparmor.security.beta.kubernetes.io/{{ .Chart.Name }}: unconfined
{{- end }}
checksum/config: {{ print (include (print $.Template.BasePath "/netdata-otel/configmap.yaml") .) (include (print $.Template.BasePath "/netdata-otel/secrets.yaml") .) | sha256sum }}
{{- with .Values.netdataOpentelemetry.podAnnotations }}
{{ toYaml . | trim | indent 8 }}
{{- end }}
labels:
app: {{ template "netdata.name" . }}
release: {{ .Release.Name }}
role: otel
{{- with .Values.netdataOpentelemetry.podLabels }}
{{ toYaml . | trim | indent 8 }}
{{- end }}
spec:
securityContext:
fsGroup: 201
Copy link

Copilot AI Jan 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The securityContext is set to fsGroup 201, but unlike the parent deployment which also sets runAsUser and runAsGroup to 201, this deployment doesn't specify these fields. For consistency and security best practices, consider adding runAsUser and runAsGroup to match the pattern used in the parent deployment, unless there's a specific reason to omit them.

Suggested change
fsGroup: 201
fsGroup: 201
runAsUser: 201
runAsGroup: 201

Copilot uses AI. Check for mistakes.
serviceAccountName: {{ .Values.serviceAccount.name }}
restartPolicy: Always
{{- if .Values.netdataOpentelemetry.priorityClassName }}
priorityClassName: "{{ .Values.netdataOpentelemetry.priorityClassName }}"
{{- end }}
{{- if .Values.imagePullSecrets }}
imagePullSecrets:
{{ toYaml .Values.imagePullSecrets | indent 8 }}
{{- end }}
initContainers:
{{- if .Values.sysctlInitContainer.enabled }}
- name: init-sysctl
image: "{{ .Values.initContainersImage.repository }}:{{ .Values.initContainersImage.tag }}"
imagePullPolicy: {{ .Values.initContainersImage.pullPolicy }}
command:
{{ toYaml .Values.sysctlInitContainer.command | indent 12 }}
securityContext:
runAsNonRoot: false
privileged: true
runAsUser: 0
resources:
{{ toYaml .Values.sysctlInitContainer.resources | indent 12 }}
{{- end }}
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
{{- if .Values.netdataOpentelemetry.claiming.enabled }}
- name: NETDATA_CLAIM_URL
value: "{{ .Values.netdataOpentelemetry.claiming.url }}"
{{- if .Values.netdataOpentelemetry.claiming.token }}
- name: NETDATA_CLAIM_TOKEN
value: "{{ .Values.netdataOpentelemetry.claiming.token }}"
{{- end }}
{{- if .Values.netdataOpentelemetry.claiming.rooms }}
- name: NETDATA_CLAIM_ROOMS
value: "{{ .Values.netdataOpentelemetry.claiming.rooms }}"
{{- end }}
{{- end }}
- name: NETDATA_LISTENER_PORT
value: '{{ tpl (.Values.netdataOpentelemetry.port | toString) . }}'
{{- range $key, $value := .Values.netdataOpentelemetry.env }}
- name: {{ $key }}
value: {{ $value | quote }}
{{- end }}
{{- with .Values.netdataOpentelemetry.envFrom }}
envFrom:
{{ toYaml . | indent 12 }}
{{- end }}
ports:
- name: http
containerPort: {{ tpl (.Values.netdataOpentelemetry.port | toString) . }}
protocol: TCP
Copy link

Copilot AI Jan 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The container listens on two ports: port 19999 for the Netdata web interface (configured via NETDATA_LISTENER_PORT) and port 4317 for the OTEL endpoint (configured in otel.yaml). However, only the Netdata web interface port is declared in the ports section. For clarity and completeness, consider also declaring the OTEL port (4317) in the container ports section, even though it's not strictly required. This helps with documentation and service discovery.

Suggested change
protocol: TCP
protocol: TCP
- name: otel
containerPort: 4317
protocol: TCP

Copilot uses AI. Check for mistakes.
livenessProbe:
exec:
command:
- /usr/sbin/netdatacli
- ping
initialDelaySeconds: {{ .Values.netdataOpentelemetry.livenessProbe.initialDelaySeconds }}
failureThreshold: {{ .Values.netdataOpentelemetry.livenessProbe.failureThreshold }}
periodSeconds: {{ .Values.netdataOpentelemetry.livenessProbe.periodSeconds }}
successThreshold: {{ .Values.netdataOpentelemetry.livenessProbe.successThreshold }}
timeoutSeconds: {{ .Values.netdataOpentelemetry.livenessProbe.timeoutSeconds }}
readinessProbe:
exec:
command:
- /usr/sbin/netdatacli
- ping
initialDelaySeconds: {{ .Values.netdataOpentelemetry.readinessProbe.initialDelaySeconds }}
failureThreshold: {{ .Values.netdataOpentelemetry.readinessProbe.failureThreshold }}
periodSeconds: {{ .Values.netdataOpentelemetry.readinessProbe.periodSeconds }}
successThreshold: {{ .Values.netdataOpentelemetry.readinessProbe.successThreshold }}
timeoutSeconds: {{ .Values.netdataOpentelemetry.readinessProbe.timeoutSeconds }}
volumeMounts:
- name: os-release
mountPath: /host/etc/os-release
{{- range $name, $config := .Values.netdataOpentelemetry.configs }}
{{- if $config.enabled }}
- name: {{ ternary "configmap" "configsecret" (ne $config.storedType "secret") }}
mountPath: {{ $config.path }}
subPath: {{ $name }}
{{- end }}
{{- end }}
{{- if .Values.netdataOpentelemetry.persistence.enabled }}
- name: varlib
mountPath: /var/log/netdata/otel
{{- end }}
{{- if .Values.netdataOpentelemetry.extraVolumeMounts -}}
{{ toYaml .Values.netdataOpentelemetry.extraVolumeMounts | nindent 12 }}
{{- end }}
resources:
{{ toYaml .Values.netdataOpentelemetry.resources | indent 12 }}
{{- with .Values.netdataOpentelemetry.nodeSelector }}
nodeSelector:
{{ toYaml . | indent 8 }}
{{- end }}
{{- with .Values.netdataOpentelemetry.affinity }}
affinity:
{{ toYaml . | indent 8 }}
{{- end }}
{{- with .Values.netdataOpentelemetry.tolerations }}
tolerations:
{{ toYaml . | indent 8 }}
{{- end }}
terminationGracePeriodSeconds: {{ .Values.netdataOpentelemetry.terminationGracePeriodSeconds }}
volumes:
- name: os-release
hostPath:
path: /etc/os-release
- name: configmap
configMap:
name: netdata-conf-otel
optional: true
- name: configsecret
secret:
secretName: netdata-conf-otel
optional: true
{{- if .Values.netdataOpentelemetry.persistence.enabled }}
- name: varlib
persistentVolumeClaim:
claimName: {{ template "netdata.name" . }}-otel-varlog
{{- end }}
{{- if .Values.netdataOpentelemetry.extraVolumes }}
{{ toYaml .Values.netdataOpentelemetry.extraVolumes | indent 8}}
{{- end }}
dnsPolicy: {{ .Values.netdataOpentelemetry.dnsPolicy }}
{{- end }}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{{- if and .Values.netdataOpentelemetry.enabled .Values.netdataOpentelemetry.persistence.enabled }}
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ template "netdata.name" . }}-otel-varlog
namespace: {{ .Release.Namespace }}
labels:
app: {{ template "netdata.name" . }}
chart: {{ template "netdata.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
role: otel
spec:
accessModes: [ "ReadWriteOnce" ]
{{- if (ne "-" .Values.netdataOpentelemetry.persistence.storageclass) }}
storageClassName: "{{ .Values.netdataOpentelemetry.persistence.storageclass }}"
{{- end }}
resources:
requests:
storage: {{ .Values.netdataOpentelemetry.persistence.volumesize }}
{{- end }}
17 changes: 17 additions & 0 deletions charts/netdata/templates/netdata-otel/secrets.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{{- $secretOtel := include "netdata.netdataOpentelemetry.configs.secret" . }}
{{- if and .Values.netdataOpentelemetry.enabled $secretOtel }}
---
apiVersion: v1
kind: Secret
metadata:
name: netdata-conf-otel
namespace: {{ .Release.Namespace }}
labels:
app: {{ template "netdata.name" . }}
chart: {{ template "netdata.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
type: Opaque
data:
{{ $secretOtel | indent 2 }}
{{- end }}
47 changes: 47 additions & 0 deletions charts/netdata/templates/netdata-otel/service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{{- if .Values.netdataOpentelemetry.enabled }}
---
apiVersion: v1
kind: Service
metadata:
name: {{ template "netdata.name" . }}-otel
namespace: {{ .Release.Namespace }}
labels:
app: {{ template "netdata.name" . }}
chart: {{ template "netdata.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
role: otel
annotations:
{{- with .Values.netdataOpentelemetry.service.annotations }}
{{ toYaml . | trim | indent 4 }}
{{- end }}
spec:
type: {{ .Values.netdataOpentelemetry.service.type }}
{{- if and (eq .Values.netdataOpentelemetry.service.type "LoadBalancer") .Values.netdataOpentelemetry.service.loadBalancerIP }}
loadBalancerIP: {{ .Values.netdataOpentelemetry.service.loadBalancerIP }}
{{- end }}
{{- if and (eq .Values.netdataOpentelemetry.service.type "LoadBalancer") .Values.netdataOpentelemetry.service.loadBalancerSourceRanges }}
loadBalancerSourceRanges:
{{- with .Values.netdataOpentelemetry.service.loadBalancerSourceRanges }}
{{ toYaml . | trim | indent 4 }}
{{- end }}
{{- end }}
{{- if and (eq .Values.netdataOpentelemetry.service.type "LoadBalancer") .Values.netdataOpentelemetry.service.externalTrafficPolicy }}
externalTrafficPolicy: {{ .Values.netdataOpentelemetry.service.externalTrafficPolicy }}
{{- if and (eq .Values.netdataOpentelemetry.service.externalTrafficPolicy "Local") .Values.netdataOpentelemetry.service.healthCheckNodePort }}
healthCheckNodePort: {{ .Values.netdataOpentelemetry.service.healthCheckNodePort }}
{{- end }}
{{- end }}
{{- if and (eq .Values.netdataOpentelemetry.service.type "ClusterIP") .Values.netdataOpentelemetry.service.clusterIP }}
clusterIP: {{ .Values.netdataOpentelemetry.service.clusterIP }}
{{- end }}
ports:
- port: {{ .Values.netdataOpentelemetry.service.port }}
targetPort: {{ .Values.netdataOpentelemetry.service.port }}
protocol: TCP
name: otel
selector:
app: {{ template "netdata.name" . }}
release: {{ .Release.Name }}
role: otel
{{- end }}
Loading
Loading