Last updated: July 5, 2026
Configuration
This guide covers all configuration options for the Dash0 operator, including backend connections, namespace monitoring, secrets, and operator settings.
Configuration
Configuring the Dash0 Backend Connection
You can skip this step if you provided --set operator.dash0Export.enabled=true together with the endpoint and either
a token or a secret reference when running helm install.
In that case, proceed to the next section,
Enable Dash0 Monitoring For a Namespace.
Otherwise, configure the backend connection now by creating a file dash0-operator-configuration.yaml with the
following content:
1234567891011121314151617apiVersion: operator.dash0.com/v1alpha1kind: Dash0OperatorConfigurationmetadata:name: dash0-operator-configurationspec:exports:- dash0:# Replace this value with the actual OTLP/gRPC endpoint of your Dash0 organization.endpoint: ingress... # TODO needs to be replaced with the actual value, see belowauthorization:# Provide the Dash0 authorization token as a string via the token property:token: auth_... # TODO needs to be replaced with the actual value, see belowapiEndpoint: https://api.....dash0.com # TODO needs to be replaced with the actual value, see belowclusterName: my-kubernetes-cluster # optional, see below
Here is a list of configuration options for this resource:
-
spec.exports[]: One or moreexportconfigs defining endpoints and authorization (see below for details). If multiple exports are defined, the telemetry will be exported to all defined exports and CRs (views, synthetic checks, dashboards, check rules, notification channels, spam filters, signal-to-metrics rules) will be synced to all defined Dash0 exports. -
spec.exports[].dash0.endpoint: The URL of the Dash0 ingress endpoint to which telemetry data will be sent. This property is mandatory. Replace the value in the example above with the OTLP/gRPC endpoint of your Dash0 organization. The correct OTLP/gRPC endpoint can be copied from https://app.dash0.com → organization settings → "Endpoints" → "OTLP/gRPC". Note that the correct endpoint value will always start withingress.and end indash0.com:4317. Including a protocol prefix (e.g.https://) is optional. -
spec.exports[].dash0.authorization.tokenorspec.exports[].dash0.authorization.secretRef: Exactly one of these two properties needs to be provided. Providing both will cause a validation error when installing the Dash0Monitoring resource.-
: Replace the value in the example above with the Dash0 authorization token of your organization. The authorization token for your Dash0 organization can be copied from https://app.dash0.com → organization settings → "Auth Tokens". The prefix
Bearermust not be included in the value. Note that the value will be rendered verbatim into a Kubernetes ConfigMap object. Anyone with API access to the Kubernetes cluster will be able to read the value. Use thesecretRefproperty and a Kubernetes secret if you want to avoid that. -
: A reference to an existing Kubernetes secret in the Dash0 operator's namespace. See the section Using a Kubernetes Secret for the Dash0 Authorization Token for an example file that uses a
secretRef. The secret needs to contain the Dash0 authorization token. See below for details on how exactly the secret should be created and configured. Note that by default, Kubernetes secrets are stored unencrypted, and anyone with API access to the Kubernetes cluster will be able to read the value. Additional steps are required to make sure secret values are encrypted. See https://kubernetes.io/docs/concepts/configuration/secret/ for more information on Kubernetes secrets.
-
-
spec.exports[].dash0.apiEndpoint: The base URL of the Dash0 API to talk to. This is not where telemetry will be sent, but it is used for managing dashboards, check rules, synthetic checks, views, notification channels, spam filters and signal-to-metrics rules via the operator. This property is optional. The value needs to be the API endpoint of your Dash0 organization. The correct API endpoint can be copied from https://app.dash0.com → organization settings → "Endpoints" → "API". The correct endpoint value will always start with "https://api." and end in ".dash0.com". If this property is omitted, managing dashboards, check rules, synthetic checks, views, notification channels, spam filters and signal-to-metrics rules via the operator will not work. -
spec.selfMonitoring.enabled: An opt-out for self-monitoring for the operator. If enabled, the operator will collect self-monitoring telemetry and send it to the configured Dash0 backend. This setting is optional, it defaults totrue. -
spec.kubernetesInfrastructureMetricsCollection.enabled: If enabled, the operator will collect Kubernetes infrastructure metrics. This setting is optional, it defaults totrue; unlesstelemetryCollection.enabledis set tofalse, thenkubernetesInfrastructureMetricsCollection.enableddefaults tofalseas well. It is a validation error to settelemetryCollection.enabled=falseandkubernetesInfrastructureMetricsCollection.enabled=trueat the same time. -
spec.collectPodLabelsAndAnnotations.enabled: If enabled, the operator will collect all Kubernetes pod labels and annotations and convert them to resource attributes for all spans, log records and metrics. The resulting resource attributes are prefixed withk8s.pod.label.ork8s.pod.annotation.respectively. This setting is optional, it defaults totrue; unlesstelemetryCollection.enabledis set tofalse, thencollectPodLabelsAndAnnotations.enableddefaults tofalseas well. It is a validation error to settelemetryCollection.enabled=falseandcollectPodLabelsAndAnnotations.enabled=trueat the same time. -
spec.collectNodeLabelsAndAnnotations.enabled: If enabled, the operator will collect all Kubernetes node labels and annotations and convert them to resource attributes for all spans, log records and metrics. The resulting resource attributes are prefixed withk8s.node.label.ork8s.node.annotation.respectively. This setting is optional, it defaults tofalse. It is a validation error to settelemetryCollection.enabled=falseandcollectNodeLabelsAndAnnotations.enabled=trueat the same time. -
spec.clusterName: If set, the value will be added as the resource attributek8s.cluster.nameto all telemetry. This setting is optional. By default,k8s.cluster.namewill not be added to telemetry. -
spec.telemetryCollection.enabled: An opt-out switch for all telemetry collection, and to avoid having the operator deploy OpenTelemetry collectors in the cluster. This setting is optional, it defaults totrue(that is, by default, OpenTelemetry collectors will be deployed and telemetry will be collected). If telemetry collection is disabled via this switch, the operator will not collect any telemetry, in particular it will not deploy any OpenTelemetry collectors in the cluster. This is useful if you want to use the operator for infrastructure-as-code (e.g. to synchronize dashboards & check rules), but do not want it to deploy the OpenTelemetry collector. Note that setting this tofalsedoes not disable the operator's self-monitoring telemetry, use the settingspec.selfMonitoring.enabledto disable self-monitoring if required (self-monitoring does not require an OpenTelemetry collector). Also note that this setting is not exposed via Helm, i.e. if you want to set this tofalseyou need to deploy the operator configuration resource manually, i.e. omit the Helm valueoperator.dash0Export.enabledor set it tofalse, then deploy an operator configuration resource viakubectl apply -for similar. -
spec.prometheusCrdSupport.enabled: A flag controlling whether support for Prometheus CRDs will be enabled. This setting is optional and the default isfalse. Setting it totrueand having at least one namespace withprometheusScrapingenabled, will deploy the OpenTelemetry target-allocator and update theprometheusreceiverin the OpenTelemetry collectors, so they query the allocator for targets to be scraped. -
spec.instrumentWorkloads.instrumentationDelivery: Whether to use an image volume or an init container plus an emptyDir volume to provide instrumentation files to workloads when applying auto-instrumentation. See Using Image Volumes for Auto-Instrumentation Files. Allowed values:auto: use image volumes if the Kubernetes version is 1.36 or later, otherwise use the init container approach.image-volume: always use image volumes, also on Kubernetes versions older than 1.36. If the Kubernetes version is older than 1.31, the operator manager will log a warning and fall back to the init container approach, since image volumes are not supported in that version. Note that if you are using Kubernetes 1.34 or earlier, and you want to use this setting, you need to enable image volumes when configuring your cluster, since image volumes are disabled by default in versions older than 1.35.init-container: always use the init container approach, regardless of the Kubernetes version. This is the default.
-
spec.autoMonitorNamespaces.enabled: Controls whether monitoring is set up for namespaces automatically. By default, a Dash0Monitoring resource has to be added to each namespace that you want to monitor. With automatic namespace monitoring, you can let the Dash0 operator automate this. This is useful if you want to monitor all or almost all namespaces in your cluster. It is also useful if you create new namespaces frequently and want to have them monitored right away, without additional setup. It is best suited if almost all namespace should be monitored in the same fashion. If enabled, the operator will:- automatically add monitoring to all existing namespaces at startup, and
- automatically add monitoring to new namespaces, as they are created. Even when enabled, individual namespaces can opt out of automatic monitoring via label selectors. Namespaces which are subject to automatic namespace monitoring will be monitored according to the settings of the monitoringTemplate.
-
operatorconfigurationresource.spec.autoMonitorNamespaces.labelSelector: An optional configurable label selector for controlling which namespaces are automatically monitored. Namespaces which match this label selector will be monitored automatically (ifautoMonitorNamespaces.enabledis set totrue). Namespaces which do not match this label selector will not be monitored, regardless of the value ofautoMonitorNamespaces.enabled. By default, this label selector has the value"dash0.com/enable!=false"- that is, the following namespaces will be monitored:- namespaces which do not have the label dash0.com/enable at all, and
- namespaces which have the label dash0.com/enable with a value other than "false". Namespaces which are subject to automatic namespace monitoring will be monitored according to the settings of the monitoringTemplate.
-
operatorconfigurationresource.spec.monitoringTemplate: Specification of the desired settings for automatically monitoring namespaces.
After providing the required values (at least endpoint and authorization), save the file and apply the resource to
the Kubernetes cluster you want to monitor:
1kubectl apply -f dash0-operator-configuration.yaml
The Dash0 operator configuration resource is cluster-scoped, so a specific namespace should not be provided when applying it.
Note: All configuration options available in the operator configuration resource can also be configured when letting the Helm chart auto-create this resource, as explained in the section Installation. You can consult the chart's values.yaml file for a complete list of available configuration settings.
Notes on Creating the Operator Configuration Resource Via Helm
Providing the backend connection settings to the operator via Helm parameters is a convenience mechanism to get
monitoring started right away when installing the operator.
Setting operator.dash0Export.enabled to true and providing other necessary operator.dash0Export.* values like
operator.dash0Export.endpoint will instruct the operator manager to create an operator configuration resource with the
provided values at startup.
This automatically created operator configuration resource will have the name
dash0-operator-configuration-auto-resource.
If an operator configuration resource with any other name already exists in the cluster (e.g. a manually created operator configuration resource), the operator will treat this as an error and refuse to overwrite the existing operator configuration resource with the values provided via Helm.
If an operator configuration resource with the name dash0-operator-configuration-auto-resource already exists in the
cluster (e.g. a previous startup of the operator manager has created the resource), the operator manager will
update/overwrite this resource with the values provided via Helm.
Manual changes to the dash0-operator-configuration-auto-resource are permissible for quickly experimenting with
configuration changes, without an operator restart, but you need to be aware that they will be overwritten with the
settings provided via Helm the next time the operator manager pod is restarted.
Possible reasons for a restart of the operator manager pod include upgrading to a new operator version, running
helm upgrade ... dash0-operator dash0-operator/dash0-operator, or Kubernetes moving the operator manager pod to a
different node.
For this reason, when using this feature, it is recommended to treat the Helm values as the source of truth for the
operator configuration.
Any changes you want to be permanent should be applied via Helm and the operator.dash0Export.* settings.
If you would rather retain manual control over the operator configuration resource, you should omit any
operator.dash0Export.* Helm values and create and manage the operator configuration resource manually (that is, via
kubectl, ArgoCD etc.).
Enable Dash0 Monitoring For a Namespace
Note: As an alternative to enabling monitoring per namespace, you can also monitor all namespaces automatically.
Note: By default, when enabling Dash0 monitoring for a namespace, all workloads in this namespace will be restarted to apply the Dash0 instrumentation. If you want to avoid this, set the
instrumentWorkloadsproperty in the monitoring resource spec tocreated-and-updated. See below for more information on theinstrumentWorkloadsmodes.
For each namespace that you want to monitor with Dash0, enable monitoring by installing a Dash0 monitoring resource into that namespace:
Create a file dash0-monitoring.yaml with the following content:
1234apiVersion: operator.dash0.com/v1beta1kind: Dash0Monitoringmetadata:name: dash0-monitoring-resource
Save the file and apply the resource to the namespace you want to monitor.
For example, if you want to monitor workloads in the namespace my-nodejs-applications, use the following command:
1kubectl apply --namespace my-nodejs-applications -f dash0-monitoring.yaml
If you want to monitor the default namespace with Dash0, use the following command:
1kubectl apply -f dash0-monitoring.yaml
Note: Even when no monitoring resources has been installed and no namespace is being monitored by Dash0, the Dash0 operator's collector will collect Kubernetes infrastructure metrics that are not namespace scoped, like node-related metrics. The only prerequisite for this is an operator configuration with exports settings.
Disable Dash0 Monitoring For a Namespace
If you want to stop monitoring a namespace with Dash0, remove the Dash0 monitoring resource from that namespace.
For example, if you want to stop monitoring workloads in the namespace my-nodejs-applications, use the following command:
1kubectl delete --namespace my-nodejs-applications Dash0Monitoring dash0-monitoring-resource
or, alternatively, by using the dash0-monitoring.yaml file created earlier:
1kubectl delete --namespace my-nodejs-applications -f dash0-monitoring.yaml
Additional Configuration Per Namespace
The Dash0 monitoring resource supports additional configuration settings:
-
spec.instrumentWorkloads.mode: A namespace-wide configuration for the workload instrumentation strategy for the target namespace. There are three possible settings:all,created-and-updatedandnone. By default, the settingallis assumed; unless there is an operator configuration resource withtelemetryCollection.enabled=false, then the settingnoneis assumed by default. Note thatspec.instrumentWorkloads.modeis the path for this setting starting with versionv1beta1of the Dash0 monitoring resource; when usingv1alpha1, the path isspec.instrumentWorkloads.-
all: If set toall, the operator will:- instrument existing workloads in the target namespace (i.e. workloads already running in the namespace) when the Dash0 monitoring resource is deployed,
- instrument existing workloads or update the instrumentation of already instrumented workloads in the target namespace when the Dash0 operator is first started or updated to a newer version,
- instrument new workloads in the target namespace when they are deployed, and
- instrument changed workloads in the target namespace when changes are applied to them.
- Note that the first two actions (instrumenting existing workloads) will result in restarting the pods of the
affected workloads.
Use
created-and-updatedif you want to avoid pod restarts.
-
created-and-updated: If set tocreated-and-updated, the operator will not instrument existing workloads in the target namespace. Instead, it will only:- instrument new workloads in the target namespace when they are deployed, and
- instrument changed workloads in the target namespace when changes are applied to them. This setting is useful if you want to avoid pod restarts as a side effect of deploying the Dash0 monitoring resource or restarting the Dash0 operator.
-
none: You can opt out of instrumenting workloads entirely by setting this option tonone. Withspec.instrumentWorkloads: none, workloads in the target namespace will never be instrumented to emit telemetry.
If this setting is omitted, the value
allis assumed and new/updated as well as existing Kubernetes workloads will be instrumented by the operator to emit telemetry, as described above. There is one exception to this rule: If there is an operator configuration resource withtelemetryCollection.enabled=false, then the default setting isnoneinstead ofall, and no workloads will be instrumented by the Dash0 operator.More fine-grained per-workload control over instrumentation is available by setting the label
dash0.com/enable=falseon individual workloads, see Disabling Auto-Instrumentation for Specific Workloads.The behavior when changing this setting for an existing Dash0 monitoring resource is as follows:
- When this setting is updated to
spec.instrumentWorkloads=all(and it had a different value before): All existing uninstrumented workloads will be instrumented. Their pods will be restarted to apply the instrumentation. - When this setting is updated to
spec.instrumentWorkloads=none(and it had a different value before): The instrumentation will be removed from all instrumented workloads. Their pods will be restarted to remove the instrumentation. (After this change, the operator will no longer instrument any workloads nor will it restart any pods.) - Updating this value to
spec.instrumentWorkloads=created-and-updatedhas no immediate effect; existing uninstrumented workloads will not be instrumented, existing instrumented workloads will not be uninstrumented. Newly deployed or updated workloads will be instrumented from the point of the configuration change onwards as described above.
Automatic workload instrumentation will automatically add tracing to your workloads. You can read more about what exactly this feature entails in the section Automatic Workload Instrumentation.
-
-
spec.instrumentWorkloads.labelSelector: A custom Kubernetes label selector for controlling the workload instrumentation on the level of individual workloads, see Using a Custom Label Selector to Control Auto-Instrumentation. -
spec.instrumentWorkloads.traceContext.propagators: When set, the operator will add the environment variableOTEL_PROPAGATORSto all instrumented workloads in the target namespace. This environment variable determines which trace context propagation headers an OTel SDK uses. Setting this can be useful if the workloads in this namespace interact with services that do not use the W3C trace context standard headertraceparentfor trace context propagation, but for example AWS X-Ray (X-Amzn-Trace-Id). The value of the setting will be validated, it needs to be a comma-separated list of valid propagators. See https://opentelemetry.io/docs/languages/sdk-configuration/general/#otel_propagators for more information.When the option is not set, the operator will not set the environment variable
OTEL_PROPAGATORS. If the option is set in the monitoring resource at some point and then later removed again, the operator will remove the environment variable from instrumented workloads if and only if the value of the environment variable matches the previously used setting in the monitoring resource. This is done to prevent accidentally removing anOTEL_PROPAGATORSenvironment variable that has been set manually and not by the operator. (For that purpose, the previous setting is stored in the monitoring resource's status.) -
spec.instrumentWorkloads.captureSqlQueryParameters: When set totrue, the operator enables SQL query parameter capture in the language agents that support it. Currently this covers the OpenTelemetry Java agent's JDBC instrumentation and the OpenTelemetry .NET auto-instrumentation for Microsoft.Data.SqlClient and Entity Framework Core, by adding the following environment variables (all set totrue) to instrumented containers in the target namespace:OTEL_INSTRUMENTATION_JDBC_EXPERIMENTAL_CAPTURE_QUERY_PARAMETERSOTEL_DOTNET_EXPERIMENTAL_SQLCLIENT_ENABLE_TRACE_DB_QUERY_PARAMETERSOTEL_DOTNET_EXPERIMENTAL_EFCORE_ENABLE_TRACE_DB_QUERY_PARAMETERS
Recorded query parameter values are added to the resulting database span attributes. Other language agents ignore these variables.
Note that these are experimental upstream OpenTelemetry agent flags and may be renamed or removed in future agent releases. Recorded query parameter values may include sensitive data such as personally identifiable information (PII), so enable this only for namespaces where capturing query parameter values is acceptable.
When the option is not set or set to
false, the operator will not set the environment variables. If the option is set totrueat some point and then later set tofalseor removed, the operator will remove each environment variable from instrumented workloads if and only if its current value still matches what the operator would have set (the literaltrue); a user-set value that differs is preserved. (For that purpose, the previous setting is stored in the monitoring resource's status.) -
spec.logCollection.enabled: A namespace-wide opt-out for collecting pod logs via thefilelogreceiver. If enabled, the operator will configure its OpenTelemetry collector to watch the log output of all pods in the namespace and send the resulting log records to Dash0. This setting is optional, it defaults totrue; unless there is an operator configuration resource withtelemetryCollection.enabled=false, then log collection is off by default. It is a validation error to settelemetryCollection.enabled=falsein the operator configuration resource andlogCollection.enabled=truein any monitoring resource at the same time. -
spec.prometheusScraping.enabled: A namespace-wide opt-out for Prometheus scraping for the target namespace. If enabled, the operator will configure its OpenTelemetry collector to scrape metrics from pods in the namespace of this Dash0Monitoring resource according to theirprometheus.io/scrapeannotations via the OpenTelemetry Prometheus receiver. In addition, if the operator configuration resource hasprometheusCrdSupport.enabled=true, the collectors will scrape metrics from endpoints defined in Prometheus CRs (ServiceMonitor,PodMonitor,ScrapeConfig) present in this namespace. This setting is optional, it defaults totrue; unless there is an operator configuration resource withtelemetryCollection.enabled=false, then Prometheus scraping is off by default. It is a validation error to settelemetryCollection.enabled=falsein the operator configuration resource andprometheusScraping.enabled=truein any monitoring resource at the same time. Note that the collection of OpenTelemetry-native metrics is not affected by settingprometheusScraping.enabled=falsefor a namespace. -
spec.filter: An optional custom filter configuration to drop some of the collected telemetry before sending it to the configured telemetry backend. Filters for a specific telemetry object type (e.g. spans) are lists of OTTL expressions. If at least one of the conditions of a list evaluates to true, the object will be dropped. (That is, conditions are implicitly connected by a logical OR.) The configuration structure is identical to the configuration of the OpenTelemetry collector's filter processor. One difference to the filter processor is that the filter rules configured in a Dash0 monitoring resource will only be applied to the telemetry collected in the namespace the monitoring resource is installed in. Telemetry from other namespaces is not affected. Existing configurations for the filter processor can be copied and pasted without syntactical changes.spec.filter.traces.span: A list of OTTL conditions for filtering spans. All spans where at least one condition evaluates to true will be dropped. (That is, conditions are implicitly connected by a logical OR.)spec.filter.traces.spanevent: A list of OTTL conditions for filtering span events. All span events where at least one condition evaluates to true will be dropped. If all span events for a span are dropped, the span will be left intact.spec.filter.metrics.metric: A list of OTTL conditions for filtering metrics. All metrics where at least one condition evaluates to true will be dropped.spec.filter.metrics.datapoint: A list of OTTL conditions for filtering individual data points of metrics. All data points where at least one condition evaluates to true will be dropped. If all datapoints for a metric are dropped, the metric will also be dropped.spec.filter.logs.log_records: A list of OTTL conditions for filtering log records. All log records where at least one condition evaluates to true will be dropped.spec.filter.profiles.profile: A list of OTTL conditions for filtering profiles. All profiles where at least one condition evaluates to true will be dropped. This setting is optional, by default, no filters are applied. It is a validation error to settelemetryCollection.enabled=falsein the operator configuration resource and set filters in any monitoring resource at the same time.
Note that although
error_modecan be specified per namespace, the filter conditions will be aggregated into one single filter processor in the resulting OpenTelemetry collector configuration; if different error modes are specified in different namespaces, the "most severe" error mode will be used (propagate > ignore > silent). -
spec.transform: An optional custom transformation configuration that will be applied to the collected telemetry before sending it to the configured telemetry backend. Transformations for a specific telemetry signal (e.g. traces, metrics, logs, profiles) are lists of OTTL statements. All telemetry for the respective signal will be routed through all transformation statements. The statements are executed in the order they are listed. The configuration structure is identical to the configuration of the OpenTelemetry collector's transform processor. Both the basic configuration style, and the advanced configuration style of the transform processor are supported. One difference to the transform processor is that the transform rules configured in a Dash0 monitoring resource will only be applied to the telemetry collected in the namespace the monitoring resource is installed in. Telemetry from other namespaces is not affected. If bothspec.filterandspec.transformare configured, the filtering for a given signal (traces, metrics, logs, profiles) will be executed before the transform processor. (That is, you cannot assume that transformations have already been applied when writing filter rules.) Existing configurations for the transform processor can be copied and pasted without syntactical changes.spec.transform.trace_statements: A list of OTTL statements (or a list of groups in the advanced config style) for transforming trace telemetry.spec.transform.metric_statements: A list of OTTL statements (or a list of groups in the advanced config style) for transforming metric telemetry.spec.transform.log_statements: A list of OTTL statements (or a list of groups in the advanced config style) for transforming log telemetry.spec.transform.profile_statements: A list of OTTL statements (or a list of groups in the advanced config style) for transforming profile telemetry. This setting is optional, by default, no transformations are applied. It is a validation error to settelemetryCollection.enabled=falsein the operator configuration resource and set transforms in any monitoring resource at the same time.
Note that although
error_modecan be specified per namespace, the transform statements will be aggregated into one single transform processor in the resulting OpenTelemetry collector configuration; if different error modes are specified in different namespaces, the "most severe" error mode will be used (propagate > ignore > silent). -
spec.synchronizePersesDashboards: A namespace-wide opt-out for synchronizing Perses dashboard resources found in the target namespace. If enabled, the operator will watch Perses dashboard resources in this namespace and create corresponding dashboards in Dash0 via the Dash0 API. More fine-grained per-resource control over synchronization is available by setting the labeldash0.com/enable=falseon individual Perses dashboard resources. See Managing Dash0 Dashboards for details. This setting is optional, it defaults totrue. -
spec.synchronizePrometheusRules: A namespace-wide opt-out for synchronizing Prometheus rule resources found in the target namespace. If enabled, the operator will watch Prometheus rule resources in this namespace and create corresponding check rules in Dash0 via the Dash0 API. More fine-grained per-resource control over synchronization is available by setting the labeldash0.com/enable=falseon individual Prometheus rule resources. See Managing Dash0 Check Rules for details. This setting is optional, it defaults totrue.
Example
Here is a comprehensive example for a monitoring resource which:
- sets the instrumentation mode to
created-and-updated, - disables Prometheus scraping,
- sets a couple of filters for all six telemetry object types,
- applies transformations to limit the length of span attributes, datapoint attributes, log attributes, and profile attributes (with the metric transform using the advanced transform config style),
- disables Perses dashboard synchronization, and
- disables Prometheus rule synchronization.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849apiVersion: operator.dash0.com/v1beta1kind: Dash0Monitoringmetadata:name: dash0-monitoring-resourcespec:instrumentWorkloads: created-and-updatedprometheusScraping:enabled: falsefilter:traces:span:- 'attributes["http.route"] == "/ready"'- 'attributes["http.route"] == "/metrics"'spanevent:- 'attributes["grpc"] == true'- 'IsMatch(name, ".*grpc.*")'metrics:metric:- 'name == "k8s.replicaset.available"'- 'name == "k8s.replicaset.desired"'datapoint:- 'metric.type == METRIC_DATA_TYPE_SUMMARY'- 'resource.attributes["service.name"] == "my_service_name"'logs:log_records:- 'IsMatch(body, ".*password.*")'- 'severity_number < SEVERITY_NUMBER_WARN'profiles:profile:- 'resource.attributes["k8s.pod.name"] == "debug-pod"'transform:trace_statements:- 'truncate_all(span.attributes, 1024)'metric_statements:- conditions:- 'metric.type == METRIC_DATA_TYPE_SUM'statements:- 'truncate_all(datapoint.attributes, 1024)'log_statements:- 'truncate_all(log.attributes, 1024)'profile_statements:- 'truncate_all(profile.attributes, 1024)'synchronizePersesDashboards: falsesynchronizePrometheusRules: false
Namespace-specific Exports and API-sync Overrides
It is possible to override the global/default exports config provided via the Dash0 operator configuration on a per-namespace basis by providing the corresponding exports config via the Dash0 monitoring resource. Please note that the namespace-specific overrides replace the default list of exports from the Dash0 operator configuration.
The override supports both the export of telemetry and the sync of resources, like dashboards or views, via the Dash0 API.
Note: The operator always expects default export and API-sync settings via the Dash0 operator configuration, even when namespace-specific overrides are used.
Automatic Namespace Monitoring
By default, a Dash0Monitoring resource has to be added to each namespace that you want to monitor (see Enable Dash0 Monitoring For a Namespace). With automatic namespace monitoring, you can let the Dash0 operator automate this. This is useful if you want to monitor all or almost all namespaces in your cluster. It is also useful if you create new namespaces frequently and want to have them monitored right away, without additional setup. It is best suited if almost all namespace should be monitored in the same fashion.
Use the following Helm values to enable automatic namespace monitoring:
1234567891011operator:dash0Export:# operator.dash0Export.enabled must be true to facilitate automatic namespace monitoring.# Refer to the section "Installation" for details.enabled: true...autoMonitorNamespaces:# Setting operator.autoMonitorNamespaces.enabled=true activates automatic namespace monitoring.enabled: true
If automatic namespace monitoring is enabled, the operator will:
- automatically add monitoring to all existing namespaces at startup, and
- automatically add monitoring to new namespaces, as they are created.
Even when this feature is enabled, individual namespaces can opt out of automatic monitoring via label selectors.
Set dash0.com/enable: "false" on a namespace to exclude it from automatic namespace monitoring.
The namespace label selector is configurable. For example, to use an opt-in approach instead of opt-out, something like this can be used:
123456789operator:dash0Export:enabled: true...autoMonitorNamespaces:enabled: truelabelSelector: monitor-namespace-with-dash0==true
With this configuration, only namespaces that have the label monitor-namespace-with-dash0: "true" will be monitored.
The following namespaces will not be monitored by automatic namespace monitoring, regardless of the label selector:
kube-systemkube-node-leasekube-public- the namespace of the Dash0 operator
You can deploy a monitoring resource to these namespaces manually though.
Automatically monitoring namespaces will be monitored with the following default settings:
instrumentWorkloads.mode:created-and-updated- Log Collection: Enabled
- Event Collection: Enabled
- Prometheues Scraping: Enabled
- Synchronize Perses Dashboards: Enabled
- Synchronize Prometheus Rules: Enabled
The defaults can be customized, as follows:
1234567891011121314151617181920operator:dash0Export:enabled: true...autoMonitorNamespaces:enabled: truemonitoringTemplate:spec:instrumentWorkloads:mode: nonelogCollection:enabled: trueeventCollection:enabled: trueprometheusScraping:enabled: falsesynchronizePersesDashboards: falsesynchronizePrometheusRules: false
With the previous example, only logs and Kubernetes events would be collected in automatically monitored namespaces, no workload auto-instrumentation would happen, and Prometheus metrics would not be scraped.
All settings mentioned in Additional Configuration Per Namespace) can be
set with the monitoring template, with the exception of per-namespace exports.
(Use the operator.dash0Export to configure the export instead.)
The following snippet shows all possible settings:
123456789101112131415161718192021222324252627282930313233343536373839404142operator:monitoringTemplate:spec:instrumentWorkloads:mode: nonelogCollection:enabled: trueeventCollection:enabled: trueprometheusScraping:enabled: falsefilter:traces:span:- 'attributes["http.route"] == "/ready"'- 'attributes["http.route"] == "/metrics"'spanevent:- 'attributes["grpc"] == true'- 'IsMatch(name, ".*grpc.*")'metrics:metric:- 'name == "k8s.replicaset.available"'- 'name == "k8s.replicaset.desired"'datapoint:- 'metric.type == METRIC_DATA_TYPE_SUMMARY'- 'resource.attributes["service.name"] == "my_service_name"'logs:log_records:- 'IsMatch(body, ".*password.*")'- 'severity_number < SEVERITY_NUMBER_WARN'transform:trace_statements:- 'truncate_all(span.attributes, 1024)'metric_statements:- conditions:- 'metric.type == METRIC_DATA_TYPE_SUM'statements:- 'truncate_all(datapoint.attributes, 1024)'log_statements:- 'truncate_all(log.attributes, 1024)'synchronizePersesDashboards: falsesynchronizePrometheusRules: false
If there are some namespaces which require different monitoring settings, exclude them from automatic namespace
monitoring via the label selector (e.g. dash0.com/enable: "false") and deploy a Dash0Monitoring resource there
manually.
If the cluster has a lot of namespaces (e.g. close to or more than 1,000), it is recommended to set
operator.collectors.compressConfigMaps to true.
This will enable gzip compression for the ConfigMaps for the OpenTelemetry collectors.
Example:
12345678910operator:dash0Export:enabled: true...collectors:compressConfigMaps: trueautoMonitorNamespaces:enabled: true
Using Image Volumes for Auto-Instrumentation Files
When using auto-instrumentation of workloads, by default the operator adds an
emptyDir volume and an
init container to provide the instrumentation
files to the workload.
Image volumes are a new Kubernetes feature that provides a better way to do this. They provide the following advantages:
- No additional ephemeral storage usage.
- Faster workload startup (because nothing needs to be copied over from the init container to the empty dir volume)
They were introduced in Kubernetes 1.31 as an alpha feature behind a feature gate. In version 1.33 they graduated to beta, but were still disabled by default. Starting with version 1.35, the image volume feature gate is enabled by default, but they are still considered beta. Image volumes finally became a stable feature in version 1.36
Set the instrumentationDelivery setting
in the operator configuration resource to determine under which circumstances image volumes will be used instead of the
init container approach.
When using the operator manager to create and manage the operator configuration resource (i.e. with
operator.dash0Export.enabled=true), set operator.instrumentation.delivery in Helm to configure image volumes.
Allowed values for the instrumentation delivery setting:
auto: use image volumes if the Kubernetes version is 1.36 or later, otherwise use the init container approach.image-volume: always use image volumes, also on Kubernetes versions older than 1.36. If the Kubernetes version is older than 1.31, the operator manager will log a warning and fall back to the init container approach, since image volumes are not supported in that version. Note that if you are using Kubernetes 1.34 or earlier, and you want to use this setting, you need to enable image volumes when configuring your cluster, since image volumes are disabled by default in versions older than 1.35.init-container: always use the init container approach, regardless of the Kubernetes version. This is the default.
Note: Changing the instrumentation delivery setting for an existing operator installation will not trigger a bulk
re-instrumentation of all existing workloads, even for namespaces that are set to instrumentWorkloadsMode=all.
Once a workload has been successfully instrumented, there is no benefit in re-instrumenting it with a different delivery
mechanism.
The new setting will be applied when instrumenting newly deployed workloads, or when a workload is updated/re-deployed.
Python Auto-Instrumentation
To enable auto-instrumentation for Python workloads, set operator.instrumentation.enablePythonAutoInstrumentation=true
via Helm.
If this setting is enabled for an existing operator installation, Python auto-instrumentation will be enabled
immediately for workloads in namespaces that have a Dash0Monitoring resource with
instrumentWorkloads.mode all.
This will cause all pods in these namespaces to be restarted.
For workloads in namespaces that use instrumentWorkloads.mode=created-and-updated, it will become active with the next
re-deployment of the workload.
The setting has no effect on workloads in namespaces that use instrumentWorkloads.mode=none or do not have a
Dash0Monitoring resource.
Python auto-instrumentation is only supported for Python 3.9 or later.
If the Dash0 Python auto-instrumentation detects an incompatible Python version (i.e. version 3.8 or older), it will
automatically deactivate itself safely and print a warning to stderr:
1[dash0] warning: cannot auto-instrument Python process: unsupported Python version: 3.8.0
This warning is also visible in the Dash0 UI's log view, unless log collection has been disabled for the namespace. Update the Python version to enable automatic Python instrumentation by Dash0 for this workload.
Python auto-instrumentation only works if the configured OTLP export protocol is http/protobuf.
If the operator is managing the container's OTEL_EXPORTER_OTLP_ENDPOINT and OTEL_EXPORTER_OTLP_PROTOCOL variables,
this will be set correctly automatically.
If the Dash0 Python auto-instrumentation detects an incompatible OTEL_EXPORTER_OTLP_PROTOCOL setting, it will
automatically deactivate itself safely and print a warning to stderr:
1[dash0] warning: cannot auto-instrument Python process: OTEL_EXPORTER_OTLP_PROTOCOL=grpc is not supported
This can only happen if the container is setting its own OTEL_EXPORTER_OTLP_ENDPOINT and/or
OTEL_EXPORTER_OTLP_PROTOCOL.
Remove these environment variables from the pod spec template to enable automatic Python instrumentation by Dash0 for
this workload.
Dash0's Python auto-instrumentation is not compatible with workloads that are already instrumented, either
manually or using the
zero-code instrumentation, e.g. the opentelemetry-instrument
wrapper.
If existing instrumentation is detected, the Dash0 Python auto-instrumentation will automatically deactivate itself
safely and print a warning to stderr:
123[dash0] warning: cannot auto-instrument Python process: The application has OpenTelemetry dependencies which indicatethat it is already instrumented. The following problematic dependencies have been found: ...Skipping the Dash0 Python auto-instrumentation to avoid double instrumentation.
This warning is also visible in the Dash0 UI's log view, unless log collection has been disabled for the namespace. Remove the existing instrumentation from the workload to enable automatic Python instrumentation by Dash0 for this, or leave the existing instrumentation in place, in which case Dash0 will refrain from instrumenting it.
Last but not least, due to the nature of Python's dependency management, Python auto-instrumentation has the potential
to introduce dependency conflicts.
The Dash0 Python auto-instrumentation checks for potential dependency conflicts before actually instrumenting a process.
If a dependency conflict is detected, the Dash0 Python auto-instrumentation will automatically deactivate itself safely
and print a warning to stderr:
1[dash0] warning: cannot auto-instrument Python process: dependency conflicts: {'package-name': {'version_required': '>=20.0', 'version_found': '19.0'}}
This warning is also visible in the Dash0 UI's log view, unless log collection has been disabled for the namespace. Resolve the version conflicts to enable automatic Python instrumentation by Dash0 for this workload, for example by updating the dependency versions used by the workload. If the conflicting dependencies cannot be resolved, you might need to instrument this workload individually, for example by using the OpenTelemetry Python zero-code instrumentation.
Using a Kubernetes Secret for the Dash0 Authorization Token
If you want to provide the Dash0 authorization token via a Kubernetes secret instead of providing the token as a string,
create the secret in the namespace where the Dash0 operator is installed.
This also applies when providing a per-namespace export and API-sync config via a monitoring resource, i.e. the operator
will always try to look up the auth token secret in the operator namespace.
If you followed the guide above, the name of that namespace is dash0-system.
The authorization token for your Dash0 organization can be copied from https://app.dash0.com → organization settings →
"Auth Tokens".
You can freely choose the name of the secret and the key of the token within the secret.
Create the secret by using the following command:
1234kubectl create secret generic \dash0-authorization-secret \--namespace dash0-system \--from-literal=token=auth_...your-token-here...
With this example command, you would create a secret with the name dash0-authorization-secret in the namespace
dash0-system.
If you installed (or plan to install) the operator into a different namespace, replace the --namespace parameter
accordingly.
The name of the secret as well as the key of the token value within the secret must be provided when referencing the
secret during helm install, or in the YAML file for the Dash0 operator configuration resource (in the secretRef
property).
For creating the operator configuration resource with helm install, the command would look like this, assuming the
secret has been created as shown above:
12345678910helm install \--wait \--namespace dash0-system \--set operator.dash0Export.enabled=true \--set operator.dash0Export.endpoint=REPLACE THIS WITH YOUR DASH0 INGRESS ENDPOINT \--set operator.dash0Export.apiEndpoint=REPLACE THIS WITH YOUR DASH0 API ENDPOINT \--set operator.dash0Export.secretRef.name=dash0-authorization-secret \--set operator.dash0Export.secretRef.key=token \dash0-operator \dash0-operator/dash0-operator
If you do not want to install the operator configuration resource via helm install but instead deploy it manually, and
use a secret reference for the auth token, the following example YAML file would work with the secret created above:
123456789101112131415apiVersion: operator.dash0.com/v1alpha1kind: Dash0OperatorConfigurationmetadata:name: dash0-operator-configurationspec:exports:- dash0:endpoint: ingress... # TODO REPLACE THIS WITH YOUR DASH0 INGRESS ENDPOINTauthorization:secretRef:name: dash0-authorization-secretkey: tokenapiEndpoint: https://api... # optional, see above
When deploying the operator configuration resource via kubectl, the following defaults apply:
- If the
nameproperty is omitted, the namedash0-authorization-secretwill be assumed. - If the
keyproperty is omitted, the keytokenwill be assumed.
With these defaults in mind, the secretRef could have also been written as follows:
12345678910111213apiVersion: operator.dash0.com/v1alpha1kind: Dash0OperatorConfigurationmetadata:name: dash0-operator-configurationspec:exports:- dash0:endpoint: ingress... # TODO needs to be replaced with the actual value, see aboveauthorization:secretRef: {}apiEndpoint: https://api... # optional, see above
Note: There are no defaults when using
--set operator.dash0Export.secretRef.nameand--set operator.dash0Export.secretRef.keywithhelm install, so for that approach the values must always be provided explicitly.
Note that by default, Kubernetes secrets are stored unencrypted, and anyone with API access to the Kubernetes cluster will be able to read the value. Additional steps are required to make sure secret values are encrypted, if that is desired. See https://kubernetes.io/docs/concepts/configuration/secret/ for more information on Kubernetes secrets.
Dash0 Dataset Configuration
Use the spec.exports[].dash0.dataset property to configure the dataset that should be used for the telemetry data.
By default, data will be sent to the dataset default.
Here is an example for a configuration that uses a different Dash0 dataset:
123456789101112131415apiVersion: operator.dash0.com/v1alpha1kind: Dash0OperatorConfigurationmetadata:name: dash0-operator-configurationspec:exports:- dash0:endpoint: ingress... # see abovedataset: my-custom-dataset # This optional setting determines the Dash0 dataset to which telemetry will be sent.authorization: # see above...apiEndpoint: https://api... # optional, see above