Kubernetes Operator 数据采集
安装 cert-manager
OpenTelemetry Operator 需要先安装证书管理器
[root@master tpls]# kubectl apply -f cert-manager.yaml
namespace/cert-manager created
customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io created
serviceaccount/cert-manager-cainjector created
serviceaccount/cert-manager created
serviceaccount/cert-manager-webhook created
clusterrole.rbac.authorization.k8s.io/cert-manager-cainjector created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-issuers created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-clusterissuers created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-certificates created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-orders created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-challenges created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-ingress-shim created
clusterrole.rbac.authorization.k8s.io/cert-manager-cluster-view created
clusterrole.rbac.authorization.k8s.io/cert-manager-view created
clusterrole.rbac.authorization.k8s.io/cert-manager-edit created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-approve:cert-manager-io created
clusterrole.rbac.authorization.k8s.io/cert-manager-controller-certificatesigningrequests created
clusterrole.rbac.authorization.k8s.io/cert-manager-webhook:subjectaccessreviews created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-cainjector created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-issuers created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-clusterissuers created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-certificates created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-orders created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-challenges created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-ingress-shim created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-approve:cert-manager-io created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-controller-certificatesigningrequests created
clusterrolebinding.rbac.authorization.k8s.io/cert-manager-webhook:subjectaccessreviews created
role.rbac.authorization.k8s.io/cert-manager-cainjector:leaderelection created
role.rbac.authorization.k8s.io/cert-manager:leaderelection created
role.rbac.authorization.k8s.io/cert-manager-tokenrequest created
role.rbac.authorization.k8s.io/cert-manager-webhook:dynamic-serving created
rolebinding.rbac.authorization.k8s.io/cert-manager-cainjector:leaderelection created
rolebinding.rbac.authorization.k8s.io/cert-manager:leaderelection created
rolebinding.rbac.authorization.k8s.io/cert-manager-cert-manager-tokenrequest created
rolebinding.rbac.authorization.k8s.io/cert-manager-webhook:dynamic-serving created
service/cert-manager-cainjector created
service/cert-manager created
service/cert-manager-webhook created
deployment.apps/cert-manager-cainjector created
deployment.apps/cert-manager created
deployment.apps/cert-manager-webhook created
mutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
validatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
等待证书证书管理器安装完成
[root@master tpls]# kubectl wait --for=condition=Ready pods -n cert-manager -l app.kubernetes.io/instance=cert-manager
#有如下输出表示安装完成
pod/cert-manager-57d855897b-b2czv condition met
pod/cert-manager-cainjector-5c7f79b84b-5pshp condition met
pod/cert-manager-webhook-657b9f664c-vvvs5 condition met
[root@master tpls]# kubectl get pods -n cert-manager
#确认证书管理器正确安装
NAME READY STATUS RESTARTS AGE
cert-manager-57d855897b-b2czv 1/1 Running 0 9m8s
cert-manager-cainjector-5c7f79b84b-5pshp 1/1 Running 0 9m8s
cert-manager-webhook-657b9f664c-vvvs5 1/1 Running 0 9m8s
安装 opentelemetry-operator
[root@master tpls]# kubectl apply -f opentelemetry-operator.yaml
namespace/opentelemetry-operator-system created
customresourcedefinition.apiextensions.k8s.io/instrumentations.opentelemetry.io created
customresourcedefinition.apiextensions.k8s.io/opampbridges.opentelemetry.io created
customresourcedefinition.apiextensions.k8s.io/opentelemetrycollectors.opentelemetry.io created
serviceaccount/opentelemetry-operator-controller-manager created
role.rbac.authorization.k8s.io/opentelemetry-operator-leader-election-role created
clusterrole.rbac.authorization.k8s.io/opentelemetry-operator-manager-role created
clusterrole.rbac.authorization.k8s.io/opentelemetry-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/opentelemetry-operator-proxy-role created
rolebinding.rbac.authorization.k8s.io/opentelemetry-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/opentelemetry-operator-manager-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/opentelemetry-operator-proxy-rolebinding created
service/opentelemetry-operator-controller-manager-metrics-service created
service/opentelemetry-operator-webhook-service created
deployment.apps/opentelemetry-operator-controller-manager created
certificate.cert-manager.io/opentelemetry-operator-serving-cert created
issuer.cert-manager.io/opentelemetry-operator-selfsigned-issuer created
mutatingwebhookconfiguration.admissionregistration.k8s.io/opentelemetry-operator-mutating-webhook-configuration created
validatingwebhookconfiguration.admissionregistration.k8s.io/opentelemetry-operator-validating-webhook-configuration created
[root@master tpls]# kubectl get pods -n opentelemetry-operator-system
#确认opentelemetry-operator安装完成
NAME READY STATUS RESTARTS AGE
opentelemetry-operator-controller-manager-58c68ff5c6-plkzn 2/2 Running 0 21s
[root@master tpls]# kubectl logs opentelemetry-operator-controller-manager-58c68ff5c6-plkzn -n opentelemetry-operator-system
#确认opentelemetry-operator正确安装【通过日志查看无ERROR级别日志】
Defaulted container "manager" out of: manager, kube-rbac-proxy
{"level":"INFO","timestamp":"2024-12-17T06:15:13.084660532Z","message":"Starting the OpenTelemetry Operator","opentelemetry-operator":"0.114.1","opentelemetry-collector":"ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector:0.114.0","opentelemetry-targetallocator":"ghcr.io/open-telemetry/opentelemetry-operator/target-allocator:0.114.1","operator-opamp-bridge":"ghcr.io/open-telemetry/opentelemetry-operator/operator-opamp-bridge:0.114.1","auto-instrumentation-java":"ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:1.33.5","auto-instrumentation-nodejs":"ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-nodejs:0.53.0","auto-instrumentation-python":"ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-python:0.48b0","auto-instrumentation-dotnet":"ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-dotnet:1.2.0","auto-instrumentation-go":"ghcr.io/open-telemetry/opentelemetry-go-instrumentation/autoinstrumentation-go:v0.17.0-alpha","auto-instrumentation-apache-httpd":"ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-apache-httpd:1.0.4","auto-instrumentation-nginx":"ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-apache-httpd:1.0.4","feature-gates":"operator.collector.default.config,-operator.collector.targetallocatorcr,-operator.golang.flags,operator.observability.prometheus,-operator.sidecarcontainers.native,-operator.targetallocator.fallbackstrategy,-operator.targetallocator.mtls","build-date":"2024-12-05T14:36:38Z","go-version":"go1.22.9","go-arch":"amd64","go-os":"linux","labels-filter":[],"annotations-filter":[],"enable-multi-instrumentation":true,"enable-apache-httpd-instrumentation":true,"enable-dotnet-instrumentation":true,"enable-go-instrumentation":false,"enable-python-instrumentation":true,"enable-nginx-instrumentation":true,"enable-nodejs-instrumentation":true,"enable-java-instrumentation":true,"create-openshift-dashboard":false,"zap-message-key":"message","zap-level-key":"level","zap-time-key":"timestamp","zap-level-format":"uppercase"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.085761306Z","logger":"setup","message":"the env var WATCH_NAMESPACE isn't set, watching all namespaces"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.291129199Z","logger":"setup","message":"Prometheus CRDs are not installed, skipping adding to scheme."}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.291223365Z","logger":"setup","message":"Openshift CRDs are not installed, skipping adding to scheme."}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.291239316Z","logger":"setup","message":"Cert-Manager is not available to the operator, skipping adding to scheme."}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.292364665Z","logger":"controller-runtime.builder","message":"Registering a mutating webhook","GVK":"opentelemetry.io/v1beta1, Kind=OpenTelemetryCollector","path":"/mutate-opentelemetry-io-v1beta1-opentelemetrycollector"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.293091003Z","logger":"controller-runtime.webhook","message":"Registering webhook","path":"/mutate-opentelemetry-io-v1beta1-opentelemetrycollector"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.293280876Z","logger":"controller-runtime.builder","message":"Registering a validating webhook","GVK":"opentelemetry.io/v1beta1, Kind=OpenTelemetryCollector","path":"/validate-opentelemetry-io-v1beta1-opentelemetrycollector"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.293506657Z","logger":"controller-runtime.webhook","message":"Registering webhook","path":"/validate-opentelemetry-io-v1beta1-opentelemetrycollector"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.294022343Z","logger":"controller-runtime.webhook","message":"Registering webhook","path":"/convert"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.294060324Z","logger":"controller-runtime.builder","message":"Conversion webhook enabled","GVK":"opentelemetry.io/v1beta1, Kind=OpenTelemetryCollector"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.294156082Z","logger":"controller-runtime.builder","message":"Registering a mutating webhook","GVK":"opentelemetry.io/v1alpha1, Kind=Instrumentation","path":"/mutate-opentelemetry-io-v1alpha1-instrumentation"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.294287297Z","logger":"controller-runtime.webhook","message":"Registering webhook","path":"/mutate-opentelemetry-io-v1alpha1-instrumentation"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.294369558Z","logger":"controller-runtime.builder","message":"Registering a validating webhook","GVK":"opentelemetry.io/v1alpha1, Kind=Instrumentation","path":"/validate-opentelemetry-io-v1alpha1-instrumentation"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.294491744Z","logger":"controller-runtime.webhook","message":"Registering webhook","path":"/validate-opentelemetry-io-v1alpha1-instrumentation"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.294748464Z","logger":"controller-runtime.webhook","message":"Registering webhook","path":"/mutate-v1-pod"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.294839746Z","logger":"controller-runtime.builder","message":"Registering a mutating webhook","GVK":"opentelemetry.io/v1alpha1, Kind=OpAMPBridge","path":"/mutate-opentelemetry-io-v1alpha1-opampbridge"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.295040562Z","logger":"controller-runtime.webhook","message":"Registering webhook","path":"/mutate-opentelemetry-io-v1alpha1-opampbridge"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.295402574Z","logger":"controller-runtime.builder","message":"Registering a validating webhook","GVK":"opentelemetry.io/v1alpha1, Kind=OpAMPBridge","path":"/validate-opentelemetry-io-v1alpha1-opampbridge"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.295563447Z","logger":"controller-runtime.webhook","message":"Registering webhook","path":"/validate-opentelemetry-io-v1alpha1-opampbridge"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.2956694Z","logger":"setup","message":"starting manager"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.295963356Z","logger":"controller-runtime.metrics","message":"Starting metrics server"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.296114435Z","logger":"controller-runtime.webhook","message":"Starting webhook server"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.296298087Z","logger":"controller-runtime.metrics","message":"Serving metrics server","bindAddress":"127.0.0.1:8080","secure":false}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.296046786Z","message":"starting server","name":"health probe","addr":"[::]:8081"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.296885436Z","logger":"controller-runtime.certwatcher","message":"Updated current TLS certificate"}
I1217 06:15:13.296963 1 leaderelection.go:254] attempting to acquire leader lease opentelemetry-operator-system/9f7554c3.opentelemetry.io...
{"level":"INFO","timestamp":"2024-12-17T06:15:13.297181963Z","logger":"controller-runtime.webhook","message":"Serving webhook server","host":"","port":9443}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.297655721Z","logger":"controller-runtime.certwatcher","message":"Starting certificate watcher"}
I1217 06:15:13.706142 1 leaderelection.go:268] successfully acquired lease opentelemetry-operator-system/9f7554c3.opentelemetry.io
{"level":"INFO","timestamp":"2024-12-17T06:15:13.706767102Z","logger":"collector-upgrade","message":"looking for managed instances to upgrade"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.706950261Z","logger":"instrumentation-upgrade","message":"looking for managed Instrumentation instances to upgrade"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.707645102Z","message":"Starting EventSource","controller":"opampbridge","controllerGroup":"opentelemetry.io","controllerKind":"OpAMPBridge","source":"kind source: *v1alpha1.OpAMPBridge"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.707760238Z","message":"Starting EventSource","controller":"opampbridge","controllerGroup":"opentelemetry.io","controllerKind":"OpAMPBridge","source":"kind source: *v1.ConfigMap"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.707781113Z","message":"Starting EventSource","controller":"opampbridge","controllerGroup":"opentelemetry.io","controllerKind":"OpAMPBridge","source":"kind source: *v1.ServiceAccount"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.707798046Z","message":"Starting EventSource","controller":"opampbridge","controllerGroup":"opentelemetry.io","controllerKind":"OpAMPBridge","source":"kind source: *v1.Service"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.707812065Z","message":"Starting EventSource","controller":"opampbridge","controllerGroup":"opentelemetry.io","controllerKind":"OpAMPBridge","source":"kind source: *v1.Deployment"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.707823304Z","message":"Starting Controller","controller":"opampbridge","controllerGroup":"opentelemetry.io","controllerKind":"OpAMPBridge"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.708510704Z","message":"Starting EventSource","controller":"opentelemetrycollector","controllerGroup":"opentelemetry.io","controllerKind":"OpenTelemetryCollector","source":"kind source: *v1beta1.OpenTelemetryCollector"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.708638225Z","message":"Starting EventSource","controller":"opentelemetrycollector","controllerGroup":"opentelemetry.io","controllerKind":"OpenTelemetryCollector","source":"kind source: *v1.ConfigMap"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.708685139Z","message":"Starting EventSource","controller":"opentelemetrycollector","controllerGroup":"opentelemetry.io","controllerKind":"OpenTelemetryCollector","source":"kind source: *v1.ServiceAccount"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.708709076Z","message":"Starting EventSource","controller":"opentelemetrycollector","controllerGroup":"opentelemetry.io","controllerKind":"OpenTelemetryCollector","source":"kind source: *v1.Service"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.708744207Z","message":"Starting EventSource","controller":"opentelemetrycollector","controllerGroup":"opentelemetry.io","controllerKind":"OpenTelemetryCollector","source":"kind source: *v1.Deployment"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.708771699Z","message":"Starting EventSource","controller":"opentelemetrycollector","controllerGroup":"opentelemetry.io","controllerKind":"OpenTelemetryCollector","source":"kind source: *v1.DaemonSet"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.708811888Z","message":"Starting EventSource","controller":"opentelemetrycollector","controllerGroup":"opentelemetry.io","controllerKind":"OpenTelemetryCollector","source":"kind source: *v1.StatefulSet"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.708827911Z","message":"Starting EventSource","controller":"opentelemetrycollector","controllerGroup":"opentelemetry.io","controllerKind":"OpenTelemetryCollector","source":"kind source: *v1.Ingress"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.708850083Z","message":"Starting EventSource","controller":"opentelemetrycollector","controllerGroup":"opentelemetry.io","controllerKind":"OpenTelemetryCollector","source":"kind source: *v2.HorizontalPodAutoscaler"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.708922276Z","message":"Starting EventSource","controller":"opentelemetrycollector","controllerGroup":"opentelemetry.io","controllerKind":"OpenTelemetryCollector","source":"kind source: *v1.PodDisruptionBudget"}
{"level":"INFO","timestamp":"2024-12-17T06:15:13.708953283Z","message":"Starting Controller","controller":"opentelemetrycollector","controllerGroup":"opentelemetry.io","controllerKind":"OpenTelemetryCollector"}
{"level":"INFO","timestamp":"2024-12-17T06:15:14.218120231Z","logger":"collector-upgrade","message":"no instances to upgrade"}
{"level":"INFO","timestamp":"2024-12-17T06:15:14.251332517Z","message":"Starting workers","controller":"opentelemetrycollector","controllerGroup":"opentelemetry.io","controllerKind":"OpenTelemetryCollector","worker count":1}
{"level":"INFO","timestamp":"2024-12-17T06:15:14.254833405Z","logger":"instrumentation-upgrade","message":"no instances to upgrade"}
{"level":"INFO","timestamp":"2024-12-17T06:15:14.255402031Z","message":"Starting workers","controller":"opampbridge","controllerGroup":"opentelemetry.io","controllerKind":"OpAMPBridge","worker count":1}
[root@master tpls]#
Automatic Instrumentation 基础模板
参考如下模板,可以添加不同语言的自动注入的配置。
automatic-instrumentation.yaml
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: automatic-instrumentation
namespace: default
spec:
exporter:
endpoint: http://light-agent.light-agent.svc.cluster.local:54318 #仅对.net 语言生效
- tracecontext
- baggage
- b3
sampler:
type: parentbased_traceidratio
argument: "1"
#不同语言类 型的自动注入的配置
tip
下面 分别以 Java、Go 为例进行说明
Java
1. 添加 Java 的 Automatic Instrumentation
kubectl apply -f automatic-instrumentation-java.yaml
automatic-instrumentation-java.yaml
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: auto-instr
namespace: default
spec:
propagators:
- tracecontext
- baggage
- b3
sampler:
type: parentbased_traceidratio
argument: "1"
java:
image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:1.33.5
env:
- name: OTEL_INSTRUMENTATION_KAFKA_ENABLED
value: "false"
- name: OTEL_INSTRUMENTATION_REDISCALA_ENABLED
value: "false"
- name: OTEL_BSP_MAX_EXPORT_BATCH_SIZE
value: "512"
- name: OTEL_EXPORTER_OTLP_COMPRESSION
value: "gzip"
- name: OTEL_BSP_SCHEDULE_DELAY
value: "5000"
- name: OTEL_EXPORTER_OTLP_PROTOCOL
value: "http/protobuf"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://light-agent.light-agent.svc.cluster.local:54318"
操作过程
[root@master tpls]# kubectl apply -f automatic-instrumentation-java.yaml
instrumentation.opentelemetry.io/auto-instr created
[root@master tpls]# kubectl get instrumentation
NAME AGE ENDPOINT SAMPLER SAMPLER ARG
auto-instr 22s http://light-agent.monitoring.svc.cluster.local:54318 parentbased_traceidratio 1
[root@master tpls]#
2. 启动 Java Demo
kubect apply -f java-demo.yaml
java-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: java-app
namespace: default
labels:
app: java-app
annotations:
instrumentation.opentelemetry.io/inject-java: "true" # 添加这个注解
spec:
containers:
- image: docker.elastic.co/demos/apm/k8s-webhook-test
imagePullPolicy: Always
name: java-app
env:
# 这是 java agent 的配置,trace 到指定的具体类和函数
- name: OTEL_INSTRUMENTATION_METHODS_INCLUDE
value: "test.Testing[methodB]"
操作过程
[root@master tpls]# kubectl apply -f java-demo.yaml
pod/java-app created
[root@master tpls]# kubectl get pod
NAME READY STATUS RESTARTS AGE
java-app 1/1 Running 0 37s
3. 观察自动注入的效果
进入 java-app
的容器,查看环境变量,是否包含 -javaagent
、OTEL_EXPORTER_OTLP_ENDPOINT...
[root@master deployment]# kubectl exec -it java-app sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Defaulted container "java-app" out of: java-app, opentelemetry-auto-instrumentation-java (init)
# printenv
OTEL_BSP_SCHEDULE_DELAY=5000
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.43.0.1:443
LANGUAGE=en_US:en
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
JAVA_TOOL_OPTIONS= -javaagent:/otel-auto-instrumentation-java/javaagent.jar
HOSTNAME=java-app
OTEL_SERVICE_NAME=java-app
HOME=/root
OTEL_INSTRUMENTATION_KAFKA_ENABLED=false
JAVA_VERSION=jdk-17.0.9+9
OTEL_TRACES_SAMPLER=parentbased_traceidratio
OTEL_TRACES_SAMPLER_ARG=1
TERM=xterm
KUBERNETES_PORT_443_TCP_ADDR=10.43.0.1
PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
OTEL_INSTRUMENTATION_METHODS_INCLUDE=test.Testing[methodB]
OTEL_PROPAGATORS=tracecontext,baggage
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
LANG=en_US.UTF-8
OTEL_NODE_IP=192.168.2.159
OTEL_EXPORTER_OTLP_ENDPOINT=http://light-agent.light-agent.svc.cluster.local:54318
OTEL_RESOURCE_ATTRIBUTES_NODE_NAME=node2
OTEL_BSP_MAX_EXPORT_BATCH_SIZE=512
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.43.0.1:443
OTEL_EXPORTER_OTLP_COMPRESSION=gzip
JAVA_HOME=/opt/java/openjdk
LC_ALL=en_US.UTF-8
OTEL_RESOURCE_ATTRIBUTES=k8s.container.name=java-app,k8s.namespace.name=default,k8s.node.name=node2,k8s.pod.name=java-app,service.instance.id=default.java-app.java-app
KUBERNETES_SERVICE_HOST=10.43.0.1
PWD=/
OTEL_INSTRUMENTATION_REDISCALA_ENABLED=false
OTEL_POD_IP=10.42.2.157
OTEL_RESOURCE_ATTRIBUTES_POD_NAME=java-app
Go
1. 启用 opentelemetry-operator 的 Go 的自动注入
kubectl patch deployment -n opentelemetry-operator-system opentelemetry-operator-controller-manager --patch-file operator-patch.yaml
operator-patch-go.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: opentelemetry-operator-controller-manager
namespace: opentelemetry-operator-system
spec:
template:
spec:
containers:
- name: manager
args:
- --enable-go-instrumentation=true
#确认opentelemetry-operator-controller-manager 的容器参数中包含 --enable-go-instrumentation=tru [待补充]
kubectl get pods -n opentelemetry-operator-system -o jsonpath='{range .items[?(@.metadata.name=="opentelemetry-operator-controller-manager-58c68ff5c6-plkzn")]}{.spec.containers[?(@.name=="manager")}{.args}{end}'
2. 添加 Go 的 Automatic Instrumentation
kubectl apply -f automatic-instrumentation-go.yaml
automatic-instrumentation-go.yaml
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: auto-instr
namespace: default
spec:
exporter:
endpoint: http://light-agent.light-agent.svc.cluster.local:54318 #仅对.net 语言生效
propagators:
- tracecontext
- baggage
- b3
sampler:
type: parentbased_traceidratio
argument: "1"
go:
image: ghcr.io/open-telemetry/opentelemetry-go-instrumentation/autoinstrumentation-go:v0.17.0-alpha
env:
- name: OTEL_INSTRUMENTATION_KAFKA_ENABLED
value: "false"
- name: OTEL_INSTRUMENTATION_REDISCALA_ENABLED
value: "false"
- name: OTEL_BSP_MAX_EXPORT_BATCH_SIZE
value: "512"
- name: OTEL_EXPORTER_OTLP_COMPRESSION
value: "gzip"
- name: OTEL_BSP_SCHEDULE_DELAY
value: "5000"
- name: OTEL_EXPORTER_OTLP_PROTOCOL
value: "http/protobuf"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://light-agent.light-agent.svc.cluster.local:54318"
3. 启动 Go Demo
kubectl apply -f go-demo.yaml
go-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: weather-service
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: weather-service
template:
metadata:
labels:
app: weather-service
annotations:
instrumentation.opentelemetry.io/inject-go: "true"
instrumentation.opentelemetry.io/otel-go-auto-target-exe: "/app/weather-service"
spec:
containers:
- name: weather-service
image: 192.168.2.99/obs_dev/weather-service:latest
imagePullPolicy: IfNotPresent
env:
- name: OTEL_SERVICE_NAME
value: "weather-service"
ports:
- containerPort: 7090
securityContext:
capabilities:
add:
- SYS_PTRACE
privileged: true
runAsUser: 0
4. 观察自动注入的效果 [待补充]
kubectl get pods
观察自动注入的效果、通过 light-agent
的 logs
查看 [待补充]
kubectl logs -f light-agent -n monitoring