OpenShift 4 - 可观测性之用 OpenTelemetry+Tempo 实现 Distributed Tracing

OpenShift / RHEL / DevSecOps 汇总目录
说明:本文已经在支持 OpenShift 4.17 + Tempo Operator 0.13.0-1 的环境中验证

技术架构

Tempo 是 Grafana 公司推出的可对云原生应用实现请求跟踪的开源产品。它和 Jaeger 的功能大体相当,首先可以接收从被跟踪目标通过 OpenTelemetry 或 ZIPKIN 发送的跟踪数据,然后集中保存跟踪数据,最后通过 Jaeger 或 Grafana 界面进行展现。
Tempo 和 Jaeger 相比较大的区别是 Jaeger 一般使用诸如 Elasticsearch 这样的数据库来保存其接收到的跟踪数据,而 Tempo 则直接使用对象存储保存其接收到的跟踪数据。
在这里插入图片描述

部署 Distributed Tracing 运行环境

安装 minio 环境

  1. 创建一个项目
$ oc new-project tempo-demo
  1. 在 tempo-demo 项目中根据以下 YAML 部署 minio 资源。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app.kubernetes.io/name: minio
  name: minio
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: minio
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: minio
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app.kubernetes.io/name: minio
    spec:
      containers:
        - command:
            - /bin/sh
            - -c
            - |
              mkdir -p /storage/tempo && \
              minio server /storage
          env:
            - name: MINIO_ACCESS_KEY
              value: tempo
            - name: MINIO_SECRET_KEY
              value: supersecret
          image: quay.io/minio/minio
          name: minio
          ports:
            - containerPort: 9000
          volumeMounts:
            - mountPath: /storage
              name: storage
      volumes:
        - name: storage
          persistentVolumeClaim:
            claimName: minio
---
apiVersion: v1
kind: Service
metadata:
  name: minio
spec:
  ports:
    - port: 9000
      protocol: TCP
      targetPort: 9000
  selector:
    app.kubernetes.io/name: minio
  type: ClusterIP

安装 Grafana Tempo 环境

  1. 使用缺省配置安装由 Red Hat 发布的 Tempo Operator。
  2. 在 tempo-demo 项目中根据以下 YAML 创建能访问 minio 服务的 Secret。
apiVersion: v1
kind: Secret
metadata:
  name: minio
stringData:
  endpoint: http://minio.tempo-demo.svc:9000
  bucket: tempo
  access_key_id: tempo
  access_key_secret: supersecret
type: Opaque
  1. 在 tempo-demo 项目中根据以下 YAML 创建一个 TempoStack 实例,其中用到上一步创建的 Secret。
apiVersion: tempo.grafana.com/v1alpha1
kind: TempoStack
metadata:
  name: my-tempo
spec:
  storage:
    secret:
      name: minio
      type: s3
  storageSize: 1Gi
  resources:
    total:
      limits:
        memory: 2Gi
        cpu: 2000m
  template:
    queryFrontend:
      jaegerQuery:
        enabled: true
  1. 查看 Tempo 相关部署。
$ oc get deploy -n tempo-demo -l app.kubernetes.io/name=tempo 
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
tempo-my-tempo-compactor        1/1     1            1           14m
tempo-my-tempo-distributor      1/1     1            1           14m
tempo-my-tempo-querier          1/1     1            1           14m
tempo-my-tempo-query-frontend   1/1     1            1           14m
  1. 查看 Tempo 相关服务,其中 tempo-my-tempo-distributor 是应用端的 OTEL 将跟踪到的数据推送的目标服务。
$ oc get svc -n tempo-demo -l app.kubernetes.io/name=tempo
NAME                                      TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                                          AGE
tempo-my-tempo-compactor                  ClusterIP   10.217.4.119   <none>        7946/TCP,3200/TCP                                16m
tempo-my-tempo-distributor                ClusterIP   10.217.5.226   <none>        4317/TCP,3200/TCP                                16m
tempo-my-tempo-gossip-ring                ClusterIP   None           <none>        7946/TCP                                         16m
tempo-my-tempo-ingester                   ClusterIP   10.217.4.249   <none>        3200/TCP,9095/TCP                                16m
tempo-my-tempo-querier                    ClusterIP   10.217.4.88    <none>        7946/TCP,3200/TCP,9095/TCP                       16m
tempo-my-tempo-query-frontend             ClusterIP   10.217.4.144   <none>        3200/TCP,9095/TCP,16686/TCP,16687/TCP            16m
tempo-my-tempo-query-frontend-discovery   ClusterIP   None           <none>        3200/TCP,9095/TCP,9096/TCP,16686/TCP,16687/TCP   16m
  1. 而 tempo-my-tempo-query-frontend 则是 Jaeger 的控制台,可以根据将其服务生成 Route,然后用浏览器访问 Route 地址。
$ oc expose service tempo-my-tempo-query-frontend --port=16686 -n tempo-demo
$ oc get route tempo-my-tempo-query-frontend -n tempo-demo -o jsonpath='{.spec.host}'
tempo-my-tempo-query-frontend-tempo-demo.apps.cluster-6htgt.6htgt.sandbox2251.opentlc.com

部署测试应用并进行观测跟踪

测试应用1

  1. 在 tempo-demo 项目中执行以下命令,运行一个测试应用。
    说明:测试应用使用了手动 Instrumentation 方式获取的跟踪数据,应用代码参见 https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/tracegen/v0.55.0/tracegen/main.go
    注意:跟踪数据推送到 Tempo 的 tempo-my-tempo-distributor:4317 接收服务。
$ oc apply -f - << EOF
apiVersion: batch/v1
kind: Job
metadata:
  name: tracegen
  namespace: tempo-demo 
spec:
  template:
    spec:
      containers:
        - name: tracegen
          image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/tracegen:latest
          command:
            - "./tracegen"
          args:
            - -otlp-endpoint=tempo-my-tempo-distributor:4317
            - -otlp-insecure
            - -duration=300s
            - -workers=1
      restartPolicy: Never
  backoffLimit: 4
EOF
  1. 刷新 Jaeger 控制台,选择 tracegen 服务后可以看到对该请求的跟踪情况。
    在这里插入图片描述
    在这里插入图片描述

测试应用2

  1. 在 tempo-demo 项目中基于以下 YAML 部署测试应用。
    说明:测试应用使用了手动 Instrumentation 方式获取的跟踪数据,应用代码参见 https://github.com/rbaumgar/otelcol-demo-app/blob/main/src/main/java/org/acme/opentelemetry/TracedResource.java
    注意:其中在 Deployment 中对 OTELCOL_SERVER 参数使用了以上 tempo-my-tempo-distributor 服务的地址。
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: otel-demo-app
  name: otel-demo-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: otel-demo-app
  template:
    metadata:
      labels:
        app: otel-demo-app
    spec:
      containers:
        - image: quay.io/rbaumgar/otelcol-demo-app-jvm
          imagePullPolicy: IfNotPresent
          name: otel-demo-app
          env:
            - name: OTELCOL_SERVER
              value: 'http://tempo-my-tempo-distributor:4317'  
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: otel-demo-app
  name: otel-demo-app
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
    name: web
  selector:
    app: otel-demo-app
  type: ClusterIP
---
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  labels:
    app: otel-demo-app
  name: otel-demo-app
spec:
  path: /
  to:
    kind: Service
    name: otel-demo-app
  port:
    targetPort: web
  1. 执行以下命令访问测试应用。
$ export URL=$(oc get route otel-demo-app -n tempo-demo -o jsonpath='{.spec.host}')
$ curl $URL/hello
hello 
$ curl $URL/sayHello/demo1
hello: demo1
$ curl $URL/sayRemote/demo2
hello: demo2 from http://otel-demo-app-tempo-demo.apps-crc.testing/
  1. 刷新 Jaeger 控制台,选择 my-service 服务后可以看到对该请求的跟踪情况。
    在这里插入图片描述

在这里插入图片描述

参考

https://tempo-operator.netlify.app/docs/prologue/quickstart.md/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值