A comprehensive Helm chart for OpenTelemetry Kubernetes operator with Tsuga integration, featuring dual deployment pattern (agent DaemonSet + cluster receiver), secure credential management, and production-ready configurations for telemetry collection to Tsuga platform.
Homepage: https://tsuga-dev.github.io/helm-charts/
| Name | Url | |
|---|---|---|
| OpenTelemetry Team | antonin@tsuga.com |
| Repository | Name | Version |
|---|---|---|
| otel-crds | 0.0.0 | |
| https://open-telemetry.github.io/opentelemetry-helm-charts | opentelemetry-operator | 0.114.1 |
The chart implements the recommended OpenTelemetry architecture with two main components:
Default Receivers:
:4317) and HTTP (:4318)localhost:8888/var/log/pods/*/*/*.log (controlled by agent.collectLogs)Default Processors:
send_batch_size/send_batch_max_size = 5000)k8s.cluster.name (only when clusterName is set)Default Connectors:
Default Exporters:
tsuga.enabledForDaemonset=false)Service Pipelines:
otlp (+filelog when agent.collectLogs) → k8s_attributes, memory_limiter, batch, resource¹ → otlp_http/tsugaotlp, kubelet_stats, spanmetrics, host_metrics → k8s_attributes, memory_limiter, cumulativetodelta, resource¹, batch → otlp_http/tsugaotlp → k8s_attributes, memory_limiter, resource¹, batch → otlp_http/tsuga, spanmetricsprometheus/self → memory_limiter, cumulativetodelta, resource/collector, batch → otlp_http/tsuga¹ The resource processor is only present when clusterName is set.
Default Spanmetrics Dimensions:
http.request.methodhttp.response.status_codehttp.routehttp.route is preferred over raw URL/path attributes because it represents the logical route template and keeps metric cardinality under control. URL-like attributes such as http.url, url.full, http.path, and http.target are intentionally excluded from the default metric dimensions because they fragment metrics with IDs, query strings, and other request-specific values.
This default targets modern OpenTelemetry HTTP semantic conventions and is most useful for server spans. If your workloads still emit legacy attributes such as http.method and http.status_code, or if you want client-focused dependency metrics, override the connector dimensions through the existing merge-based config.
Example override for client-oriented HTTP dependency metrics:
agent:
config:
additionalConfig:
connectors:
spanmetrics:
dimensions:
- name: http.request.method
default: GET
- name: http.response.status_code
- name: server.address
Example override for workloads still emitting legacy HTTP semantic conventions:
agent:
config:
additionalConfig:
connectors:
spanmetrics:
dimensions:
- name: http.method
default: GET
- name: http.status_code
- name: http.route
Default Receivers:
k8s_cluster): Collects cluster-level metrics and entity eventsk8s_objects): Watches pods (only when cluster.collectk8sobjects=true)localhost:8888Default Processors:
k8s.cluster.name (only when clusterName is set)Default Exporters:
tsuga.enabledForClusterReceiver=false)Service Pipelines:
k8s_cluster → resource¹, k8s_attributes, batch → otlp_http/tsugak8s_cluster (+k8s_objects when enabled) → resource¹, k8s_attributes, batch → otlp_http/tsugaprometheus/self → cumulativetodelta, resource/collector, batch → otlp_http/tsuga¹ The resource processor is only present when clusterName is set.
Use the deploy script
./deploy.sh
Before installing this chart, you need the following components:
The OpenTelemetry Operator requires cert-manager to be installed in your cluster.
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.18.2/cert-manager.yaml
Verify cert-manager is running:
kubectl wait --for=condition=Ready pods --all -n cert-manager --timeout=300s
The OpenTelemetry Operator is required for auto-instrumentation features. You have two options:
This chart includes the OpenTelemetry Operator as a dependency. Enable it in your values:
opentelemetry-operator:
enabled: true
Or via command line:
helm install my-otel-stack tsuga-charts/opentelemetry-kube-stack \
--set opentelemetry-operator.enabled=true
If you prefer to manage the operator separately or it’s already installed:
kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
Verify the operator is running:
kubectl wait --for=condition=Ready pods -l app.kubernetes.io/name=opentelemetry-operator -n opentelemetry-operator-system --timeout=300s
This chart can optionally create an OpenTelemetry Operator Instrumentation resource via autoInstrumentation.
Create an Instrumentation CR with your desired configuration:
autoInstrumentation:
enabled: true
# apiVersion depends on your operator version
apiVersion: opentelemetry.io/v1alpha1
spec:
exporter:
endpoint: http://otel-collector:4318
propagators: [tracecontext, baggage]
sampler:
type: parentbased_traceidratio
argument: "1.0"
# Configure the language(s) you plan to inject
java:
image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:2.10.0
Annotate your workload pods to enable injection:
spec:
template:
metadata:
annotations:
instrumentation.opentelemetry.io/inject-java: "true"
Supported annotation keys depend on language (examples):
instrumentation.opentelemetry.io/inject-javainstrumentation.opentelemetry.io/inject-pythoninstrumentation.opentelemetry.io/inject-nodejsinstrumentation.opentelemetry.io/inject-dotnet# Add the repository
helm repo add tsuga-charts https://tsuga-dev.github.io/helm-charts/
helm repo update
# Install with Tsuga configuration
helm install my-otel-stack tsuga-charts/opentelemetry-kube-stack \
--set secret.create=true \
--set tsuga.otlpEndpoint="https://your-tsuga-endpoint.com" \
--set tsuga.apiKey="your-api-key-here"
# Install directly from the chart directory
helm install my-otel-stack ./opentelemetry-kube-stack \
--set secret.create=true \
--set tsuga.otlpEndpoint="https://your-tsuga-endpoint.com" \
--set tsuga.apiKey="your-api-key-here"
# Create a values file
cat > my-values.yaml << EOF
tsuga:
otlpEndpoint: "https://your-tsuga-endpoint.com"
apiKey: "your-api-key-here"
secret:
create: true
EOF
# Install with values file
helm install my-otel-stack ./opentelemetry-kube-stack -f my-values.yaml
| Key | Type | Default | Description | |
|---|---|---|---|---|
| affinity | object | {} | Affinity rules for pod scheduling Used as default when agent.affinity is not set | |
| agent.addLogsVolumes | bool | true | Add logs volumes to the agent When true, adds volumes for log collection Even if collectLogs is false, the volumes are added | |
| agent.affinity | object | {} | Agent-specific affinity rules If not set, inherits from global affinity configuration | |
| agent.collectLogs | bool | true | Collect logs from the host and containers When true, enables filelog receiver to collect logs from /var/log/pods Also mounts required volumes for log collection | |
| agent.collectNetwork | bool | false | Collect host network metrics When true, enables network scraper in hostmetrics receiver | |
| agent.collectOtelLogs | bool | true | Collect OpenTelemetry collector logs When false, excludes OpenTelemetry collector logs from collection Useful to avoid log loops | |
| agent.collectProcesses | bool | false | Collect host processes metrics When true, enables processes and process scrapers in hostmetrics receiver | |
| agent.config | object | {"extraConnectors":{},"extraExporters":{},"extraExtensions":{},"extraProcessors":{},"extraReceivers":{},"extraTelemetry":{},"service":{"extraExtensions":[],"pipelines":{"extraPipelines":{},"logs":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]},"metrics":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]},"traces":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]}}}} |
Agent collector configuration (merge-based approach) Use this to extend the default configuration Default config includes: filelog, kubelet_stats, host_metrics, otlp, prometheus/self receivers Default processors: k8s_attributes, memory_limiter, batch, cumulativetodelta, resource | |
| agent.config.extraConnectors | object | {} | Additional connectors to merge into the collector configuration These are merged with default connectors | |
| agent.config.extraExporters | object | {} | Additional exporters to merge into the collector configuration These are merged with default exporters (otlp_http/tsuga) | |
| agent.config.extraExtensions | object | {} | Additional extensions to merge into the collector configuration These are merged with default extensions (health_check) | |
| agent.config.extraProcessors | object | {} | Additional processors to merge into the collector configuration These are merged with default processors | |
| agent.config.extraReceivers | object | {} | Additional receivers to merge into the collector configuration These are merged with default receivers | |
| agent.config.extraTelemetry | object | {} | Additional telemetry to merge into the collector configuration Merges with default telemetry (Prometheus metrics on port 8888) | |
| agent.config.service | object | {"extraExtensions":[],"pipelines":{"extraPipelines":{},"logs":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]},"metrics":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]},"traces":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]}}} |
Service configuration | |
| agent.config.service.extraExtensions | list | [] | Additional extensions to add to the service configuration Added to default extensions (health_check) | |
| agent.config.service.pipelines | object | {"extraPipelines":{},"logs":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]},"metrics":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]},"traces":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]}} |
Pipeline configuration | |
| agent.config.service.pipelines.logs | object | {"extraExporters":[],"extraProcessors":[],"extraReceivers":[]} |
Logs pipeline configuration | |
| agent.config.service.pipelines.logs.extraExporters | list | [] | Additional exporters to add to the logs pipeline Added to default exporter (otlp_http/tsuga) | |
| agent.config.service.pipelines.logs.extraProcessors | list | [] | Additional processors to add to the logs pipeline Added to default processors (k8s_attributes, memory_limiter, batch, resource) | |
| agent.config.service.pipelines.logs.extraReceivers | list | [] | Additional receivers to add to the logs pipeline Added to default receivers (otlp, filelog) | |
| agent.config.service.pipelines.metrics | object | {"extraExporters":[],"extraProcessors":[],"extraReceivers":[]} |
Metrics pipeline configuration | |
| agent.config.service.pipelines.metrics.extraExporters | list | [] | Additional exporters to add to the metrics pipeline Added to default exporter (otlp_http/tsuga) | |
| agent.config.service.pipelines.metrics.extraProcessors | list | [] | Additional processors to add to the metrics pipeline Added to default processors (k8s_attributes, memory_limiter, batch, cumulativetodelta, resource) | |
| agent.config.service.pipelines.metrics.extraReceivers | list | [] | Additional receivers to add to the metrics pipeline Added to default receivers (otlp, kubelet_stats, spanmetrics, host_metrics) | |
| agent.config.service.pipelines.traces | object | {"extraExporters":[],"extraProcessors":[],"extraReceivers":[]} |
Traces pipeline configuration | |
| agent.config.service.pipelines.traces.extraExporters | list | [] | Additional exporters to add to the traces pipeline Added to default exporters (otlp_http/tsuga, spanmetrics) | |
| agent.config.service.pipelines.traces.extraProcessors | list | [] | Additional processors to add to the traces pipeline Added to default processors (k8s_attributes, memory_limiter, batch, resource) | |
| agent.config.service.pipelines.traces.extraReceivers | list | [] | Additional receivers to add to the traces pipeline Added to default receivers (otlp) | |
| agent.customConfig | object | {} | Replace default config with complete custom configuration When set, this completely replaces the default collector configuration Use this for full control over the OpenTelemetry Collector config See cluster.customConfig for example format | |
| agent.enabled | bool | true | Enable agent daemonset deployment | |
| agent.extraAnnotationsMapping | list | [] | Annotations mapping configuration for agent Maps Kubernetes pod annotations to OpenTelemetry resource attributes These are appended to default annotation mappings Format: List of objects with tag_name, key, and from fields | |
| agent.extraEnvs | list | [] | Extra environment variables for agent These are in addition to automatic secret env vars (TSUGA_API_KEY, TSUGA_OTLP_ENDPOINT, MY_POD_IP) | |
| agent.extraLabelMapping | list | [] | Label mapping configuration for agent Maps Kubernetes pod labels to OpenTelemetry resource attributes These are appended to default label mappings Format: List of objects with tag_name, key, and from fields Example: extraLabelMapping: - tag_name: “app.version” key: “app.version” from: “pod” | |
| agent.hostNetwork | bool | true | Enable host network for agent (recommended for optimal performance) When true, agent uses host networking for better performance | |
| agent.image | string | ”” | OpenTelemetry Collector image for agent Defaults to: ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-k8s | |
| agent.nodeSelector | object | {} | Agent-specific node selector If not set, inherits from global nodeSelector configuration | |
| agent.resources | object | {} | Agent-specific resource limits and requests If not set, inherits from global resources configuration | |
| agent.tolerations | list | [] | Agent-specific tolerations If not set, inherits from global tolerations configuration | |
| autoInstrumentation.annotations | object | {} | Extra annotations to add to the Instrumentation resource | |
| autoInstrumentation.apiVersion | string | “opentelemetry.io/v1alpha1” | apiVersion for the Instrumentation CR (depends on operator version) Common values: “opentelemetry.io/v1alpha1” | |
| autoInstrumentation.enabled | bool | false | Enable OpenTelemetry Operator auto-instrumentation (Instrumentation CR) Requires the OpenTelemetry Operator to be installed in the cluster. | |
| autoInstrumentation.labels | object | {} | Extra labels to add to the Instrumentation resource | |
| autoInstrumentation.nameOverride | string | ”” | Override the name of the Instrumentation resource If empty, defaults to “ |
|
| autoInstrumentation.spec | object | {} | Instrumentation spec (full passthrough) This is passed directly to the Instrumentation Custom Resource spec. It can include (non-exhaustive): exporter, propagators, sampler, env, resource, and language blocks like java, nodejs, python, dotnet, go, apacheHttpd. Ref: https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/api.md#instrumentation | |
| cluster.affinity | object | {} | Cluster-specific affinity rules If not set, inherits from global affinity configuration | |
| cluster.collectk8sobjects | bool | false |
||
| cluster.config | object | {"extraConnectors":{},"extraExporters":{},"extraProcessors":{},"extraReceivers":{},"extraTelemetry":{},"service":{"extraExtensions":[],"pipelines":{"extraPipelines":{},"logs":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]},"metrics":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]},"traces":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]}}}} |
Gateway collector configuration (merge-based approach) Use this to extend the default configuration Default config includes: k8s_cluster receiver, k8s_attributes processor, resource processor | |
| cluster.config.extraConnectors | object | {} | Additional connectors to merge into the collector configuration These are merged with default connectors | |
| cluster.config.extraExporters | object | {} | Additional exporters to merge into the collector configuration These are merged with default exporters (otlp_http/tsuga) | |
| cluster.config.extraProcessors | object | {} | Additional processors to merge into the collector configuration These are merged with default processors (k8s_attributes, resource) | |
| cluster.config.extraReceivers | object | {} | Additional receivers to merge into the collector configuration These are merged with default receivers (k8s_cluster) Example: extraReceivers: prometheus: config: scrape_configs: - job_name: ‘my-service’ | |
| cluster.config.extraTelemetry | object | {} | Additional telemetry to merge into the collector configuration Merges with default telemetry | |
| cluster.config.service | object | {"extraExtensions":[],"pipelines":{"extraPipelines":{},"logs":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]},"metrics":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]},"traces":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]}}} |
Service configuration | |
| cluster.config.service.extraExtensions | list | [] | Additional extensions to add to the service configuration Added to default extensions | |
| cluster.config.service.pipelines | object | {"extraPipelines":{},"logs":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]},"metrics":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]},"traces":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]}} |
Pipeline configuration | |
| cluster.config.service.pipelines.extraPipelines | object | {} | Additional pipelines to add to the service configuration These are completely new pipelines (not extending default ones) Example: extraPipelines: custom-logs: receivers: [custom-receiver] processors: [batch] exporters: [custom-exporter] | |
| cluster.config.service.pipelines.logs | object | {"extraExporters":[],"extraProcessors":[],"extraReceivers":[]} |
Logs pipeline configuration | |
| cluster.config.service.pipelines.logs.extraExporters | list | [] | Additional exporters to add to the logs pipeline Added to default exporter (otlp_http/tsuga) | |
| cluster.config.service.pipelines.logs.extraProcessors | list | [] | Additional processors to add to the logs pipeline Added to default processors (resource) | |
| cluster.config.service.pipelines.logs.extraReceivers | list | [] | Additional receivers to add to the logs pipeline Added to default receiver (k8s_cluster) | |
| cluster.config.service.pipelines.metrics | object | {"extraExporters":[],"extraProcessors":[],"extraReceivers":[]} |
Metrics pipeline configuration | |
| cluster.config.service.pipelines.metrics.extraExporters | list | [] | Additional exporters to add to the metrics pipeline Added to default exporter (otlp_http/tsuga) | |
| cluster.config.service.pipelines.metrics.extraProcessors | list | [] | Additional processors to add to the metrics pipeline Added to default processors (resource) | |
| cluster.config.service.pipelines.metrics.extraReceivers | list | [] | Additional receivers to add to the metrics pipeline Added to default receiver (k8s_cluster) | |
| cluster.config.service.pipelines.traces | object | {"extraExporters":[],"extraProcessors":[],"extraReceivers":[]} |
Traces pipeline configuration | |
| cluster.config.service.pipelines.traces.extraExporters | list | [] | Additional exporters to add to the traces pipeline Added to default exporter (otlp_http/tsuga) | |
| cluster.config.service.pipelines.traces.extraProcessors | list | [] | Additional processors to add to the traces pipeline Added to default processors (resource) | |
| cluster.config.service.pipelines.traces.extraReceivers | list | [] | Additional receivers to add to the traces pipeline Added to default receiver (k8s_cluster) | |
| cluster.customConfig | object | {} | Replace default config with complete custom configuration When set, this completely replaces the default collector configuration Use this for full control over the OpenTelemetry Collector config Example: customConfig: | - receivers: k8s_cluster: collection_interval: 30s processors: batch: {} exporters: otlp_http/tsuga: endpoint: ${TSUGA_OTLP_ENDPOINT} service: pipelines: metrics: receivers: [k8s_cluster] processors: [batch] exporters: [otlp_http/tsuga] |
| cluster.enabled | bool | true | Enable cluster receiver (gateway) deployment | |
| cluster.extraAnnotationsMapping | list | [] | Annotations mapping configuration for cluster receiver Maps Kubernetes pod annotations to OpenTelemetry resource attributes These are appended to default annotation mappings Format: List of objects with tag_name, key, and from fields | |
| cluster.extraEnvs | list | [] | Extra environment variables for cluster receiver These are in addition to automatic secret env vars (TSUGA_API_KEY, TSUGA_OTLP_ENDPOINT, MY_POD_IP) Example: extraEnvs: - name: CUSTOM_VAR value: “custom-value” | |
| cluster.extraLabelMapping | list | [] | Label mapping configuration for cluster receiver Maps Kubernetes pod labels to OpenTelemetry resource attributes These are appended to default label mappings Format: List of objects with tag_name, key, and from fields Example: extraLabelMapping: - tag_name: “app.version” key: “app.version” from: “pod” | |
| cluster.image | string | ”” | OpenTelemetry Collector image for cluster receiver Defaults to: ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-k8s | |
| cluster.nodeSelector | object | {} | Cluster-specific node selector If not set, inherits from global nodeSelector configuration | |
| cluster.resources | object | {} | Cluster-specific resource limits and requests If not set, inherits from global resources configuration | |
| cluster.tolerations | list | [] | Cluster-specific tolerations If not set, inherits from global tolerations configuration | |
| clusterName | string | ”” | The name of the cluster to be used in the resource attributes This value is added to all telemetry data as k8s.cluster.name RECOMMENDED: Set this value to identify your cluster in telemetry data If not set, the k8s.cluster.name attribute will be omitted from telemetry | |
| fullnameOverride | string | ”” | Override the full name used in resource naming | |
| image | string | ”” | Default OpenTelemetry Collector image Used as fallback when cluster.image or agent.image are not set Format: registry/repository:tag | |
| nameOverride | string | ”” | Override the chart name used in resource naming | |
| nodeSelector | object | {} | Node selector for daemonset mode (agent) Used as default when agent.nodeSelector is not set | |
| opentelemetry-operator.admissionWebhooks.failurePolicy | string | "Ignore" |
||
| opentelemetry-operator.crds.create | bool | false |
||
| opentelemetry-operator.enabled | bool | false |
||
| opentelemetry-operator.manager.collectorImage.repository | string | "otel/opentelemetry-collector-k8s" |
||
| rbac | object | {"create":true} |
RBAC configuration | |
| rbac.create | bool | true | Create RBAC resources (ClusterRole and ClusterRoleBinding) Required for collecting Kubernetes cluster metrics and metadata | |
| resources.limits | object | {"cpu":"500m","memory":"512Mi"} |
Resource limits | |
| resources.limits.cpu | string | “500m” | CPU limit | |
| resources.limits.memory | string | “512Mi” | Memory limit | |
| resources.requests | object | {"cpu":"100m","memory":"128Mi"} |
Resource requests | |
| resources.requests.cpu | string | “100m” | CPU request | |
| resources.requests.memory | string | “128Mi” | Memory request | |
| secret.create | bool | false | Create a Kubernetes secret for OpenTelemetry configuration If true: creates a secret with values from tsuga configuration If false: uses an existing secret (must be created separately) | |
| secret.keyMapping | object | {"TSUGA_API_KEY":"TSUGA_API_KEY","TSUGA_OTLP_ENDPOINT":"TSUGA_OTLP_ENDPOINT"} |
Key mapping for existing secret (used when create=false) Maps chart expected keys to keys in the existing secret Example: If your secret uses “api-key” instead of “TSUGA_API_KEY”, set: keyMapping: TSUGA_API_KEY: “api-key” | |
| secret.keyMapping.TSUGA_API_KEY | string | “TSUGA_API_KEY” | Key name in the secret for Tsuga API key | |
| secret.keyMapping.TSUGA_OTLP_ENDPOINT | string | “TSUGA_OTLP_ENDPOINT” | Key name in the secret for Tsuga OTLP endpoint | |
| secret.name | string | “otel-secret” | Name of the secret Used when create=true (name of secret to create) Used when create=false (name of existing secret to use) | |
| secret.validation | object | {"mandatoryKeys":["TSUGA_API_KEY","TSUGA_OTLP_ENDPOINT"],"requireMandatoryKeys":true} |
Validation settings | |
| secret.validation.mandatoryKeys | list | [“TSUGA_API_KEY”, “TSUGA_OTLP_ENDPOINT”] | Mandatory keys that must be present in the secret | |
| secret.validation.requireMandatoryKeys | bool | true | Require all mandatory keys to be present in the secret When true, chart will fail if required keys are missing | |
| serviceAccount | object | {"annotations":{},"create":true,"name":""} |
Service account configuration | |
| serviceAccount.annotations | object | {} | Annotations to add to the service account Useful for IRSA (IAM Roles for Service Accounts) or workload identity | |
| serviceAccount.create | bool | true | Create a service account for the OpenTelemetry collectors | |
| serviceAccount.name | string | ”” | Name of the service account If not set, will be auto-generated based on release name | |
| statefulset.affinity | object | {} | StatefulSet-specific affinity rules | |
| statefulset.config | object | {"extraConnectors":{},"extraExporters":{},"extraProcessors":{},"extraReceivers":{},"extraTelemetry":{},"service":{"extraExtensions":[],"pipelines":{"extraPipelines":{},"metrics":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]}}}} |
StatefulSet collector configuration (merge-based approach) | |
| statefulset.config.extraConnectors | object | {} | Additional connectors to merge into the collector configuration | |
| statefulset.config.extraExporters | object | {} | Additional exporters to merge into the collector configuration | |
| statefulset.config.extraProcessors | object | {} | Additional processors to merge into the collector configuration | |
| statefulset.config.extraReceivers | object | {} | Additional receivers to merge into the collector configuration | |
| statefulset.config.extraTelemetry | object | {} | Additional telemetry to merge into the collector configuration | |
| statefulset.config.service | object | {"extraExtensions":[],"pipelines":{"extraPipelines":{},"metrics":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]}}} |
Service configuration | |
| statefulset.config.service.extraExtensions | list | [] | Additional extensions to add to the service configuration | |
| statefulset.config.service.pipelines | object | {"extraPipelines":{},"metrics":{"extraExporters":[],"extraProcessors":[],"extraReceivers":[]}} |
Pipeline configuration | |
| statefulset.config.service.pipelines.extraPipelines | object | {} | Additional pipelines to add to the service configuration | |
| statefulset.config.service.pipelines.metrics | object | {"extraExporters":[],"extraProcessors":[],"extraReceivers":[]} |
Metrics pipeline configuration | |
| statefulset.config.service.pipelines.metrics.extraExporters | list | [] | Additional exporters to add to the metrics pipeline Added to default exporter (otlp_http/tsuga) | |
| statefulset.config.service.pipelines.metrics.extraProcessors | list | [] | Additional processors to add to the metrics pipeline Added to default processors (k8s_attributes, batch) | |
| statefulset.config.service.pipelines.metrics.extraReceivers | list | [] | Additional receivers to add to the metrics pipeline Added to default receiver (prometheus) | |
| statefulset.customConfig | object | {} | Replace default config with complete custom configuration | |
| statefulset.extraAnnotationsMapping | list | [] | Annotations mapping configuration for agent Maps Kubernetes pod annotations to OpenTelemetry resource attributes These are appended to default annotation mappings Format: List of objects with tag_name, key, and from fields | |
| statefulset.extraEnvs | list | [] | Extra environment variables for statefulset collector | |
| statefulset.extraLabelMapping | list | [] | Label mapping configuration for agent Maps Kubernetes pod labels to OpenTelemetry resource attributes These are appended to default label mappings Format: List of objects with tag_name, key, and from fields Example: extraLabelMapping: - tag_name: “app.version” key: “app.version” from: “pod” | |
| statefulset.image | string | ”” | OpenTelemetry Collector image for statefulset collector | |
| statefulset.nodeSelector | object | {} | StatefulSet-specific node selector | |
| statefulset.replicas | int | 1 | Number of StatefulSet collector replicas The Target Allocator distributes targets evenly across replicas. | |
| statefulset.resources | object | {} | StatefulSet-specific resource limits and requests | |
| statefulset.tolerations | list | [] | StatefulSet-specific tolerations | |
| targetAllocator.enabled | bool | false | Enable Target Allocator and paired StatefulSet collector | |
| targetAllocator.spec | object | {} | TargetAllocator CR spec (full passthrough) All fields are passed directly to the TargetAllocator CR spec. Ref: https://github.com/open-telemetry/opentelemetry-operator/blob/main/docs/api.md#targetallocator | |
| targetAllocator.spec.allocationStrategy | string | “consistent-hashing” | Allocation strategy for distributing targets across collector replicas Options: consistent-hashing (default), least-weighted, per-node | |
| targetAllocator.spec.prometheusCR | object | {"enabled":false,"podMonitorSelector":{},"serviceMonitorSelector":{}} |
PrometheusCR configuration When enabled, the Target Allocator discovers ServiceMonitor and PodMonitor CRs. Requires monitoring.coreos.com RBAC rules (added automatically when enabled). | |
| targetAllocator.spec.prometheusCR.enabled | bool | false | Enable ServiceMonitor/PodMonitor discovery | |
| targetAllocator.spec.prometheusCR.podMonitorSelector | object | {} | Selector for PodMonitor resources An empty selector ({}) matches all PodMonitors in all namespaces. | |
| targetAllocator.spec.prometheusCR.serviceMonitorSelector | object | {} | Selector for ServiceMonitor resources An empty selector ({}) matches all ServiceMonitors in all namespaces. | |
| tolerations | list | [] | Tolerations for daemonset mode (agent) Used as default when agent.tolerations is not set | |
| tsuga.apiKey | string | ”” | Tsuga API key for authentication Set via: –set tsuga.apiKey=”your-api-key-here” Or use external secrets: –set tsuga.apiKey=”” | |
| tsuga.enabledForClusterReceiver | bool | true | Enable Tsuga OTLP exporter for the cluster receiver (gateway) | |
| tsuga.enabledForDaemonset | bool | true | Enable Tsuga OTLP exporter for the agent DaemonSet | |
| tsuga.enabledForStatefulset | bool | true | Enable Tsuga OTLP exporter for the StatefulSet collector (when targetAllocator is enabled) | |
| tsuga.otlpEndpoint | string | ”” | Tsuga OTLP endpoint for telemetry data Set via: –set tsuga.otlpEndpoint=”https://your-tsuga-endpoint.com” | |
| validation | object | {"enabled":true,"enforceNamingConventions":true,"maxNameLength":63} |
Resource naming validation | |
| validation.enabled | bool | true | Enable resource name validation When enabled, validates resource names meet Kubernetes requirements | |
| validation.enforceNamingConventions | bool | true | Validate naming conventions Enforces Kubernetes naming conventions (lowercase alphanumeric and hyphens) | |
| validation.maxNameLength | int | 63 | Maximum length for resource names (Kubernetes limit is 63 characters) |
git clone https://github.com/tsuga-dev/helm-charts.git
cd helm-charts/charts/opentelemetry-kube-stack
git checkout -b feature/your-feature-name
templates/values.yamltests/# Run unit tests
make unittest
# Run a specific test file
helm unittest -f 'tests/secret_test.yaml' .
# Run integration tests
make integration
# or
./tests/integration/test-deployment.sh
# Run security scan
make security
# or
./tests/security/security-scan.sh
# Lint templates
make lint
# or
helm lint .
# Test rendering
make template
# or
helm template test . --set tsuga.otlpEndpoint="test" --set tsuga.apiKey="test"
To update the parameter documentation in the README:
# Generate documentation using helm-docs (run from the repo root)
helm-docs --chart-search-root=charts/opentelemetry-kube-stack
This will automatically update the parameter reference section in the README based on comments in values.yaml.
values.yaml have proper helm-docs comments (# -- Description and # @default -- value)This chart is licensed under the Apache 2.0 License. See the LICENSE file for details.
For support and questions: