【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
- <dependency>
- <groupId>org.apache.skywalking</groupId>
- <artifactId>apm-toolkit-trace</artifactId>
- <version>6.5.0</version>
- </dependency>
获取 TraceContext.traceId();
-
- @RequestMapping("/member")
- public String orderToMember(@RequestParam("id") Integer id) {
- // 获取request对象
- HttpServletRequest request = ((ServletRequestAttributes)
- RequestContextHolder.getRequestAttributes()).getRequest();
- getHeders(request);
- // 获取traceId
- String traceId = TraceContext.traceId();
- log.info(">>traceId:{}<<", traceId);
- Integer j = 1 / id;
- return "我是会员服务:" + traceId + "," + j;
- }
-
- public static void getHeders(HttpServletRequest request) {
- //2.获得所有头的名称
- Enumeration<String> headerNames = request.getHeaderNames();
- while (headerNames.hasMoreElements()) {//判断是否还有下一个元素
- String nextElement = headerNames.nextElement();//获取headerNames集合中的请求头
- String header2 = request.getHeader(nextElement);//通过请求头得到请求内容
- log.info("请求头=========={}" + nextElement + "VALUE:" + header2);
- //System.out.println(nextElement+":"+header2);
- }
- }
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、自定义告警接口接收数据格式
- [{
- "scopeId": 1,
- "scope": "SERVICE",
- "name": "serviceA",
- "id0": 12,
- "id1": 0,
- "ruleName": "service_resp_time_rule",
- "alarmMessage": "alarmMessage xxxx",
- "startTime": 1560524171000
- }, {
- "scopeId": 1,
- "scope": "SERVICE",
- "name": "serviceB",
- "id0": 23,
- "id1": 0,
- "ruleName": "service_resp_time_rule",
- "alarmMessage": "alarmMessage yyy",
- "startTime": 1560524171000
- }]
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、封装报警参数的对象
- /**
- * 封装报警参数的对象
- */
-
- public class AlarmMessageDto {
- private int scopeId;
- private String name;
- private int id0;
- private int id1;
- private String alarmMessage;
- private long startTime;
-
- public int getScopeId() {
- return scopeId;
- }
-
- public String getName() {
- return name;
- }
-
- public int getId0() {
- return id0;
- }
-
- public int getId1() {
- return id1;
- }
-
- public String getAlarmMessage() {
- return alarmMessage;
- }
-
- public long getStartTime() {
- return startTime;
- }
-
- public void setScopeId(int scopeId) {
- this.scopeId = scopeId;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public void setId0(int id0) {
- this.id0 = id0;
- }
-
- public void setId1(int id1) {
- this.id1 = id1;
- }
-
- public void setAlarmMessage(String alarmMessage) {
- this.alarmMessage = alarmMessage;
- }
-
- public void setStartTime(long startTime) {
- this.startTime = startTime;
- }
- }
6.2.2、提供报警接口
- import com.mayikt.entity.AlarmMessageDto;
- import org.springframework.web.bind.annotation.RequestBody;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.RestController;
-
- import java.util.ArrayList;
- import java.util.List;
-
- /**
- * 报警接口
- */
- @RestController
- public class PoliceService {
-
- private List<List<AlarmMessageDto>> listAlarmMessage = new ArrayList<>();
-
- /**
- * 接收告警信息
- *
- * @param alarmMessageList
- */
- @RequestMapping(value = "/police", method = RequestMethod.POST)
- public void alarm(@RequestBody List<AlarmMessageDto> alarmMessageList) {
- listAlarmMessage.add(alarmMessageList);
- }
-
- /**
- * 打印告警信息
- *
- * @return
- */
- @RequestMapping("/getListAlarmMessageDto")
- public List<List<AlarmMessageDto>> getListAlarmMessageDto() {
- return listAlarmMessage;
- }
-
- }
7、SkyWalking数据持久化
SkyWalking 默认是将数据存入在内存中,如果重启SkyWalking 数据则都会丢失。
我们可以选择将数据持久化存放在mysql、es中等。
1、打开SkyWalking目录config/application.yml,在里边配置Mysql的连接信息;
- storage:
- selector: ${SW_STORAGE:mysql} #默认使用的H2数据库存储,将h2改为mysql
- mysql: #修改mysql连接 IP端口号,数据库
- properties:
- jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/swtest?serverTimezone=UTC&characterEncoding=utf-8"}
- dataSource.user: ${SW_DATA_SOURCE_USER:root}
- dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root@1234}
- dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
- dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}
- dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}
- dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true}
- metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:5000}
2、在oap-libs/目录中放入 mysql-connector-java-8.0.16.jar
百度网盘 点击下载
3、重启SkyWalking,会自动在配置的Mysql库中创建依赖的表结构。
相关文章:
【SkyWalking】分布式服务追踪与调用链系统
1、基本介绍 SkyWalking是一个开源的观测平台,官网:Apache SkyWalking; 可监控:分布式追踪调用链 、jvm内存变化、监控报警、查看服务器基本配置信息。 2、SkyWalking架构原理 在整个skywalking的系统中,有三个角色&am…...
Python“牵手”速卖通商品详情API接口运用场景及功能介绍
速卖通电商API接口是针对速卖通提供的电商服务平台,为开发人员提供了简单、可靠的技术来与速卖通电商平台进行数据交互,实现一系列开发、管理和营销等操作。其中包括商品详情API接口,通过这个API接口商家可以获取商品的详细信息,包…...
java调用python脚本的示例
java调用python脚本的示例 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class JavaCallPythonScript {public static void main(String[] args) {// 调用Python脚本的命令String pythonScriptPath "path/to/y…...
【C语言】柔性数组(可边长数组)
一、介绍 柔性数组(Flexible Array),又称可变长数组。一般数组的长度是在编译时确定,而柔性数组对象的长度在运行时确定。在定义结构体时允许创建一个空数组(例如:arr [ 0 ] ),该数…...
C++信息学奥赛1131:基因相关性
这段代码的功能是比较两个字符串的相似度,并根据给定的阈值判断是否相似。 解析注释后的代码如下: #include <iostream> #include <string> using namespace std;int main() {double bf; // 定义双精度浮点数变量bf,用于存储阈…...
如何保证分布式系统中服务的高可用性:应对 ZooKeeper Leader 节点故障的注册处理策略
推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 「java、python面试题」来自UC网盘app分享,打开手机app,额外获得1T空间 https://dr…...
SQL注入之延时注入
文章目录 延时注入是什么?延时注入获取数据库版本号 延时注入是什么? 延时注入就是利用sleep()函数通过if语句判断所写的语句真假,如果为真返回我们想要的东西(例如:数据库的长度,数据库的名字等࿰…...
运维高级学习--Docker(二)
1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 #拉取mysql5.6和owncloud镜像 [rootlocalhost ~]# docker pull mysql:5.6 [rootlocalhost ~]# docker pull owncloud [rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED …...
QT的核心——信号与槽
目录 回顾C 语言信号 1、信号与槽 2、关联信号与槽 2.1自动关联信号与槽 2.2手动关联信号与槽 2.3断开信号与槽 3、自定义信号 3.1自定义信号使用条件 3.2自定义槽函数使用条件 4、信号与槽参数传递 4.1自定义一个带参的信号 4.2关联带参的信号与槽 4.3发送一个带…...
【业务功能篇73】web系统架构演变-单体-集群-垂直化-服务化-微服务化
1.服务架构的演 1.1 单体架构 单体架构应该是我们最先接触到的架构实现了,在单体架构中使用经典的三层模型,即表现层,业务逻辑层和数据访问层。 单体架构只适合在应用初期,且访问量比较下的情况下使用,优点是性价比很…...
MyCAT命令行监控
9066端口 ,用mysql命令行连接 Mysql –utest –ptest –P9066 show help 可显示所有相关管理命令 显示后端物理库连接信息,包括当前连接数,端口 Show backend Show connection 显示当前前端客户端连接情况,已经网络流量信息、…...
【python】正则表达式匹配数据
前言 使用正则表达式处理数据,可进行字符串匹配、提取和替换等操作。在python中,通过re库完成正则匹配的操作。 一、正则语法规则 1.常用匹配符 模式描述^匹配字符串开头$匹配字符串结尾.匹配任意字符*匹配前面的字符零次或多次匹配前面的字符一次或多…...
【C++】用Windows API在控制台实现选择选项
2023年8月23日,周三上午 今天上午花了一个小时来实现这个 这个程序在碰到边界时会发出声音, 通过调用Windows API的Beep函数来实现。 #include<Windows.h> #include<conio.h> #include<iostream> #include<cstdlib>const int …...
Golang 批量执行/并发执行
提到Golang,都说Golang 天生高并发。所以分享一下我认为的Golang高并发精髓 简单的并发执行util package util import ("context""sync" )type batchRunner struct {BatchSize intctx context.Contextchannel chan func()wg sy…...
使用go语言、Python脚本搭建一个简单的chatgpt服务网站。
使用go语言、Python脚本搭建一个简单的GPT服务网站 前言 研0在暑假想提升一下自己,自学了go语言编程和机器学习相关学习,但是一味学习理论,终究是枯燥的,于是自己弄点小项目做。 在这之前,建议您需要掌握以下两个技…...
基于java会议室预约系统设计与实现
摘要 一个企业的发展离不开相关的规定流程。信息化到来的今天在我们的生活当中。离不开各种信息化的支持。比如钉钉会议预约、美团买菜、扫码签到等各种信息化软件。他们涉及我们生活中的方方面面给我们的生活提供了更大的便利性。大到政府、企业办公小到人们的衣食住行都离不开…...
Ubuntu18.04 交叉编译curl-7.61.0
下载 官方网址是:curl 安装依赖库 如果需要curl支持https协议,需要先交叉编译 openssl,编译流程如下: Ubuntu18.04 交叉编译openssl-1.1.1_我是谁??的博客-CSDN博客 解压 # 解压: $tar -xzvf curl-7.61.…...
Android相机-HAL子系统
引言 应用框架要通过拍照预览摄像获得照片或者视频,就需要向相机子系统发出请求, 一个请求对应一组结果 一次可发起多个请求,并且提交请求是非阻塞的,始终按照接收的顺序以队列的形式先进先出地进行顺序处理 一个请求包含了拍摄和拍照配置的所有信息&…...
PostgreSQL-研究学习-介绍与安装
PostgreSQL-预研 是个很厉害的数据库的样子 ψ(*`ー)ψ 官方文档:http://www.postgres.cn/docs/12/ 总的结论和备注 PgSQL 支持对JSON的支持很强大,以及提供了很多数学几何相关的数据类型【例:点,线条,几何…...
【Unity细节】Unity制作汽车时,为什么汽车会被弹飞?为什么汽车会一直抖动?
👨💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶🌫️收录于专栏:unity细节和bug 😶🌫️优质专栏 ⭐【…...
Android初学之android studio运行java/kotlin程序
第一步骤:File—>New—>New Module,然后弹出一个框,(左边)选择Java or Kotlin Library,(右边)编辑自己的图书馆名、包名、类名,选择Java一个语言,然后F…...
使用自定义 C ++类扩展 TorchScript
使用自定义 C 类扩展 TorchScript 本教程是自定义运算符教程的后续教程,并介绍了我们为将 C 类同时绑定到 TorchScript 和 Python 而构建的 API。 该 API 与 pybind11 非常相似,如果您熟悉该系统,则大多数概念都将转移过来。 在 C 中实现和…...
UITableView自定义TableHeader和TableFooter
UITableView自定义TableHeader和TableFooter 我猜你希望的效果是这样的 我猜你希望的效果是这样的 自定义页眉视图 让我们创建一个文件名 UITableViewHeaderFooterView 的 CustomerHeaderView 子类。 现在让我们创建视图的 Xib 文件并将其命名为 CustomHeaderView。 更改高度标…...
【TA 挖坑03】雾效 | 透光材质 | Impostor | 厚度转球谐
仍旧是记录下半年想要做的东西,很有趣,实现“一团雾效” “面片也有立体感” 等等效果的一些技术上的方法。 仅粗浅记录,保证之后自己填坑的时候看得懂就行! 透光 -> 透光材质ShadingModel 《永劫无间》透光材质的渲染&…...
案例-基于MVC和三层架构实现商品表的增删改查
文章目录 0. 项目介绍1. 环境准备2. 查看所有2.1 编写BrandMapper接口2.2 编写服务类,创建BrandService,用于调用该方法2.5 编写Servlet2.4 编写brand.jsp页面2.5 测试 3.添加3.1 编写BrandMapper接口 添加方法3.2 编写服务3.3 改写Brand.jsp页面&#x…...
Java——一个简单的计算器程序
该代码是一个简单的计算器程序,使用了Java的图形化界面库Swing。具体分析如下: 导入必要的类和包: import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Objects; import javax.…...
自定义滑动到底部触发指令,elementUI实现分页下拉框
在 main.js 中添加 // 自定义滑动到底部指令 Vue.directive(selectLoadMore, {bind(el, binding) {// 获取element-ui定义好的scroll盒子const SELECTWRAP_DOM el.querySelector(.el-select-dropdown .el-select-dropdown__wrap)SELECTWRAP_DOM.addEventListener(scroll, fun…...
【Windows 常用工具系列 10 -- linux ssh登录脚本输入密码】
文章目录 脚本输入SSH登录密码scp 脚本免密传输 脚本输入SSH登录密码 sshpass 是一个用于运行时非交互式ssh密码提供的工具,它允许你直接在命令行中为ssh命令提供密码。这就意味着你可以在脚本中使用ssh命令,而不需要用户交互地输入密码。 一般来说&am…...
C#的索引器
索引器 在 C# 中,索引器(Indexer)是一种特殊的属性,允许通过类的实例像访问数组一样访问对象的元素。索引器允许将类的实例作为集合来使用,可以按照自定义的方式访问类中的元素。 索引器的定义类似于属性,…...
软件配置安装(破解)--- maven下载配置
检查环境是否已有 首先检查一下电脑里有无maven环境,有的话就不用安装了 查看path环境中没有maven,开始准备接下来的重头戏 下载maven 下载bin.zip版 解压mavenxxxbin.zip (建议把解压的文件放在一个文件夹内,命名英文的env…...
英文医疗网站建设/nba排名最新赛程
B树索引、位图索引和散列索引 1.B树索引结构:特点:1.B*Tree 索引不存储null值 。更准确的说,单列索引不存储null值,复合索引不存储全为null的值,因为索引上如果有Null值&…...
优秀网站赏析/怎么在百度免费推广
一个很影响用户体验的使用,就是文件传输失败,然后点了重发,还是失败。 一般用户遇到这个问题,任何APP被立刻卸载的几率也是有70%以上 因此迫在眉睫,但是好在我们公司这个项目没有推广太广(对于我是压力没那…...
那些是flash做的网站/西安霸屏推广
作为一名程序员,尤其是开发Android应用程序的程序员,不会自己折腾ROM简直就是一件不好意思的事情,于是乎我就费劲巴力的上网看资料,找工具,准备自己开始制作有“中国特色”的ROM,以下是解决的一些问题&…...
广告平台源码/seo可以从哪些方面优化
PyInstaller的原理简介PyInstaller其实就是把python解析器和你自己的脚本打包成一个可执行的文件,和编译成真正的机器码完全是两回事,所以千万不要指望成打包成一个可执行文件会提高运行效率,相反可能会降低运行效率,好处就是在运…...
91色做爰网站/在线服务器网站
重庆商报-上游财经记者 刘真重庆商报讯 一直以来,外语和计算机都是评定职称的“拦路虎”,不过从现在起,将不再成为“硬杠杠”了。昨天,市人力社保局正式出台《关于调整全市职称外语和计算机考试政策的通知》(渝人社发〔2017〕67号…...
新闻网站开发方案/搜什么关键词能找到网站
项目介绍 股票交易模拟系统是针对目前股票交易模拟管理的实际需求,从实际工作出发,对过去的股票交易模拟管理系统存在的问题进行分析,完善客户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利&#…...