SkyWalking

SkyWalking

1、SkyWalking是什么?

skywalking 是一个国产开源框架,2015年由个人吴晟(华为开发者)开源 , 2017年加入Apache孵化器,skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案

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

下载:https://skywalking.apache.org/downloads/

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

文档:https://skywalking.apache.org/docs/main/latest/readme/

1.1、链路追踪框架对比

  • 1、Zipkin是Twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单。
  • 2、Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具,特点是支持多种插件,UI功能强大,接入端无代码侵入。
  • 3、SkyWalking是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具,特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已成为apache顶级项目
  • 4、CAT是大众点评开源的基于编码和配置的调用链分析,应用监控分析,日志采集,监控报警等一系列的监控平台工具。
项目 Cat Zipkin SkyWalking
调用链可视化
聚合报表 非常丰富 较丰富
服务依赖图 简单 简单
埋点方式 侵入式 侵入式 非侵入,字节码增强
VM监控指标
支持语言 java/.net 丰富 java/.net/Nodejs/php/go
存储机制 mysql(报表),本地文件/HDFS(调用链) 内存,es,mysql等 H2,es
社区支持 主要国内 国外主流 Apache支持
使用案例 美团,携程,陆金所 京东,阿里定制后不开源 华为,小米,当当,微众银行
APM
是否支持webflux

1.2、SkyWalking主要功能特性

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

2、SkyWalking环境搭建

下载:https://www.apache.org/dyn/closer.cgi/skywalking/8.9.1/apache-skywalking-apm-8.9.1.tar.gz
下载探针:https://www.apache.org/dyn/closer.cgi/skywalking/java-agent/8.8.0/apache-skywalking-java-agent-8.8.0.tgz

windows双击apache-skywalking-apm-bin\bin下startup.bat启动,linux运行startup.sh

3、微服务接入SkyWalking

3.1、windows环境接入SkyWalking

# skywalking-agent.jar的本地磁盘路径
-javaagent:D:\SkyWalking\skywalking-agent\skywalking-agent.jar
# 在skywalking上显示的服务名
-DSW_AGENT_NAME=springboot-skywalking-demo
# skywalking的collector服务的IP及端口
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800
# -DSW_AGENT_COLLECTOR_BACKEND_SERVICES 可以指定远程地址,但javaagent必须指定本机物理路径的skywalking-agent.jar

注意:skywalking默认不支持gateway需要到 skywalking-agent\optional-plugins 文件夹下将 apm-spring-cloud-gateway-3.x-plugin-8.8.0.jar 复制到 skywalking-agent\plugins 文件夹后,重启服务

3.2、linux环境接入SkyWalking

java -javaagent:/usr/loacl/soft/skywalking-agent/skywalking-agent.jar
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800
-DSW_AGENT_NAME=springboot-skywalking-demo
-jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar

3.3、多个微服务接入SkyWalking

只需要每个微服务设置运行参数

4、SkyWalking UI介绍

  • Service Apdex (数字) :当前服务的评分
  • Service Apdex (折线图):不同时间的Apdex评分
  • Service Avg Response Times:平均响应延时,单位ms
  • Service Response Time Percentile:百分比响应延时
  • Successful Rate (数字):请求成功率
  • Successful Rate (折线图):不同时间的请求成功率
  • Service Load (数字):每分钟请求数
  • Service Load (折线图):不同时间的每分钟请求数
  • Service Instances Load :每个服务实例的每分钟请求数
  • Show Service Instance:每个服务实例的最大延时
  • Service Instance Successful Rate :每个服务实例的请求成功率

5、SkyWalking基于mysql持久化数据

config/application.yml

storage:
  selector: ${SW_STORAGE:mysql} #默认使用的H2数据库存储,将h2改为mysql
  mysql: #修改mysql连接 IP端口号,数据库
    properties:
      jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/swtest?rewriteBatchedStatements=true"}
      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}

skywalking默认没有mysql驱动,下载好mysql驱动放入 apache-skywalking-apm-bin/oap-libs 文件夹后,重启服务

6、自定义链路追踪

如需要对业务中的方法,实现链路追踪,可以按照下面步骤实现

<!-- SkyWalking 工具类 -->
<!-- skywalking.version 为版本号,需和服务版本保持一致 -->
<dependency>
   <groupId>org.apache.skywalking</groupId>
   <artifactId>apm-tookit-trace</artifactId>
   <version>${skywalking.version}</version> 
</dependency>
//在业务方法上加入@Trace注解即可
@Override
@Trace
@Tags(@Tag(key="selectAppHistoryVersionList",value="arg[0]"), //记录参数,value=arg[0],0为参数下标,key=方法名
     @Tag(key="selectAppHistoryVersionList",value="returnObj")) //记录返回值 value=returnObj,key=方法名
public List<AppHistoryVersion> selectAppHistoryVersionList(AppHistoryVersion appHistoryVersion)
{
  return appHistoryVersionMapper.selectAppHistoryVersionList(appHistoryVersion);
}
//返回对象需在实体类加入toString,否则返回对象的内存地址

7、告警

自定义发送邮件:
SkyWalking的告警消息会通过 HTTP 请求进行发送,请求方法为 POST,Content-Type 为 application/json,其JSON 数据实基于List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage进行序列化的

json数据字段说明:

  • scopeId、scope:所有可用的 Scope
  • name:目标 Scope 的实体名称
  • id0:Scope 实体的 ID
  • id1:保留字段,目前暂未使用
  • ruleName:告警规则名称
  • alarmMessage:告警消息内容
  • startTime:告警时间,格式为时间戳

定义一个接口接收skywalking告警通知

@RequestMapping("/alarm")
public class AlarmController {

    private final JavaMailSender sender;

    /**
     * 接收skywalking服务的告警通知并发送至邮箱
     */
    @PostMapping("/receive")
    public void receive(@RequestBody List<SwAlarmDTO> alarmList) {
        SimpleMailMessage message = new SimpleMailMessage();
        // 发送者邮箱
        message.setFrom("邮箱");
        // 接收者邮箱
        message.setTo("邮箱");
        // 主题
        message.setSubject("告警邮件");
        String content = getContent(alarmList);
        // 邮件内容
        message.setText(content);
        sender.send(message);
    }

    private String getContent(List<AlarmDTO> alarmList) {
        StringBuilder sb = new StringBuilder();
        for (AlarmDTO dto : alarmList) {
            sb.append("scopeId: ").append(dto.getScopeId())
                    .append("\nscope: ").append(dto.getScope())
                    .append("\n目标 Scope 的实体名称: ").append(dto.getName())
                    .append("\nScope 实体的 ID: ").append(dto.getId0())
                    .append("\nid1: ").append(dto.getId1())
                    .append("\n告警规则名称: ").append(dto.getRuleName())
                    .append("\n告警消息内容: ").append(dto.getAlarmMessage())
                    .append("\n告警时间: ").append(dto.getStartTime());
        }

        return sb.toString();
    }
}

将接口配置到 config/alarm-settings.yml

网络钩子,告警触发接口
webhooks:
  - http://127.0.0.1:8888/alarm/receive # 接口访问地址
posted @ 2022-04-19 16:40  清清清清清  阅读(391)  评论(0编辑  收藏  举报