# 使用 OTel 自动探针增强 Go 应用程序(实验性功能) 如果不想手动更改应用代码,您可以尝试使用本文基于 eBPF 的自动增强方式。 该功能目前还处于捐献到 OpenTelemetry 社区的评审阶段,还不支持 Operator 通过注解方式注入(未来会支持),因此需要手动更改 Deployment YAML 或采用 patch 的方式。 ## 前提条件 请确保 Insight Agent 已经就绪。如若没有,请参阅[安装 insight-agent 采集数据](../install/install-agent.md),并确保以下三项就绪: - 为 Insight-agent 开启 trace 功能 - trace 数据的地址以及端口是否填写正确 - deployment/opentelemetry-operator-controller-manager 和 deployment/insight-agent-opentelemetry-collector 对应的 Pod 已经准备就绪 ## 安装 Instrumentation CR 在 Insight-system namespace 下安装,如已安装可跳过此步骤。 注意:该 CR 目前只支持注入对接 Insight 所需要的环境变量(包括服务名、链路上报地址等等),未来会支持注入 Golang 探针。 ```bash kubectl apply -f - <- http://insight-agent-opentelemetry-collector.insight-system.svc.cluster.local:4317 - name: OTEL_EXPORTER_OTLP_TIMEOUT value: '200' - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED value: 'true' - name: OTEL_SERVICE_NAME value: voting - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name - name: OTEL_RESOURCE_ATTRIBUTES_POD_UID valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.uid - name: OTEL_RESOURCE_ATTRIBUTES_NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName - name: OTEL_PROPAGATORS value: jaeger,b3 - name: OTEL_TRACES_SAMPLER value: always_on - name: OTEL_RESOURCE_ATTRIBUTES value: >- k8s.container.name=voting-svc,k8s.deployment.name=voting,k8s.deployment.uid=79e015e2-4643-44c0-993c-e486aebaba10,k8s.namespace.name=default,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),k8s.pod.uid=$(OTEL_RESOURCE_ATTRIBUTES_POD_UID),k8s.replicaset.name=voting-84b696c897,k8s.replicaset.uid=63f56167-6632-415d-8b01-43a3db9891ff resources: requests: cpu: 100m volumeMounts: - name: launcherdir mountPath: /odigos-launcher - name: kube-api-access-gwj5v readOnly: true mountPath: /var/run/secrets/kubernetes.io/serviceaccount terminationMessagePath: /dev/termination-log terminationMessagePolicy: File imagePullPolicy: IfNotPresent - name: emojivoto-voting-instrumentation image: keyval/otel-go-agent:v0.6.0 env: - name: OTEL_TARGET_EXE value: /usr/local/bin/emojivoto-voting-svc - name: OTEL_EXPORTER_OTLP_ENDPOINT value: jaeger:4317 - name: OTEL_SERVICE_NAME value: emojivoto-voting resources: {} volumeMounts: - name: kernel-debug mountPath: /sys/kernel/debug - name: kube-api-access-gwj5v readOnly: true mountPath: /var/run/secrets/kubernetes.io/serviceaccount terminationMessagePath: /dev/termination-log terminationMessagePolicy: File imagePullPolicy: IfNotPresent securityContext: capabilities: add: - SYS_PTRACE privileged: true runAsUser: 0 ······ ``` ## 更多参考 - [Go OpenTelemetry Automatic Instrumentation 入门](https://github.com/keyval-dev/opentelemetry-go-instrumentation/blob/master/docs/getting-started/README.md) - [Donating ebpf based instrumentation](https://github.com/open-telemetry/opentelemetry-go-instrumentation/pull/4)