当前位置: 首页 > news >正文

详解最新链路追踪skywalking框架介绍、架构、环境本地部署配置、整合微服务springcloudalibaba 、日志收集、自定义链路追踪、告警等

1.skywalking介绍

  • 多种监控手段,可以通过语言探针和service mesh 获得监控数据
  • 支持多种语言自动探针,包含java/net/nodejs
  • 轻量高效,无需大数据平台和大量的服务器资源
  • 模块化,UI、存储、集群管理都有多种机制可选
  • 支持告警
  • 优秀的可视化解决方案

整体架构
在这里插入图片描述

  • 上部分 Agent :负责从应用中收集链路信息,发送给SkyWalking OAP服务器,目前支持SkyWalking、Zikpin、Jaeger等提供的Tracing 数据信息。而目前采用的是SkyWalking Agent收集 SkyWalking Tracing数据,传递给服务器

  • 下部分SkyWalking OAP :负责接收Agent发送的Tracing数据信息,然后进行分析(Analysis Core) ,存储到外部存储器(Storage ),最终提供查询( Query )功能

  • 右部分 Storage :Tracing 数据存储。目前支持ES、MySQL、Sharding Sphere、TiDB、H2多种存储器,目前采用的是 ES ,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主

  • 左部分 SkyWalking UI :负责提供控台,查看链路等等

skywalking demo
默认登录账户: skywalking skywalking

https://demo.skywalking.apache.org/

资料

官网:https://skywalking.apache.org/

下载 skywalking本地安装包:
https://skywalking.apache.org/downloads/

文档:https://skywalking.apache.org/docs/#SkyWalking

github: https://github.com/apache/skywalking

https://skywalking.apache.org/docs/main/latest/en/setup/backend/backend-setup/#applicationyml

  1. SkyWalking 环境搭建部署(单机版)

在这里插入图片描述
1.安装elasticSearch

  • 参考之前博文安装&启动
    elasticsearch.bat 或者elasticsearch.sh启动服务

  • 访问默认地址:http://localhost:9200/

2.搭建skywalking 服务

  • 下载skywalking 安装包

    对于 SkyWalking 的软件包,有两种方式获取:

    • 手动编译
    • 官方包 (建议官方包,bug少)
  • 修改 skywalking config目录application.yml配置
    在这里插入图片描述
    在这里插入图片描述

  • 修改skywalking 安装目录中的webapp目录中的webapp.yml配置
    在这里插入图片描述

  • 启动skywalking server &webapp 执行如下命令:
    在这里插入图片描述
    备注说明:如果启动有问题,可以查看日志
    在这里插入图片描述

  • skywalking ui访问地址:
    默认 http://localhost:8080
    在这里插入图片描述
    3.启动一个 Spring Boot 应用,并配置 SkyWalking Agent

首先,下载skywalking agent 包如下:
在这里插入图片描述
在这里插入图片描述
其次,启动探针

通过探针方式配置微服务链路追踪*

   java -javaagent:/path/to/skywalking-agent.jar \-Dskywalking.agent.service_name=order-service \-Dskywalking.collector.backend_service=localhost:11800 \-jar order-service.jar

linux启动
在这里插入图片描述
idea中配置探针

#设置skywalking-agent.jar路径
-javaagent:D:\resource\skywalking\skywalking-agent\skywalking-agent.jar
#在skywalking上显示微服务名称
-DSW_AGENT_NAME=wemedia-oss-user
#skywalking的collector服务的ip以及端口
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800

在这里插入图片描述
启动服务之后,调用服务api:http://127.0.0.1:8889/api/user/vipRecharge ,在skywalking ui上查看服务如下:
在这里插入图片描述
查看拓扑图如下:
在这里插入图片描述
发现拓扑图不显示gateway服务,分析这是skywalking的bug,解决方法:
到agent optional-plugins目录下 复制最新的gateway lib到agent plugins目录里
在这里插入图片描述
在这里插入图片描述
重启skywalking

重启微服务

重新访问接口微服务:http://127.0.0.1:8889/api/user/vipRecharge

再次访问skywalking ui:
在这里插入图片描述

3.skywalking 日志收集

  1. 引入skywalking日志收集依赖

        <!--skywalking 日志收集,引入工具类--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>9.3.0</version></dependency>
    
  2. 调整logback-spring.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod=" 5 seconds"><!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径,请根据需求配置路径--><springProperty scope="context" name="log.path" source="path.log"/><springProperty scope="context" name="app.anme" source="spring.application.name"/><property name="app.name" value="${app.anme}"/><!-- 业务日志路径--><property name="logging.path" value="${log.path}"/><!-- 系统日志路径--><property name="system.log" value="system"/><!-- 日志保存时间(天) --><property name="log.save.time.day" value="30"/><!-- 彩色日志依赖的渲染类 --><conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /><conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /><conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /><!-- 彩色日志格式 --><property name="CONSOLE_LOG_PATTERN"value="${app.name} >> ${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}]){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(LN:%L){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" /><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><!--把控制台的日志输出到sKywalking--><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><pattern>${CONSOLE_LOG_PATTERN}</pattern></layout><!--            <pattern>${CONSOLE_LOG_PATTERN}</pattern>--><charset>utf8</charset></encoder></appender><appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"><discardingThreshold>0</discardingThreshold><queueSize>1024</queueSize><neverBlock>true</neverBlock><appender-ref ref="STDOUT"/></appender><!--skywalking日志上报--><appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><pattern>${CONSOLE_LOG_PATTERN}</pattern></layout><charset>utf8</charset></encoder></appender><!-- 按照每天生成日志文件 --><appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-info.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志文件输出的文件名--><FileNamePattern>${log.path}/sys-info-%d{yyyy-MM-dd}.log</FileNamePattern><!--日志文件保留天数--><MaxHistory>${log.save.time.day}</MaxHistory></rollingPolicy><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern></layout></encoder></appender><!-- 系统错误日志 --><appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-error.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>${log.save.time.day}</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>ERROR</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><!-- 显示形成的sql、使用的参数、结果集 生产环境需要删掉 --><logger name="java.sql" level="debug"/><logger name="org.springframework.jdbc" level="debug"/><!-- 日志输出级别  ,注意:如果不写<appender-ref ref="FILE" /> ,将导致springbootadmin找不到文件,无法查看日志 --><root level="INFO"><appender-ref ref="grpc-log" /><appender-ref ref="ASYNC" /><appender-ref ref="FILE"/></root></configuration>

备注说明: [%X{tid}] :添加skywalking 追踪id,方便追踪整个调用链路

  1. 访问接口,查看skywalking ui log界面,日志正常显示如下:
    在这里插入图片描述

4.skywalking 自定义链路追踪

  • 自定义链路追踪主要是为了对项目中的业务方法,实现链路追踪,方便排查问题

  • 引入依赖

     <!--自定义skywalking链路,引入工具类--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>9.3.0</version></dependency>
    
  • 自定义链路
    方法1:使用@Trace注解在要追踪的接口上,只需要记录方法的出参 ,入参;如果要打印返回结果,一定要重写返回结果toString()方法,不然返回对象的地址

加入@Tags或@Tag记录参数和返回信息
​ @Tag注解中key= 方法名 value= returnedObj 返回值 arg[0] 参数
在这里插入图片描述

/***
*controller方法
*/@GetMapping("/vipRecharge")public CommonResult<String> vipReCharge() {userService.vipReCharge("123");return CommonResult.success("vip用户充值成功!");}/***
* servrice方法
*/@Trace@Tags({@Tag(key = "vipReCharge",value = "returnedObj"),@Tag(key = "vipReCharge",value = "arg[0]")})@SentinelResource(value = "vipReCharge",blockHandler ="vipReChargeFallback" )@Overridepublic CommonResult<String> vipReCharge(String num) {List<TUser> userList=tUserMapper.selectAll();System.out.println("userList:"+userList.size());CommonResult<String> result=payFeignApi.callWechatPay();System.out.println("调用第三方payFeignApi.callWechatPay 返回结果:"+result);return CommonResult.success("调用支付服务成功!");}

再次查看skywalking链路追踪trace,发现上面该方法已经被加载进链路中
在这里插入图片描述

增加Tags之后, 查看方法请求和返回值

在这里插入图片描述

方法2:编码的方式,适合逻辑比较多,多个地方需要记录一些参数或关键信息,info,debug 或堆栈日志等

使用skywalking 的 ActiveSpan.error(); ActiveSpan.info();ActiveSpan.debug()等在需要追踪的关键地方记录日志

    @GetMapping("/callWechatPay")public CommonResult<String> callWechatPay(HttpServletRequest request) {log.info("X-Token value:"+request.getHeader("X-Token"));ActiveSpan.tag("PayController.callWechatPay()","调用支付controller中callWechatPay()方法!");try {//模拟异常情况:int i=10/0;
//            TimeUnit.SECONDS.sleep(2);} catch (Exception e) {//ActiveSpan.error();//skywalking追踪事件为error级别 或debug或info级别// ActiveSpan.error("是除零异常");//错误messageActiveSpan.error(new RuntimeException("是除零异常"));// throw new RuntimeException(e);}return CommonResult.success("调用微信支付成功!");}

再次查看skywalking ui结果如下:

在这里插入图片描述

方法3 使用OpenTracing Java API定义链路追踪

  1. 在pom文件中引入依赖

     <dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-opentracing</artifactId><version>9.3.0</version></dependency>
    
  2. 在代码中增加自定义的链路追踪代码,最后一定要进行finish,否则也收集不到信息。

    //在service中增加自定义链路追踪代码 @Overridepublic CommonResult<String> vipReCharge(String num) {//在代码中使用opentracing代码自定义链路追踪Tracer tracer=new SkywalkingTracer();Tracer.SpanBuilder spanBuilder=tracer.buildSpan("UserServiceImpl.vipRecharge(String num)方法");Span span=spanBuilder.withTag("startTag",false).startManual();List<TUser> userList=tUserMapper.selectAll();System.out.println("userList:"+userList.size());CommonResult<String> result=payFeignApi.callWechatPay();System.out.println("调用第三方payFeignApi.callWechatPay 返回结果:"+result);span.log("调用第三方payFeignApi.callWechatPay 返回结果:"+result);span.finish();return CommonResult.success("调用支付服务成功!");}
    
  3. 查看结果如下:
    在这里插入图片描述

5.skywalking 告警

在这里插入图片描述

配置告警接口:

在这里插入图片描述

实现高级接口nofity或go-wechat

6.参考资料

  • SkyWalking 极简入门:https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/

    https://github.com/SkyAPM/document-cn-translation-of-skywalking/blob/master/docs/zh/8.0.0/setup/backend/backend-setup.md

  • 本地安装参考文档:https://blog.csdn.net/seashouwang/article/details/111156985

  • 分布式监控Skywalking安装及使用教程:
    https://blog.csdn.net/m0_74825488/article/details/145787488?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-145787488-blog-111156985.235

  • skywalking 中文教程 https://www.echo.cool/docs/category/skywalking-%E6%95%99%E7%A8%8B

相关文章:

  • Java学习手册:Java开发常用的内置工具类包
  • Python函数基础:简介,函数的定义,函数的调用和传入参数,函数的返回值
  • C语言学习之调试
  • 测试基础笔记第十三天
  • 第八部分:缓解 RAG 中的幻觉
  • 6.2 内容生成与营销:个性化内容创作与营销策略优化
  • 常见cmd命令
  • 3.1/Q1,Charls最新文章解读
  • Buffer Pool是什么,有什么作用
  • priority_queue的学习
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十四章 集合框架:告别手写链表的苦役
  • Eigen迭代求解器类
  • 对卡尔曼滤波的理解和简单示例实现
  • 服务器虚拟化:技术解析与实践指南
  • 2025蓝桥省赛c++B组第二场题解
  • python 与Redis操作整理
  • Android HAL HIDL
  • matplotlib画图工具使用(1) 画折线统计图python代码
  • 推论阶梯——AI与思维模型【81】
  • 【SpringBoot】WebConfig 跨域配置详细说明
  • 上海市委常委会传达学习总书记重要讲话精神,研究张江科学城建设等事项
  • VR数字沉浸体验又添新节目,泰坦尼克号驶进文旅元宇宙
  • “世纪火种”嘉年华启动,69家单位加入阅读“朋友圈”
  • 政治局会议:持续稳定和活跃资本市场
  • 谷歌一季度利润增超四成:云业务利润率上升,宏观环境可能影响广告业务
  • 帕力旦·吐尔逊已任喀什大学党委副书记、校长