目录

opentelemetry-3-终篇-接管可观测数据

目录

根据前面两篇文章,基本了解了opentelemetry,并且搭建了一套基于opentelemetry的可观测平台,其中包括日志的loki,监控的prometheus,链路的tempo,以及UI的grafana。

接下来,本文将为java服务接入opentelemetry-java-instrumentation,实现java无代码入侵接入opentelemetry。

首先需要下载opentelemetry-javaagent, 然后将java agent上传到私有s3存储,便于后续下载。

然后修改流水线,将java agent添加进去,方式很多,作者这里使用Dockerfile来做。

1
2
3
4
5
6
7
8
9
# Dockerfile
FROM 打码
ADD 打码 打码

ADD 打码  打码

ADD opentelemetry-javaagent.jar /tmp/opentelemetry-javaagent.jar

CMD ["sh","-c","java $Options  -jar  打码.jar"]

这里修改Dockerfile之后需要在流水线中获取opentelemetry-javaagent.jar包

1
2
3
4
5
6
7
8
9
# gitlab-ci.yaml
......省略
  script:
    - mvn clean install 打码
    - curl -X GET "https://s3存储/agent/opentelemetry-javaagent.jar" -o /opentelemetry-javaagent.jar -k
    - docker build 打码
    - docker push 打码
    - docker rmi 打码
......省略

最后部署服务的时候添加一下ENV,完成配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 服务部署文件
......省略
    spec:
      containers:
      - env:
        - name: Options
          value: -javaagent:/tmp/opentelemetry-javaagent.jar -Dotel.resource.attributes=service.name=YOUR_APP_NAME
        - name: OTEL_TRACES_EXPORTER
          value: logging,otlp
        - name: OTEL_EXPORTER_OTLP_COMPRESSION
          value: gzip
        - name: OTEL_EXPORTER_OTLP_ENDPOINT
          value: http://otel-collector-headless.opentelemetry:4317
......省略

相关配置解释在这里

由于OTEL_TRACES_EXPORTER我们配置了logging,所以生成traceID的时候会输出到控制台,我们Loki同时从promtail接收容器Stdout日志,所以可以直接获取。而配置otlp,则将trace数据传输给了opentelemetry,在上文中,我们opentelemetry是将数据传给了tempo,那么,现在从loki中查询到的traceID,可以直接关联到tempo中了。

如下图演示:

我们先请求一下我们的java服务,产生一下trace数据。

进到grafana,选择我们的服务,搜索一下刚刚请求的接口。

../images/otel-10.png

发现搜索到了日志

../images/otel-11.png

我们点开日志

../images/otel-12.png

发现匹配到了TraceID,我们点击Tempo,页面上同时展示日志和链路信息

../images/otel-13.png

此时可以点击链路内容进行问题排查,例如作者这里的可以显示是执行了某段sql。

../images/otel-14.png