OpenShift 4 - 可观测性之通过向被观测应用注入OpenTelemetry Agent 实现 Distributed Tracing(附视频)

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

  1. 使用缺省配置安装 OpenShift Distributed Tracing Platform Opeartor。
  2. 在 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
  1. 查看 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 服务显示了其使用的端口和对应的访问协议。
在这里插入图片描述

  1. 获得 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

  1. 使用缺省配置安装 OpenShift Distributed Tracing Data Collection Opeartor。
  2. 在 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

  1. 在 OpenShift 的开发者视图中点击“添加” 菜单,在“添加” 页面中找到 “样本” 并点击进入。
  2. 在 “样本” 页面中按照 java 搜索到 Basic Spring Boot,然后点击进入。
    在这里插入图片描述
  3. 在页面中将名称设为 springboot-app,然后点击 “创建”。
    在这里插入图片描述
  4. 当应用已经部署完成后执行以下命令,向部署增加自动诸如 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'

在这里插入图片描述

  1. 执行以下命令,确认 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
  1. 查看 springboot-app-xxxx 的 Pod 日志,确认其中为 javaagent 参数设置了 otel-auto-instrumentation/javaagent.jar。
    在这里插入图片描述

  2. 执行命令访问应用。

$ curl $(oc get route springboot-app -o jsonpath={.spec.host})
Hello World!
  1. 刷新 Jaeger 控制台,在 Service 选中 springboot-app,点击 Find Traces 后可以看到跟踪到的请求和用时。
    在这里插入图片描述

部署 Nodejs 应用并注入 Auto-Instrumentation

  1. 在 OpenShift 的开发者视图中点击“添加” 菜单,在“添加” 页面中找到 “样本” 并点击进入。
  2. 在 “样本” 页面中按照 node.js 搜索到 Basic Node.js,然后点击进入。
    在这里插入图片描述
  3. 在页面中将名称设为 nodejs-app,然后点击 “创建”。
    在这里插入图片描述
  4. 当应用已经部署完成后执行以下命令,向部署增加自动诸如 OpenTelemetry Instrumentation 的注释。
$ oc patch deployment nodejs-app -p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-nodejs": "true"}}}}}'
  1. 执行以下命令,确认 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
  1. 执行命令访问应用。
$ curl $(oc get route nodejs-app -o jsonpath={.spec.host})
Hello from Node.js Starter Application!
  1. 刷新 Jaeger 控制台,在 Service 选中 nodejs-app,点击 Find Traces 后可以看到跟踪到的请求和用时。
    在这里插入图片描述

部署 Python 应用并注入 Auto-Instrumentation

  1. 在 OpenShift 的开发者视图中点击“添加” 菜单,在“添加” 页面中找到 “样本” 并点击进入。
  2. 在 “样本” 页面中按照 python 搜索到 Basic Python,然后点击进入。
    在这里插入图片描述
  3. 在页面中将名称设为 python-app,然后点击 “创建”。
    在这里插入图片描述
  4. 当应用已经部署完成后执行以下命令,向部署增加自动诸如 OpenTelemetry Instrumentation 的注释。
$ oc patch deployment python-app -p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-python": "true"}}}}}'
  1. 执行以下命令,确认 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
  1. 在应用对应的 Pod 查看环境,其中 python-app 容器用到的变量名 OTEL_EXPORTER_OTLP_ENDPOINT 的值是 http://jaeger-all-in-one-inmemory-collector:4318
    在这里插入图片描述

  2. 执行命令访问应用。

$ curl $(oc get route python-app -o jsonpath={.spec.host})
Hello World!
  1. 刷新 Jaeger 控制台,在 Service 选中 python-app,点击 Find Traces 后可以看到跟踪到的请求和用时。
    在这里插入图片描述

部署 .Net 应用并注入 Auto-Instrumentation

  1. 在 OpenShift 的开发者视图中点击“添加” 菜单,在“添加” 页面中找到 “样本” 并点击进入。
  2. 在 “样本” 页面中按照 .NET 搜索到 .NET,然后点击进入。
    在这里插入图片描述
  3. 在页面中将名称设为 dotnet-app,然后点击 “创建”。
    在这里插入图片描述
  4. 当应用已经部署完成后执行以下命令,向部署增加自动诸如 OpenTelemetry Instrumentation 的注释。
$ oc patch deployment dotnet-app -p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-dotnet": "true"}}}}}'
  1. 执行以下命令,确认 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
  1. 在应用对应的 Pod 查看环境,其中 dotnet-app 容器用到的变量名 OTEL_EXPORTER_OTLP_ENDPOINT 的值是 http://jaeger-all-in-one-inmemory-collector:4318
    在这里插入图片描述
  2. 执行命令访问应用。
$ curl $(oc get route notnet-app -o jsonpath={.spec.host})
  1. 刷新 Jaeger 控制台,在 Service 选中 dotnet-app,点击 Find Traces 后可以看到跟踪到的请求和用时。
    在这里插入图片描述

部署 Quarkus 的 SuperHero 应用

  1. 执行命令,部署 SuperHero 相关资源。
$ oc apply -f https://raw.githubusercontent.com/liuxiaoyu-git/OpenShift-HOL/master/superhero.yaml

在这里插入图片描述

  1. 获取 ui-super-heroes 的访问地址,然后用浏览器访问。
$ oc get route ui-super-heroes -ojsonpath={.spec.host}
ui-super-heroes-app-observ.apps.cluster-dqmxw.dqmxw.sandbox431.opentlc.com
  1. 在 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值