分布式链路追踪SkyWalking进阶实战之RPC上报和WebHook通知(三)

news2024/9/23 17:11:40

目录

1.自定义SkyWalking链路追踪配置

1.1 什么是TraceId

1.2 使用的背景

1.3 编码

2.SkyWalking-RocketBot性能剖析

3.SkyWalking链路追踪-日志和RPC上报实战

4.源码部署 Apache SkyWalking

5.SkyWalking链路追踪-告警模块和WebHook通知《上》

6.SkyWalking链路追踪-告警模块和WebHook通知《下》

7.Jar包和微服务方式打包运行整合Skywalking


本篇主要介绍SkyWalking性能剖析,慢业务代码定位以及通知告警

SkyWalking和Springboot的整合以及基础页面介绍见下面2篇博客

分布式链路追踪SkyWalking快速入门之环境安装界面指标介绍(一)_这是王姑娘的微博的博客-CSDN博客本篇简单介绍SkyWalking是什么,特点和整体架构组成,使用docker安装部署,页面指标项的介绍https://blog.csdn.net/wnn654321/article/details/128594125Springboot整合分布式链路追踪SkyWalking之探针使用和链路采集实战(二)_这是王姑娘的微博的博客-CSDN博客本篇主要展示SkyWalking和Springboot项目的整合以及探针链路采集展示https://blog.csdn.net/wnn654321/article/details/128594365

1.自定义SkyWalking链路追踪配置

1.1 什么是TraceId

用来标识一条请求链路,一条请求链路中包含一个Trace ID,多个Span ID

1.2 使用的背景

对业务代码进行链路追踪,方便排查问题
比如,某个接口请求耗时慢,想对业务接口方法进行追踪
controller->service 方法,记录业务方法加入到链路中,记录入参、返回值等

1.3 编码

添加依赖

<dependency>
      <groupId>org.apache.skywalking</groupId>
      <artifactId>apm-toolkit-trace</artifactId>
      <version>8.5.0</version>
</dependency>

业务方法添加注解 @Trace

需要记录入参和返回值的话增加 tag注解

注意!!POJO记得重写toString方法
@Tags(
  {@Tag(key = "方法名-input", value = "arg[0]"), 
  @Tag(key = "方法名-output", value = "returnedObj")
  }
)

 Demo: 

缺点:代码有侵入性
 

2.SkyWalking-RocketBot性能剖析


性能剖析

新建任务:新建需要分析的端点

左侧列表:对任务进行采样

右侧:每个端点的链路信息

性能分析:可以查看对应方法的调用栈,找出问题点 可直接定位到代码方法和代码行
注意:一个服务在监控持续时间内只能设置一个端点监控任务

  新建任务后开始请求接口,然后等待几秒刷新性能剖析列表,就会出来接口对应的分析结果

点击分析按钮,出来对应的堆栈信息 ,可查看自己熟悉的包名类名调用

3.SkyWalking链路追踪-日志和RPC上报实战

使用背景:
用户请求接口,怎么在我们日志中找到traceId来跟踪系统调用链路 / 需要在系统日志打印出traceId

添加依赖:pom.xml

 <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
            <version>8.5.0</version>
</dependency>

配置logback打印日志(SpringBoot默认使用Logback),配置文件名 logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>  
    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>

    <!--系统操作日志-->
    <root level="INFO">  
        <appender-ref ref="console"/> 
        <appender-ref ref="grpc-log"/> 
    </root>
</configuration>

 代码打印日志:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


Logger logger = LoggerFactory.getLogger(ProductController.class);

//代码中 logger.info 打印日志

 重启服务后打印日志: 可以看到TID

 将日志上传到skywalking oap中,查看更方便

<?xml version="1.0" encoding="UTF-8"?>
<configuration>  
    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>


    <!-- skywalking grpc 日志收集上报服务端 8.4.0版本后支持 -->
    <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>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>


    <!--系统操作日志-->
    <root level="INFO">  
        <appender-ref ref="console"/> 
        <appender-ref ref="grpc-log"/> 
    </root>
</configuration>

注意:
skywaling agent 默认是上传到本地的oap,如果oap server地址不是本地,则需要单独配置oap server地址
agent文件夹里面config配置 增加以下几个

#日志数据的grpc服务器的主机
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:112.xxx.xx.xxx}
#日志数据的grpc服务器的端口
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
#日志数据的最大大小
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
#发送数据时将超时多长时间。单位是秒
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}

重启后访问连接,在日志模块可以看到控制台输出的信息


   日志详情:

 根据TID搜索控制台日志

 同步搜索UI 日志模块

 查看日详情

4.源码部署 Apache SkyWalking

解压:

配置更改:config配置文件 application.yml 存储
H2(默认)/ ElasticSearch 6, 7/MySQL /TiDB /InfluxDB 

 

 启动:路径 /skywalking/apache-skywalking-apm-bin/bin

 方式一:bin/startup.sh  startup.sh里面是启动了 oap和ui的

 方式二:分开启动 

#端口 11800
bin/oapService.sh

#端口8080
bin/webappService.sh

 完成启动~

查看日志  #oap日志  skywalking-oap-server.log
#ui界面日志  webapp.log 

5.SkyWalking链路追踪-告警模块和WebHook通知《上》

需求:
监控业务相关接口性能,超过阈值则触发告警功能
通过调用webhook接口进行触发,具体的webhook接口地址可以自行定义路径
注意:要OAP Server的网络可以触发的webhook接口  一个是阿里云 一个是本机电脑,直接是通不了的 可以增加小米球 / Ngrok内网穿透
开发人员可以在webhook接口中编写告警方式,比如邮件、短信等,就是一个http接口

Apache Skywalking默认的告警规则配置

安装目录下的config文件夹下 alarm-settings.yml文件
默认内置多个规则
最近3分钟内服务的平均响应时间超过1秒
最近2分钟服务成功率低于80%
最近3分钟90%服务响应时间超过1秒
最近2分钟内服务实例的平均响应时间超过1秒
 

配置含义:
metrics-name 脚本中的度量名称
threshold 阈值
op 比较操作符,可以设定>,<,=
period 多久检查一次当前的指标数据是否符合告警规则,单位分钟
count 达到多少次后,触发告警消息
silence-period 在多久时间之内,忽略相同的告警消息,在时间T触发了某告警,那么在(T+10)这个时间段,不会再次触发相同告警
message 告警消息内容
webhooks 配置告警产生时的触发的调用地址


6.SkyWalking链路追踪-告警模块和WebHook通知《下》

编码:

public class AlarmMessage {

    private int scopeId;
    private String scope;
    private String name;
    private String id0;
    private String id1;
    private String ruleName;
    private String alarmMessage;
    private long startTime;
    private transient int period;
    private transient boolean onlyAsCondition;

    //.........set get toString...........
}


@RestController
public class CallbackController {
    Logger logger = LoggerFactory.getLogger(CallbackController.class);
    private List<AlarmMessage> messageList = new ArrayList<>();


    @PostMapping("webhook")
    public void webhook(@RequestBody List<AlarmMessage> alarmMessageList){

        logger.info("收到消息 该消息接收到后,可以推送邮箱或者短信:"+alarmMessageList);

        messageList.addAll(alarmMessageList);
    }

    @GetMapping("list_alarm_msg")
    public List<AlarmMessage> list(){

        return messageList;
    }


}

配置webhook接口,POST方式推送

注意:要重启oap server!!!!!!!!
webhooks:
  - http://127.0.0.1:8081/webhook/

更改config目录下的alarm-settings.yml

重启oap server 先停止8080和11800 然后再启动

业务代码更改: 
修改睡眠时间为2秒,模拟接口响应慢

 启动业务代码,访问连接,结果:

 2-10分钟之内, 服务下的接口请求超过1秒响应 则进行告警推送,在skywalking的告警页面可见。

 

  代码中接收到的错误信息,实际应用中可以获取到信息 然后推送钉钉 或者短信邮件等渠道

Springboot整合短信发送见下面这篇博文:

springboot2.x 接入阿里云市场短信发送_这是王姑娘的微博的博客-CSDN博客1.短信平台购买次数地址https://market.aliyun.com/products/57000002/cmapi00046920.html提供测试模板、免审核、测试成本更低2.测试学习使用的话,3块钱75多次够用了3.购买后在跳转成功页面记录AppSecret、key、code4.记录模板ID5.上代码环节@Configurationpublic class RestTemplateConfig { @Bean public .https://blog.csdn.net/wnn654321/article/details/121578434

Springboot整合邮箱发送见下面这篇博文:

springboot2.x整合邮箱发送_这是王姑娘的微博的博客-CSDN博客1.邮件传输协议◦SMTP协议:全称为 Simple Mail Transfer Protocol,简单邮件传输协议。它定义了邮件客户端软件和SMTP邮件服务器之间,以及两台SMTP邮件服务器之间的通信规则◦POP3协议:全称为 Post Office Protocol,邮局协议。它定义了邮件客户端软件和POP3邮件服务器的通信 规则◦IMAP协议:全称为 Internet Message Access Protocol,Internet消息访问协议,它是对POP3协议一种扩展,也是定义了邮件客户端https://blog.csdn.net/wnn654321/article/details/114228363
7.Jar包和微服务方式打包运行整合Skywalking

项目打包:
springboot项目和springcloud项目都一样,jar方式运行

通过java -jar 加入参数

项目打包:mvn install

启动:

nohup java -jar -javaagent:/root/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=WnnShop -Dskywalking.collector.backend_service=112.xxx.xxx.240:11800 wnn-sky-0.0.1-SNAPSHOT.jar &

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

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

相关文章

对技术类的管理和绩效的一些想法

大家好&#xff1a; 我是烤鸭。看完春晚小品的心情(除了神马组合)&#xff0c;就跟下面这哥们一样&#xff0c;尬的抠脚。再加上初一跟家人出去一趟&#xff0c;消费是真的复苏了&#xff0c;哪哪都排队。本来还想去洗温泉&#xff0c;给商家打电话一直占线…就能想象有多少人了…

7. 初步认识线程同步

前言&#xff1a;一旦接触到多线程编程&#xff0c;那么线程之间的同步就显得非常重要了。c/c#/java等高级语言都有自己的线程库&#xff0c;当然也提供了线程同步的API接口。打个比方&#xff0c;在C/QT中&#xff0c;线程的同步有以下几种方式&#xff1a;互斥锁、信号量、条…

2、SPSS的基本知识

目录 一、SPSS软件的安装和启动 二、SPSS的基本操作环境 &#xff08;1&#xff09;数据编辑窗口&#xff08;主程序窗口&#xff09; &#xff08;2&#xff09;SPSS结果输出窗口 三、SPSS软件的退出 四、SPSS软件的三种基本使用方式 五、SPSS数据的结构和定义方法 1.…

单链表——简单的增删查改

前言&#xff1a;上次介绍了顺序表&#xff0c;这次我要分享对单链表的一些简单理解&#xff0c;主要框架与上次大致相同&#xff0c;内容主要是单链表的增删查改&#xff0c;适用于初学者&#xff0c;之后会继续更新一些更深入的内容。同时&#xff0c;这也仅仅是我个人对所学…

不完全微分PID控制算法及仿真

在 PID控制中&#xff0c;微分信号的引入可改善系统的动态特性&#xff0c;但也易引进高频干扰&#xff0c;在误差扰动突变时尤其显出微分项的不足。若在控制算法中加入低通滤波器&#xff0c;则可使系统性能得到改善。克服上述缺点的方法之一是在 PID算法中加入一个一阶惯性环…

pdf如何合并,用这个方法又快又好使

我们在整理文档的时候经常被要求最后提交的得是PDF&#xff0c;所以有时候手头上的文档有多份&#xff0c;但最后还得整合成一份PDF才行。合并PDF后我们才可以进行后续的操作&#xff0c;所以学会如何快速合并PDF很重要。要把多个文档整合到一起&#xff0c;借助下面这些工具就…

一文带你了解学习python的用处及好处,建议收藏

目录 学习Python能做什么&#xff1f; Python的用途有哪些 普通人学习python有什么好处 用处&#xff0c;很重要的呢 今天这一讲很关键&#xff0c;如果你都不知道python的好处&#xff0c;以及python的用处&#xff0c;那你python就算是白学了 学习Python能做什么&#xf…

【目标检测】------rcnn、fastrcnn、fasterrcnn

RCNN流程图 sppnet流程图 fastRcnn fasterrcnn网络 RPN&#xff08;Region Proposal Network&#xff09;是Faster-RCNN网络用于提取预选框&#xff08;也就是RCNN中使用selective search算法进行Region Proposal的部分&#xff09;&#xff0c;我们知道RCNN及Fast-RCNN中一个…

【Maven】属性管理

1. 属性 问题导入 定义属性有什么好处&#xff1f; 1.1 属性配置与使用 ①&#xff1a;定义属性 <!--定义自定义属性--> <properties><spring.version>5.2.10.RELEASE</spring.version><junit.version>4.12</junit.version> </prop…

第二章——CSS基础选择器,标签选择器,类选择器, id 选择器,通配符选择器

文章目录2.1 CSS选择器的作用2.2 CSS选择器分类2.3 CSS 基础选择器分类2.4 标签选择器2.5 类选择器2.5.1 多类名选择2.6 id选择器2.7 id选择器与类选择器的区别‘2.8 通配符选择器2.9 选择器对比2.1 CSS选择器的作用 选择器(选择符)就是根据不同需求把不同的标签选出来这就是选…

python图像处理(直方图增强)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面几篇文章谈到了对图像的处理,但是它们大多数都是对图像像素进行一些时空的转换,本身像素的内容并没有发生转变。比如旋转,镜像、移动、放大、缩小等等,像素还是这些像素,只…

Pytorch基础知识

Pytorch 基础知识 1.1 张量的概念 在PyTorch中&#xff0c;张量&#xff08;Tensor&#xff09;属于一种数据结构&#xff0c;它可以使一个标量、一个向量、一个矩阵&#xff0c;甚至是更维度的数组。类似于numpy中的数组 (ndarray),并且它们是可以相互转化的&#xff0c;在P…

python3:openpyxl解析和生成excel的常用方法

解析 打开已经存在的工作簿 openpyxl.load_workbook()方法 from openpyxl import load_workbookwb2 load_workbook(test.xlsx) print wb2.get_sheet_names() [Sheet2, New Title, Sheet1] 生成 创建一个工作簿 from openpyxl import Workbook# 一个工作簿(workbook)在创建…

kafka的关键细节 以及 分区和主题的概念

文章目录Kafka中的关键细节1.消息的顺序存储2. 单播消息的实现3.多播消息的实现4.查看消费组及信息主题、分区的概念1.主题Topic2.partition分区Kafka中的关键细节 1.消息的顺序存储 消息的发送方会把消息发送到broker中&#xff0c;broker会存储消息&#xff0c;消息是按照发…

python本科毕业设计基于神经网络的虚假评论识别系统源码,含模型及数据

主要函数&#xff1a; 1.corpusprocess原始语料处理函数 2.train_word2vec生成word2vec向量 3.generate_id2wec获得索引的w2id,和嵌入权重embedding_weights 4.prepare_data 数据预处理 完整代码下载地址&#xff1a;python本科毕业设计基于神经网络的虚假评论识别系统源码 代…

多线程(初阶)——多线程基础

多线程(初阶)——多线程基础 文章目录多线程(初阶)——多线程基础1.认识线程2.多线程程序2.1 第一个Java多线程程序2.2 观察线程的详细情况2.3 sleep方法2.4 run和start方法的区别3.创建线程3.1 继承Thread类3.2实现Runnable接口3.3 通过匿名内部类创建线程3.4通过实现Runnable…

【目标检测】------yolox网络结构

YOLOX网络结构图 卷积和池化计算器&#xff1a; http://www.sqflash.com/cal.html

ServletAPI 2-10复杂参数, 解析完的参数值都会放到 ModelAndViewContainer里面

总结&#xff1a; 找到解析器后&#xff0c;用解析器去解析参数&#xff0c;都使用了resolveArgument()中以下方法 mavContainer.getModel(); mavContainer:模型和视图容器 视图&#xff1a;页面请求要返回一个地方&#xff0c;这个地方的地址叫视图 。比如要到/sucess 模…

CV——day70 零基础学YOLO:YOLOv1

YOLO系列1. 不同阶段算法优缺点分析2. IOU指标计算3. MAP指标计算**指标分析**如何计算MAP4 YOLOv14.1 YOLOv1核心思想4.2 YOLOv1网络架构那么&#xff0c;7 * 7 * 30的输出是怎么来呢&#xff1f;4.3 损失函数4.3.1 位置误差4.3.2 置信度误差(含object)4.3.3 置信度误差(不含o…

股票量化分析工具QTYX使用攻略——小市值轮动选股策略(更新2.5.9)

搭建自己的量化交易系统 如果要长期在市场中立于不败之地&#xff01;必须要形成一套自己的交易系统。 如何学会搭建自己的量化交易系统&#xff1f; 边学习边实战&#xff0c;在实战中学习才是最有效地方式。于是我们分享一个即可以用于学习&#xff0c;也可以用于实战炒股分析…