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

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.rhkb.cn/news/106922.html

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

相关文章

WPS右键新建没有docx pptx xlsx 修复

解决wps右键没有新建文档的问题 右键没有新建PPT和Excel 1 wps自带的修复直接修复没有用 以上不管咋修复都没用 2 先编辑注册表 找到 HKEY_CLASSES_ROOT CTRLF搜文件扩展名 pptx docx xlsx 新建字符串 三种扩展名都一样操作 注册表编辑之后再次使用wps修复 注册组件&am…

K8S如何部署ZooKeeper以及如何进行ZooKeeper的平滑替换

前言 在之前的章节中&#xff0c;我们已经成功地将Dubbo项目迁移到了云环境。在这个过程中&#xff0c;我们选择了单机ZooKeeper作为注册中心。接下来&#xff0c;我们将探讨如何将单机ZooKeeper部署到云端&#xff0c;以及在上云过程中可能遇到的问题及解决方案。 ZooKeeper…

picGo+gitee+typora设置图床

picGogiteetypora设置图床 picGogitee设置图床下载picGo软件安装picGo软件gitee操作在gitee中创建仓库在gitee中配置私人令牌 配置picGo在插件设置中搜索gitee插件并进行下载 TyporapicGo设置Typora 下载Typora进行图像设置 picGogitee设置图床 当我了解picGogitee可以设置图床…

Vue3 [Day11]

Vue3的优势 create-vue搭建Vue3项目 node -v npm init vuelatest npm installVue3项目目录和关键文件 Vetur插件是Vue2的 Volarr插件是Vue3的 main.js import ./assets/main.css// new Vue() 创建一个应用实例 > createApp() // createRouter() createStore() // 将创建实…

TensorFlow中slim包的具体用法

TensorFlow中slim包的具体用法 1、训练脚本文件&#xff08;该文件包含数据下载打包、模型训练&#xff0c;模型评估流程&#xff09;3、模型训练1、数据集相关模块&#xff1a;2、设置网络模型模块3、数据预处理模块4、定义损失loss5、定义优化器模块 本次使用的TensorFlow版本…

【C++】—— C++11之可变参数模板

前言&#xff1a; 在C语言中&#xff0c;我们谈论了有关可变参数的相关知识。在C11中引入了一个新特性---即可变参数模板。本期&#xff0c;我们将要介绍的就是有关可变参数模板的相关知识&#xff01;&#xff01;&#xff01; 目录 序言 &#xff08;一&#xff09;可变参…

0基础学习VR全景平台篇 第90篇:智慧眼-数据统计

【数据统计】是按不同条件去统计整个智慧眼项目中的热点&#xff0c;共包含四大块&#xff0c;分别是数据统计、分类热点、待审核、回收站&#xff0c;下面我们来逐一进行介绍。 1、数据统计 ① 可以按所属分类、场景分组、所属场景、热点类型以及输入热点名去筛选对应的热点&…

文生图模型之Stable Diffusion

原始文章地址 autoencoder CLIP text encoder tokenizer最大长度为77&#xff08;CLIP训练时所采用的设置&#xff09;&#xff0c;当输入text的tokens数量超过77后&#xff0c;将进行截断&#xff0c;如果不足则进行paddings&#xff0c;这样将保证无论输入任何长度的文本&…

Kaniko在containerd中无特权快速构建并推送容器镜像

目录 一、kaniko是什么 二、kaniko工作原理 三、kanijo工作在Containerd上 基于serverless的考虑&#xff0c;我们选择了kaniko作为镜像打包工具&#xff0c;它是google提供了一种不需要特权就可以构建的docker镜像构建工具。 一、kaniko是什么 kaniko 是一种在容器或 Kube…

【Linux】进程状态|僵尸进程|孤儿进程

前言 本文继续深入讲解进程内容——进程状态。 一个进程包含有多种状态&#xff0c;有运行状态&#xff0c;阻塞状态&#xff0c;挂起状态&#xff0c;僵尸状态&#xff0c;死亡状态等等&#xff0c;其中&#xff0c;阻塞状态还包含深度睡眠和浅度睡眠状态。 个人主页&#xff…

Diffusion Models for Image Restoration and Enhancement – A Comprehensive Survey

图像恢复与增强的扩散模型综述 论文链接&#xff1a;https://arxiv.org/abs/2308.09388 项目地址&#xff1a;https://github.com/lixinustc/Awesome-diffusion-model-for-image-processing/ Abstract 图像恢复(IR)一直是低水平视觉领域不可或缺的一项具有挑战性的任务&…

算法竞赛入门【码蹄集新手村600题】(MT1220-1240)C语言

算法竞赛入门【码蹄集新手村600题】(MT1220-1240&#xff09;C语言 目录MT1221 分数的总和MT1222 等差数列MT1223 N是什么MT1224 棋盘MT1225 复杂分数MT1226 解不等式MT1227 宝宝爬楼梯MT1228 宝宝抢糖果MT1229 搬家公司MT1230 圆周率MT1231圆周率IIMT1232 数字和MT1233 数字之…

适配器模式实现stack和queue

适配器模式实现stack和queue 什么是适配器模式&#xff1f;STL标准库中stack和queue的底层结构stack的模拟实现queue的模拟实现 什么是适配器模式&#xff1f; 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结)&#xff…

时间和日期--Python

1. 时间&#xff1a;time模块 总结&#xff1a;2. datetime模块 相比与time模块&#xff0c;datetime模块的接口更直观、更容易调用 2.1 datetime模块定义的类 &#xff08;1&#xff09;datetime.date:表示日期的类。常用的属性有&#xff1a;year、month、day; &#xff…

k8s节点pod驱逐、污点标记

一、设置污点&#xff0c;禁止pod被调度到节点上 kubectl cordon k8s-node-145 设置完成后&#xff0c;可以看到该节点附带了 SchedulingDisabled 的标记 二、驱逐节点上运行的pod到其他节点 kubectl drain --ignore-daemonsets --delete-emptydir-data k8s-node-145 显示被驱逐…

抓包相关,抓包学习

检查网络流量 - 提琴手经典 (telerik.com) Headers Reference - Fiddler Classic (telerik.com) 以上是fiddler官方文档 F12要勾选保留日志 不勾选的话跳转到新页面之前页面的日志不会在下方显示 会保留所有抓到的包 如果重定向到别的页面 F12抓包可能看不到响应信息,但是…

【PHP】PHP开发教程-PHP开发环境安装

1、PHP简单介绍 PHP&#xff08;全称&#xff1a;Hypertext Preprocessor&#xff09;是一种广泛使用的开放源代码脚本语言&#xff0c;特别适用于Web开发。它嵌入在HTML中&#xff0c;通过在HTML文档中添加PHP标记和脚本&#xff0c;可以生成动态的、个性化的Web页面。 PHP最…

Vant 4.6.4发布,增加了一些新功能,并修复了一些bug

导读Vant 4.6.4发布,增加了一些新功能&#xff0c;并修复了一些bug等。 新功能 feat(area-data): 更新芜湖的县区数据&#xff0c;由 nivin-studio 在 #12122 中贡献feat(Locale): 添加塞尔维亚语到国际化&#xff0c;由 RogerZXY 在 #12145 中贡献feat(ImagePreview): 添加 c…

百望云华为云共建零售数字化新生态 聚焦数智新消费升级

零售业是一个充满活力和创新的行业&#xff0c;但也是当前面临很大新挑战和新机遇的行业。数智新消费时代&#xff0c;数字化转型已经成为零售企业必须面对的重要课题。 8 月 20 日-21日&#xff0c;以“云上创新 韧性增长”为主题的华为云数智新消费创新峰会2023在成都隆重召…