目录

Opentelemetry-4-续1-链路与日志的关联

目录

根据上一篇文章的内容,我们成功的观测到了java服务中的链路信息,可以轻松排查到问题,但是整体架构比较复杂,本篇将对日志架构进行优化,主要针对日志的接收方式进行调整,下面是上一篇文章的日志接收流程。

../images/otel-loki-2.png

在这一套日志流程中,并没有涉及到opentelemetry,我们是通过promtail抓取的javaagent生成TraceID留下的结构体记录。

../images/otel-11.png

这些日志并不是业务日志,它拥有所有生成TraceID的记录,复制粘贴它携带的TraceID去Tempo搜索就能看到查询的接口链路。但该日志与业务日志本身没有关联,这样显然是有很多问题存在的:

  1. 大量的生成TraceID的日志,存储成本太高。
  2. TraceID与业务日志没有进行关联,使用上不方便。
  3. 没有接入opentelemetry,架构松散不易维护。

于是,在我们公司爬坑的过程中,将日志流转改为了如下流程:

../images/otel-loki-1.png

在这套架构下,有哪些改变:

  1. 之前的架构,获取了业务日志、容器日志、TraceID日志,现在只存储业务日志。
  2. 之前是由页面获取接口,查询接口生成的TraceID,拿去Tempo查询链路,现在是日志关联TraceID,点击日志然后查询Tempo即可。
  3. 省略了promtail服务,通过javaagent抓取日志,与trace一同流转到opentelemetry。
  4. agent抓取的日志是json字符串格式,阅读不太方便,可通过grafana面板弥补一些。

接下来就来看看具体过程吧。

距离上次研究和测试opentelemetry已经有4个多月了,opentelemetry已经从0.60.0版本升级到了0.72.0,而我部署的方式也就是operator的版本也升级到了0.70.0,javaagent也从1.19升级到了1.23,可以看出这项技术目前还是处于高速发展的阶段。首先我将这些服务全部升级一遍,使用当前最新版本,过程省略,可以从上文中查找,大多都是根据官网提供的方式去做,过程中有些小坑,但也不麻烦就不列出了,下面来看配置文件。

opentelemetry配置文件

因为我用的operator,所以配置包含在部署文件里

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: otel
  namespace: opentelemetry
spec:
  image: otel/opentelemetry-collector-contrib:0.72.0
  config: |
    receivers:
      jaeger:
        protocols:
          grpc:
          thrift_binary:
          thrift_compact:
          thrift_http:
      otlp:
        protocols:
          grpc:
          http:
    exporters:
      logging:
        loglevel: debug
      otlp:
        endpoint: tempo-tempo-distributed-distributor.tempo:4317
        tls:
          insecure: true
      loki:
        endpoint: http://loki.loki/loki/api/v1/push
        tls:
          insecure: true
    
    extensions:
    
    service:
      extensions:
      pipelines:
        traces:
          receivers: [otlp]
          exporters: [otlp]
        logs:
          receivers: [otlp]
          exporters: [loki]    

在原来的基础上把pipeline的logging全部去掉了,其余不变。

javaagent配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
        - name: Options
          value: -javaagent:/tmp/opentelemetry-javaagent.jar -Dotel.resource.attributes=service.name=app
        - name: OTEL_EXPORTER_OTLP_COMPRESSION
          value: gzip
        - name: OTEL_EXPORTER_OTLP_ENDPOINT
          value: http://otel-collector-headless.opentelemetry:4317
        - name: OTEL_EXPORTER_OTLP_LOGS_ENDPOINT
          value: http://otel-collector-headless.opentelemetry:4317
        - name: OTEL_LOGS_EXPORTER
          value: otlp

爬坑过程中,OTEL_LOGS_EXPORTER这个配置卡了我1个多小时,没有默认配置,必须要手动添加,opentelemetry才能收到业务日志。

效果如下

配置grafana的Fields,关联Tempo

../images/otel-loki-3.png

查询日志

../images/otel-loki-4.png

../images/otel-loki-5.png

这些都是业务日志

点开带有traceID的日志

../images/otel-loki-6.png

点击TraceID进行跳转

../images/otel-loki-7.png

到这里就完成了