diff --git a/charts/opentelemetry-kube-stack/Chart.yaml b/charts/opentelemetry-kube-stack/Chart.yaml index 9131d41b1b..77d82030cd 100644 --- a/charts/opentelemetry-kube-stack/Chart.yaml +++ b/charts/opentelemetry-kube-stack/Chart.yaml @@ -1,6 +1,6 @@ apiVersion: v2 name: opentelemetry-kube-stack -version: 0.15.2 +version: 0.16.0 description: | OpenTelemetry Quickstart chart for Kubernetes. Installs an operator and collector for an easy way to get started with Kubernetes observability. diff --git a/charts/opentelemetry-kube-stack/README.md b/charts/opentelemetry-kube-stack/README.md index 354712adf8..5908b6525e 100644 --- a/charts/opentelemetry-kube-stack/README.md +++ b/charts/opentelemetry-kube-stack/README.md @@ -34,6 +34,97 @@ This chart provides functionality to port an existing scrape configuration from > [!NOTE] > This chart aims to provide compatibility for scrape targets from the kube-prometheus-stack chart. This chart is not responsible for applying Prometheus Rules, Alertmanager, or a Prometheus instance. +#### `presets.prometheus.*` presets + +The `presets.prometheus.*` family (`nodeExporter`, `cadvisor`, `podAnnotations`) configure the OpenTelemetry Collectors to scrape popular Prometheus Kubernetes metrics: + +* `presets.prometheus.nodeExporter`: Kubernetes node metrics exposed with the [prometheus-node-exporter](https://github.com/prometheus-community/helm-charts/tree/main/charts/prometheus-node-exporter), +* `presets.prometheus.cadvisor`: [cAdvisor](https://github.com/google/cadvisor) metrics scraped from the kubelet, +* `presets.prometheus.podAnnotations`: custom pod metrics exposed using the `prometheus.io/scrape=true` Kubernetes annotation. + +The `prometheus.*` presets are implemented adding named instances of the [Prometheus receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/prometheusreceiver) to the daemonset collector's metrics pipeline (`prometheus/node_exporter`, `prometheus/cadvisor`, and `prometheus/pod_annotations`). +They are a **replacement** for the `daemon_scrape_configs.yaml` scrape file. + +
+Constraints (chart-enforced) + +The `prometheus.*` presets are gated; chart rendering fails if these are violated: + +* **Mutually exclusive with `scrape_configs_file`**. The presets replace the scrape file (which by default already has node-exporter, kubelet/cAdvisor, and pod-annotation jobs). Enabling any preset while `scrape_configs_file` is non-empty fails with a clear error. Set `scrape_configs_file: ""` to migrate. +* **Require `mode: daemonset`**. The scrape configs reference `${OTEL_K8S_NODE_IP}` / `${OTEL_K8S_NODE_NAME}`, which the OpenTelemetry Operator only injects on daemonset collector pods. + +
+ +#### Prometheus metrics label set + +The `presets.prometheus.*` presets produce the same Prometheus labels as the Kube-Prometheus-Stack. + +
+Details + +The exact labels attached vary per preset: + +| Prometheus label | `nodeExporter` | `cadvisor` | `podAnnotations` | +|-------------------------|------------------------------|------------------------------------------------|-------------------------------------------------------------| +| `job` | `node-exporter` | `kubelet` | `kubernetes-pods`, overridable per pod via the `app.kubernetes.io/name` pod label | +| `instance` | `:` | `:` | `:` from pod SD | +| `node` | from `${OTEL_K8S_NODE_NAME}` | from `${OTEL_K8S_NODE_NAME}` | from `__meta_kubernetes_pod_node_name` | +| `namespace` | — | intrinsic (emitted by cAdvisor) | from `__meta_kubernetes_namespace` | +| `pod` | — | intrinsic | from `__meta_kubernetes_pod_name` | +| `container`, `image` | — | intrinsic (`container`, `image` from cAdvisor) | — | +| Pod labels (`labelmap`) | — | — | all pod labels mapped via `__meta_kubernetes_pod_label_*` | + +Prometheus labels are mapped to OpenTelemetry metrics data points and resource attributes according to the `prometheus` receiver [Resource Attribute Mapping](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/prometheusreceiver/resource_attribute_mapping.md) + +Kubernetes resource attributes (`k8s.*`) are eventually supplied downstream by the `k8sattributes` processor when `presets.kubernetesAttributes.enabled=true` (recommended). + +
+ +##### Differences between `presets.prometheus.*` and `daemon_scrape_configs.yaml` metrics + +`presets.prometheus.*` are designed to replace `daemon_scrape_configs.yaml`, with each preset mapping to a specific scrape job in that file. All three presets retain the same labels — `job`, `instance`, and Kubernetes labels. Notable differences include additional labels (e.g. `node`) and default-value adjustments for improved consistency, as described per preset below. + +
+Details + +###### `presets.prometheus.nodeExporter` ↔ `daemon_scrape_configs.yaml`'s `node-exporter` job + +Same scrape target (`${OTEL_K8S_NODE_IP}:9100`), same `job=node-exporter` label, same `scrape_interval: 30s`. The preset additionally emits a `node` label (the legacy job didn't). + +###### `presets.prometheus.cadvisor` ↔ `daemon_scrape_configs.yaml`'s `kubelet` job + +Same `job=kubelet` label as `daemon_scrape_configs.yaml` (which force-relabels every series to `job=kubelet`). + +Minor differences: + +* **Scrape interval**: the preset defaults to `30s`, the `daemon_scrape_configs.yaml` job uses `15s`. Set `presets.prometheus.cadvisor.scrapeInterval: 15s` to match exactly (affects `rate()` resolution). +* **Dropped helper labels**: the `daemon_scrape_configs.yaml` job attaches `endpoint=https-metrics` and `metrics_path=/metrics/cadvisor`; the preset does not. +* **Intrinsic cAdvisor labels** (`namespace`, `pod`, `container`, `image`, `id`, ...) are identical in both — these come from cAdvisor itself, not from relabel rules. +* **`metric_relabel_configs`**: identical drop list (`container_cpu_load_average_10s`, `container_spec_*`, `container_fs_io_current`, `container_memory_mapped_file/swap`, `container_file_descriptors/tasks_state/threads_max`, plus non-pod cgroup rows). + +###### `presets.prometheus.podAnnotations` ↔ `daemon_scrape_configs.yaml`'s `kubernetes-pods` job + +Same `job=kubernetes-pods` (overridable per pod via the `app.kubernetes.io/name` pod label, in both cases), same label set (`namespace`, `pod`, all pod labels via `labelmap`), same `scrape_interval: 30s`, same annotation-driven scheme/path/port/param handling. + +Differences from the `daemon_scrape_configs.yaml` job: + +* **`node` label** added by the preset (sourced from `__meta_kubernetes_pod_node_name`). +* **Self-scrape filter**: the preset's pod selector excludes pods with `app.kubernetes.io/component=opentelemetry-collector` to prevent the collector from scraping itself. The `daemon_scrape_configs.yaml` job has no such filter, so it would scrape any collector pod carrying `prometheus.io/scrape: "true"`. + +
+ +#### `scrape_configs_file=daemon_scrape_configs.yaml` + +> [!NOTE] +> This parameter only works when running the helm chart locally. When installing the helm chart using the remote repository it is not possible to include "external" scrape config files into the helm structure. This is also true when the chart is used as a subchart, and the scrape config files exists in the parent chart. Ref. [helm docs](https://helm.sh/docs/chart_template_guide/accessing_files/) + +By default, the daemonset collector will load in the daemon_scrape_configs.yaml file which collects Prometheus metrics from applications on the same node that have the `prometheus.io/scrape=true` annotation, kubernetes node metrics, and cadvisor metrics. Users can disable this by settings collectors.daemon.scrape_configs_file: "" OR they can provide their own promethues scrape config file for the daemonset by supplying collectors.daemon.scrape_configs_file: ".yaml" + +#### Duplicate-scrape risks + +**`prometheus-node-exporter` subchart**: when installed via the top-level `nodeExporter.enabled: true` flag, the subchart creates its own `ServiceMonitor` by default. +If a target allocator picks it up and `presets.prometheus.nodeExporter.enabled=true` or `scrape_configs_file=daemon_scrape_configs.yaml`, then node-exporter metrics are scraped twice. + ### Image versioning The appVersion of the chart is aligned to the latest image version of the operator. Images are upgraded within the chart manually by setting the image tag to the latest release of each image used. This will be the latest patch release for the chart's appVersion. example: @@ -43,12 +134,6 @@ collector.image.tag: 0.103.1 bridge.image.tag: 0.103.0 ``` -### scrape_configs_file Details - -> [!NOTE] -> This parameter only works when running the helm chart locally. When installing the helm chart using the remote repository it is not possible to include "external" scrape config files into the helm structure. This is also true when the chart is used as a subchart, and the scrape config files exists in the parent chart. Ref. [helm docs](https://helm.sh/docs/chart_template_guide/accessing_files/) - -By default, the daemonset collector will load in the daemon_scrape_configs.yaml file which collects prometheus metrics from applications on the same node that have the prometheus.io/scrape=true annotation, kubernetes node metrics, and cadvisor metrics. Users can disable this by settings collectors.daemon.scrape_configs_file: "" OR they can provide their own promethues scrape config file for the daemonset by supplying collectors.daemon.scrape_configs_file: ".yaml" ## Prerequisites @@ -152,4 +237,4 @@ The following command will show all the configurable options with detailed comme $ helm show values open-telemetry/opentelemetry-kube-stack ``` -When using this chart as a subchart, you may want to unset certain default values. Since Helm v3.13 values handling is improved and null can now consistently be used to remove values (e.g. to remove the default CPU limits). \ No newline at end of file +When using this chart as a subchart, you may want to unset certain default values. Since Helm v3.13 values handling is improved and null can now consistently be used to remove values (e.g. to remove the default CPU limits). diff --git a/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/bridge.yaml b/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/bridge.yaml index f916861db3..4f82c6b7bb 100644 --- a/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/bridge.yaml +++ b/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/bridge.yaml @@ -5,7 +5,7 @@ kind: OpAMPBridge metadata: name: example labels: - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/collector.yaml b/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/collector.yaml index b0e1fd9f2a..0485ac826e 100644 --- a/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/collector.yaml +++ b/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/collector.yaml @@ -6,7 +6,7 @@ metadata: name: example-daemon namespace: default labels: - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/hooks.yaml b/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/hooks.yaml index d73d11f878..b16df5ac8f 100644 --- a/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/hooks.yaml +++ b/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/hooks.yaml @@ -61,4 +61,4 @@ spec: - "delete" - "instrumentations,opampbridges,opentelemetrycollectors" - "-l" - - "helm.sh/chart=opentelemetry-kube-stack-0.15.2" + - "helm.sh/chart=opentelemetry-kube-stack-0.16.0" diff --git a/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/instrumentation.yaml b/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/instrumentation.yaml index e1279c7c1b..ee026d337a 100644 --- a/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/instrumentation.yaml +++ b/charts/opentelemetry-kube-stack/examples/cloud-demo/rendered/instrumentation.yaml @@ -5,7 +5,7 @@ kind: Instrumentation metadata: name: example labels: - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-logs/rendered/collector.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-logs/rendered/collector.yaml index 52a6983f13..f280d0720c 100644 --- a/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-logs/rendered/collector.yaml +++ b/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-logs/rendered/collector.yaml @@ -6,7 +6,7 @@ metadata: name: example-daemon namespace: default labels: - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-logs/rendered/hooks.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-logs/rendered/hooks.yaml index d73d11f878..b16df5ac8f 100644 --- a/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-logs/rendered/hooks.yaml +++ b/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-logs/rendered/hooks.yaml @@ -61,4 +61,4 @@ spec: - "delete" - "instrumentations,opampbridges,opentelemetrycollectors" - "-l" - - "helm.sh/chart=opentelemetry-kube-stack-0.15.2" + - "helm.sh/chart=opentelemetry-kube-stack-0.16.0" diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-metrics/rendered/collector.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-metrics/rendered/collector.yaml index dde6bceb0e..c5edf11f42 100644 --- a/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-metrics/rendered/collector.yaml +++ b/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-metrics/rendered/collector.yaml @@ -6,7 +6,7 @@ metadata: name: example-daemon namespace: default labels: - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-metrics/rendered/hooks.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-metrics/rendered/hooks.yaml index d73d11f878..b16df5ac8f 100644 --- a/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-metrics/rendered/hooks.yaml +++ b/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery-metrics/rendered/hooks.yaml @@ -61,4 +61,4 @@ spec: - "delete" - "instrumentations,opampbridges,opentelemetrycollectors" - "-l" - - "helm.sh/chart=opentelemetry-kube-stack-0.15.2" + - "helm.sh/chart=opentelemetry-kube-stack-0.16.0" diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery/rendered/collector.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery/rendered/collector.yaml index f4665820bd..2394e4fd65 100644 --- a/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery/rendered/collector.yaml +++ b/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery/rendered/collector.yaml @@ -6,7 +6,7 @@ metadata: name: example-daemon namespace: default labels: - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery/rendered/hooks.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery/rendered/hooks.yaml index d73d11f878..b16df5ac8f 100644 --- a/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery/rendered/hooks.yaml +++ b/charts/opentelemetry-kube-stack/examples/daemonset-annotation-discovery/rendered/hooks.yaml @@ -61,4 +61,4 @@ spec: - "delete" - "instrumentations,opampbridges,opentelemetrycollectors" - "-l" - - "helm.sh/chart=opentelemetry-kube-stack-0.15.2" + - "helm.sh/chart=opentelemetry-kube-stack-0.16.0" diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/clusterrole.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/clusterrole.yaml new file mode 100644 index 0000000000..2c535f471b --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/clusterrole.yaml @@ -0,0 +1,68 @@ +--- +# Source: opentelemetry-kube-stack/templates/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: example-collector +rules: +- apiGroups: [""] + resources: + - namespaces + - nodes + - nodes/proxy + - nodes/metrics + - nodes/stats + - services + - endpoints + - pods + - events + - secrets + - persistentvolumeclaims + - persistentvolumes + verbs: ["get", "list", "watch"] +- apiGroups: ["monitoring.coreos.com"] + resources: + - servicemonitors + - podmonitors + - scrapeconfigs + - probes + verbs: ["get", "list", "watch"] +- apiGroups: + - extensions + resources: + - ingresses + verbs: ["get", "list", "watch"] +- apiGroups: + - apps + resources: + - daemonsets + - deployments + - replicasets + - statefulsets + verbs: ["get", "list", "watch"] +- apiGroups: + - networking.k8s.io + resources: + - ingresses + verbs: ["get", "list", "watch"] +- apiGroups: ["discovery.k8s.io"] + resources: + - endpointslices + verbs: ["get", "list", "watch"] +- nonResourceURLs: ["/metrics", "/metrics/cadvisor"] + verbs: ["get"] +--- +# Source: opentelemetry-kube-stack/templates/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: example-daemon +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: example-collector +subjects: +- kind: ServiceAccount + # quirk of the Operator + name: "example-daemon-collector" + namespace: default diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/collector.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/collector.yaml new file mode 100644 index 0000000000..286912e5f0 --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/collector.yaml @@ -0,0 +1,236 @@ +--- +# Source: opentelemetry-kube-stack/templates/collector.yaml +apiVersion: opentelemetry.io/v1beta1 +kind: OpenTelemetryCollector +metadata: + name: example-daemon + namespace: default + labels: + helm.sh/chart: opentelemetry-kube-stack-0.16.0 + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + release: "example" +spec: + managementState: managed + mode: daemonset + config: + exporters: + debug: {} + processors: + batch: + send_batch_max_size: 1500 + send_batch_size: 1000 + timeout: 1s + resource/hostname: + attributes: + - action: insert + from_attribute: k8s.node.name + key: host.name + resourcedetection/env: + detectors: + - env + - k8snode + override: false + timeout: 2s + receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + prometheus/cadvisor: + config: + scrape_configs: + - authorization: + credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token + type: Bearer + job_name: kubelet + metric_relabel_configs: + - action: drop + regex: container_cpu_(load_average_10s|system_seconds_total|user_seconds_total) + source_labels: + - __name__ + - action: drop + regex: container_fs_(io_current|reads_merged_total|sector_reads_total|sector_writes_total|writes_merged_total) + source_labels: + - __name__ + - action: drop + regex: container_memory_(mapped_file|swap) + source_labels: + - __name__ + - action: drop + regex: container_(file_descriptors|tasks_state|threads_max) + source_labels: + - __name__ + - action: drop + regex: container_spec.* + source_labels: + - __name__ + - action: drop + regex: .+; + source_labels: + - id + - pod + metrics_path: /metrics/cadvisor + relabel_configs: + - replacement: ${env:OTEL_K8S_NODE_NAME} + target_label: node + scheme: https + scrape_interval: 30s + scrape_timeout: 10s + static_configs: + - targets: + - ${env:OTEL_K8S_NODE_IP}:10250 + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + insecure_skip_verify: true + prometheus/node_exporter: + config: + scrape_configs: + - job_name: node-exporter + relabel_configs: + - replacement: ${env:OTEL_K8S_NODE_NAME} + target_label: node + scrape_interval: 30s + scrape_timeout: 10s + static_configs: + - targets: + - ${env:OTEL_K8S_NODE_IP}:9100 + prometheus/pod_annotations: + config: + scrape_configs: + - job_name: kubernetes-pods + kubernetes_sd_configs: + - role: pod + selectors: + - field: spec.nodeName=${env:OTEL_K8S_NODE_NAME} + label: app.kubernetes.io/component!=opentelemetry-collector + role: pod + relabel_configs: + - action: keep + regex: true + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_scrape + - action: drop + regex: true + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_scrape_slow + - action: replace + regex: (https?) + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_scheme + target_label: __scheme__ + - action: replace + regex: (.+) + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_path + target_label: __metrics_path__ + - action: replace + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $$1:$$2 + source_labels: + - __address__ + - __meta_kubernetes_pod_annotation_prometheus_io_port + target_label: __address__ + - action: labelmap + regex: __meta_kubernetes_pod_annotation_prometheus_io_param_(.+) + replacement: __param_$$1 + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - action: replace + source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - action: replace + source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - action: replace + source_labels: + - __meta_kubernetes_pod_node_name + target_label: node + - action: drop + regex: Pending|Succeeded|Failed|Completed + source_labels: + - __meta_kubernetes_pod_phase + - action: replace + source_labels: + - __meta_kubernetes_pod_label_app_kubernetes_io_name + target_label: job + scrape_interval: 30s + scrape_timeout: 10s + service: + pipelines: + logs: + exporters: + - debug + processors: + - resourcedetection/env + - resource/hostname + - batch + receivers: + - otlp + metrics: + exporters: + - debug + processors: + - resourcedetection/env + - resource/hostname + - batch + receivers: + - otlp + - prometheus/node_exporter + - prometheus/cadvisor + - prometheus/pod_annotations + traces: + exporters: + - debug + processors: + - resourcedetection/env + - resource/hostname + - batch + receivers: + - otlp + imagePullPolicy: IfNotPresent + upgradeStrategy: automatic + terminationGracePeriodSeconds: 30 + resources: + limits: + cpu: 200m + memory: 500Mi + requests: + cpu: 100m + memory: 250Mi + securityContext: + {} + env: + - name: K8S_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: OTEL_K8S_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: OTEL_K8S_NODE_IP + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: OTEL_K8S_NAMESPACE + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: OTEL_K8S_POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: OTEL_K8S_POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + - name: OTEL_RESOURCE_ATTRIBUTES + value: "k8s.pod.name=$(OTEL_K8S_POD_NAME),k8s.namespace.name=$(OTEL_K8S_NAMESPACE),k8s.node.name=$(OTEL_K8S_NODE_NAME),host.name=$(OTEL_K8S_NODE_NAME),k8s.node.ip=$(OTEL_K8S_NODE_IP),k8s.pod.ip=$(OTEL_K8S_POD_IP),k8s.cluster.name=unknown_k8s_cluster" diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/hooks.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/hooks.yaml new file mode 100644 index 0000000000..b16df5ac8f --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/hooks.yaml @@ -0,0 +1,64 @@ +--- +# Source: opentelemetry-kube-stack/templates/hooks.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: delete-resources-sa + annotations: + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded +--- +# Source: opentelemetry-kube-stack/templates/hooks.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: delete-resources-role + annotations: + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded +rules: + - apiGroups: + - opentelemetry.io + resources: + - instrumentations + - opampbridges + - opentelemetrycollectors + verbs: + - get + - list + - delete +--- +# Source: opentelemetry-kube-stack/templates/hooks.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: delete-resources-rolebinding + annotations: + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: delete-resources-role +subjects: + - kind: ServiceAccount + name: delete-resources-sa +--- +# Source: opentelemetry-kube-stack/templates/hooks.yaml +apiVersion: batch/v1 +kind: Job +metadata: + name: opentelemetry-kube-stack-pre-delete-job + annotations: + "helm.sh/hook": pre-delete + "helm.sh/hook-delete-policy": hook-succeeded,hook-failed +spec: + template: + spec: + restartPolicy: Never + serviceAccountName: delete-resources-sa + containers: + - name: delete-resources + image: "rancher/kubectl:v1.34.1" + args: + - "delete" + - "instrumentations,opampbridges,opentelemetrycollectors" + - "-l" + - "helm.sh/chart=opentelemetry-kube-stack-0.16.0" diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/admission-webhooks/operator-webhook-with-cert-manager.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/admission-webhooks/operator-webhook-with-cert-manager.yaml new file mode 100644 index 0000000000..7dbf1665c0 --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/admission-webhooks/operator-webhook-with-cert-manager.yaml @@ -0,0 +1,192 @@ +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/admission-webhooks/operator-webhook-with-cert-manager.yaml +apiVersion: admissionregistration.k8s.io/v1 +kind: MutatingWebhookConfiguration +metadata: + annotations: + cert-manager.io/inject-ca-from: default/example-opentelemetry-operator-serving-cert + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: webhook + name: example-opentelemetry-operator-mutation +webhooks: + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: example-opentelemetry-operator-webhook + namespace: default + path: /mutate-opentelemetry-io-v1alpha1-instrumentation + port: 443 + failurePolicy: Ignore + name: minstrumentation.kb.io + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - instrumentations + scope: Namespaced + sideEffects: None + timeoutSeconds: 10 + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: example-opentelemetry-operator-webhook + namespace: default + path: /mutate-opentelemetry-io-v1beta1-opentelemetrycollector + port: 443 + failurePolicy: Ignore + name: mopentelemetrycollectorbeta.kb.io + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1beta1 + operations: + - CREATE + - UPDATE + resources: + - opentelemetrycollectors + scope: Namespaced + sideEffects: None + timeoutSeconds: 10 + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: example-opentelemetry-operator-webhook + namespace: default + path: /mutate-v1-pod + port: 443 + failurePolicy: Ignore + name: mpod.kb.io + rules: + - apiGroups: + - "" + apiVersions: + - v1 + operations: + - CREATE + resources: + - pods + scope: Namespaced + sideEffects: None + timeoutSeconds: 10 +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/admission-webhooks/operator-webhook-with-cert-manager.yaml +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingWebhookConfiguration +metadata: + annotations: + cert-manager.io/inject-ca-from: default/example-opentelemetry-operator-serving-cert + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: webhook + name: example-opentelemetry-operator-validation +webhooks: + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: example-opentelemetry-operator-webhook + namespace: default + path: /validate-opentelemetry-io-v1alpha1-instrumentation + port: 443 + failurePolicy: Ignore + name: vinstrumentationcreateupdate.kb.io + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - instrumentations + scope: Namespaced + sideEffects: None + timeoutSeconds: 10 + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: example-opentelemetry-operator-webhook + namespace: default + path: /validate-opentelemetry-io-v1alpha1-instrumentation + port: 443 + failurePolicy: Ignore + name: vinstrumentationdelete.kb.io + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - DELETE + resources: + - instrumentations + scope: Namespaced + sideEffects: None + timeoutSeconds: 10 + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: example-opentelemetry-operator-webhook + namespace: default + path: /validate-opentelemetry-io-v1beta1-opentelemetrycollector + port: 443 + failurePolicy: Ignore + name: vopentelemetrycollectorcreateupdatebeta.kb.io + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1beta1 + operations: + - CREATE + - UPDATE + resources: + - opentelemetrycollectors + scope: Namespaced + sideEffects: None + timeoutSeconds: 10 + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: example-opentelemetry-operator-webhook + namespace: default + path: /validate-opentelemetry-io-v1beta1-opentelemetrycollector + port: 443 + failurePolicy: Ignore + name: vopentelemetrycollectordeletebeta.kb.io + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1beta1 + operations: + - DELETE + resources: + - opentelemetrycollectors + scope: Namespaced + sideEffects: None + timeoutSeconds: 10 diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/admission-webhooks/operator-webhook.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/admission-webhooks/operator-webhook.yaml new file mode 100644 index 0000000000..5b9ff5511d --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/admission-webhooks/operator-webhook.yaml @@ -0,0 +1,3 @@ +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/admission-webhooks/operator-webhook.yaml +--- diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/certmanager.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/certmanager.yaml new file mode 100644 index 0000000000..b7b5be3ffe --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/certmanager.yaml @@ -0,0 +1,43 @@ +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/certmanager.yaml +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: webhook + name: example-opentelemetry-operator-serving-cert + namespace: default +spec: + dnsNames: + - example-opentelemetry-operator-webhook.default.svc + - example-opentelemetry-operator-webhook.default.svc.cluster.local + issuerRef: + kind: Issuer + name: example-opentelemetry-operator-selfsigned-issuer + secretName: example-opentelemetry-operator-controller-manager-service-cert + subject: + organizationalUnits: + - example-opentelemetry-operator +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/certmanager.yaml +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: webhook + name: example-opentelemetry-operator-selfsigned-issuer + namespace: default +spec: + selfSigned: {} diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/clusterrole.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/clusterrole.yaml new file mode 100644 index 0000000000..05d1494af1 --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/clusterrole.yaml @@ -0,0 +1,408 @@ +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator-manager +rules: + - apiGroups: + - "" + resources: + - configmaps + - persistentvolumeclaims + - persistentvolumes + - pods + - serviceaccounts + - services + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - "" + resources: + - events + verbs: + - create + - get + - list + - patch + - watch + - apiGroups: + - "" + resources: + - namespaces + verbs: + - list + - watch + - apiGroups: + - "" + resources: + - namespaces/status + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - nodes/spec + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - pods/status + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - replicationcontrollers + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - replicationcontrollers/status + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - resourcequotas + verbs: + - get + - list + - watch + - apiGroups: + - apps + resources: + - daemonsets + - deployments + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + - extensions + resources: + - replicasets + verbs: + - get + - list + - watch + - apiGroups: + - extensions + resources: + - daemonsets + verbs: + - get + - list + - watch + - apiGroups: + - extensions + resources: + - deployments + verbs: + - get + - list + - watch + - apiGroups: + - autoscaling + resources: + - horizontalpodautoscalers + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - batch + resources: + - jobs + verbs: + - get + - list + - watch + - apiGroups: + - batch + resources: + - cronjobs + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - nodes/proxy + verbs: + - get + - apiGroups: + - "" + resources: + - nodes/stats + verbs: + - get + - apiGroups: + - config.openshift.io + resources: + - infrastructures + - infrastructures/status + verbs: + - get + - list + - watch + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - create + - get + - list + - update + - apiGroups: + - discovery.k8s.io + resources: + - endpointslices + verbs: + - get + - list + - apiGroups: + - events.k8s.io + resources: + - events + verbs: + - create + - list + - patch + - watch + - apiGroups: + - gateway.networking.k8s.io + resources: + - httproutes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - monitoring.coreos.com + resources: + - podmonitors + - servicemonitors + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - ingresses + - networkpolicies + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - instrumentations + verbs: + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - opampbridges + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - opampbridges/finalizers + verbs: + - update + - apiGroups: + - opentelemetry.io + resources: + - opampbridges/status + verbs: + - get + - patch + - update + - apiGroups: + - opentelemetry.io + resources: + - opentelemetrycollectors + verbs: + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - opentelemetrycollectors/finalizers + verbs: + - get + - patch + - update + - apiGroups: + - opentelemetry.io + resources: + - opentelemetrycollectors/status + verbs: + - get + - patch + - update + - apiGroups: + - policy + resources: + - poddisruptionbudgets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - route.openshift.io + resources: + - routes + - routes/custom-host + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - targetallocators + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - targetallocators/status + verbs: + - get + - patch + - update + - apiGroups: + - opentelemetry.io + resources: + - targetallocators/finalizers + verbs: + - get + - patch + - update + - apiGroups: + - cert-manager.io + resources: + - issuers + - certificaterequests + - certificates + verbs: + - create + - get + - list + - watch + - update + - patch + - delete + - apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator-metrics +rules: + - nonResourceURLs: + - /metrics + verbs: + - get diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/clusterrolebinding.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/clusterrolebinding.yaml new file mode 100644 index 0000000000..8259beef16 --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/clusterrolebinding.yaml @@ -0,0 +1,22 @@ +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator-manager +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: example-opentelemetry-operator-manager +subjects: + - kind: ServiceAccount + name: opentelemetry-operator + namespace: default diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/deployment.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/deployment.yaml new file mode 100644 index 0000000000..2854112b68 --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/deployment.yaml @@ -0,0 +1,104 @@ +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator + namespace: default +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/component: controller-manager + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + spec: + automountServiceAccountToken: true + hostNetwork: false + containers: + - args: + - --metrics-addr=0.0.0.0:8443 + - --metrics-secure=true + - --enable-leader-election + - --health-probe-addr=:8081 + - --webhook-port=9443 + - --collector-image=otel/opentelemetry-collector-k8s:0.151.0 + command: + - /manager + env: + - name: SERVICE_ACCOUNT_NAME + valueFrom: + fieldRef: + fieldPath: spec.serviceAccountName + - name: ENABLE_WEBHOOKS + value: "true" + image: "ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator:0.151.0" + name: manager + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8443 + name: metrics + protocol: TCP + - containerPort: 9443 + name: webhook-server + protocol: TCP + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + {} + volumeMounts: + - mountPath: /tmp/k8s-webhook-server/serving-certs + name: cert + readOnly: true + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + nodeSelector: + kubernetes.io/os: linux + serviceAccountName: opentelemetry-operator + terminationGracePeriodSeconds: 10 + volumes: + - name: cert + secret: + defaultMode: 420 + secretName: example-opentelemetry-operator-controller-manager-service-cert + securityContext: + fsGroup: 65532 + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/role.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/role.yaml new file mode 100644 index 0000000000..0a015afb82 --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/role.yaml @@ -0,0 +1,199 @@ +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/role.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator-leader-election + namespace: default +rules: + - apiGroups: + - "" + resources: + - configmaps + - pods + - serviceaccounts + - services + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - apiGroups: + - "" + resources: + - namespaces + - secrets + verbs: + - get + - list + - watch + - apiGroups: + - apps + resources: + - daemonsets + - deployments + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - replicasets + verbs: + - get + - list + - watch + - apiGroups: + - autoscaling + resources: + - horizontalpodautoscalers + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - batch + resources: + - jobs + verbs: + - get + - list + - watch + - apiGroups: + - config.openshift.io + resources: + - infrastructures + - infrastructures/status + verbs: + - get + - list + - watch + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - create + - get + - list + - update + - apiGroups: + - monitoring.coreos.com + resources: + - podmonitors + - servicemonitors + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - ingresses + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - instrumentations + - opentelemetrycollectors + verbs: + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - opampbridges + - targetallocators + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - opampbridges/finalizers + verbs: + - update + - apiGroups: + - opentelemetry.io + resources: + - opampbridges/status + - opentelemetrycollectors/finalizers + - opentelemetrycollectors/status + - targetallocators/status + - targetallocators/finalizers + verbs: + - get + - patch + - update + - apiGroups: + - policy + resources: + - poddisruptionbudgets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - route.openshift.io + resources: + - routes + - routes/custom-host + verbs: + - create + - delete + - get + - list + - patch + - update + - watch diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/rolebinding.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/rolebinding.yaml new file mode 100644 index 0000000000..721fdb0099 --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/rolebinding.yaml @@ -0,0 +1,23 @@ +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/rolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator-leader-election + namespace: default +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: example-opentelemetry-operator-leader-election +subjects: + - kind: ServiceAccount + name: opentelemetry-operator + namespace: default diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/service.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/service.yaml new file mode 100644 index 0000000000..bf164a93d7 --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/service.yaml @@ -0,0 +1,47 @@ +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator + namespace: default +spec: + ports: + - name: metrics + port: 8443 + protocol: TCP + targetPort: metrics + selector: + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/component: controller-manager +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator-webhook + namespace: default +spec: + ports: + - port: 443 + protocol: TCP + targetPort: webhook-server + selector: + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/component: controller-manager diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/serviceaccount.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/serviceaccount.yaml new file mode 100644 index 0000000000..6abe418372 --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/serviceaccount.yaml @@ -0,0 +1,16 @@ +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +automountServiceAccountToken: true +metadata: + name: opentelemetry-operator + namespace: default + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/tests/test-certmanager-connection.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/tests/test-certmanager-connection.yaml new file mode 100644 index 0000000000..f86f50575c --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/tests/test-certmanager-connection.yaml @@ -0,0 +1,53 @@ +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/tests/test-certmanager-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "example-opentelemetry-operator-cert-manager" + namespace: default + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: webhook + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: "busybox:latest" + env: + - name: CERT_MANAGER_CLUSTERIP + value: "cert-manager-webhook" + - name: CERT_MANAGER_PORT + value: "443" + command: + - sh + - -c + # The following shell script tests if the cert-manager service is up. If the service is up, when we try + # to wget its exposed port, we will get an HTTP error 400. + - | + wget_output=$(wget -q "$CERT_MANAGER_CLUSTERIP:$CERT_MANAGER_PORT") + if wget_output=="wget: server returned error: HTTP/1.0 400 Bad Request" + then exit 0 + else exit 1 + fi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + restartPolicy: Never + nodeSelector: + kubernetes.io/os: linux + securityContext: + fsGroup: 65532 + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/tests/test-service-connection.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/tests/test-service-connection.yaml new file mode 100644 index 0000000000..79329c4b9b --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/rendered/opentelemetry-operator/tests/test-service-connection.yaml @@ -0,0 +1,106 @@ +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/tests/test-service-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "example-opentelemetry-operator-metrics" + namespace: default + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: "busybox:latest" + env: + - name: MANAGER_METRICS_SERVICE_CLUSTERIP + value: "example-opentelemetry-operator" + - name: MANAGER_METRICS_SERVICE_PORT + value: "8443" + command: + - sh + - -c + # The following shell script tests if the controller-manager-metrics-service is up. + # If the service is up, when we try to wget its exposed port, we will get an HTTP error 400. + - | + wget_output=$(wget -q "$MANAGER_METRICS_SERVICE_CLUSTERIP:$MANAGER_METRICS_SERVICE_PORT") + if wget_output=="wget: server returned error: HTTP/1.0 400 Bad Request" + then exit 0 + else exit 1 + fi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + restartPolicy: Never + nodeSelector: + kubernetes.io/os: linux + securityContext: + fsGroup: 65532 + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 +--- +# Source: opentelemetry-kube-stack/charts/opentelemetry-operator/templates/tests/test-service-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "example-opentelemetry-operator-webhook" + namespace: default + labels: + helm.sh/chart: opentelemetry-operator-0.113.1 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.151.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/part-of: opentelemetry-operator + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: "busybox:latest" + env: + - name: WEBHOOK_SERVICE_CLUSTERIP + value: "example-opentelemetry-operator-webhook" + - name: WEBHOOK_SERVICE_PORT + value: "443" + command: + - sh + - -c + # The following shell script tests if the webhook service is up. If the service is up, when we try + # to wget its exposed port, we will get an HTTP error 400. + - | + wget_output=$(wget -q "$WEBHOOK_SERVICE_CLUSTERIP:$WEBHOOK_SERVICE_PORT") + if wget_output=="wget: server returned error: HTTP/1.0 400 Bad Request" + then exit 0 + else exit 1 + fi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + restartPolicy: Never + nodeSelector: + kubernetes.io/os: linux + securityContext: + fsGroup: 65532 + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 diff --git a/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/values.yaml b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/values.yaml new file mode 100644 index 0000000000..f3ebaac9f1 --- /dev/null +++ b/charts/opentelemetry-kube-stack/examples/daemonset-prometheus-presets/values.yaml @@ -0,0 +1,45 @@ +# Demonstrates the `presets.prometheus.*` family of presets, which add named instances +# of the prometheus receiver to the metrics pipeline of the daemonset collector: +# +# * prometheus/node_exporter — scrapes Prometheus Node Exporter on the same node +# * prometheus/cadvisor — scrapes cAdvisor metrics from the local kubelet +# * prometheus/pod_annotations — scrapes pods carrying classic prometheus.io/* annotations +# +# Each preset uses ${OTEL_K8S_NODE_IP} / ${OTEL_K8S_NODE_NAME} to scope scraping to the +# local node, so the load is naturally sharded across daemonset collector pods. +# +# This example disables the default `scrape_configs_file` so node-exporter and cAdvisor +# are only scraped once. The default daemon_scrape_configs.yaml already has its own +# node-exporter, kubelet/cadvisor and pod-annotation scrape jobs — enabling these presets +# alongside it would cause duplicate scrapes. +collectors: + daemon: + scrape_configs_file: "" + presets: + logsCollection: + enabled: false + kubeletMetrics: + enabled: false + hostMetrics: + enabled: false + kubernetesAttributes: + enabled: false + kubernetesEvents: + enabled: false + clusterMetrics: + enabled: false + prometheus: + nodeExporter: + enabled: true + port: 9100 + scrapeInterval: 30s + scrapeTimeout: 10s + cadvisor: + enabled: true + port: 10250 + scrapeInterval: 30s + scrapeTimeout: 10s + podAnnotations: + enabled: true + scrapeInterval: 30s + scrapeTimeout: 10s \ No newline at end of file diff --git a/charts/opentelemetry-kube-stack/examples/default/rendered/collector.yaml b/charts/opentelemetry-kube-stack/examples/default/rendered/collector.yaml index 9f87697ceb..a4b8c44e29 100644 --- a/charts/opentelemetry-kube-stack/examples/default/rendered/collector.yaml +++ b/charts/opentelemetry-kube-stack/examples/default/rendered/collector.yaml @@ -6,7 +6,7 @@ metadata: name: example-daemon namespace: default labels: - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/default/rendered/hooks.yaml b/charts/opentelemetry-kube-stack/examples/default/rendered/hooks.yaml index d73d11f878..b16df5ac8f 100644 --- a/charts/opentelemetry-kube-stack/examples/default/rendered/hooks.yaml +++ b/charts/opentelemetry-kube-stack/examples/default/rendered/hooks.yaml @@ -61,4 +61,4 @@ spec: - "delete" - "instrumentations,opampbridges,opentelemetrycollectors" - "-l" - - "helm.sh/chart=opentelemetry-kube-stack-0.15.2" + - "helm.sh/chart=opentelemetry-kube-stack-0.16.0" diff --git a/charts/opentelemetry-kube-stack/examples/isolated-multicollector-deployment/rendered/collector.yaml b/charts/opentelemetry-kube-stack/examples/isolated-multicollector-deployment/rendered/collector.yaml index 146eed269c..7cb3bcd04a 100644 --- a/charts/opentelemetry-kube-stack/examples/isolated-multicollector-deployment/rendered/collector.yaml +++ b/charts/opentelemetry-kube-stack/examples/isolated-multicollector-deployment/rendered/collector.yaml @@ -6,7 +6,7 @@ metadata: name: agent namespace: default labels: - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" @@ -232,7 +232,7 @@ metadata: name: gateway namespace: default labels: - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" @@ -365,7 +365,7 @@ metadata: name: ingress namespace: default labels: - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/isolated-multicollector-deployment/rendered/hooks.yaml b/charts/opentelemetry-kube-stack/examples/isolated-multicollector-deployment/rendered/hooks.yaml index d73d11f878..b16df5ac8f 100644 --- a/charts/opentelemetry-kube-stack/examples/isolated-multicollector-deployment/rendered/hooks.yaml +++ b/charts/opentelemetry-kube-stack/examples/isolated-multicollector-deployment/rendered/hooks.yaml @@ -61,4 +61,4 @@ spec: - "delete" - "instrumentations,opampbridges,opentelemetrycollectors" - "-l" - - "helm.sh/chart=opentelemetry-kube-stack-0.15.2" + - "helm.sh/chart=opentelemetry-kube-stack-0.16.0" diff --git a/charts/opentelemetry-kube-stack/examples/no-leader-election-extension/rendered/collector.yaml b/charts/opentelemetry-kube-stack/examples/no-leader-election-extension/rendered/collector.yaml index 78c4b65978..fb60f13e92 100644 --- a/charts/opentelemetry-kube-stack/examples/no-leader-election-extension/rendered/collector.yaml +++ b/charts/opentelemetry-kube-stack/examples/no-leader-election-extension/rendered/collector.yaml @@ -6,7 +6,7 @@ metadata: name: example-cluster-stats namespace: default labels: - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" @@ -173,7 +173,7 @@ metadata: name: example-daemon namespace: default labels: - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/no-leader-election-extension/rendered/hooks.yaml b/charts/opentelemetry-kube-stack/examples/no-leader-election-extension/rendered/hooks.yaml index d73d11f878..b16df5ac8f 100644 --- a/charts/opentelemetry-kube-stack/examples/no-leader-election-extension/rendered/hooks.yaml +++ b/charts/opentelemetry-kube-stack/examples/no-leader-election-extension/rendered/hooks.yaml @@ -61,4 +61,4 @@ spec: - "delete" - "instrumentations,opampbridges,opentelemetrycollectors" - "-l" - - "helm.sh/chart=opentelemetry-kube-stack-0.15.2" + - "helm.sh/chart=opentelemetry-kube-stack-0.16.0" diff --git a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/collector.yaml b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/collector.yaml index 957fff77fa..94eb9454a1 100644 --- a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/collector.yaml +++ b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/collector.yaml @@ -6,7 +6,7 @@ metadata: name: example-daemon namespace: default labels: - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-api-server/servicemonitor.yaml b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-api-server/servicemonitor.yaml index 1ecde1540e..fe7964fbd8 100644 --- a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-api-server/servicemonitor.yaml +++ b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-api-server/servicemonitor.yaml @@ -7,7 +7,7 @@ metadata: namespace: default labels: app: opentelemetry-kube-stack-apiserver - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-controller-manager/service.yaml b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-controller-manager/service.yaml index 5f5cba12a4..48fad8ddcb 100644 --- a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-controller-manager/service.yaml +++ b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-controller-manager/service.yaml @@ -7,7 +7,7 @@ metadata: labels: app: opentelemetry-kube-stack-kube-controller-manager jobLabel: kube-controller-manager - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-controller-manager/servicemonitor.yaml b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-controller-manager/servicemonitor.yaml index ed54b86360..add508a859 100644 --- a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-controller-manager/servicemonitor.yaml +++ b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-controller-manager/servicemonitor.yaml @@ -7,7 +7,7 @@ metadata: namespace: default labels: app: opentelemetry-kube-stack-kube-controller-manager - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-dns/service.yaml b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-dns/service.yaml index 006955a824..8b5323b653 100644 --- a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-dns/service.yaml +++ b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-dns/service.yaml @@ -7,7 +7,7 @@ metadata: labels: app: opentelemetry-kube-stack-kube-dns jobLabel: kube-dns - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-dns/servicemonitor.yaml b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-dns/servicemonitor.yaml index c220b7c160..837fdb290f 100644 --- a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-dns/servicemonitor.yaml +++ b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-dns/servicemonitor.yaml @@ -7,7 +7,7 @@ metadata: namespace: default labels: app: opentelemetry-kube-stack-kube-dns - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-etcd/service.yaml b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-etcd/service.yaml index 253ab1c8ad..ec97d4662b 100644 --- a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-etcd/service.yaml +++ b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-etcd/service.yaml @@ -7,7 +7,7 @@ metadata: labels: app: opentelemetry-kube-stack-kube-etcd jobLabel: kube-etcd - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-etcd/servicemonitor.yaml b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-etcd/servicemonitor.yaml index e6368c0020..96ab2eff9b 100644 --- a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-etcd/servicemonitor.yaml +++ b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-etcd/servicemonitor.yaml @@ -7,7 +7,7 @@ metadata: namespace: default labels: app: opentelemetry-kube-stack-kube-etcd - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-proxy/service.yaml b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-proxy/service.yaml index cb3563aa27..8af7794d9b 100644 --- a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-proxy/service.yaml +++ b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-proxy/service.yaml @@ -7,7 +7,7 @@ metadata: labels: app: opentelemetry-kube-stack-kube-proxy jobLabel: kube-proxy - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-proxy/servicemonitor.yaml b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-proxy/servicemonitor.yaml index d978dd0799..421c615391 100644 --- a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-proxy/servicemonitor.yaml +++ b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-proxy/servicemonitor.yaml @@ -7,7 +7,7 @@ metadata: namespace: default labels: app: opentelemetry-kube-stack-kube-proxy - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-scheduler/service.yaml b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-scheduler/service.yaml index b68cc52c72..ef5a5763d7 100644 --- a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-scheduler/service.yaml +++ b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-scheduler/service.yaml @@ -7,7 +7,7 @@ metadata: labels: app: opentelemetry-kube-stack-kube-scheduler jobLabel: kube-scheduler - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-scheduler/servicemonitor.yaml b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-scheduler/servicemonitor.yaml index e5e961ef1c..ac1c7e7618 100644 --- a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-scheduler/servicemonitor.yaml +++ b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/exporters/kube-scheduler/servicemonitor.yaml @@ -7,7 +7,7 @@ metadata: namespace: default labels: app: opentelemetry-kube-stack-kube-scheduler - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/hooks.yaml b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/hooks.yaml index d73d11f878..b16df5ac8f 100644 --- a/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/hooks.yaml +++ b/charts/opentelemetry-kube-stack/examples/prometheus-otel/rendered/hooks.yaml @@ -61,4 +61,4 @@ spec: - "delete" - "instrumentations,opampbridges,opentelemetrycollectors" - "-l" - - "helm.sh/chart=opentelemetry-kube-stack-0.15.2" + - "helm.sh/chart=opentelemetry-kube-stack-0.16.0" diff --git a/charts/opentelemetry-kube-stack/examples/secrets-csi-driver/rendered/collector.yaml b/charts/opentelemetry-kube-stack/examples/secrets-csi-driver/rendered/collector.yaml index 0e1492ecd2..76358c5f88 100644 --- a/charts/opentelemetry-kube-stack/examples/secrets-csi-driver/rendered/collector.yaml +++ b/charts/opentelemetry-kube-stack/examples/secrets-csi-driver/rendered/collector.yaml @@ -6,7 +6,7 @@ metadata: name: example-daemon namespace: default labels: - helm.sh/chart: opentelemetry-kube-stack-0.15.2 + helm.sh/chart: opentelemetry-kube-stack-0.16.0 app.kubernetes.io/version: "0.151.0" app.kubernetes.io/managed-by: Helm release: "example" diff --git a/charts/opentelemetry-kube-stack/examples/secrets-csi-driver/rendered/hooks.yaml b/charts/opentelemetry-kube-stack/examples/secrets-csi-driver/rendered/hooks.yaml index d73d11f878..b16df5ac8f 100644 --- a/charts/opentelemetry-kube-stack/examples/secrets-csi-driver/rendered/hooks.yaml +++ b/charts/opentelemetry-kube-stack/examples/secrets-csi-driver/rendered/hooks.yaml @@ -61,4 +61,4 @@ spec: - "delete" - "instrumentations,opampbridges,opentelemetrycollectors" - "-l" - - "helm.sh/chart=opentelemetry-kube-stack-0.15.2" + - "helm.sh/chart=opentelemetry-kube-stack-0.16.0" diff --git a/charts/opentelemetry-kube-stack/templates/_config.tpl b/charts/opentelemetry-kube-stack/templates/_config.tpl index 0cb39498ca..cede9b97f0 100644 --- a/charts/opentelemetry-kube-stack/templates/_config.tpl +++ b/charts/opentelemetry-kube-stack/templates/_config.tpl @@ -10,6 +10,7 @@ receiver (with an empty scrape_configs list) is injected if one isn't already de target allocator has a receiver to populate. */}} {{- define "opentelemetry-kube-stack.config" -}} +{{- include "opentelemetry-kube-stack.assertPrometheusPresets" . }} {{- $collector := .collector }} {{- $config := .collector.config }} {{- if .collector.scrape_configs_file }} @@ -46,6 +47,18 @@ target allocator has a receiver to populate. {{- $config = (include "opentelemetry-kube-stack.collector.applyKubeletMetricsConfig" (dict "collector" $collector) | fromYaml) -}} {{- $_ := set $collector "config" $config }} {{- end }} +{{- if .collector.presets.prometheus.nodeExporter.enabled }} +{{- $config = (include "opentelemetry-kube-stack.collector.applyPrometheusScrapeConfig" (dict "collector" $collector "configTemplate" "opentelemetry-kube-stack.collector.prometheusNodeExporterConfig" "receiverName" "prometheus/node_exporter") | fromYaml) -}} +{{- $_ := set $collector "config" $config }} +{{- end }} +{{- if .collector.presets.prometheus.cadvisor.enabled }} +{{- $config = (include "opentelemetry-kube-stack.collector.applyPrometheusScrapeConfig" (dict "collector" $collector "configTemplate" "opentelemetry-kube-stack.collector.prometheusCadvisorConfig" "receiverName" "prometheus/cadvisor") | fromYaml) -}} +{{- $_ := set $collector "config" $config }} +{{- end }} +{{- if .collector.presets.prometheus.podAnnotations.enabled }} +{{- $config = (include "opentelemetry-kube-stack.collector.applyPrometheusScrapeConfig" (dict "collector" $collector "configTemplate" "opentelemetry-kube-stack.collector.prometheusPodAnnotationsConfig" "receiverName" "prometheus/pod_annotations") | fromYaml) -}} +{{- $_ := set $collector "config" $config }} +{{- end }} {{- if .collector.presets.kubernetesEvents.enabled }} {{- $config = (include "opentelemetry-kube-stack.collector.applyKubernetesEventsConfig" (dict "collector" $collector "namespace" .namespace) | fromYaml) -}} {{- $_ := set $collector "config" $config }} @@ -492,3 +505,178 @@ gcp: k8s.cluster.name: enabled: true {{- end -}} + +{{/* +Validates the `presets.prometheus.*` family of presets: + * mutually exclusive with `scrape_configs_file` — they are a replacement, not + an addition. Enabling both would cause duplicate scrapes (the default + daemon_scrape_configs.yaml already has node-exporter / kubelet-cadvisor / + kubernetes-pods jobs). + * require the collector to run in `daemonset` mode — the scrape configs use + the OTEL_K8S_NODE_IP / OTEL_K8S_NODE_NAME env vars and kubernetes_sd + field selectors keyed on the local node, which are only meaningful when + a collector pod is scheduled per node. +*/}} +{{- define "opentelemetry-kube-stack.assertPrometheusPresets" -}} +{{- $prom := .collector.presets.prometheus }} +{{- $enabled := list }} +{{- if $prom.nodeExporter.enabled }}{{- $enabled = append $enabled "nodeExporter" }}{{- end }} +{{- if $prom.cadvisor.enabled }}{{- $enabled = append $enabled "cadvisor" }}{{- end }} +{{- if $prom.podAnnotations.enabled }}{{- $enabled = append $enabled "podAnnotations" }}{{- end }} +{{- if $enabled }} +{{- $collectorName := .collector.suffix | default "unnamed" }} +{{- $enabledList := join ", " $enabled }} +{{- if .collector.scrape_configs_file }} +{{- fail (printf "collector %q: presets.prometheus.{%s} are a replacement for `scrape_configs_file` (the chart default is `daemon_scrape_configs.yaml`). Both are configured: scrape_configs_file=%q. Choose one — either keep `scrape_configs_file` and disable the listed presets, or keep the presets and set `scrape_configs_file: \"\"`." $collectorName $enabledList .collector.scrape_configs_file) }} +{{- end }} +{{- $mode := .collector.mode | default "deployment" }} +{{- if ne $mode "daemonset" }} +{{- fail (printf "collector %q: presets.prometheus.{%s} require `mode: daemonset` (current mode: %q). The scrape targets reference ${OTEL_K8S_NODE_IP} / ${OTEL_K8S_NODE_NAME}, which the OpenTelemetry Operator only injects on daemonset collector pods." $collectorName $enabledList $mode) }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Shared apply helper for the `presets.prometheus.*` family. Merges the named +scrape-config template into the collector config and appends the receiver to +the metrics pipeline. Args: + collector - the collector dict + configTemplate - full name of the scrape-config template to include + receiverName - receiver key to append to service.pipelines.metrics.receivers +*/}} +{{- define "opentelemetry-kube-stack.collector.applyPrometheusScrapeConfig" -}} +{{- $config := mustMergeOverwrite (include .configTemplate .collector | fromYaml) .collector.config }} +{{- if and (dig "service" "pipelines" "metrics" false $config) (not (has .receiverName (dig "service" "pipelines" "metrics" "receivers" list $config))) }} +{{- $_ := set $config.service.pipelines.metrics "receivers" (append ($config.service.pipelines.metrics.receivers | default list) .receiverName | uniq) }} +{{- end }} +{{- $config | toYaml }} +{{- end }} + +{{- define "opentelemetry-kube-stack.collector.prometheusNodeExporterConfig" -}} +{{- $cfg := .presets.prometheus.nodeExporter }} +receivers: + prometheus/node_exporter: + config: + scrape_configs: + - job_name: node-exporter + scrape_interval: {{ $cfg.scrapeInterval }} + scrape_timeout: {{ $cfg.scrapeTimeout }} + static_configs: + - targets: + - ${env:OTEL_K8S_NODE_IP}:{{ $cfg.port }} + relabel_configs: + - target_label: node + replacement: ${env:OTEL_K8S_NODE_NAME} +{{- end }} + +{{- define "opentelemetry-kube-stack.collector.prometheusCadvisorConfig" -}} +{{- $cfg := .presets.prometheus.cadvisor }} +receivers: + prometheus/cadvisor: + config: + scrape_configs: + - job_name: kubelet + scheme: https + metrics_path: /metrics/cadvisor + scrape_interval: {{ $cfg.scrapeInterval }} + scrape_timeout: {{ $cfg.scrapeTimeout }} + authorization: + type: Bearer + credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + insecure_skip_verify: true + static_configs: + - targets: + - ${env:OTEL_K8S_NODE_IP}:{{ $cfg.port }} + relabel_configs: + - target_label: node + replacement: ${env:OTEL_K8S_NODE_NAME} + metric_relabel_configs: + # Drop the highest-cardinality / lowest-value cAdvisor series. Mirrors the + # `metric_relabel_configs` used by the kubelet job in daemon_scrape_configs.yaml. + - source_labels: [__name__] + regex: container_cpu_(load_average_10s|system_seconds_total|user_seconds_total) + action: drop + - source_labels: [__name__] + regex: container_fs_(io_current|reads_merged_total|sector_reads_total|sector_writes_total|writes_merged_total) + action: drop + - source_labels: [__name__] + regex: container_memory_(mapped_file|swap) + action: drop + - source_labels: [__name__] + regex: container_(file_descriptors|tasks_state|threads_max) + action: drop + - source_labels: [__name__] + regex: container_spec.* + action: drop + # Drop series where the cgroup id is set but the pod label is empty + # (non-pod cgroups like system.slice and the kubelet's own resources). + - source_labels: [id, pod] + regex: .+; + action: drop +{{- end }} + +{{- define "opentelemetry-kube-stack.collector.prometheusPodAnnotationsConfig" -}} +{{- $cfg := .presets.prometheus.podAnnotations }} +receivers: + prometheus/pod_annotations: + config: + scrape_configs: + - job_name: kubernetes-pods + scrape_interval: {{ $cfg.scrapeInterval }} + scrape_timeout: {{ $cfg.scrapeTimeout }} + kubernetes_sd_configs: + - role: pod + selectors: + - role: pod + # Only scrape data from pods running on the same node as the collector, + # and skip the OpenTelemetry collector's own pods to avoid self-scrape loops. + field: "spec.nodeName=${env:OTEL_K8S_NODE_NAME}" + label: "app.kubernetes.io/component!=opentelemetry-collector" + relabel_configs: + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] + action: keep + regex: true + - source_labels: + [__meta_kubernetes_pod_annotation_prometheus_io_scrape_slow] + action: drop + regex: true + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scheme] + action: replace + regex: (https?) + target_label: __scheme__ + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: + [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] + action: replace + regex: ([^:]+)(?::\d+)?;(\d+) + # NOTE: otel collector uses env var replacement. $$ is used as a literal $. + replacement: $$1:$$2 + target_label: __address__ + - action: labelmap + regex: __meta_kubernetes_pod_annotation_prometheus_io_param_(.+) + replacement: __param_$$1 + # Emit Prometheus-style Kubernetes labels: namespace, pod, node, and all pod labels + # mapped via __meta_kubernetes_pod_label_*. + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - source_labels: [__meta_kubernetes_namespace] + action: replace + target_label: namespace + - source_labels: [__meta_kubernetes_pod_name] + action: replace + target_label: pod + - source_labels: [__meta_kubernetes_pod_node_name] + action: replace + target_label: node + - source_labels: [__meta_kubernetes_pod_phase] + regex: Pending|Succeeded|Failed|Completed + action: drop + - action: replace + source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name] + target_label: job +{{- end }} diff --git a/charts/opentelemetry-kube-stack/values.schema.json b/charts/opentelemetry-kube-stack/values.schema.json index a52436409f..fcdbcbb0b0 100644 --- a/charts/opentelemetry-kube-stack/values.schema.json +++ b/charts/opentelemetry-kube-stack/values.schema.json @@ -1478,6 +1478,78 @@ } } }, + "prometheus": { + "type": "object", + "additionalProperties": false, + "description": "Prometheus-based scraping presets. Each preset adds a named instance of the prometheus receiver (e.g. `prometheus/node_exporter`) to the metrics pipeline. Constraints (enforced at template render time): mutually exclusive with `scrape_configs_file` (the presets replace the scrape file), and require `mode: daemonset` (the scrape configs use ${OTEL_K8S_NODE_IP} / ${OTEL_K8S_NODE_NAME} and kubernetes_sd field selectors keyed on the local node).", + "properties": { + "nodeExporter": { + "type": "object", + "additionalProperties": false, + "description": "Scrapes a Prometheus Node Exporter on the local node via a static_config targeting ${OTEL_K8S_NODE_IP}:. Adds a `prometheus/node_exporter` receiver to the metrics pipeline.", + "properties": { + "enabled": { + "description": "Enable scraping of the Prometheus Node Exporter on the local node.", + "type": "boolean" + }, + "port": { + "description": "Port where the Prometheus Node Exporter is listening on each node. Defaults to 9100.", + "type": "integer" + }, + "scrapeInterval": { + "description": "Scrape interval as a duration string accepted by Prometheus (e.g. \"30s\", \"1m\"). Defaults to 30s.", + "type": "string" + }, + "scrapeTimeout": { + "description": "Scrape timeout as a duration string accepted by Prometheus (e.g. \"10s\"). Defaults to 10s.", + "type": "string" + } + } + }, + "cadvisor": { + "type": "object", + "additionalProperties": false, + "description": "Scrapes cAdvisor metrics from the local node's kubelet via a static_config targeting https://${OTEL_K8S_NODE_IP}:/metrics/cadvisor with service-account bearer-token auth. Adds a `prometheus/cadvisor` receiver. Drops the highest-cardinality / lowest-value cAdvisor series by default.", + "properties": { + "enabled": { + "description": "Enable scraping of cAdvisor metrics from the local node's kubelet.", + "type": "boolean" + }, + "port": { + "description": "Port where the kubelet HTTPS endpoint serves /metrics/cadvisor. Defaults to 10250.", + "type": "integer" + }, + "scrapeInterval": { + "description": "Scrape interval as a duration string accepted by Prometheus (e.g. \"30s\", \"1m\"). Defaults to 30s.", + "type": "string" + }, + "scrapeTimeout": { + "description": "Scrape timeout as a duration string accepted by Prometheus (e.g. \"10s\"). Defaults to 10s.", + "type": "string" + } + } + }, + "podAnnotations": { + "type": "object", + "additionalProperties": false, + "description": "Scrapes pods on the local node carrying classic Prometheus annotations (prometheus.io/scrape=true, prometheus.io/port, prometheus.io/path, prometheus.io/scheme). Adds a `prometheus/pod_annotations` receiver to the metrics pipeline that uses Kubernetes pod service discovery + Prometheus relabel rules. Always emits namespace/pod/node and all pod labels via labelmap — matches the labels produced by the `kubernetes-pods` job in `daemon_scrape_configs.yaml`.", + "properties": { + "enabled": { + "description": "Enable scraping of pods carrying classic Prometheus annotations via a standalone Prometheus receiver.", + "type": "boolean" + }, + "scrapeInterval": { + "description": "Scrape interval as a duration string accepted by Prometheus (e.g. \"30s\", \"1m\"). Defaults to 30s.", + "type": "string" + }, + "scrapeTimeout": { + "description": "Scrape timeout as a duration string accepted by Prometheus (e.g. \"10s\"). Defaults to 10s.", + "type": "string" + } + } + } + } + }, "resourceDetection": { "type": "object", "additionalProperties": false, @@ -1548,6 +1620,7 @@ "type": "string" }, "scrape_configs_file": { + "description": "Path to an external Prometheus scrape_configs file to load into the collector's prometheus receiver. Mutually exclusive with the `presets.prometheus.*` family of presets (enabling both fails the chart render). Set to \"\" when using `presets.prometheus.*`.", "type": "string", "default": "" }, diff --git a/charts/opentelemetry-kube-stack/values.yaml b/charts/opentelemetry-kube-stack/values.yaml index eeb60bb32c..9c7b9d506f 100644 --- a/charts/opentelemetry-kube-stack/values.yaml +++ b/charts/opentelemetry-kube-stack/values.yaml @@ -94,6 +94,10 @@ defaultCRConfig: # the collector's prometheus scrape_configs. This is added to assist users # coming from the prometheus ecosystem by allowing users to simply copy and paste # directly from prometheus into this file to use the same config. + # + # Mutually exclusive with the `presets.prometheus.*` family of presets — the + # presets are a replacement for the scrape file, not an addition. Enabling both + # fails the chart render. scrape_configs_file: "" # Management state of the collector @@ -509,6 +513,63 @@ defaultCRConfig: enabled: false metrics: enabled: false + # Configures Prometheus-based scraping presets. Each preset adds a named instance of the + # prometheus receiver (e.g. `prometheus/node_exporter`) to the metrics pipeline. + # + # Constraints (enforced at template render time — invalid configurations fail with a + # clear error message): + # * Mutually exclusive with `scrape_configs_file` — the presets are a replacement + # for the scrape file (the chart default is `daemon_scrape_configs.yaml`, which + # already covers the same targets). Enable the presets and set + # `scrape_configs_file: ""`, or keep `scrape_configs_file` and disable the presets. + # * Require `mode: daemonset` — the scrape configs reference `${OTEL_K8S_NODE_IP}` / + # `${OTEL_K8S_NODE_NAME}` (only injected on daemonset collectors) and use field + # selectors keyed on the local node. + # + # Distinct from the top-level `nodeExporter.enabled` flag, which controls whether the + # prometheus-node-exporter subchart is installed. + # + prometheus: + # Scrapes a Prometheus Node Exporter on the local node via a static_config targeting + # `${OTEL_K8S_NODE_IP}:`. Adds a `prometheus/node_exporter` receiver. + nodeExporter: + enabled: false + # Port where the Prometheus Node Exporter is listening on each node. + port: 9100 + # Scrape interval, as a duration string accepted by Prometheus (e.g. "30s", "1m"). + scrapeInterval: 30s + # Scrape timeout, as a duration string accepted by Prometheus. + scrapeTimeout: 10s + # Scrapes cAdvisor metrics from the local node's kubelet via a static_config targeting + # `https://${OTEL_K8S_NODE_IP}:/metrics/cadvisor` with bearer-token auth from the + # collector's service account. Adds a `prometheus/cadvisor` receiver. + # + # Drops the highest-cardinality / lowest-value cAdvisor series by default + # (container_cpu_load_average_10s, container_spec_*, container_fs_io_current, ...). + cadvisor: + enabled: false + # Port where the kubelet HTTPS endpoint serves /metrics/cadvisor. + port: 10250 + # Scrape interval, as a duration string accepted by Prometheus (e.g. "30s", "1m"). + scrapeInterval: 30s + # Scrape timeout, as a duration string accepted by Prometheus. + scrapeTimeout: 10s + # Scrapes pods on the local node carrying classic Prometheus annotations: + # prometheus.io/scrape=true (required), prometheus.io/port, prometheus.io/path, + # prometheus.io/scheme. Adds a `prometheus/pod_annotations` receiver that uses + # Kubernetes pod service discovery + Prometheus relabel rules. + # + # The scrape config always emits Prometheus-style Kubernetes labels — `namespace`, + # `pod`, `node`, and all pod labels mapped via `__meta_kubernetes_pod_label_*`. This + # matches the labels produced by the `kubernetes-pods` job in + # `daemon_scrape_configs.yaml`, so existing dashboards, alerts and recording rules + # built on those labels keep working when migrating from `scrape_configs_file`. + podAnnotations: + enabled: false + # Scrape interval, as a duration string accepted by Prometheus (e.g. "30s", "1m"). + scrapeInterval: 30s + # Scrape timeout, as a duration string accepted by Prometheus. + scrapeTimeout: 10s resourceDetection: # Each detector can be enabled individually. Base detectors 'env' and 'k8snode' are always included when any detector is enabled. # Typically used to resolve the 'k8s.cluster.name' resource attribute. @@ -539,9 +600,12 @@ collectors: requests: cpu: 100m memory: 250Mi - # A scrape config file to instruct the daemon collector to pull metrics from any matching targets on the same node with - # prometheus.io/scrape=true - # This config also scrapes a running node exporter and the kubelet CAdvisor metrics which aren't currently supported. + # A scrape config file loaded into the daemon collector's prometheus receiver. The + # default `daemon_scrape_configs.yaml` scrapes node-exporter on the same host, kubelet + # cAdvisor metrics, and pods on the same node carrying `prometheus.io/scrape=true`. + # + # Mutually exclusive with `presets.prometheus.*` (set `scrape_configs_file: ""` to + # use those presets instead). scrape_configs_file: "daemon_scrape_configs.yaml" presets: logsCollection: @@ -561,6 +625,15 @@ collectors: enabled: false metrics: enabled: false + # NOTE: "prometheus.*" presets are mutually exclusive with "scrape_configs_file", + # they are a replacement for the scrape config file, not an addition. Enabling both fails the chart render. + prometheus: + nodeExporter: + enabled: false + cadvisor: + enabled: false + podAnnotations: + enabled: false resourceDetection: aks: enabled: false