之前介绍了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. PBN离场定高转弯保护区插件发布测试

    昨天2月29日,是四年才有一次的日子,本想着应该写点什么,但一测试发现还有问题,只能先放下. 今天是三月份的第一天,一年已经过去了六分之一.疫情的关系,原本并不紧急的工作,现在也开始积压的有些多了,时 ...

  2. django学习-4.url动态传值

    1.前言 我们在浏览器访问一个网页A是通过一个指定的url地址去访问的.但在浏览器用一个不存在的url地址去执行访问是打不开正确的网页的,只会打开一个浏览器自带的有错误提示的网页. 在django框架 ...

  3. C++算法模板集合

    我的常用刷题网站:http://218.5.5.242:9018/JudgeOnline/ https://www.luogu.com.cn/ 排序 选择排序(selection sort) 1 vo ...

  4. 生成类库项目时同时生成的pdb文件是什么东东?

    英文全称:Program Database File Debug里的PDB是full,保存着调试和项目状态信息.有断言.堆栈检查等代码.可以对程序的调试配置进行增量链接.Release 里的PDB是p ...

  5. hadoop支持lzo完整过程

    简介 启用lzo 启用lzo的压缩方式对于小规模集群是很有用处,压缩比率大概能降到原始日志大小的1/3.同时解压缩的速度也比较快. 安装lzo lzo并不是linux系统原生支持,所以需要下载安装软件 ...

  6. Java自学第7期——异常(Exception)

    1.概念: 异常 :指的是程序在执行过程中,出现的非正常的情况,终会导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类, 产生异常就是创建异常对象并抛出了一个异常对象. Ja ...

  7. @Transaction注解失效的几种场景

    一.@Transactional介绍 1.@Transactional注解可以作用于哪些地方? @Transactional 可以作用在接口.类.类方法上. 作用于类:表示所有该类的public方法都 ...

  8. DRF简介/接口概念

    目录 一.drf框架简介 1. drf安装 2. drf的优势 二.接口 1. 接口的概念 2. 接口文档 3. 接口规范(restful) 3.1 url链接规范 3.2 请求方式规范 3.3 响应 ...

  9. CSS的定位布局(position)

    定位 static(默认值) 没有开启定位 relative 相对定位的性质 包含块(containing block)概念 没有开启定位时包含块就是当前元素最近的祖先块元素 开启绝对定位后的元素包含 ...

  10. c++移动构造

    下面随笔给出c++移动构造. 在现实中有很多这样的例子,我们将钱从一个账号转移到另一个账号,将手机SIM卡转移到另一台手机,将文件从一个位置剪切到另一个位置--移动构造可以减少不必要的复制,带来性能上 ...