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

OpenShift / RHEL / DevSecOps 汇总目录
说明:本文已经在支持 OpenShift 4.17 + Red Hat build of OpenTelemetry Opeartor 0.107.0-5 的环境中验证

从应用获取跟踪数据的两种方法

OpenTelemetry 从被跟踪应用获取跟踪数据可以使用两种手段:手动手段和自动手段。它们的实现方法区别如下表:
在这里插入图片描述
本文重点介绍的 Auto Instrumentation 需要在 Operator 中创建一个 Instrumentation 对象,它为自动通过 Sidecar 注入的 Agent 提供配置。根据该配置,从被跟踪应用收集的数据将发送给指定的 Collector 收集器。
在这里插入图片描述

部署运行环境

安装配置 Distributed Tracing Platform Opeartor

为了跟踪应用访问,本文使用的是 Red Hat build of OpenTelemetry Opeartor,也可以用 Tempo Operator 实现相同功能。

  1. 使用缺省配置安装 OpenShift Distributed Tracing Platform Opeartor。
  2. 在 OpenShift Distributed Tracing Platform Opeartor 中基于以下 YAML 创建一个 Jaeger 运行实例。
$ oc new-project app-observ
 
$ oc apply -f - << EOF
kind: Jaeger
apiVersion: jaegertracing.io/v1
metadata:
  name: jaeger-all-in-one-inmemory
  namespace: app-observ
spec:
  strategy: allInOne
EOF
  1. 查看 Jaeger 相关服务和使用的端口。
$ oc get svc -n app-observ
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 -n app-observ -o jsonpath='{.spec.host}'

在这里插入图片描述

安装配置 Red Hat build of OpenTelemetry Opeartor

  1. 使用缺省配置安装 Red Hat build of OpenTelemetry Opeartor。
  2. 在 Red Hat build of OpenTelemetry 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'
  sampler:
    type: always_on
  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 -n app-observ -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 -n app-observ -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 -k https://$(oc get route springboot-app -n app-observ -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 -n app-observ -p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-nodejs": "true"}}}}}'
  1. 执行以下命令,确认 pod 中已经有 2 个容器了,其中一个为 opentelemetry-auto-instrumentation。
$ oc get pod -n app-observ -l app=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 -k https://$(oc get route nodejs-app -n app-observ -o jsonpath={.spec.host})
Hello from Node.js Starter Application!
  1. 刷新 Jaeger 控制台,在 Service 选中 nodejs-app,点击 Find Traces 后可以看到跟踪到的请求和用时。
    在这里插入图片描述

    部署 Python 应用并注入 Auto-Instrumentation

  2. 在 OpenShift 的开发者视图中点击“添加” 菜单,在“添加” 页面中找到 “样本” 并点击进入。

  3. 在 “样本” 页面中按照 python 搜索到 Basic Python,然后点击进入。
    在这里插入图片描述

  4. 在页面中将名称设为 python-app,然后点击 “创建”。
    在这里插入图片描述

  5. 当应用已经部署完成后执行以下命令,向部署增加自动诸如 OpenTelemetry Instrumentation 的注释。

$ oc patch deployment python-app -n app-observ -p '{"spec": {"template": {"metadata": {"annotations": {"instrumentation.opentelemetry.io/inject-python": "true"}}}}}'
  1. 执行以下命令,确认 pod 中已经有 2 个容器了,其中一个为 opentelemetry-auto-instrumentation。
$ oc get pod -n app-observ -l app=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 -k https://$(oc get route python-app -n app-observ -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 -n app-observ -l app=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 -k https://$(oc get route notnet-app -n app-observ -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 -n app-observ -ojsonpath={.spec.host}
  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/kubernetes/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
https://www.redhat.com/en/blog/announcing-red-hat-build-opentelemetry-and-distributed-tracing-3.2-release

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值