观测云对接 OpenTelemetry 最佳实践
通过 OpenTelemetry exporter 方式,上报数据到观测云进行可视化分析。
观测云支持多种方式来接入 OpenTelemetry 上报的数据,比如通过 OpenTelemetry Collector ,也可以直接通过 exporter 方式上报。本次最佳实践主要通过 exporter 方式进行上报,架构如下:

- 免费开通观测云
- 安装 DataKit
- DataKit 开启 opentelemetry 采集器
- DataKit 开启 log采集器
- 准备应用,接入 opentelemetry-javaagent,上报至 DataKit 。
DataKit
1、安装 DataKit
参考链接:https://docs.guance.com/datakit/datakit-install/
2、opentelemetry 采集器
进入 DataKit 安装目录下的 conf.d/opentelemetry 目录,复制 opentelemetry.conf.sample 并命名为 opentelemetry.conf ,主要调整以下配置:
[inputs.opentelemetry.http]
enable = true
http_status_ok = 200
trace_api = "/otel/v1/trace"
metric_api = "/otel/v1/metric"
## OTEL agent GRPC config for trace and metrics.
## GRPC services for trace and metrics can be enabled respectively as setting either to be true.
## add is the listening on address for GRPC server.
[inputs.opentelemetry.grpc]
trace_enable = true
metric_enable = true
addr = "0.0.0.0:4317"
从上面配置可以看出,opentelemetry 采集器支持两种协议 :
- GRPC:4317 端口,也可以自行调整。
- HTTP:9529 端口,是 DataKit 的端口,访问地址是
http://localhost:9529/otel/v1/trace。
3、log 采集器
用于采集应用日志信息,进入 DataKit 安装目录下的 conf.d/log 目录,复制 logging.conf.sample 并命名为 logging.conf 。示例如下:
[[inputs.logging]]
# 日志文件列表,可以指定绝对路径,支持使用 glob 规则进行批量指定
# 推荐使用绝对路径
logfiles = [
"/home/code/observable-demo/logs/server/server.log",
]
......
注意日志路径和文件名,也可以支持通配符的方式。
4、重启 Datakit
datakit service -R
应用接入 OpenTelemetry
准备一个应用,这里主要演示 java 环境下接入 OpenTelemetry。
- 下载 opentelemetry-javaagent
建议下载观测云版本的 opentelemetry-javaagent。 https://github.com/GuanceCloud/opentelemetry-java-instrumentation/releases
- 调整日志输出格式
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<springProperty scope="context" name="LOG_HOME" source="logback.home"/>
<!-- <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] %X{dd.service} %X{dd.trace_id} %X{dd.span_id} - %msg%n" />-->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] %X{trace_id} %X{span_id} - %msg%n" />
<!-- <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] [traceId=%X{trace_id} spanId=%X{span_id}] - %msg%n" />-->
<springProperty scope="context" name="logName" source="spring.application.name" defaultValue="Springboot"/>
<!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,,,, -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/${logName}/${logName}.log</file> <!-- 使用方法 -->
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/${logName}/${logName}-%d{yyyy-MM-dd}.log.%i</fileNamePattern>
<maxFileSize>64MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 只打印error级别的内容 -->
<logger name="net.sf.json" level="ERROR" />
<logger name="org.springframework" level="ERROR" />
<!-- <logger name="io.opentelemetry" level="DEBUG" />-->
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
主要是在 logback.xml 上调整 pattern 格式 %X{trace_id} %X{span_id} ,用于日志和链路的关联。
- 启动应用
java \
-javaagent:/home/liurui/code/opentelemetry-java-instrumentation/javaagent/build/libs/opentelemetry-javaagent-1.31.0.jar \
-Dotel.traces.exporter=otlp \
-Dotel.exporter.otlp.protocol=grpc \
-Dotel.exporter.otlp.endpoint=http://localhost:4317 \
-Dotel.resource.attributes=service.name=springboot \
-jar springboot-server.jar
观测云效果
- 链路列表
可以看到所有链路相关的数据

查看链路详情,可以关联到对应的日志信息

- 日志

- Opentelemetry JVM 视图
Opentelemetry JVM 视图是基于 Opentelemetry 上报的指标信息进行绘制的视图模版,可以选择对应的模版进行 clone。


Contact us
Join the community
to join the community
Try Guance
Start online and pay only for what you use.
Get startedChoose a Guance plan