之前介绍了Sentinel相关的文章,小伙伴在生产实践中不知道有没有这个疑问?我们的Sentinel控制台监控的数据只能看最近5分钟的,如图

那么就导致历史数据是查看不了的,那肯定是不行的,在生产环境中我们最起码能够看到最近几天甚至几个月的监控数据,方便我们排查出哪些时间段/哪些天,哪些接口会到达什么样的QPS;方便我们对整体系统的QPS、以及异常情况有基本的了解

如果要做到这些,就需要做到对这些数据进行持久化,而不能只保存在内存中。那我们今天就来介绍一下怎么改造Sentinel控制台,可以达到持久化的目的。同时用XMind画了一张导图记录Spring Cloud Alibaba的学习笔记(源文件对部分节点有详细备注和参考资料,由于太大就没展示全部,欢迎关注我的公众号:阿风的架构笔记 后台发送【导图】拿下载链接, 已经完善更新):

分析

Sentinel客户端会记录资源访问的秒级数据(若没有访问则不进行记录)并保存在本地日志中。Sentinel 控制台可以通过 Sentinel 客户端预留的 HTTP API 从秒级监控日志中拉取监控数据,并进行聚合

目前Sentinel控制台中监控数据聚合后直接存在内存中,未进行持久化,且仅保留最近 5 分钟的监控数据。核心思想就是实现MetricsRepository接口实现,源码如下

MetricsRepository定义了以下接口:

save 与 saveAll:存储对应的监控数据

queryByAppAndResourceBetween:查询某段时间内的某个应用的某个资源的监控数据

listResourcesOfApp:查询某个应用下的所有资源

现在Sentinel控制台只实现了内存InMemoryMetricsRepository,接口可传入自定义范型

上面默认的监控数据类型为MetricEntity,包含应用名称、时间戳、资源名称、异常数、请求通过数、请求拒绝数、平均响应时间等信息

对于监控数据的存储,用户需要根据自己的存储精度,来考虑如何存储这些监控数据。部署多个控制台实例时,通常需要仔细设计下监控拉取和写入策略。

我们知道了Sentinel的实现,那我们持久化监控的方案是什么呢?

方案

我们把监控数据持久化到哪里呢?能想到的就是数据库,但不要选择mysql数据库,而是选择带时序功能的数据库方案,可采用主流的InfluxDB时序数据库

具体InfluxDB和mysql有什么区别,可网上查看

持久化是第一步,我们下一步还需要用图表的方式展现出来,我们第一个能够想到的方案就是Grafana。

小伙伴如果不了解,自行网补

这样我们具体的方案就有了,如图

代码

现在Sentinel控制台项目pom.xml中引入influxdb包

<dependency>
<groupId>org.influxdb</groupId>
<artifactId>influxdb-java</artifactId>
<version>2.21</version>
</dependency>

封装一个influxdb工具类

  1. url、username、password用于存储InfluxDB的连接、用户名、密码信息,定义为static属性,因此在set方法上使用@Value注解从配置文件读取属性值;
  2. resultMapper用于查询结果到实体类的映射;
  3. init方法用于初始化url、username、password;
  4. process为通用的处理方法,负责打开关闭连接,并且调用InfluxDBCallback回调方法;
  5. insert为插入数据方法,配合InfluxDBInsertCallback回调使用;
  6. query为通用的查询方法,配合InfluxDBQueryCallback回调方法使用,返回QueryResult对象;
  7. queryList为查询列表方法,调用query得到QueryResult,再通过resultMapper转换为List<实体类>;

**在resources目录下的application.properties文件中,增加InfluxDB的配置: **

influxdb.url=http://127.0.0.1:8086
influxdb.username=admin
influxdb.password=admin

在datasource.entity包下,新建influxdb包,下面新建sentinel_metric数据表(measurement)对应的实体类MetricPO

该类参考MetricEntity创建,加上influxdb-java包提供的注解

通过@Measurement(name = "sentinel_metric")指定数据表(measurement)名称

time作为时序数据库的时间列

app、resource设置为tag列,通过注解标识为tag=true;

其它字段为filed列;

接着在InMemoryMetricsRepository所在的repository.metric包下新建InfluxDBMetricsRepository类,实现MetricsRepository接口

其中:

  1. save、saveAll方法通过调用InfluxDBUtils.insert和InfluxDBInsertCallback回调方法,往sentinel_db库的sentinel_metric数据表写数据;
  2. saveAll方法不是循环调用save方法,而是在回调内部循环Iterable metrics处理,这样InfluxDBFactory.connect连接只打开关闭一次;
  3. doSave方法中,.time(DateUtils.addHours(metric.getTimestamp(), 8).getTime(), TimeUnit.MILLISECONDS)
  4. queryByAppAndResourceBetween、listResourcesOfApp里面的查询方法,使用InfluxDB提供的类sql语法,编写查询语句即可。

最后一步,在MetricController、MetricFetcher两个类,找到metricStore属性,

在@Autowired注解上面加上@Qualifier("influxDBMetricsRepository")注解:

到此持久化就完成了,可以启动测试一下,就可以发现influxdb进入了监控数据

监控

部署安装Grafana这里就不介绍了,自行网补;Grafana有模板的概念,只要配置了模板,然后动态传入参数即可快速生成多个使用相同模板的不同指标数据的图表。

添加模板

然后配置SQL执行查询,即时可看到效果

配置好以后使用模板功能查看多个接口的流控指标监控

具体Grafana配置,小伙伴们可以自行网补

方案优化

上面我们已经实现了监控数据持久化到influxDB中了,但是我们会发现一写问题

1、sentinel-dashboard目前是每隔一秒从所有的客户端同步一次数据, 集群庞大的情况下,控制台需要拉取很多客户端的数据,效率很低且不稳定,看源码

2、sentinel-dashboard收集到数据以后直接插入数据库没有缓冲,吞吐量低,性能低

基于上面的问题我们可以优化一下方案

优化方案

优化点

  1. 增加一个服务Sentinel Server,用来就是收集监控数据

  2. Sentinel客户端主动推送给Sentinel Server,不需要去拉;这样就解决了集群大的情况

  3. 增加kafka消息中间件,做了数据的缓冲,性能以及吞吐量会大大提升

  4. Sentinel Server发布以及订阅监控数据消息

这个优化方案就要把Sentinel控制台中的监控业务移除掉

总结

这篇文章最主要解决了监控数据持久化监控的问题,涉及到最终的优化方案有时间后续文章介绍,希望这篇文章能够帮助小伙伴们,谢谢!!!

看完三件事️



如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  1. 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  2. 关注公众号 『 阿风的架构笔记 』,不定期分享原创知识。
  3. 同时可以期待后续文章ing
  4. 关注后回复【666】扫码即可获取架构进阶学习资料包

Sentinel上生产环境只差一步,监控数据持久化的更多相关文章

  1. Linux上生产环境源码方式安装配置postgresql12

    1.Linux上源码方式安装postgresql12 01.准备操作系统环境 echo "192.168.1.61 tsepg61" >> /etc/hosts mou ...

  2. VUE项目部署到线上生产环境,Loading chunk xxx failed

    项目部署到生产环境,路由点击无效,报错 Loading chunk chunk-xxxxx failed.(missing xxxx) 加载失败,错误的路径. 话不多说,直接贴代码: vue.conf ...

  3. sentinel控制台监控数据持久化【InfluxDB】

    根据官方wiki文档,sentinel控制台的实时监控数据,默认仅存储 5 分钟以内的数据.如需持久化,需要定制实现相关接口. https://github.com/alibaba/Sentinel/ ...

  4. sentinel控制台监控数据持久化【MySQL】

    根据官方wiki文档,sentinel控制台的实时监控数据,默认仅存储 5 分钟以内的数据.如需持久化,需要定制实现相关接口. https://github.com/alibaba/Sentinel/ ...

  5. NanoProfiler - 适合生产环境的性能监控类库 之 大数据篇

    上期回顾 上一期:NanoProfiler - 适合生产环境的性能监控类库 之 基本功能篇 上次介绍了NanoProfiler的基本功能,提到,NanoProfiler实现了MiniProfiler欠 ...

  6. Dubbo Mesh 在闲鱼生产环境中的落地实践

    本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是“借力开源.反哺开源” ...

  7. MySQL 系列(五) 多实例、高可用生产环境实战

    MySQL 系列(五) 多实例.高可用生产环境实战   第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 史上最屌.你不知道的数据库操作 第三 ...

  8. Filebeat 收集K8S 日志,生产环境实践

    根据生产环境要求,需要采集K8Spod 日志,和开发协商之后,pod中应用会将日志输出到容器终端上,这时可以直接用filebeat 采集node节点上面的/var/log/containers/*.l ...

  9. Java生产环境下性能监控与调优详解视频教程 百度云 网盘

    集数合计:9章Java视频教程详情描述:A0193<Java生产环境下性能监控与调优详解视频教程>软件开发只是第一步,上线后的性能监控与调优才是更为重要的一步本课程将为你讲解如何在生产环境 ...

随机推荐

  1. nginx日志文件切分

    定义cut_nginx_log.sh 日志文件脚本如下 #!/bin/bash#LOGS_PATH为日志存放路径LOGS_PATH=/weblog/nginx/logsYESTERDAY=$(date ...

  2. 翻译:《实用的 Python 编程》02_07_Objects

    目录 | 上一节 (2.6 列表推导式) | 下一节 (3 从程序组织) 2.7 对象 本节介绍有关 Python 内部对象模型的更多详细信息,并讨论一些与内存管理,拷贝和类型检查有关的问题. 赋值 ...

  3. Django-用户权限,用户角色使用指南

    RBAC(Role-Based Access Control,基于角色的访问控制)就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用户 ...

  4. HDOJ-1114(完全背包模板题)

    Piggy-Bank HDOJ-1114 本题就是完全背包的模板题,注意复习一下关于背包九讲中的问什么这里使用的是顺序遍历. 还需要注意的一个问题就是初始化的问题,dp[0]初始化为0,其他的初始化为 ...

  5. Mybatis系列全解(二):Mybatis简介与环境搭建

    封面:洛小汐 作者:潘潘 Mybatis 是一套持久层框架,灵活易用,特别流行. 前言 Mybatis系列全解,我们预计准备10+篇文章,让我们了解到 Mybatis 的基本全貌,真正从入门到上手,从 ...

  6. Java 集合框架 01

    集合框架· ArrayList 和 Vector 对象数组的概述和使用 * A:案例演示 * 需求:我有5个学生,请把这5个学生的信息存储到数组中,并遍历数组,获取到每个学生的信息 Student[] ...

  7. django Form 效验

    Django 登入效验 .py from django import forms from student import models from django.core.exceptions impo ...

  8. 「CTSC 2013」组合子逻辑

    Tag 堆,贪心 Description 给出一个数列 \(n\) 个数,一开始有一个括号包含 \([1,n]\),你需要加一些括号,使得每个括号(包括一开始的)所包含的元素个数 \(\leq\) 这 ...

  9. Prometheus时序数据库-数据的查询

    Prometheus时序数据库-数据的查询 前言 在之前的博客里,笔者详细阐述了Prometheus数据的插入过程.但我们最常见的打交道的是数据的查询.Prometheus提供了强大的Promql来满 ...

  10. Spring(一):Spring概述及相关概念

    Spring简介 Spring主要作用是用来解耦,降低代码之间的耦合度.根据功能的不同,可以将系统的代码分为主业务逻辑与系统服务逻辑. 主业务逻辑之间代码联系紧密,相互调用较多,复用性相对较低: 系统 ...