JAVA 服务可观测性最佳实践

Java应用全面可观测实践:无侵入式接入观测云与DDTrace
本文介绍了如何通过无侵入方式在Ubuntu系统上的Java应用(基于JDK11和SpringBoot)接入观测云,包括应用链路、日志、JVM指标和Profiling的接入步骤,以及如何配置Logback、DDTrace和StatsD等工具来实现全面的可观测性。

前言

本次实践主要是介绍 Java 服务通过无侵入的方式接入观测云进行全面的可观测。

环境信息

  • 系统环境:Ubuntu(主机环境)
  • 开发语言:JDK 11.0.18
  • Web 框架:SpringBoot
  • 日志框架:Logback
  • APM 探针:DDTrace

实现目标

  • 应用链路接入
  • 应用日志接入
  • JVM 指标接入
  • Profiling 接入

对 JDK 有版本要求,具体参考文档: docs.guance.com/integration…

接入方案

准备工作

安装 DataKit
 

ini

复制代码

# 需要把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 service -R

通过 datakit monitor 命令可以观察到采集器是否启动成功。

红色为采集器,下面各种接入都会开启采集器,每个采集器都需要重启 DataKit 。

日志接入

  • Logback 日志格式调整

主要是调整 pattern ,新增三个参数 %X{dd.service} %X{dd.trace_id} %X{dd.span_id} ,部分配置如下:

 

xml

复制代码

<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 。

  • 配置应用日志目录
 

ini

复制代码

logfiles = [ "/home/liurui/code/observable-demo/logs/server/server.log" ] # 服务名称,非必填 service = "server" ## Grok pipeline script name. pipeline = "server.p"

  • 配置 pipeline

日志 pipeline 用于解析日志格式

解析脚本

 

yaml

复制代码

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 采集器

DDTrace 采集器用于采集链路信息,进入到 DataKit 安装目录下,执行 conf.d/ddtrace/ ,复制 ddtrace.conf.sample 并重命名为 ddtrace.conf 即可 。

  • 应用启动参数
 

ini

复制代码

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 采集器

StatsD 采集器用于采集指标信息,进入到 DataKit 安装目录下,执行 conf.d/statsd/ ,复制 statsd.conf.sample 并重命名为 statsd.conf 即可,默认端口为 8125 。

按照链路的启动方式启动应用即可。

Profiling 接入

  • 开启 Profile 采集器

Profiling 采集器主要用于采集应用性能数据,如 java 的 jfr。进入到 DataKit 安装目录下,执行 conf.d/profile/ ,复制 profile.conf.sample 并重命名为 profile.conf 。

  • 应用启动参数

主要是调整参数,添加以下参数。

 

ini

复制代码

-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 相关参数。

 

ini

复制代码

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

通过 Profiling 能更详细的追溯堆栈问题,从而更好的优化代码、提升性能。

  • JVM 监控视图

可以分析 java 在内存、cpu 等分配使用情况。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值