JAVA 服务可观测性最佳实践

前言

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

环境信息

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

实现目标

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

对 JDK 有版本要求,具体参考文档: Java - 观测云文档

接入方案

准备工作

安装 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 等分配使用情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/538746.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【自监督学习算法】

【自监督学习算法】 什么是自监督学习 (SSL) 算法? 自监督学习 (SSL)是一种不断发展的机器学习技术,旨在解决过度依赖标记数据带来的挑战。多年来,使用机器学习方法构建智能系统在很大程度上依赖于高质量的标记数据。因此,高质量注释数据的成本是整个训练过程中的主要…

HarmonyOS系统开发基础环境搭建

目录 一 鸿蒙介绍&#xff1a; 1.1 HarmonyOS系统 1.2 HarmonyOS软件编程语言 二 HarmonyOS编程环境搭建 1.1 官网下载地址 1.2搭建开发流程 1.3 创建安装目录 1.4 下载DevEco Studio​编辑 1.5 下载后点击安装 1.6 自动添加桌面快捷和bin路径 ​编辑1.7 安装好运行 …

程序员注意“进厂”时机!!鸿蒙生态已进入第二发展阶段

自打今年1月份鸿蒙宣布星河版发布后&#xff0c;已经有200家大型互联网企业展开鸿蒙原生合作。就在今天的3月14日&#xff0c;继钉钉、高德、淘宝、UC浏览器、夸克等app应用启动鸿蒙原生开发后。又迎来阿里旗下多款应用与华为举行鸿蒙合作签约仪式&#xff0c;宣布将基于Harmon…

UnityShader常用算法笔记(颜色叠加混合、RGB-HSV-HSL的转换、重映射、UV序列帧动画采样等,持续更新中)

一.颜色叠加混合 1.Blend混合 // 正常&#xff0c;透明度混合 Normal Blend SrcAlpha OneMinusSrcAlpha //柔和叠加 Soft Additive Blend OneMinusDstColor One //正片叠底 相乘 Multiply Blend DstColor Zero //两倍叠加 相加 2x Multiply Blend DstColor SrcColor //变暗…

HTML常用布局标签:提升网页颜值!不可不知的HTML布局技巧全解析!

在HTML的世界里&#xff0c;一切都是由容器和内容构成的。容器&#xff0c;就如同一个个盒子&#xff0c;用来装载各种元素&#xff1b;而内容&#xff0c;则是这些盒子里的珍宝。理解了这一点&#xff0c;我们就迈出了探索HTML布局的第一步。 在HTML中&#xff0c;布局标签主要…

leetcode刷题日志-108/1382将有序数组转换为二叉搜索树/将二叉搜索树变平衡

由于这两道题思路极其类似&#xff0c;在此统一记录&#xff1a; 108题.将有序数组转换为平衡二叉搜索树 思路&#xff1a;给定的数组已经升序排列&#xff0c;而二叉搜索树中序遍历的结果就是升序&#xff0c;但是仅凭中序遍历不能确定一颗二叉树&#xff0c;但是题目只是说…

基于HarmonyOS ArkTS中秋国庆祝福程序、以代码之名,写阖家团圆祝福

中秋、国庆双节将至&#xff0c;作为程序员&#xff0c;以代码之名&#xff0c;表达对于阖家团圆的祝福。本节将演示如何在基于HarmonyOS ArkUI的SwiperController、Image、Swiper等组件来实现节日祝福轮播程序。 规则要求具体要求如下&#xff1a; 1、根据主题&#xff0c;用…

Solidity 智能合约开发 - 基础:基础语法 基础数据类型、以及用法和示例

苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏 ←持续记录本人自学两年走过无数弯路的智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 本篇主要是做一个知识的整理和规划 作为一个类似文档的作用 更为简要和明了 具体的实现案例和用法 后续会陆续给出…

轻松驾驭时间流:MYSQL日期与时间函数的实用技巧

​&#x1f308; 个人主页&#xff1a;danci_&#x1f525; 系列专栏&#xff1a;《MYSQL应用》&#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 轻松驾驭时间流&#xff1a;MYSQL日期与时间函数的实用技巧 MYSQL日期时间函数是数据库操作中不可…

【网络安全】-数字证书

数字证书 数字证书是互联网通讯中用于标志通讯各方身份信息的一串数字或数据&#xff0c;它为网络应用提供了一种验证通信实体身份的方式。具体来说&#xff0c;数字证书是由权威的证书授权&#xff08;CA&#xff09;中心签发的&#xff0c;包含公开密钥拥有者信息以及公开密…

搭建项目前端系统基础架构

Vue是什么 Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。目前市面上有很多基于Vue重新封装的各种前端UI框…

MySQL死锁案例分析及避免办法

1. 什么是死锁2. 举个栗子&#xff1a;2.1. 栗子一&#xff1a;2.1.1 代码栗子&#xff1a;2.1.2 存储引擎状态分析2.1.2.1 第一部分&#xff1a;2.1.2.2 第二部分&#xff1a;2.1.2.3 第三部分&#xff1a; 2.1.3 解决方式2.1.3.1 注意资源的获取顺序2.1.3.2 大事务拆小 2.2. …