免费域名网站黄的免费,网页游戏网站模板,做五金建材市场的网站,深圳市交易服务中心1. 下载Agents
https://archive.apache.org/dist/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz 2. 上传到服务器解压
在Spring Cloud项目中#xff0c;每部署一个服务时#xff0c;就拷贝一份skywalking的agent文件到该服务器上并解压。不管是部署…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.jaragent.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_nameskywalking_demo_test -Dskywalking.collector.backend_service192.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相关的依赖包
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scopeexclusionsexclusionartifactIdspring-boot-starter-logging/artifactIdgroupIdorg.springframework.boot/groupId/exclusion/exclusions/dependency!--引入log4j2依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-log4j2/artifactId/dependencydependencygroupIdorg.apache.skywalking/groupIdartifactIdapm-toolkit-log4j-2.x/artifactIdversion9.0.0/version/dependency!--apm 工具包--dependencygroupIdorg.apache.skywalking/groupIdartifactIdapm-toolkit-trace/artifactIdversion9.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;PostConstructSuppressWarnings(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 CoreSubscriberObject actual;public MdcSubscriber(CoreSubscriberObject actual) {this.actual actual;}Overridepublic void onSubscribe(Subscription s) {actual.onSubscribe(s);}Overridepublic void onNext(Object o) {Context c actual.currentContext();OptionalString 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 MapString, Object beanToMap(T bean) {MapString, 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 version1.0 encodingUTF-8?
ConfigurationPropertiesProperty namePATTERN value[%d{yyyy-MM-dd HH:mm:ss.SSS}] [TID: %equals{%X{traceId}}{}{N/A}] [%logger{36}] [%thread] [%-5level] %msg%n//PropertiesAppendersConsole nameConsole targetSYSTEM_OUTPatternLayout pattern${PATTERN}//ConsoleAsync nameAsyncAppenderRef refConsole//Async!--输出到日志文件滚动分割日志文件自动打包gz --RollingFile nameINFO_FILE fileNamelogs/gateway-info1.log filePattern$logs/gateway-%d{yyyyMMdd}.log.%iPatternLayout pattern${PATTERN}/Policies!--默认一天一个文件 --TimeBasedTriggeringPolicy /!--一天内大于size就单独分隔--SizeBasedTriggeringPolicy size500MB//Policies/RollingFile!--skywalking 日志收集 --GRPCLogClientAppender nameAPM_LOGPatternLayout pattern${PATTERN}//GRPCLogClientAppender/AppendersLoggersRoot levelINFOAppenderRef refConsole/AppenderRef refINFO_FILE/AppenderRef refAPM_LOG//Root/Loggers
/Configuration
4.2.4. 启动
启动gateway服务发起http请求可以看到日志中已经出现traceId 要注意的是在skywalking控制台看日志时是没有traceid的这一点和普通的springboot项目不同
如下图所示gateway服务的日志 traceId只能在内容里面查看 4.2.5. 完成