JAVA 服务可观测性最佳实践

前言

本次实践主要是介绍 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 service -R

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

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

日志接入

- Logback 日志格式调整

主要是调整 `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

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

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

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

- 应用启动参数

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

-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

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

- JVM 监控视图

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容