前言
本次实践主要是介绍 Java 服务通过无侵入的方式接入观测云进行全面的可观测。
环境信息
系统环境:Ubuntu(主机环境)
开发语言:JDK 11.0.18
Web 框架:SpringBoot
日志框架:Logback
APM 探针:DDTrace
实现目标
应用链路接入
应用日志接入
JVM 指标接入
Profiling 接入
对 JDK 有版本要求,具体参考文档: https://docs.guance.com/integrations/profile-java/#__tabbed_1_1
接入方案
准备工作
安装 DataKit
# 需要把token 改成观测云空间的实际token值(可在「观测云控制台」-「集成」-「Datakit」 上面获取)
DK_DATAWAY="https://openway.guance.com?token=tkn_xxxxxx" bash -c "$(curl -L https://static.guance.com/datakit/install.sh)"
复制代码
重启 DataKit
以下接入配置后都需重启 DataKit ,使配置生效,命令如下:
通过 datakit monitor
命令可以观察到采集器是否启动成功。
红色为采集器,下面各种接入都会开启采集器,每个采集器都需要重启 DataKit
。
日志接入
主要是调整 pattern
,新增三个参数 %X{dd.service} %X{dd.trace_id} %X{dd.span_id}
,部分配置如下:
<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] [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>
复制代码
Log 采集器主要用于采集日志信息,可以通过 Socket 或者 File 方式进行日志采集。进入到 DataKit 安装目录下,执行 conf.d/log/
,复制 logging.conf.sample
并重命名为 logging.conf
。
logfiles = [
"/home/liurui/code/observable-demo/logs/server/server.log"
]
# 服务名称,非必填
service = "server"
## Grok pipeline script name.
pipeline = "server.p"
复制代码
日志 pipeline 用于解析日志格式
解析脚本
grok(_, "%{TIMESTAMP_ISO8601:time} %{NOTSPACE:thread_name} %{LOGLEVEL:status}%{SPACE}%{NOTSPACE:class_name} - \\[%{NOTSPACE:method_name},%{NUMBER:line}\\] %{DATA:service_name} %{DATA:trace_id} %{DATA:span_id} - %{GREEDYDATA:msg}")
default_time(time,"Asia/Shanghai")
复制代码
可以按照实际日志格式进行调整,以上 pipeline 只适应 %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
的日志格式。
链路接入
DDTrace 采集器用于采集链路信息,进入到 DataKit 安装目录下,执行 conf.d/ddtrace/
,复制 ddtrace.conf.sample
并重命名为 ddtrace.conf
即可 。
java \
-javaagent:/home/liurui/agent/dd-java-agent-1.21.1-guance.jar \
-Ddd.service.name=server \
-Ddd.env=dev \
-Ddd.version=1.2.3
-jar springboot-server.jar
复制代码
JVM 指标接入
StatsD 采集器用于采集指标信息,进入到 DataKit 安装目录下,执行 conf.d/statsd/
,复制 statsd.conf.sample
并重命名为 statsd.conf
即可,默认端口为 8125
。
按照链路的启动方式启动应用即可。
Profiling 接入
Profiling 采集器主要用于采集应用性能数据,如 java 的 jfr。进入到 DataKit 安装目录下,执行 conf.d/profile/
,复制 profile.conf.sample
并重命名为 profile.conf
。
主要是调整参数,添加以下参数。
-Ddd.profiling.enabled=true \
-Ddd.profiling.ddprof.enabled=true \
-Ddd.profiling.ddprof.cpu.enabled=true \
-Ddd.profiling.ddprof.wall.enabled=true \
-Ddd.profiling.ddprof.alloc.enabled=true \
-Ddd.profiling.ddprof.liveheap.enabled=true \
复制代码
完整启动命令
在启动命令加上 DDTrace 相关参数。
java \
-javaagent:/home/liurui/agent/dd-java-agent-1.21.1-guance.jar \
-Ddd.service.name=server \
-Ddd.env=dev \
-Ddd.version=1.2.3 \
-Ddd.profiling.enabled=true \
-Ddd.profiling.ddprof.enabled=true \
-Ddd.profiling.ddprof.cpu.enabled=true \
-Ddd.profiling.ddprof.wall.enabled=true \
-Ddd.profiling.ddprof.alloc.enabled=true \
-Ddd.profiling.ddprof.liveheap.enabled=true \
-jar springboot-server.jar
复制代码
实践效果
应用日志基本上都采集上来了,而且日志里面还包含了 trace_id
这些信息。
通过链路可以关联到日志信息,反之亦然,实现了日志与链路的联动效果。
通过 Profiling 能更详细的追溯堆栈问题,从而更好的优化代码、提升性能。
可以分析 java 在内存、cpu 等分配使用情况。
评论