Open Telemetry手动仪表化实战应用

Open Telemetry手动仪表化实战应用

实现环境

k8s,一台master,两台node
代码采用golang编写

整体框架图

​ 首先在Windows下用golang编写了一个测试代码,导入otel的各种包,在代码中实现对需要收集的追踪数据和指标数据进行侵入,实现一个手动仪表化的功能,使得代码生成观测数据,之后这些观测数据被分为trace类型的数据和metric类型的数据,通过grpc协议将这些数据传输到OpenTelemetry Collector中,Collector 使用 gRPC 接受这些数据并进行处理,最后将处理后的数据导出到后端jaeger以及Prometheus,其中Prometheus是自己主动拉取的数据.

OpenTelemetry Collector部署

​ opentelemetry collector是通过helm进行部署,配置文件如下:

vim otel-helm-config.yaml

  image:
  #repository: 这里定义了使用的容器镜像的地址。otel/opentelemetry-collector-contrib 是 OpenTelemetry Collector 的官方贡献版镜像。
    repository: "otel/opentelemetry-collector-contrib"   
  #enabled: 设置为 true,表示启用 OpenTelemetry Collector
  enabled: true
  #nameOverride: 可以用来覆盖 Helm chart 中的默认名称,这里将其设置为otelcol
  nameOverride: otelcol
  #部署模式为deploy模式
  mode: deployment
  presets:
  #表示启用 Kubernetes 特有的元数据(如 Pod 名称、命名空间等),使得OpenTelemetry收集的指标和追踪数据包含Kubernetes环境的信息
    kubernetesAttributes:
      enabled: true
  #资源相关配置
  resources:
    limits:
      memory: 2048Mi
  #Service 配置
  service:
  # 设置服务类型为ClusterIP,表示服务只能在集群内部访问
    type: ClusterIP
  ports:
    metrics:
      # The metrics port is disabled by default. However you need to enable the port
      # in order to use the ServiceMonitor (serviceMonitor.enabled) or PodMonitor (podMonitor.enabled).
      enabled: true
      containerPort: 8899
      servicePort: 8899
      hostPort: 8899
      protocol: TCP
  #Config 配置
  config:
  #接收器使用otlp,此处配置了使用 gRPC 协议接收来自其他系统的 OTLP 数据,在所有网络接口上监听 55678 端口
    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: "0.0.0.0:55678"
  #处理器为批处理模式
    processors:
      batch:
        send_batch_size: 1
        send_batch_max_size: 1
  #导出器配置
    exporters:
    #将OTLP格式的数据导出到 jaeger:4317,jaeger为其服务名
      otlp:
        endpoint: "jaeger:4317"
        tls:
          insecure: true
    #将 Prometheus 格式的指标数据导出到8899端口,使得Prometheus可以抓取
      prometheus:
        endpoint: "0.0.0.0:8899"
    #Service Pipelines 配置
    service:
    #定义了两个数据流管道,一个用于traces(跟踪数据),一个用于 metrics(指标数据)
      pipelines:
        traces:
          receivers: [otlp]
          processors: [batch]
          exporters: [otlp]
        metrics:
          receivers: [otlp,prometheus]
          processors: [batch]
          exporters: [debug,prometheus]

之后使用helm安装命令进行collector的部署

helm install otel-collector open-telemetry/opentelemetry-collector --values otel-helm-config.yaml

jaeger搭建

jaeger的搭建比较简单,就是写配置文件

vim otel-jaeger-config.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jaeger
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jaeger
  template:
    metadata:
      labels:
        app: jaeger
    spec:
      containers:
      - name: jaeger
        image: jaegertracing/all-in-one:latest
        ports:
        - containerPort: 16686
        - containerPort: 14268
        - containerPort: 14250
        - containerPort: 4317
        env:
        - name: COLLECTOR_OTLP_ENABLED
          value: "true"
---
apiVersion: v1
kind: Service
metadata:
  name: jaeger
spec:
  selector:
    app: jaeger
  ports:
  - protocol: TCP
    port: 16686
    targetPort: 16686
    nodePort: 31686 # 为 Jaeger UI 指定 NodePort
    name: jaeger-ui
  - protocol: TCP
    port: 14268
    targetPort: 14268
    nodePort: 31268
    name: jaeger-collector
  - protocol: TCP
    port: 14250
    targetPort: 14250
    nodePort: 31250
    name: jaeger-agent
  - protocol: TCP
    port: 4317
    targetPort: 4317
    nodePort: 31417
    name: jaeger-otlp
  type: NodePort # 更改为 NodePort 类型

之后对jaeger的配置文件进行部署

kubectl apply -f otel-jaeger-config.yaml -n <命名空间>

等jaeger的pod起来之后,就能在31686端口上看到jaeger的webUI界面了

prometheus搭建

Prometheus也是通过配置文件进行搭建的

vim otel-prometheus-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s
    scrape_configs:
      - job_name: 'otel-collector-opentelemetry-collector'
        scrape_interval: 10s
        static_configs:
          - targets: ['otel-collector-otelcol:8899']  # OpenTelemetry Collector 暴露指标的服务名和端口
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
      - name: prometheus
        image: prom/prometheus:latest
        ports:
        - containerPort: 9090
        volumeMounts:
        - name: config-volume
          mountPath: /etc/prometheus
        args:
          - "--config.file=/etc/prometheus/prometheus.yml"
          - "--storage.tsdb.path=/prometheus"
      volumes:
      - name: config-volume
        configMap:
          name: prometheus-config
---
apiVersion: v1
kind: Service
metadata:
  name: prometheus
spec:
  ports:
  - port: 9090
    targetPort: 9090
    nodePort: 30090
    protocol: TCP
  selector:
    app: prometheus
  type: NodePort

之后对Prometheus的配置文件进行部署

kubectl apply -f otel-prometheus-config.yaml -n <命名空间>

等Prometheus的pod起来之后,就能在30090端口上看到jaeger的webUI界面了

结果展示

运行代码程序,jaeger的webUI上,如下图

Prometheus上也有指标数据了,如下图


posted @ 2024-11-08 16:18  Lionkkkk  阅读(23)  评论(0编辑  收藏  举报