OpenTelemetry入门看这一篇就够了( 五 )


要使用自动检测,需要为 SDK 和检测配置添加一个 Instrumentation 资源 。比如对于 Java 应用程序,配置如下 。
apiVersion: opentelemetry.io/v1alpha1kind: Instrumentationmetadata:name: java-instrumentationspec:propagators:- tracecontext- baggage- b3sampler:type: always_onjava:如果是 Python 应用程序,配置如下:
apiVersion: opentelemetry.io/v1alpha1kind: Instrumentationmetadata:name: python-instrumentationspec:propagators:- tracecontext- baggage- b3sampler:type: always_onpython:要启用检测,我们需要更新部署文件并向其添加注解 。通过这种方式,我们告诉 OpenTelemetry Operator 将 sidecar 和 java 工具注入到我们的应用程序中 。
annotations:instrumentation.opentelemetry.io/inject-java: "true"sidecar.opentelemetry.io/inject: "true"示例应用这里我们将使用一个名为 Petclinic 的 Java 应用程序,这是一个使用 Maven 或 Gradle 构建的 Spring Boot 应用程序 。该应用程序将使用 OpenTelemetry 生成数据 。
对于 Java 应用,我们可以通过下载 OpenTelemetry 提供的 opentelemetry-javaagent 这个 jar 包来使用 OpenTelemetry 自动检测应用程序 。
只需要将这个 jar 包添加到应用程序的启动命令中即可,比如:
java -javaagent:opentelemetry-javaagent.jar -jar target/*.jarJava 自动检测使用可附加到任何 Java 8+ 应用程序的 Java 代理 JAR 。它动态注入字节码以从许多流行的库和框架捕获遥测数据 。它可用于捕获应用程序或服务“边缘”的遥测数据,例如入站请求、出站 HTTP 调用、数据库调用等 。通过运行以上命令,我们可以对应用程序进行插桩,并生成链路数据,而对我们的应用程序没有任何修改 。
尤其是在 Kubernetes 环境中,我们可以使用 OpenTelemetry Operator 来注入和配置 OpenTelemetry 自动检测库,这样连 javaagent 我们都不需要去手动注入了 。
我们首先部署 Petclinic 应用程序 。
apiVersion: apps/v1kind: Deploymentmetadata:name: petclinicspec:selector:matchLabels:app: petclinictemplate:metadata:labels:app: petclinicspec:contAIners:- name: appimage: cnych/spring-petclinic:latest然后我们为 Java 应用程序添加一个 Instrumentation 资源 。
# java-instrumentation.yamlapiVersion: opentelemetry.io/v1alpha1kind: Instrumentationmetadata:name: java-instrumentationspec:propagators:- tracecontext- baggage- b3sampler:type: always_onjava:image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:latest为了启用自动检测,我们需要更新部署文件并向其添加注解 。这样我们可以告诉 OpenTelemetry Operator 将 sidecar 和 java-instrumentation 注入到我们的应用程序中 。修改 Deployment 配置如下:
# petclinic.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: petclinicspec:selector:matchLabels:app: petclinictemplate:metadata:labels:app: petclinicannotations:instrumentation.opentelemetry.io/inject-java: "true"sidecar.opentelemetry.io/inject: "sidecar"spec:containers:- name: appimage: cnych/spring-petclinic:latest然后再创建一个 NodePort 类型的 Service 服务来暴露应用程序 。
# petclinic-svc.yamlapiVersion: v1kind: Servicemetadata:name: petclinicspec:selector:app: petclinictype: NodePortports:- protocol: TCPport: 80targetPort: 8080直接应用上面的资源清单即可:
$ kubectl apply -f central-collector.yaml$ kubectl apply -f sidecar.yaml$ kubectl apply -f java-instrumentation.yaml$ kubectl apply -f petclinic.yaml$ kubectl apply -f petclinic-svc.yaml正常部署完成后可以看到对应的 Pod 已经正常运行:
$ kubectl get podsNAMEREADYSTATUSRESTARTSAGEpetclinic-6fdd56f4d7-qfff72/2Running062ssimplest-collector-87d8bf9bf-dh8pl1/1Running036m$ kubectl get svcNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEpetclinicNodePort10.103.6.52<none>80:30941/TCP46ssimplest-collectorClusterIP10.102.131.126<none>4317/TCP,4318/TCP17msimplest-collector-headlessClusterIPNone<none>4317/TCP,4318/TCP17msimplest-collector-monitoringClusterIP10.98.65.171<none>8888/TCP17m然后我们就可以通过 http://<node_ip>:30941 来访问 Petclinic 应用程序了 。
当我们访问应用程序时,应用程序就将生成追踪数据,并将其发送到我们的中心收集器 。我们可以通过访问 Grafana Tempo 来查看追踪数据,同时也可以通过访问中心收集器的控制台来查看追踪数据 。因为我们在中心收集器中配置了日志记录导出器和 Grafana Tempo 两个导出器,当然也可以配置其他导出器 。
$ kubectl logs -f petclinic-6fdd56f4d7-qfff7 -c otc-container# ......2023-09-10T04:11:41.164ZinfoTracesExporter{"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 1, "spans": 76}2023-09-10T04:12:11.012ZinfoTracesExporter{"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 1, "spans": 3}2023-09-10T04:12:16.221ZinfoTracesExporter{"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 1, "spans": 23}^C$ kubectl logs -f simplest-collector-677f4779ff-x8h2m# ......2023-09-10T04:11:09.221Zinfoservice/service.go:161Everything is ready. Begin running and processing data.2023-09-10T04:11:49.222ZinfoTracesExporter{"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 1, "spans": 76}2023-09-10T04:12:19.224ZinfoTracesExporter{"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 2, "spans": 26}


推荐阅读