一. 配置Loki和Tempo
Log2Trace
打开loki数据源
Name配置TraceId
regex 配置 (?:trace_id)=(\w+)
URL配置 ${__value.raw}
打开internal link 配置tempo
保存
Trace2Log
打开tempo数据源,配置如下
二. 验证前准备工作
制作opentelemetry agent的基础镜像
mkdir /home/agent-docker
cd /home/agent-docker
##wget可能会失败,可以直接离线下载并上传
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v2.20.1/opentelemetry-javaagent.jar
vim Dockerfile
#一个java21+opentelemetry的docker 镜像
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:21-jdk-slim
# 设置语言环境变量为中文
ENV LANG=zh_CN.UTF-8
# 安装所需的软件包,包括中文字体和中文语言支持
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# 创建工作目录并复制 OpenTelemetry Java Agent
RUN mkdir -p /otel
COPY ./opentelemetry-javaagent.jar /otel/opentelemetry-javaagent.jar
文件如下:
制作镜像并推送harbor
docker login -u admin -p Harbor12345 http://192.168.10.136
docker build -t 192.168.10.136/library/opentelemetry-openjdk:21 .
docker push 192.168.10.136/library/opentelemetry-openjdk:21
制作springboot镜像
克隆代码后通过IDE构建得到demo-0.0.1-SNAPSHOT.jar
https://github.com/zhen1995/opentelemetry-demo
mkdir /home/demo-docker
cd /home/demo-docker
vim Dockerfile
# 后端Dockerfile
# 使用opentelemetry+openjdk21的基础镜像
FROM 192.168.10.136/library/opentelemetry-openjdk:21
WORKDIR "/home"
COPY ./demo-0.0.1-SNAPSHOT.jar /home/app.jar
# 合并 JAVA_OPTS 和 OTEL 配置
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
上传demo-0.0.1-SNAPSHOT.jar到服务器后如下
docker build -t 192.168.10.136/library/demo:20260729 .
docker push 192.168.10.136/library/demo:20260729
docker build -t 10.2.216.104:8080/library/demo:20260729 .
docker login -u admin -p Harbor12345 http://10.2.216.104:8080
docker push 10.2.216.104:8080/library/demo:20260729
vim demo.yaml
apiVersion: v1
kind: Namespace
metadata:
name: demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: opentelemetry-demo
namespace: demo
labels:
app: opentelemetry-demo
spec:
replicas: 1
selector:
matchLabels:
app: opentelemetry-demo
template:
metadata:
labels:
app: opentelemetry-demo
spec:
containers:
- name: demo
image: 192.168.10.136/library/demo:20260729
imagePullPolicy: Always
ports:
- name: http
containerPort: 8080
protocol: TCP
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
env:
- name: JAVA_OPTS
value: "-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -XX:InitialRAMPercentage=50.0"
# 如果使用的是 Spring Boot 的 entrypoint 脚本,它会自动读取 JAVA_OPTS
# 如果不是,需要在启动命令中引用:java $JAVA_OPTS -jar app.jar
- name: JAVA_TOOL_OPTIONS
value: "-javaagent:/otel/opentelemetry-javaagent.jar"
- name: OTEL_SERVICE_NAME
value: "opentelemetry-demo"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://otel-collector.observability.svc.cluster.local:4318"
- name: OTEL_EXPORTER_OTLP_PROTOCOL
value: "http/protobuf"
- name: OTEL_EXPORTER_OTLP_TIMEOUT
value: "30000" # 可选:加大超时到 30 秒
# 启用所有导出(Trace + Metrics + Logs)
- name: OTEL_TRACES_SAMPLER
value: "parentbased_traceidratio"
- name: OTEL_TRACES_SAMPLER_ARG
value: "1.0"
---
apiVersion: v1
kind: Service
metadata:
name: opentelemetry-demo
namespace: demo
labels:
app: opentelemetry-demo
spec:
type: NodePort
selector:
app: opentelemetry-demo
ports:
- name: http
port: 8080
targetPort: 8080
nodePort: 30081
protocol: TCP
kubectl apply -f deploy.yaml
#查看在哪个节点
kubectl get pod -o wide
三. 验证
浏览器访问所在节点的30081端口的服务的接口
http://192.168.10.129:30081/demo/test/traceAndLog
查看loki 并验证log2trace
点击tempo
关联tempo数据成功
查看tempo 并验证trace2log
展开对应的trace后,点击log按钮
得到log数据,验证trace2log成功
OpenTelemetry实践系列-1 部署服务篇环境准备 - 掘金