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上也有指标数据了,如下图