《OpenShift / RHEL / DevSecOps 汇总目录》
说明:本文已经在支持 OpenShift 4.13 的环境中验证
从应用获取跟踪数据的两种方法
OpenTelemetry 从被跟踪应用获取跟踪数据可以使用两种手段:手动手段和自动手段。它们的实现方法区别如下表:
本文重点介绍的 Auto Instrumentation 需要在 Operator 中创建一个 Instrumentation 对象,它为自动通过 Sidecar 注入的 Agent 提供配置。根据该配置,从被跟踪应用收集的数据将发送给指定的 Collector 收集器。
部署 Distributed Tracing 运行环境
首先创建一个测试项目。
$ oc new-project app-observ
安装配置 Distributed Tracing Platform Opeartor
- 使用缺省配置安装 OpenShift Distributed Tracing Platform Opeartor。
- 在 OpenShift Distributed Tracing Platform Opeartor 中基于以下 YAML 创建一个 Jaeger 运行实例。
kind: Jaeger
apiVersion: jaegertracing.io/v1
metadata:
name: jaeger-all-in-one-inmemory
namespace: app-observ
spec:
strategy: allInOne
- 查看 Jaeger 相关服务和使用的端口。
$ oc get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/jaeger-all-in-one-inmemory-agent ClusterIP None <none> 5775/UDP,5778/TCP,6831/UDP,6832/UDP 76m
service/jaeger-all-in-one-inmemory-collector ClusterIP 172.30.75.167 <none> 9411/TCP,14250/TCP,14267/TCP,14268/TCP,4317/TCP,4318/TCP 76m
service/jaeger-all-in-one-inmemory-collector-headless ClusterIP None <none> 9411/TCP,14250/TCP,14267/TCP,14268/TCP,4317/TCP,4318/TCP 76m
service/jaeger-all-in-one-inmemory-query ClusterIP 172.30.134.109 <none> 443/TCP,16685/TCP 76m
另外还可以在 OpenShift 控制台的开发者视图中查看和 aeger-all-in-one-inmemory 部署相关的服务,其中 jaeger-all-in-on-inmemory-collector 服务显示了其使用的端口和对应的访问协议。
- 获得 Jaeger 控制台的访问地址,然后用浏览器访问。
$ oc get route jaeger-all-in-one-inmemory -o jsonpath='{.spec.host}'
jaeger-all-in-one-inmemory.apps.cluster-lqbff.lqbff.sandbox2053.opentlc.com
配置 Distributed Tracing Data Collection Opeartor
- 使用缺省配置安装 OpenShift Distributed Tracing Data Collection Opeartor。
- 在 OpenShift Distributed Tracing Data Collection Opeartor 中使用以下 YAML 创建一个 OpenTelemetry Instrumentation 实例,它用来说明使用何种配置向运行应用的 Pod 自动注入 Sidecar 容器。注意:spec.exporter 定义了缺省的数据出口使用的服务地址,由于 dotnet 和 pytho 使用的 Agent 使用了不同的传输协议,因此在 OTEL_EXPORTER_OTLP_ENDPOINT 环境变量中设置了非缺省的 exporter 地址。
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: instrumentation
namespace: app-observ
spec:
exporter:
endpoint: 'http://jaeger-all-in-one-inmemory-collector:4317'
dotnet:
env:
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: 'http://jaeger-all-in-one-inmemory-collector:4318'
python:
env:
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: 'http://jaeger-all-in-one-inmemory-collector:4318'
安装测试应用并进行观测跟踪
部署 Java 应用并注入 Auto-Instrumentation
- 在 OpenShift 的开发者视图中点击“添加” 菜单,在“添加” 页面中找到 “样本” 并点击进入。
- 在 “样本” 页面中按照 java 搜索到 Basic Spring Boot,然后点击进入。
- 在页面中将名称设为 springboot-app,然后点击 “创建”。
- 当应用已经部署完成后执行以下命令,向部署增加自动诸如 OpenTelemetry Instrumentation 的注释。
$ `oc patch deployment springboot-app -p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-java": "true"}}}}}'`
也可以直接向 springboot-app 部署追加以下的 YAML。
annotations:
instrumentation.opentelemetry.io/inject-java: 'true'
- 执行以下命令,确认 pod 中已经有 2 个容器了,其中一个为 opentelemetry-auto-instrumentation。
$ oc get pod -l app=springboot-app -o custom-columns=CONTAINER:.spec.containers[0].name,SIDECAR-CONTAINER:.spec.initContainers[0].name
CONTAINER SIDECAR-CONTAINER
springboot-app opentelemetry-auto-instrumentation
-
查看 springboot-app-xxxx 的 Pod 日志,确认其中为 javaagent 参数设置了 otel-auto-instrumentation/javaagent.jar。
-
执行命令访问应用。
$ curl $(oc get route springboot-app -o jsonpath={.spec.host})
Hello World!
- 刷新 Jaeger 控制台,在 Service 选中 springboot-app,点击 Find Traces 后可以看到跟踪到的请求和用时。
部署 Nodejs 应用并注入 Auto-Instrumentation
- 在 OpenShift 的开发者视图中点击“添加” 菜单,在“添加” 页面中找到 “样本” 并点击进入。
- 在 “样本” 页面中按照 node.js 搜索到 Basic Node.js,然后点击进入。
- 在页面中将名称设为 nodejs-app,然后点击 “创建”。
- 当应用已经部署完成后执行以下命令,向部署增加自动诸如 OpenTelemetry Instrumentation 的注释。
$ oc patch deployment nodejs-app -p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-nodejs": "true"}}}}}'
- 执行以下命令,确认 pod 中已经有 2 个容器了,其中一个为 opentelemetry-auto-instrumentation。
$ oc get pod -l name=nodejs-app -o custom-columns=CONTAINER:.spec.containers[0].name,SIDECAR-CONTAINER:.spec.initContainers[0].name
CONTAINER SIDECAR-CONTAINER
nodejs-app opentelemetry-auto-instrumentation
- 执行命令访问应用。
$ curl $(oc get route nodejs-app -o jsonpath={.spec.host})
Hello from Node.js Starter Application!
- 刷新 Jaeger 控制台,在 Service 选中 nodejs-app,点击 Find Traces 后可以看到跟踪到的请求和用时。
部署 Python 应用并注入 Auto-Instrumentation
- 在 OpenShift 的开发者视图中点击“添加” 菜单,在“添加” 页面中找到 “样本” 并点击进入。
- 在 “样本” 页面中按照 python 搜索到 Basic Python,然后点击进入。
- 在页面中将名称设为 python-app,然后点击 “创建”。
- 当应用已经部署完成后执行以下命令,向部署增加自动诸如 OpenTelemetry Instrumentation 的注释。
$ oc patch deployment python-app -p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-python": "true"}}}}}'
- 执行以下命令,确认 pod 中已经有 2 个容器了,其中一个为 opentelemetry-auto-instrumentation。
$ oc get pod -l name=python-app -o custom-columns=CONTAINER:.spec.containers[0].name,SIDECAR-CONTAINER:.spec.initContainers[0].name
CONTAINER SIDECAR-CONTAINER
python-app opentelemetry-auto-instrumentation
-
在应用对应的 Pod 查看环境,其中 python-app 容器用到的变量名 OTEL_EXPORTER_OTLP_ENDPOINT 的值是 http://jaeger-all-in-one-inmemory-collector:4318
-
执行命令访问应用。
$ curl $(oc get route python-app -o jsonpath={.spec.host})
Hello World!
- 刷新 Jaeger 控制台,在 Service 选中 python-app,点击 Find Traces 后可以看到跟踪到的请求和用时。
部署 .Net 应用并注入 Auto-Instrumentation
- 在 OpenShift 的开发者视图中点击“添加” 菜单,在“添加” 页面中找到 “样本” 并点击进入。
- 在 “样本” 页面中按照 .NET 搜索到 .NET,然后点击进入。
- 在页面中将名称设为 dotnet-app,然后点击 “创建”。
- 当应用已经部署完成后执行以下命令,向部署增加自动诸如 OpenTelemetry Instrumentation 的注释。
$ oc patch deployment dotnet-app -p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-dotnet": "true"}}}}}'
- 执行以下命令,确认 pod 中已经有 2 个容器了,其中一个为 opentelemetry-auto-instrumentation。
$ oc get pod -l name=dotnet-app -o custom-columns=CONTAINER:.spec.containers[0].name,SIDECAR-CONTAINER:.spec.initContainers[0].name
CONTAINER SIDECAR-CONTAINER
dotnet-app opentelemetry-auto-instrumentation
- 在应用对应的 Pod 查看环境,其中 dotnet-app 容器用到的变量名 OTEL_EXPORTER_OTLP_ENDPOINT 的值是 http://jaeger-all-in-one-inmemory-collector:4318
- 执行命令访问应用。
$ curl $(oc get route notnet-app -o jsonpath={.spec.host})
- 刷新 Jaeger 控制台,在 Service 选中 dotnet-app,点击 Find Traces 后可以看到跟踪到的请求和用时。
部署 Quarkus 的 SuperHero 应用
- 执行命令,部署 SuperHero 相关资源。
$ oc apply -f https://raw.githubusercontent.com/liuxiaoyu-git/OpenShift-HOL/master/superhero.yaml
- 获取 ui-super-heroes 的访问地址,然后用浏览器访问。
$ oc get route ui-super-heroes -ojsonpath={.spec.host}
ui-super-heroes-app-observ.apps.cluster-dqmxw.dqmxw.sandbox431.opentlc.com
- 在 Jaeger 中可查看 up-super-heroes 服务以及请求跟踪。
视频
参考
https://medium.com/opentelemetry/using-opentelemetry-auto-instrumentation-agents-in-kubernetes-869ec0f42377
https://medium.com/@akashjoffical08/implement-distributed-tracing-with-jaeger-opentelemetry-on-kubernetes-3e35cb77b536
https://medium.com/@magstherdev/opentelemetry-up-and-running-b4c58eaf8c05
https://opentelemetry.io/docs/k8s-operator/automatic/
https://opentelemetry.io/docs/demo/architecture/
https://www.aneasystone.com/archives/2022/11/opentelemetry-observability.html
https://www.aspecto.io/blog/what-is-opentelemetry-the-infinitive-guide/
https://developers.redhat.com/articles/2023/03/22/how-enable-opentelemetry-traces-react-applications
https://github.com/jpkrohling/opentelemetry-collector-deployment-patterns
https://github.com/open-telemetry/opentelemetry-operator/blob/main/README.md
https://github.com/rbaumgar/otelcol-demo-app/blob/main/ServicePerformanceMonitoring.md