SpringCloud集成Skywalking链路追踪和日志收集

1. 下载Agents

https://archive.apache.org/dist/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz

2. 上传到服务器解压

在Spring Cloud项目中,每部署一个服务时,就拷贝一份skywalking的agent文件到该服务器上并解压。不管是部署注册中心、网关、还是其它服务,都这么做,无论一个服务器部署多少个微服务,有一份就行。

3. 集成链路追踪

3.1. 修改Spring Boot启动参数

springcloud/springboot 一般是通过 java -jar xxx.jar 进行启动。我们只需要在其中加上 -javaagent 参数即可,格式如下面

java  -javaagent:上一步解压目录/agent/skywalking-agent.jar=agent.service_name=自定义服务名,collector.backend_service=服务ip:11800 -jar xxx.jar

说明

-javaagent后是skywalking-agent.jar的绝对路径,在apache-skywalking-java-agent-9.0.0.tgz解压后的包中

-Dskywalking.agent.service_name是服务的名称,自定义,一般用spring.application.name

-Dskywalking.collector.backend_service是指skywalking oap服务器的ip和端口号

示例

java -javaagent:F:\project\git\agent\skywalking-agent\skywalking-agent.jar -Dskywalking.agent.service_name=skywalking_demo_test  -Dskywalking.collector.backend_service=192.168.110.155:11800  -jar skywaking_demo.jar

启动springboot项目,然后查看控制台或文件中的日志

bash start.sh

3.2. Gateway集成Skywalking链路追踪

其他服务已经完成链路追踪功能,只有gateway服务需要特殊配置一下。

问题:Spring Cloud Gateway是基于WebFlux实现的,Skywalking默认不支持,在链路上是不展示gateway组件的

链路图如下图所示

解决方案如下

把agent/optional-plugins下面的两个插件

apm-spring-cloud-gateway-x.x-plugin-x.0.0.jar、apm-spring-webflux-x.x-plugin-x.0.0.jar

根据你的Spring Cloud Gateway版本选择合适的版本拷贝到agent/plugin目录下

,比如我的gateway版本为3.1.4,则拷贝apm-spring-cloud-gateway-3.x-plugin-9.0.0.jar、apm-spring-webflux-5.x-plugin-9.0.0.jar到plugin目录下

然后重启gateway服务

重新发起请求,链路图如下

4. 配置日志收集

需要先完成第三步 配置链路追踪,不然无法打印日志。

4.1. 普通SpingBoot项目配置

这里的普通springboot项目是指除gateway服务以外的其他服务

参考:SpringBoot集成Skywalking日志收集-CSDN博客

4.2. Spring Cloud Gateway日志收集配置

目前Spring Cloud Gateway服务日志会丢失TraceId,现在的解决方案如下

4.2.1. 修改POM文件

日志更换为log4j2,引入skywalking相关的依赖包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><artifactId>spring-boot-starter-logging</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions></dependency><!--引入log4j2依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-log4j-2.x</artifactId><version>9.0.0</version></dependency><!--apm 工具包--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>9.0.0</version></dependency>

4.2.2. 增加如下两个配置类

LogHooks.java

package com.szc.gateway.logconfig;import org.springframework.stereotype.Component;
import reactor.core.publisher.Operators;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;@Component
public class LogHooks {private static final String KEY = "logMdc";@PostConstruct@SuppressWarnings("unchecked")public void setHook() {reactor.core.publisher.Hooks.onEachOperator(KEY,Operators.lift((scannable, coreSubscriber) -> new MdcSubscriber(coreSubscriber)));}@PreDestroypublic void resetHook() {reactor.core.publisher.Hooks.resetOnEachOperator(KEY);}}

MdcSubscriber.java

package com.szc.gateway.logconfig;import org.reactivestreams.Subscription;
import org.slf4j.MDC;
import org.springframework.cglib.beans.BeanMap;
import reactor.core.CoreSubscriber;
import reactor.util.context.Context;import java.util.HashMap;
import java.util.Map;
import java.util.Optional;public class MdcSubscriber implements CoreSubscriber {private static final String TRACE_ID = "traceId";private static final String SKYWALKING_CTX_SNAPSHOT = "SKYWALKING_CONTEXT_SNAPSHOT";private final CoreSubscriber<Object> actual;public MdcSubscriber(CoreSubscriber<Object> actual) {this.actual = actual;}@Overridepublic void onSubscribe(Subscription s) {actual.onSubscribe(s);}@Overridepublic void onNext(Object o) {Context c = actual.currentContext();Optional<String> traceIdOptional = Optional.empty();if (!c.isEmpty() && c.hasKey(SKYWALKING_CTX_SNAPSHOT)) {traceIdOptional = Optional.of(c.get(SKYWALKING_CTX_SNAPSHOT)).map(MdcSubscriber::beanToMap).map(t -> t.get(TRACE_ID)).map(MdcSubscriber::beanToMap).map(t -> t.get("id")).map(Object::toString);}try (MDC.MDCCloseable cMdc = MDC.putCloseable(TRACE_ID, traceIdOptional.orElse("N/A"))) {actual.onNext(o);}}@Overridepublic void onError(Throwable throwable) {actual.onError(throwable);}@Overridepublic void onComplete() {actual.onComplete();}@Overridepublic Context currentContext() {return actual.currentContext();}public static <T> Map<String, Object> beanToMap(T bean) {Map<String, Object> map = new HashMap<>();if (bean != null) {BeanMap beanMap = BeanMap.create(bean);for (Object key : beanMap.keySet()) {if (key.equals("traceId") || key.equals("id")) {map.put(key.toString(), beanMap.get(key));}}}return map;}}

4.2.3. 增加log4j2日志配置文件

log4j2.xml内容

<?xml version="1.0" encoding="UTF-8"?>
<Configuration><Properties><Property name="PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [TID: %equals{%X{traceId}}{}{N/A}] [%logger{36}] [%thread] [%-5level] %msg%n"/></Properties><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="${PATTERN}"/></Console><Async name="Async"><AppenderRef ref="Console"/></Async><!--输出到日志文件,滚动分割日志文件,自动打包gz --><RollingFile name="INFO_FILE" fileName="logs/gateway-info1.log" filePattern="$logs/gateway-%d{yyyyMMdd}.log.%i"><PatternLayout pattern="${PATTERN}"/><Policies><!--默认一天一个文件 --><TimeBasedTriggeringPolicy /><!--一天内大于size就单独分隔--><SizeBasedTriggeringPolicy size="500MB"/></Policies></RollingFile><!--skywalking 日志收集 --><GRPCLogClientAppender name="APM_LOG"><PatternLayout pattern="${PATTERN}"/></GRPCLogClientAppender></Appenders><Loggers><Root level="INFO"><AppenderRef ref="Console"/><AppenderRef ref="INFO_FILE"/><AppenderRef ref="APM_LOG"/></Root></Loggers>
</Configuration>

4.2.4. 启动

启动gateway服务,发起http请求,可以看到日志中已经出现traceId

要注意的是,在skywalking控制台看日志时,是没有traceid的,这一点和普通的springboot项目不同

如下图所示,gateway服务的日志 traceId只能在内容里面查看

4.2.5. 完成

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

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

相关文章

基于PyAutoGUI图片定位的自动化截图工具--jmeter部分

1、计划 压测完成后需要编写性能测试报告&#xff0c;报告中所需数据截图较多&#xff0c;使用自动化操作方便快捷&#xff0c;就编写一个界面工具以便后续复用。之前编写过loadrunner报告的自动化截图脚本&#xff0c;现在用jmeter也比较多&#xff0c;就编写jmeter部分&#…

3V升9V3串LED驱动恒流WT7012

3V升9V3串LED驱动恒流WT7012 WT7012是一款性能卓越的升压转换器&#xff0c;设计用于驱动多达七串的白光LED。该器件具备宽输入工作电压范围(2-24V)&#xff0c;使其在单节或多节锂电池供电的应用中能够稳定提供背光。WT7012支持从3V起升至6V、9V、12V的恒流输出&#xff0c;通…

sqlserver问题记录

今天在利用sql查询数据时出现如下错误 在执行批处理时出现错误。错误消息为: 引发类型为“System.OutOfMemoryException”的异常。 症状 使用 SSMS 运行返回大量数据的 SQL 查询时&#xff0c;会收到类似于以下内容的错误消息&#xff1a; 执行批处理时出错。 错误消息为&…

Linux基础指令补全,权限问题分析—3

一、命令补全&#xff1a; 1.bc指令&#xff1a; 功能&#xff1a;命令行计算器&#xff0c;使用quit退出语法&#xff1a;bc 算式 2.uname指令&#xff1a; 语法&#xff1a;uname 选项功能&#xff1a;uname原来获取电脑或操作系统的相关信息选项&#xff1a; ①-a选项&am…

【IC前端虚拟项目】验证阶段开篇与知识预储备

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 从这篇开始进入验证阶段&#xff0c;因为很多转方向的小伙伴是转入芯片验证工程师方向的&#xff0c;所以有必要先做一个知识预储备的说明&#xff0c;或者作为验证入门的一个小指导吧。 在最开始&#…

如何做好2024年中央企业内部控制体系建设与监督工作

面对日益复杂的经济环境和全球一体化的挑战&#xff0c;中央企业作为国家经济的中流砥柱&#xff0c;必须不断提升内部控制体系的建设与执行水平。随着2024年的脚步逼近&#xff0c;中央企业需围绕国家宏观政策&#xff0c;积极采纳智能化技术&#xff0c;强化内控体系&#xf…

Redis 的数据结构和内部编码

Redis的 5 种数据类型 Redis 底层在实现上述数据结构的时候&#xff0c;会在源码层面&#xff0c;针对上述实现进行 特定的优化 &#xff0c;来达到节省时间/节省空间效果 特定的优化&#xff1a;内部的具体实现的数据结构&#xff0c;在特定场景下&#xff0c;不是其对应的标准…

运动控制卡/运动控制器的ZCAN总线ZMIO310扩展模块使用

本节课程主要分为八个部分给大家讲解ZCAN扩展模块的使用&#xff0c;分别是&#xff1a; 一、ZMIO310系列扩展模块介绍 二、ZMIO310-CAN通讯模块的接线 三、ZMIO310-CAN通讯模块介绍及拨码开关设置 四、ZMIO310子模块接线参考 五、ZMIO310-CAN扩展模块功能验证 六、ZMIO3…

新手怎么正确地做抖音小店?入门级教程来了,建议认真阅读!

大家好&#xff0c;我是电商糖果 新手做抖音小店&#xff0c;不懂小店的运营&#xff0c;总是容易走弯路&#xff0c;踩坑。 糖果这里就给大家带来&#xff0c;新手正确的入门级运营教程。 近期刚开店的朋友&#xff0c;建议认真阅读&#xff01; 第一步&#xff1a;基础后台…

探索艺术的新领域——3D线上艺术馆如何改变艺术作品的传播方式

在数字化时代的浪潮下&#xff0c;3D线上艺术馆成为艺术家们展示和传播自己作品的新平台。不仅突破了地域和物理空间的限制&#xff0c;还提供了全新的互动体验。 一、无界限的展示空间&#xff1a;艺术家的新展示平台 3D线上艺术馆通过数字化技术&#xff0c;为艺术家提供了一…

Java List基础篇

目录 前言一、常用List1.1 List1.1.1 特点1.1.2 常用API 1.2 ArrayList1.2.1 特点1.2.2 使用 1.3 LinkedList1.3.1 特点1.3.2 使用 1.4 CopyOnWriteArrayList1.4.1 特点1.4.2 使用 1.5 Arrays.asList()1.5.1 特点1.5.2 使用 二、对比总结 前言 一、常用List 1.1 List List是…

JUC常用辅助类

一、CountDownLatch 1.原理 它内部维护了一个计数器&#xff0c;该计数器初始化时设定一个数值&#xff0c;表示需要等待的线程数量。每个线程执行完特定任务后会调用CountDownLatch的countDown()方法&#xff0c;该方法会将计数器减一。同时&#xff0c;另外一个或多个线程可…

Acrel-1000DP光伏监控系统 的应用 安科瑞 许敏

摘 要&#xff1a;分布式光伏发电特指在用户场地附近建设&#xff0c;运行方式多为自发自用&#xff0c;余电上网&#xff0c;部分项目采用全额上网模式。分布式光伏全额上网的优点是可以充分利用分布式光伏发电系统的发电量&#xff0c;提高分布式光伏发电系统的利用率。发展分…

题目 2348: 信息学奥赛一本通T1436-数列分段II【二分答案】

信息学奥赛一本通T1436-数列分段II - C语言网 (dotcpp.com) #include<iostream> #include<algorithm> #include<cstring> using namespace std; #define int long long const int N1e5100; const int inf1e9; int n,m; int a[N]; bool check(int mid) {int s…

ELK、ELKF企业级日志分析系统介绍

前言 随着企业级应用系统日益复杂&#xff0c;随之产生的海量日志数据。传统的日志管理和分析手段&#xff0c;难以做到高效检索、实时监控以及深度挖掘潜在价值。在此背景下&#xff0c;ELK日志分析系统应运而生。"Elastic" 是指 Elastic 公司所提供的一系列与搜索…

总体标准差、样本标准差、标准误(标准误差)

下面是样例&#xff1a; 参考文章如何做好SCI论文中的标准误差图 - 知乎 (zhihu.com)

第十四篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python自动化处理图像

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、Python自动化图像处理的优点介绍二、Python常用图像处理库和功能介绍三、强大且易于上手示例代码四、丰富的算法资源示例代码五、批量处理图片示例代码六、支持多种图像格式示例代码七、…

【LeetCode】单调栈类题目详解

所有题目均来自于LeetCode&#xff0c;刷题代码使用的Python3版本 单调栈 通常针对一维数组的问题&#xff0c;如果需要寻找一个元素右边或者左边第一个比自己大或者小的元素的位置&#xff0c;就可以使用单调栈&#xff0c;时间复杂度为O(n) 单调栈的本质是空间换时间&#…

Linux内核中常用的C语言技巧

Linux内核采用的是GCC编译器&#xff0c;GCC编译器除了支持ANSI C&#xff0c;还支持GNU C。在Linux内核中&#xff0c;许多地方都使用了GNU C语言的扩展特性&#xff0c;如typeof、__attribute__、__aligned、__builtin_等&#xff0c;这些都是GNU C语言的特性。 typeof 下面…

如何使用Jellyfin+cpolar低成本部署私人影音平台并实现无公网IP远程访问

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…