diff --git a/.chloggen/discoverymode.yaml b/.chloggen/discoverymode.yaml new file mode 100644 index 0000000000..84ece31a42 --- /dev/null +++ b/.chloggen/discoverymode.yaml @@ -0,0 +1,12 @@ +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: enhancement +# The name of the component, or a single word describing the area of concern, (e.g. agent, clusterReceiver, gateway, operator, chart, other) +component: agent +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: 'linux: Adopt discovery mode in agent and provide agent.discovery.properties value mapping' +# One or more tracking issues related to the change +issues: [1108] +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: diff --git a/docs/advanced-configuration.md b/docs/advanced-configuration.md index 0b4948299e..b01344f1d1 100644 --- a/docs/advanced-configuration.md +++ b/docs/advanced-configuration.md @@ -133,6 +133,57 @@ clusterReceiver: enabled: false ``` +## Discovery Mode + +*At this time only Linux installations are supported* + +The agent daemonset can be configured to run in [`--discovery` mode](https://docs.splunk.com/observability/en/gdi/opentelemetry/discovery-mode.html), initiating a "preflight" discovery phase to test bundled metric receiver configurations against `k8s_observer` discovered endpoints. Successfully discovered instances are then incorporated in the existing service config. + +You can additionally configure any necessary discovery properties for providing required auth or service-specific information: + +```yaml +agent: + discovery: + enabled: true # disabled by default + properties: + extensions: + k8s_observer: + config: + auth_type: serviceAccount # default auth_type value + receivers: + postgres: + config: + # auth fields reference environment variables populated by secret data below + username: '${env:POSTGRES_USER}' + password: '${env:POSTGRES_PASSWORD}' + tls: + insecure: true + + extraEnvs: + # environment variables using a manually created "postgres-monitoring" secret + - name: POSTGRES_USER + valueFrom: + secretKeyRef: + name: postgres-monitoring + key: username + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: postgres-monitoring + key: password +``` + +For discovery progress and statement evaluations, see the agent startup logs in product or via kubectl. + +```bash +$ kubectl -n monitoring logs splunk-otel-collector-agent | grep -i disco +Discovering for next 10s... +Successfully discovered "postgresql" using "k8s_observer" endpoint "k8s_observer/e8a10f52-4f2a-468c-be7b-7f3c673b1c8e/(5432)". +Discovery complete. +``` + +By default, the `docker_observer` and `host_observer` extensions are disabled for discovery in the helm chart. + ## GKE Autopilot support If you want to run Splunk OTel Collector in [Google Kubernetes Engine diff --git a/examples/discovery-mode/README.md b/examples/discovery-mode/README.md new file mode 100644 index 0000000000..403ed94e28 --- /dev/null +++ b/examples/discovery-mode/README.md @@ -0,0 +1,3 @@ +# Discovery mode example + +This example configures the agent to run in --discovery mode using redis receiver discovery properties provided as values. diff --git a/examples/discovery-mode/discovery-mode-values.yaml b/examples/discovery-mode/discovery-mode-values.yaml new file mode 100644 index 0000000000..4b00e67899 --- /dev/null +++ b/examples/discovery-mode/discovery-mode-values.yaml @@ -0,0 +1,29 @@ +clusterName: CHANGEME +splunkObservability: + realm: CHANGEME + accessToken: CHANGEME +agent: + discovery: + enabled: true + properties: + receivers: + redis: + config: + password: '${env:REDIS_PASSWORD}' + username: '${env:REDIS_USERNAME}' + # these env vars reference a secret that must be created manually + extraEnvs: + - name: REDIS_USERNAME + valueFrom: + secretKeyRef: + name: redis-secret + key: username + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: redis-secret + key: password + +clusterReceiver: + # disabled for example only. unrelated to discovery mode + enabled: false diff --git a/examples/discovery-mode/rendered_manifests/clusterRole.yaml b/examples/discovery-mode/rendered_manifests/clusterRole.yaml new file mode 100644 index 0000000000..d8223663db --- /dev/null +++ b/examples/discovery-mode/rendered_manifests/clusterRole.yaml @@ -0,0 +1,83 @@ +--- +# Source: splunk-otel-collector/templates/clusterRole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: default-splunk-otel-collector + labels: + app.kubernetes.io/name: splunk-otel-collector + helm.sh/chart: splunk-otel-collector-0.91.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: default + app.kubernetes.io/version: "0.91.1" + app: splunk-otel-collector + chart: splunk-otel-collector-0.91.0 + release: default + heritage: Helm +rules: +- apiGroups: + - "" + resources: + - events + - namespaces + - namespaces/status + - nodes + - nodes/spec + - nodes/stats + - nodes/proxy + - pods + - pods/status + - persistentvolumeclaims + - persistentvolumes + - replicationcontrollers + - replicationcontrollers/status + - resourcequotas + - services + verbs: + - get + - list + - watch +- apiGroups: + - apps + resources: + - daemonsets + - deployments + - replicasets + - statefulsets + verbs: + - get + - list + - watch +- apiGroups: + - extensions + resources: + - daemonsets + - deployments + - replicasets + verbs: + - get + - list + - watch +- apiGroups: + - batch + resources: + - jobs + - cronjobs + verbs: + - get + - list + - watch +- apiGroups: + - autoscaling + resources: + - horizontalpodautoscalers + verbs: + - get + - list + - watch +- nonResourceURLs: + - /metrics + verbs: + - get + - list + - watch diff --git a/examples/discovery-mode/rendered_manifests/clusterRoleBinding.yaml b/examples/discovery-mode/rendered_manifests/clusterRoleBinding.yaml new file mode 100644 index 0000000000..41ca2b8638 --- /dev/null +++ b/examples/discovery-mode/rendered_manifests/clusterRoleBinding.yaml @@ -0,0 +1,24 @@ +--- +# Source: splunk-otel-collector/templates/clusterRoleBinding.yaml +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: default-splunk-otel-collector + labels: + app.kubernetes.io/name: splunk-otel-collector + helm.sh/chart: splunk-otel-collector-0.91.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: default + app.kubernetes.io/version: "0.91.1" + app: splunk-otel-collector + chart: splunk-otel-collector-0.91.0 + release: default + heritage: Helm +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: default-splunk-otel-collector +subjects: +- kind: ServiceAccount + name: default-splunk-otel-collector + namespace: default diff --git a/examples/discovery-mode/rendered_manifests/configmap-agent.yaml b/examples/discovery-mode/rendered_manifests/configmap-agent.yaml new file mode 100644 index 0000000000..fc80c5b6dd --- /dev/null +++ b/examples/discovery-mode/rendered_manifests/configmap-agent.yaml @@ -0,0 +1,285 @@ +--- +# Source: splunk-otel-collector/templates/configmap-agent.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: default-splunk-otel-collector-otel-agent + labels: + app.kubernetes.io/name: splunk-otel-collector + helm.sh/chart: splunk-otel-collector-0.91.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: default + app.kubernetes.io/version: "0.91.1" + app: splunk-otel-collector + chart: splunk-otel-collector-0.91.0 + release: default + heritage: Helm +data: + relay: | + exporters: + sapm: + access_token: ${SPLUNK_OBSERVABILITY_ACCESS_TOKEN} + endpoint: https://ingest.CHANGEME.signalfx.com/v2/trace + signalfx: + access_token: ${SPLUNK_OBSERVABILITY_ACCESS_TOKEN} + api_url: https://api.CHANGEME.signalfx.com + correlation: null + ingest_url: https://ingest.CHANGEME.signalfx.com + sync_host_metadata: true + extensions: + health_check: null + k8s_observer: + auth_type: serviceAccount + node: ${K8S_NODE_NAME} + memory_ballast: + size_mib: ${SPLUNK_BALLAST_SIZE_MIB} + zpages: null + processors: + batch: null + filter/logs: + logs: + exclude: + match_type: strict + resource_attributes: + - key: splunk.com/exclude + value: "true" + k8sattributes: + extract: + annotations: + - from: pod + key: splunk.com/sourcetype + - from: namespace + key: splunk.com/exclude + tag_name: splunk.com/exclude + - from: pod + key: splunk.com/exclude + tag_name: splunk.com/exclude + - from: namespace + key: splunk.com/index + tag_name: com.splunk.index + - from: pod + key: splunk.com/index + tag_name: com.splunk.index + labels: + - key: app + metadata: + - k8s.namespace.name + - k8s.node.name + - k8s.pod.name + - k8s.pod.uid + - container.id + - container.image.name + - container.image.tag + filter: + node_from_env_var: K8S_NODE_NAME + pod_association: + - sources: + - from: resource_attribute + name: k8s.pod.uid + - sources: + - from: resource_attribute + name: k8s.pod.ip + - sources: + - from: resource_attribute + name: ip + - sources: + - from: connection + - sources: + - from: resource_attribute + name: host.name + memory_limiter: + check_interval: 2s + limit_mib: ${SPLUNK_MEMORY_LIMIT_MIB} + resource: + attributes: + - action: insert + key: k8s.node.name + value: ${K8S_NODE_NAME} + - action: upsert + key: k8s.cluster.name + value: CHANGEME + resource/add_agent_k8s: + attributes: + - action: insert + key: k8s.pod.name + value: ${K8S_POD_NAME} + - action: insert + key: k8s.pod.uid + value: ${K8S_POD_UID} + - action: insert + key: k8s.namespace.name + value: ${K8S_NAMESPACE} + resource/logs: + attributes: + - action: upsert + from_attribute: k8s.pod.annotations.splunk.com/sourcetype + key: com.splunk.sourcetype + - action: delete + key: k8s.pod.annotations.splunk.com/sourcetype + - action: delete + key: splunk.com/exclude + resourcedetection: + detectors: + - env + - system + override: true + timeout: 15s + receivers: + hostmetrics: + collection_interval: 10s + scrapers: + cpu: null + disk: null + filesystem: null + load: null + memory: null + network: null + paging: null + processes: null + jaeger: + protocols: + grpc: + endpoint: 0.0.0.0:14250 + thrift_http: + endpoint: 0.0.0.0:14268 + kubeletstats: + auth_type: serviceAccount + collection_interval: 10s + endpoint: ${K8S_NODE_IP}:10250 + extra_metadata_labels: + - container.id + metric_groups: + - container + - pod + - node + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + prometheus/agent: + config: + scrape_configs: + - job_name: otel-agent + scrape_interval: 10s + static_configs: + - targets: + - ${K8S_POD_IP}:8889 + receiver_creator: + receivers: + smartagent/coredns: + config: + extraDimensions: + metric_source: k8s-coredns + port: 9153 + type: coredns + rule: type == "pod" && labels["k8s-app"] == "kube-dns" + smartagent/kube-controller-manager: + config: + extraDimensions: + metric_source: kubernetes-controller-manager + port: 10257 + skipVerify: true + type: kube-controller-manager + useHTTPS: true + useServiceAccount: true + rule: type == "pod" && labels["k8s-app"] == "kube-controller-manager" + smartagent/kubernetes-apiserver: + config: + extraDimensions: + metric_source: kubernetes-apiserver + skipVerify: true + type: kubernetes-apiserver + useHTTPS: true + useServiceAccount: true + rule: type == "port" && port == 443 && pod.labels["k8s-app"] == "kube-apiserver" + smartagent/kubernetes-proxy: + config: + extraDimensions: + metric_source: kubernetes-proxy + port: 10249 + scrapeFailureLogLevel: debug + type: kubernetes-proxy + rule: type == "pod" && labels["k8s-app"] == "kube-proxy" + smartagent/kubernetes-scheduler: + config: + extraDimensions: + metric_source: kubernetes-scheduler + port: 10259 + skipVerify: true + type: kubernetes-scheduler + useHTTPS: true + useServiceAccount: true + rule: type == "pod" && labels["k8s-app"] == "kube-scheduler" + watch_observers: + - k8s_observer + signalfx: + endpoint: 0.0.0.0:9943 + smartagent/signalfx-forwarder: + listenAddress: 0.0.0.0:9080 + type: signalfx-forwarder + zipkin: + endpoint: 0.0.0.0:9411 + service: + extensions: + - health_check + - k8s_observer + - memory_ballast + - zpages + pipelines: + metrics: + exporters: + - signalfx + processors: + - memory_limiter + - batch + - resourcedetection + - resource + receivers: + - hostmetrics + - kubeletstats + - otlp + - receiver_creator + - signalfx + metrics/agent: + exporters: + - signalfx + processors: + - memory_limiter + - batch + - resource/add_agent_k8s + - resourcedetection + - resource + receivers: + - prometheus/agent + traces: + exporters: + - sapm + - signalfx + processors: + - memory_limiter + - k8sattributes + - batch + - resourcedetection + - resource + receivers: + - otlp + - jaeger + - smartagent/signalfx-forwarder + - zipkin + telemetry: + metrics: + address: 0.0.0.0:8889 + discovery.properties: | + splunk.discovery: + extensions: + docker_observer: + enabled: false + host_observer: + enabled: false + receivers: + redis: + config: + password: ${env:REDIS_PASSWORD} + username: ${env:REDIS_USERNAME} diff --git a/examples/discovery-mode/rendered_manifests/daemonset.yaml b/examples/discovery-mode/rendered_manifests/daemonset.yaml new file mode 100644 index 0000000000..b2fa3d4fd7 --- /dev/null +++ b/examples/discovery-mode/rendered_manifests/daemonset.yaml @@ -0,0 +1,222 @@ +--- +# Source: splunk-otel-collector/templates/daemonset.yaml +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: default-splunk-otel-collector-agent + labels: + app.kubernetes.io/name: splunk-otel-collector + helm.sh/chart: splunk-otel-collector-0.91.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: default + app.kubernetes.io/version: "0.91.1" + app: splunk-otel-collector + component: otel-collector-agent + chart: splunk-otel-collector-0.91.0 + release: default + heritage: Helm +spec: + updateStrategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 1 + selector: + matchLabels: + app: splunk-otel-collector + release: default + template: + metadata: + labels: + app: splunk-otel-collector + component: otel-collector-agent + release: default + annotations: + checksum/config: dd8559e2b4cc0ffc01163bc5996e3e7effb850dae257052b8dc15cc8690a57c8 + kubectl.kubernetes.io/default-container: otel-collector + spec: + hostNetwork: true + dnsPolicy: ClusterFirstWithHostNet + serviceAccountName: default-splunk-otel-collector + nodeSelector: + kubernetes.io/os: linux + tolerations: + + - effect: NoSchedule + key: node-role.kubernetes.io/master + - effect: NoSchedule + key: node-role.kubernetes.io/control-plane + containers: + - name: otel-collector + command: + - /otelcol + - --config=/conf/relay.yaml + - --discovery + ports: + - name: jaeger-grpc + containerPort: 14250 + hostPort: 14250 + protocol: TCP + - name: jaeger-thrift + containerPort: 14268 + hostPort: 14268 + protocol: TCP + - name: otlp + containerPort: 4317 + hostPort: 4317 + protocol: TCP + - name: otlp-http + containerPort: 4318 + protocol: TCP + - name: otlp-http-old + containerPort: 55681 + protocol: TCP + - name: sfx-forwarder + containerPort: 9080 + hostPort: 9080 + protocol: TCP + - name: signalfx + containerPort: 9943 + hostPort: 9943 + protocol: TCP + - name: zipkin + containerPort: 9411 + hostPort: 9411 + protocol: TCP + image: quay.io/signalfx/splunk-otel-collector:0.91.1 + imagePullPolicy: IfNotPresent + env: + - name: SPLUNK_MEMORY_TOTAL_MIB + value: "500" + - name: K8S_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: K8S_NODE_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.hostIP + - name: K8S_POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + - name: K8S_POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: K8S_POD_UID + valueFrom: + fieldRef: + fieldPath: metadata.uid + - name: K8S_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: SPLUNK_OBSERVABILITY_ACCESS_TOKEN + valueFrom: + secretKeyRef: + name: default-splunk-otel-collector + key: splunk_observability_access_token + # Env variables for host metrics receiver + - name: HOST_PROC + value: /hostfs/proc + - name: HOST_SYS + value: /hostfs/sys + - name: HOST_ETC + value: /hostfs/etc + - name: HOST_VAR + value: /hostfs/var + - name: HOST_RUN + value: /hostfs/run + - name: HOST_DEV + value: /hostfs/dev + # until https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/5879 + # is resolved fall back to previous gopsutil mountinfo path: + # https://github.com/shirou/gopsutil/issues/1271 + - name: HOST_PROC_MOUNTINFO + value: /proc/self/mountinfo + - name: REDIS_USERNAME + valueFrom: + secretKeyRef: + key: username + name: redis-secret + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + key: password + name: redis-secret + + readinessProbe: + httpGet: + path: / + port: 13133 + livenessProbe: + httpGet: + path: / + port: 13133 + resources: + limits: + cpu: 200m + memory: 500Mi + volumeMounts: + - mountPath: /conf + name: otel-configmap + - mountPath: /etc/otel/collector/config.d + name: otel-discovery-properties-configmap + - mountPath: /hostfs/dev + name: host-dev + readOnly: true + - mountPath: /hostfs/etc + name: host-etc + readOnly: true + - mountPath: /hostfs/proc + name: host-proc + readOnly: true + - mountPath: /hostfs/run/udev/data + name: host-run-udev-data + readOnly: true + - mountPath: /hostfs/sys + name: host-sys + readOnly: true + - mountPath: /hostfs/var/run/utmp + name: host-var-run-utmp + readOnly: true + - mountPath: /usr/lib/splunk-otel-collector/agent-bundle/run/collectd + name: run-collectd + readOnly: false + terminationGracePeriodSeconds: 600 + volumes: + - name: run-collectd + emptyDir: + sizeLimit: 25Mi + - name: host-dev + hostPath: + path: /dev + - name: host-etc + hostPath: + path: /etc + - name: host-proc + hostPath: + path: /proc + - name: host-run-udev-data + hostPath: + path: /run/udev/data + - name: host-sys + hostPath: + path: /sys + - name: host-var-run-utmp + hostPath: + path: /var/run/utmp + - name: otel-configmap + configMap: + name: default-splunk-otel-collector-otel-agent + items: + - key: relay + path: relay.yaml + - name: otel-discovery-properties-configmap + configMap: + name: default-splunk-otel-collector-otel-agent + items: + - key: discovery.properties + path: properties.discovery.yaml diff --git a/examples/discovery-mode/rendered_manifests/secret-splunk.yaml b/examples/discovery-mode/rendered_manifests/secret-splunk.yaml new file mode 100644 index 0000000000..922a7ff4d1 --- /dev/null +++ b/examples/discovery-mode/rendered_manifests/secret-splunk.yaml @@ -0,0 +1,19 @@ +--- +# Source: splunk-otel-collector/templates/secret-splunk.yaml +apiVersion: v1 +kind: Secret +metadata: + name: default-splunk-otel-collector + labels: + app.kubernetes.io/name: splunk-otel-collector + helm.sh/chart: splunk-otel-collector-0.91.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: default + app.kubernetes.io/version: "0.91.1" + app: splunk-otel-collector + chart: splunk-otel-collector-0.91.0 + release: default + heritage: Helm +type: Opaque +data: + splunk_observability_access_token: Q0hBTkdFTUU= diff --git a/examples/discovery-mode/rendered_manifests/serviceAccount.yaml b/examples/discovery-mode/rendered_manifests/serviceAccount.yaml new file mode 100644 index 0000000000..1439e2b75e --- /dev/null +++ b/examples/discovery-mode/rendered_manifests/serviceAccount.yaml @@ -0,0 +1,16 @@ +--- +# Source: splunk-otel-collector/templates/serviceAccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: default-splunk-otel-collector + labels: + app.kubernetes.io/name: splunk-otel-collector + helm.sh/chart: splunk-otel-collector-0.91.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: default + app.kubernetes.io/version: "0.91.1" + app: splunk-otel-collector + chart: splunk-otel-collector-0.91.0 + release: default + heritage: Helm diff --git a/helm-charts/splunk-otel-collector/templates/config/_otel-agent.tpl b/helm-charts/splunk-otel-collector/templates/config/_otel-agent.tpl index 6a842f9102..3099bc08f4 100644 --- a/helm-charts/splunk-otel-collector/templates/config/_otel-agent.tpl +++ b/helm-charts/splunk-otel-collector/templates/config/_otel-agent.tpl @@ -862,3 +862,15 @@ service: {{- end }} {{- end }} {{- end }} +{{/* +Discovery properties for the otel-collector agent +The values can be overridden in .Values.agent.discovery.properties. +*/}} +{{- define "splunk-otel-collector.agentDiscoveryProperties" -}} +extensions: + docker_observer: + enabled: false + host_observer: + enabled: false +receivers: {} +{{- end }} diff --git a/helm-charts/splunk-otel-collector/templates/configmap-agent.yaml b/helm-charts/splunk-otel-collector/templates/configmap-agent.yaml index 56de122fd3..1727437aca 100644 --- a/helm-charts/splunk-otel-collector/templates/configmap-agent.yaml +++ b/helm-charts/splunk-otel-collector/templates/configmap-agent.yaml @@ -17,4 +17,10 @@ data: relay: | {{- $config := include "splunk-otel-collector.agentConfig" . | fromYaml }} {{- $agent.config | mustMergeOverwrite $config | toYaml | nindent 4 }} +{{- if .Values.agent.discovery.enabled }} + discovery.properties: | + splunk.discovery: + {{- $properties := include "splunk-otel-collector.agentDiscoveryProperties" . | fromYaml }} + {{- $agent.discovery.properties | mustMergeOverwrite $properties | toYaml | nindent 6 }} +{{- end }} {{- end }} diff --git a/helm-charts/splunk-otel-collector/templates/daemonset.yaml b/helm-charts/splunk-otel-collector/templates/daemonset.yaml index 9da8dfdc2e..963731f2f8 100644 --- a/helm-charts/splunk-otel-collector/templates/daemonset.yaml +++ b/helm-charts/splunk-otel-collector/templates/daemonset.yaml @@ -254,6 +254,9 @@ spec: {{- if .Values.agent.featureGates }} - --feature-gates={{ .Values.agent.featureGates }} {{- end }} + {{- if and .Values.agent.discovery.enabled (not .Values.isWindows) }} + - --discovery + {{- end }} ports: {{- range $key, $port := $agent.ports }} {{- if eq true (and (eq (include "splunk-otel-collector.metricsEnabled" $) "true") (has "metrics" $port.enabled_for)) (and (eq (include "splunk-otel-collector.tracesEnabled" $) "true") (has "traces" $port.enabled_for)) (and (eq (include "splunk-otel-collector.logsEnabled" $) "true") (has "logs" $port.enabled_for)) (and (eq (include "splunk-otel-collector.profilingEnabled" $) "true") (has "profiling" $port.enabled_for)) }} @@ -355,6 +358,10 @@ spec: volumeMounts: - mountPath: {{ .Values.isWindows | ternary "C:\\conf" "/conf" }} name: otel-configmap + {{- if and .Values.agent.discovery.enabled (not .Values.isWindows) }} + - mountPath: /etc/otel/collector/config.d + name: otel-discovery-properties-configmap + {{- end }} {{- if eq (include "splunk-otel-collector.metricsEnabled" $) "true" }} {{- if .Values.isWindows }} - mountPath: "C:\\hostfs" @@ -537,6 +544,14 @@ spec: items: - key: relay path: relay.yaml + {{- if and .Values.agent.discovery.enabled (not .Values.isWindows) }} + - name: otel-discovery-properties-configmap + configMap: + name: {{ template "splunk-otel-collector.fullname" . }}-otel-agent + items: + - key: discovery.properties + path: properties.discovery.yaml + {{- end }} {{- if $agent.extraVolumes }} {{- toYaml $agent.extraVolumes | nindent 6 }} {{- end }} diff --git a/helm-charts/splunk-otel-collector/values.schema.json b/helm-charts/splunk-otel-collector/values.schema.json index f19d0aef3e..eaf1a6cc06 100644 --- a/helm-charts/splunk-otel-collector/values.schema.json +++ b/helm-charts/splunk-otel-collector/values.schema.json @@ -595,6 +595,29 @@ "annotations": { "type": "object" }, + "discovery": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + }, + "properties": { + "type": "object", + "additionalProperties": false, + "properties": { + "extensions": { + "type": "object", + "additionalProperties": true + }, + "receivers": { + "type": "object", + "additionalProperties": true + } + } + } + } + }, "podAnnotations": { "type": "object" }, diff --git a/helm-charts/splunk-otel-collector/values.yaml b/helm-charts/splunk-otel-collector/values.yaml index 6524a7b024..31c50b0e57 100644 --- a/helm-charts/splunk-otel-collector/values.yaml +++ b/helm-charts/splunk-otel-collector/values.yaml @@ -424,6 +424,15 @@ agent: # existing fields can be disabled by setting them to null value. config: {} + # Discovery mode attempts to automatically configure the agent with bundled metric receiver configuration. + # For more details, refer to: https://github.com/signalfx/splunk-otel-collector-chart/blob/main/docs/advanced-configuration.md#discovery-mode + + discovery: + enabled: false + properties: + extensions: {} + receivers: {} + ################################################################################ # OpenTelemetry Kubernetes cluster receiver # This is an extra 1-replica deployment of Open-temlemetry collector used