--- MTPE: windsonsea Date: 2024-10-16 --- # Enhance Applications Non-Intrusively with Operators Currently, only Java, Node.js, Python, .NET, and Golang support non-intrusive integration through the Operator approach. ## Prerequisites Please ensure that the insight-agent is ready. If not, please refer to [Install insight-agent for data collection](../install/install-agent.md) and make sure the following three items are ready: - Enable trace functionality for insight-agent - Check if the address and port for trace data are correctly filled - Ensure that the Pods corresponding to deployment/insight-agent-opentelemetry-operator and deployment/insight-agent-opentelemetry-collector are ready ## Install Instrumentation CR !!! tip Starting from Insight v0.22.0, there is no longer a need to manually install the Instrumentation CR. Install it in the insight-system namespace. There are some minor differences between different versions. === "Insight v0.21.x" ```bash K8S_CLUSTER_UID=$(kubectl get namespace kube-system -o jsonpath='{.metadata.uid}') kubectl apply -f - < language specific env vars -> common env vars -> instrument spec configs' vars ``` However, it is important to avoid manually overriding __OTEL_RESOURCE_ATTRIBUTES_NODE_NAME__ . This variable serves as an identifier within the operator to determine if a pod has already been injected with a probe. Manually adding this variable may prevent the probe from being injected successfully. ## Automatic injection Demo Note that the `annotation` is added under spec.annotations. ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-app labels: app: my-app spec: selector: matchLabels: app: my-app replicas: 1 template: metadata: labels: app: my-app annotations: instrumentation.opentelemetry.io/inject-java: "insight-system/insight-opentelemetry-autoinstrumentation" spec: containers: - name: myapp image: ghcr.io/pavolloffay/spring-petclinic:latest ports: - containerPort: 8080 protocol: TCP ``` The final generated YAML is as follows: ```diff apiVersion: v1 kind: Pod metadata: name: my-deployment-with-sidecar-565bd877dd-nqkk6 generateName: my-deployment-with-sidecar-565bd877dd- namespace: default uid: aa89ca0d-620c-4d20-8bc1-37d67bad4ea4 resourceVersion: '2668986' creationTimestamp: '2022-04-08T05:58:48Z' labels: app: my-app annotations: instrumentation.opentelemetry.io/inject-java: "insight-system/insight-opentelemetry-autoinstrumentation" spec: volumes: - name: kube-api-access-sp2mz projected: sources: - serviceAccountToken: expirationSeconds: 3607 path: token - configMap: name: kube-root-ca.crt items: - key: ca.crt path: ca.crt - downwardAPI: items: - path: namespace fieldRef: apiVersion: v1 fieldPath: metadata.namespace defaultMode: 420 + - name: opentelemetry-auto-instrumentation-java + emptyDir: + sizeLimit: 200Mi + initContainers: + - name: opentelemetry-auto-instrumentation-java + image: ghcr.m.daocloud.io/openinsight-proj/autoinstrumentation-java:1.45.0-eb49d21116a1d8fbf0d9080adddad3a367e68a5e + imagePullPolicy: IfNotPresent + command: + - cp + - /javaagent.jar + - /otel-auto-instrumentation-java/javaagent.jar + resources: + limits: + cpu: 500m + memory: 64Mi + requests: + cpu: 50m + memory: 64Mi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - name: opentelemetry-auto-instrumentation-java + mountPath: /otel-auto-instrumentation-java + - name: kube-api-access-sp2mz + readOnly: true + mountPath: /var/run/secrets/kubernetes.io/serviceaccount containers: - name: myapp image: ghcr.io/pavolloffay/spring-petclinic:latest imagePullPolicy: Always ports: - containerPort: 8080 protocol: TCP + env: + - name: OTEL_JAVAAGENT_DEBUG + value: "false" + - name: OTEL_INSTRUMENTATION_JDBC_ENABLED + value: "true" + - name: SPLUNK_PROFILER_ENABLED + value: "false" + - name: JAVA_TOOL_OPTIONS + value: ' -javaagent:/otel-auto-instrumentation-java/javaagent.jar' + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://insight-agent-opentelemetry-collector.insight-system.svc.cluster.local:4317 + - name: OTEL_NODE_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.hostIP + - name: OTEL_POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + - name: OTEL_K8S_CLUSTER_UID + value: 416d133f-d00a-43e1-b859-f1839a5a93ee + - name: OTEL_EXPORTER_OTLP_PROTOCOL + value: grpc + - name: OTEL_K8S_NAMESPACE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.namespace + - name: OTEL_LOGS_EXPORTER + value: none + - name: OTEL_METRICS_EXPORTER + value: prometheus + - name: OTEL_EXPORTER_PROMETHEUS_PORT + value: "9464" + - name: OTEL_SERVICE_NAME + value: my-app + - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: OTEL_PROPAGATORS + value: tracecontext,baggage,b3,b3multi,jaeger,xray,ottrace + - name: OTEL_TRACES_SAMPLER + value: always_on + - 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_RESOURCE_ATTRIBUTES + value: k8s.container.name=myapp,k8s.deployment.name=my-app,k8s.deployment.uid=25ce570c-8401-4f07-b8a9-dd64fcf3a1d1,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=my-app-54fc75999c,k8s.replicaset.uid=56358d62-1321-4a62-b2e9-34132988efa0,service.instance.id=default.$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME).myapp,service.version=latest resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - name: kube-api-access-sp2mz readOnly: true mountPath: /var/run/secrets/kubernetes.io/serviceaccount + - name: opentelemetry-auto-instrumentation-java + mountPath: /otel-auto-instrumentation-java ``` 🔔 Automatically injected YAML may not be entirely consistent across different versions." ## Trace query How to query the connected services, refer to [Trace Query](../../user-guide/trace/trace.md).