【SkyWalking】分布式服务追踪与调用链系统

news2024/12/27 19:14:39

1、基本介绍

SkyWalking是一个开源的观测平台,官网:Apache SkyWalking;

可监控:分布式追踪调用链 、jvm内存变化、监控报警、查看服务器基本配置信息。

2、SkyWalking架构原理

在整个skywalking的系统中,有三个角色:
1.skywalking agent 和业务系统(jar)关联在一起,负责收集各种监控数据;
2.skywalking oapservice负责处理监控数据,比如接受skywalking agent的监控数据,并存储在数据库中(例如elasticsearch、mysql中等);接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。,Skywalking oapservice通常以集群的形式存在;
3.skywalking webapp 前端界面,用于展示数据。

2.1、skywalking 底层原理流程

1.springboot项目启动的时候 是不需要引入任何的jar包,

2.启动springboot项目时被skywalking skywalking-agent.jar 代理拦截

        -- agent代理拦截是jdk提供的一种技术;可以使启动jar包时不需要引入任何依赖,agent就可以对java程序做业务增强,类似AOP技术,但是比AOP级别更高,agent属于监控整个java进程。

3.将rpc请求数据 发送给我们的skywalking oapservice接口项目,

4.连接到我们的skywalking webapp项目展示数据,

5.数据最终是可以持久化存放在 db或者es中。

        -- SkyWalking 默认是将数据存入在内存中,如果重启SkyWalking 数据则都会丢失。

3、skywalking 环境安装

1. 下载apache-skywalking-apm-6.5.0.tar安装包,下载链接:百度网盘 skywalking.tar  

1.1. 下载数据库链接:百度网盘 mysql-connector-java-8.0.16.jar  后续做数据持久化会用到。

2. 进入到bin目录(Windows直接双击启动startup.bat / Linix则执行startup.sh

    注:启动startup.bat = 同时启动oapService.bat 和 webappService.bat

3. 查看webapp管理界面 http://127.0.0.1:8080

4、skywalking-agent监控springboot.jar包

1. 创建一个springboot项目,并打成jar包

2. 启动springboot.jar包时指定agent目录下的skywalking-agent.jar,注意skywalking-agent.jar要写绝对路径

启动jar包命令: java -javaagent:skywalking-agent.jar -jar springboot.jar

 启动jar包命令,同时设置服务名称为server-member: 

java -javaagent:skywalking-agent.jar 

-Dskywalking.agent.service_name=server-member  -jar springboot.jar

4、测试访问几次接口,然后去SkyWalking控制台 http://127.0.0.1:8080/ 查看效果。

4.1、如何在IDEA中使用skywalking

IDEA启动配置:

-javaagent:D:\java\dev-tool\skywalking\apache-skywalking-apm-6.5.0\apache-skywalking-apm-bin\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=server-member
-Dskywalking.collector.backend_service=127.0.0.1:11800

IDEA启动服务后,调用接口,然后进入WEB页面查看效果:

5、SkyWalking获取全局追踪id


   
   
  1. <dependency >
  2. <groupId >org.apache.skywalking < /groupId >
  3. <artifactId >apm-toolkit-trace < /artifactId >
  4. <version > 6.5.0 < /version >
  5. < /dependency >

获取 TraceContext.traceId();


   
   
  1. @RequestMapping("/member")
  2. public String orderToMember (@RequestParam("id") Integer id) {
  3. // 获取request对象
  4. HttpServletRequest request = ((ServletRequestAttributes)
  5. RequestContextHolder.getRequestAttributes()).getRequest();
  6. getHeders(request);
  7. // 获取traceId
  8. String traceId = TraceContext.traceId();
  9. log.info( ">>traceId:{}<<", traceId);
  10. Integer j = 1 / id;
  11. return "我是会员服务:" + traceId + "," + j;
  12. }
  13. public static void getHeders (HttpServletRequest request) {
  14. //2.获得所有头的名称
  15. Enumeration<String> headerNames = request.getHeaderNames();
  16. while (headerNames.hasMoreElements()) { //判断是否还有下一个元素
  17. String nextElement = headerNames.nextElement(); //获取headerNames集合中的请求头
  18. String header2 = request.getHeader(nextElement); //通过请求头得到请求内容
  19. log.info( "请求头=========={}" + nextElement + "VALUE:" + header2);
  20. //System.out.println(nextElement+":"+header2);
  21. }
  22. }

6、SkyWalking告警功能

SkyWalking 告警功能是在6.x版本新增的,其核心由一组规则驱动,这些规则定义在SkyWalking目录的config/alarm-settings.yml文件中。

SkyWalking告警后会调用开发者自己定义的接口,

注:自定义的接口地址配置到alarm-settings.yml的webhooks下,当SkyWalking产生告警后会调用webhooks下的URL地址传入告警信息;

alarm-settings.yml文件预先定义了一些常用的告警规则。如下:

1.过去3分钟内服务平均响应时间超过1秒

2.服务成功率在过去2分钟内低于80%

3.服务90%响应时间在过去3分钟内低于1000毫秒

4.服务实例在过去2分钟内的平均响应时间超过1秒

5.端点平均响应时间过去2分钟超过1秒

6.1、自定义告警接口接收数据格式


   
   
  1. [{
  2. "scopeId": 1,
  3. "scope": "SERVICE",
  4. "name": "serviceA",
  5. "id0": 12,
  6. "id1": 0,
  7. "ruleName": "service_resp_time_rule",
  8. "alarmMessage": "alarmMessage xxxx",
  9. "startTime": 1560524171000
  10. }, {
  11. "scopeId": 1,
  12. "scope": "SERVICE",
  13. "name": "serviceB",
  14. "id0": 23,
  15. "id1": 0,
  16. "ruleName": "service_resp_time_rule",
  17. "alarmMessage": "alarmMessage yyy",
  18. "startTime": 1560524171000
  19. }]

scopeId、scope:所有可用的 Scope 详见

org.apache.skywalking.oap.server.core.source.DefaultScopeDefine

name:目标 Scope 的实体名称

id0:Scope 实体的 ID

id1:保留字段,目前暂未使用

ruleName:告警规则名称

alarmMessage:告警消息内容

startTime:告警时间,格式为时间戳

6.2、 编写告警接口

6.2.1、封装报警参数的对象


   
   
  1. /**
  2. * 封装报警参数的对象
  3. */
  4. public class AlarmMessageDto {
  5. private int scopeId;
  6. private String name;
  7. private int id0;
  8. private int id1;
  9. private String alarmMessage;
  10. private long startTime;
  11. public int getScopeId () {
  12. return scopeId;
  13. }
  14. public String getName () {
  15. return name;
  16. }
  17. public int getId0 () {
  18. return id0;
  19. }
  20. public int getId1 () {
  21. return id1;
  22. }
  23. public String getAlarmMessage () {
  24. return alarmMessage;
  25. }
  26. public long getStartTime () {
  27. return startTime;
  28. }
  29. public void setScopeId (int scopeId) {
  30. this.scopeId = scopeId;
  31. }
  32. public void setName (String name) {
  33. this.name = name;
  34. }
  35. public void setId0 (int id0) {
  36. this.id0 = id0;
  37. }
  38. public void setId1 (int id1) {
  39. this.id1 = id1;
  40. }
  41. public void setAlarmMessage (String alarmMessage) {
  42. this.alarmMessage = alarmMessage;
  43. }
  44. public void setStartTime (long startTime) {
  45. this.startTime = startTime;
  46. }
  47. }

6.2.2、提供报警接口


   
   
  1. import com.mayikt.entity.AlarmMessageDto;
  2. import org.springframework.web.bind.annotation.RequestBody;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestMethod;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. /**
  9. * 报警接口
  10. */
  11. @RestController
  12. public class PoliceService {
  13. private List<List<AlarmMessageDto>> listAlarmMessage = new ArrayList<>();
  14. /**
  15. * 接收告警信息
  16. *
  17. * @param alarmMessageList
  18. */
  19. @RequestMapping(value = "/police", method = RequestMethod.POST)
  20. public void alarm (@RequestBody List<AlarmMessageDto> alarmMessageList) {
  21. listAlarmMessage.add(alarmMessageList);
  22. }
  23. /**
  24. * 打印告警信息
  25. *
  26. * @return
  27. */
  28. @RequestMapping("/getListAlarmMessageDto")
  29. public List<List<AlarmMessageDto>> getListAlarmMessageDto () {
  30. return listAlarmMessage;
  31. }
  32. }

7、SkyWalking数据持久化

SkyWalking 默认是将数据存入在内存中,如果重启SkyWalking 数据则都会丢失。

我们可以选择将数据持久化存放在mysql、es中等。

1、打开SkyWalking目录config/application.yml,在里边配置Mysql的连接信息;


   
   
  1. storage:
  2. selector: ${SW_STORAGE:mysql} #默认使用的H2数据库存储,将h2改为mysql
  3. mysql: #修改mysql连接 IP端口号,数据库
  4. properties:
  5. jdbcUrl: ${SW_JDBC_URL: "jdbc:mysql://localhost:3306/swtest?serverTimezone=UTC&characterEncoding=utf-8"}
  6. dataSource.user: ${SW_DATA_SOURCE_USER:root}
  7. dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root@ 1234}
  8. dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS: true}
  9. dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE: 250}
  10. dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT: 2048}
  11. dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS: true}
  12. metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE: 5000}

2、在oap-libs/目录中放入 mysql-connector-java-8.0.16.jar 

百度网盘 点击下载

3、重启SkyWalking,会自动在配置的Mysql库中创建依赖的表结构。

 

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

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

相关文章

APP外包开发上线问题解决

在APP上线过程中可能会遇到各种问题&#xff0c;这些问题可能涉及技术、审核、发布等方面。可能会遇到各种挑战&#xff0c;但通过充分的准备、测试和持续的改进&#xff0c;可以解决大部分问题并提升应用的质量和用户满意度。以下是一些常见的问题及其解决方案&#xff0c;希望…

面试想拿13K,HR说你只值10K,该怎样反驳?

最近&#xff0c;有一个朋友跑来跟我吐槽说&#xff0c;刚刚一场面试&#xff0c;笔试面试都过了&#xff0c;部门领导对他也很满意&#xff0c;就只剩最后hr面谈了。以为只是走走流程&#xff0c;谈谈入职时间的事&#xff0c;没想到hr上来就说&#xff1a; 求职表上你写的期…

使用StorageClass动态创建pv

rook-ceph安装部署到位后&#xff0c;就可以开始来尝试使用StorageClass来动态创建pv了。 有状态的中间件在kubernetes上落地基本上都会用到StorageClass来动态创建pv&#xff08;对于云上应用没有那么多烦恼&#xff0c;云硬盘很好用&#xff0c;但是对于自己学习和练习来说还…

2023年护网总结报告

目录 一、 概况 二、 演习背景 三、 护网前期工作准备 3.1 成立工作小组 3.2 攻击面自查自检 3.3 制定演习方案 3.4 加强监测设施 四、 护网工作落实情况 4.1 严格落实值班制度 4.2 威胁情报收集 4.3 强化应急响应 4.4 严格管控 4.5 保障业务连续性 五、 演习评估…

开发第一个gPRC的开发

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

利用anaconda安装指定版本tensorflow的两种方法,并配置于Pycharm上

引言 作为一个跨专业到人工智能的小白&#xff0c;刚开始学习Deep learning时难免会遇到很多安装python开源库的问题&#xff0c;经过自己这段时间的摸索&#xff0c;总结出了两种安装tensorflow指定版本的方法&#xff08;可以衍生到安装其他python开源库&#xff0c;方法一样…

17.2.2 【Linux】通过systemctl观察系统上所有的服务

使用 systemctl list-unit-files 会将系统上所有的服务通通列出来&#xff5e;而不像 list-units 仅以 unit 分类作大致的说明。 至于 STATE 状态就是前两个小节谈到的开机是否会载入的那个状态项目。主要有 enabled / disabled / mask / static 等等。 假设我不想要知道这么多…

mybatis动态SQL的运用

一、mybatis动态SQL update 表名 set name?,age? where id? 如果我们的前台没有传参&#xff0c;比如没有传入我们的name值&#xff0c;name就会把字段值改为null&#xff0c;这就违背了我们编码的初衷。 许多人会使用类似于where 1 1 来作为前缀&#xff0c;在代码中会用i…

Socket编程入门

Socket编程 套接字的类型 套接字分为两种类型 Stream Sockets&#xff0c;流格式&#xff0c;传输使用的是TCP协议Datagram Sockets&#xff0c;数据包格式&#xff0c;传输使用的是UDP协议 结构体 在不同类型电脑中&#xff0c;字节的排列顺序是不同的&#xff1a;大端序…

uniapp项目添加人脸识别功能,可用作登录,付款,流程审批前的安全校验

本案例使用了hbuilder插件商城中的活体检验插件&#xff0c;可自行前往作者处下载查看&#xff0c; 效果图如下 此插件需要在manifest.json中勾选 实现流程 1&#xff1a;前往hbuilder插件市场下载插件 2&#xff1a;在页面中导入import face from "/uni_modules/mcc-…

成集云 | 维格表会员/租约/合同到期同步企微提醒 | 解决方案

源系统成集云目标系统 方案介绍 维格表是一种新一代的团队数据协作和项目管理工具&#xff0c;由深圳维格智数科技有限公司研发。它结合了可视化数据库、电子表格、实时网络协同、低代码开发技术四项功能&#xff0c;且支持API与可视化看板&#xff0c;操作简单&#xff0c;能…

【数据结构入门指南】二叉树

【数据结构入门指南】二叉树 一、二叉树的概念二、现实中的二叉树三、特殊的二叉树四、二叉树的性质五、二叉树的存储结构5.1 顺序结构5.2 链式结构 一、二叉树的概念 二叉树是一棵特殊的树。一棵二叉树是结点的一个有限集合&#xff0c;该节点&#xff1a; ①&#xff1a;或者…

Vue 2 插槽

可以先阅读组件基础-简单了解通过插槽分发内容。 一、插槽定义 插槽将子组件标签间的内容分发到子组件模板的<slot>标签位置。 如果没有<slot>标签&#xff0c;那么该内容将被丢弃。 二、编译作用域 内容在哪个作用域编译&#xff0c;就可以访问哪个作用域的数据…

SMS 与 WhatsApp 营销,哪个方式最适合你的业务?

SMS和 WhatsApp营销越来越受欢迎&#xff0c;因为它们为企业提供了接触目标受众的有效方式。超过 91%的客户希望收到来自企业的 SMS消息&#xff0c;使用WhatsAppAPI发送的消息的打开率高达99% &#xff0c;这证明了这两种形式的消息传递对于希望及时与客户沟通的企业来说变得重…

火山引擎发布自研视频编解码芯片 压缩效率提升30%

8月22日&#xff0c;火山引擎视频云宣布其自研的视频编解码芯片已成功出片。经验证&#xff0c;该芯片的视频压缩效率相比行业主流硬件编码器可提升30%以上&#xff0c;未来将服务于抖音、西瓜视频等视频业务&#xff0c;并将通过火山引擎视频云开放给企业客户。 火山引擎总裁…

C语言好题解析(四)

目录 选择题一选择题二选择题三选择题四选择题五编程题一 选择题一 已知函数的原型是&#xff1a; int fun(char b[10], int *a); 设定义&#xff1a; char c[10];int d; &#xff0c;正确的调用语句是&#xff08; &#xff09; A: fun(c,&d); B: fun(c,d); C: fun(&…

安防视频监控平台EasyNVR平台启用国标级联的操作步骤来啦!

安防视频监控汇聚EasyNVR视频集中存储平台&#xff0c;是基于RTSP/Onvif协议的安防视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。 为提高用户体验&#xff0c;让用户更加便捷…

再JAVA中如何使用qsort对类进行排序?

目录 结论&#xff1a; 解析&#xff1a; 结论&#xff1a; import java.util.Arrays;class Person implements Comparable<Person>{public String name;public int age;public Person(String name, int age) {this.name name;this.age age;}Overridepublic Stri…

关于Springboot项目打包的配置问题

一、打包方式的不同致使jar包运行性能及docker部署的效率问题 1.1方式一 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source&…

保护函数返回的利器——Linux Shadow Call Stack

写在前面 提到内核栈溢出的漏洞缓解&#xff0c;许多朋友首先想到的是栈内金丝雀&#xff08;Stack Canary&#xff09;。今天向大家介绍一项在近年&#xff0c;于Android设备中新增&#xff0c;且默默生效的安全机制——影子调用栈&#xff1a;SCS&#xff08;Shadow Call St…