Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot 2.0 + InfluxDB+ Sentinel 实时监控数据存储

SpringBoot 2.0 + InfluxDB+ Sentinel 实时监控数据存储

作者头像
小柒2012
发布于 2019-12-05 14:45:49
发布于 2019-12-05 14:45:49
1.3K00
代码可运行
举报
文章被收录于专栏:IT笔记IT笔记
运行总次数:0
代码可运行

前言

阿里巴巴提供的控制台只是用于演示 Sentinel 的基本能力和工作流程,并没有依赖生产环境中所必需的组件,比如持久化的后端数据库、可靠的配置中心等。目前 Sentinel 采用内存态的方式存储监控和规则数据,监控最长存储时间为 5 分钟,控制台重启后数据丢失

企业版

这里推荐一下阿里云的官方版,AHAS Sentinel 控制台 是 Sentinel 控制台的阿里云上版本,提供企业级的控制台服务,包括:

  • 实时请求链路查看
  • 还有各种酷炫的监控图表
  • 可靠的实时监控和历史监控数据查询,无需自行存储、拉取
  • 动态规则管理/推送,无需自行配置外部数据源

免费版,可以提供 5 个节点的免费额度。开通专业版即可享受不限量节点额度。

专业版没有实例连接限制,开通后每天前5个限流降级节点不计费,超出部分按3元/天/实例收取相应的费用。

思路

官方文档也提供了思路,若需要监控数据持久化的功能,可以自行扩展实现 MetricsRepository 接口(0.2.0 版本),然后注册成 Spring Bean 并在相应位置通过 @Qualifier 注解指定对应的 bean name 即可。MetricsRepository 接口定义了以下功能:

  • save 与 saveAll:存储对应的监控数据
  • queryByAppAndResourceBetween:查询某段时间内的某个应用的某个资源的监控数据
  • listResourcesOfApp:查询某个应用下的所有资源

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

对于监控数据的存储,用户需要根据自己的存储精度,来考虑如何存储这些监控数据。显然我们要使用目前最流行的时序数据库InfluxDB解决方案,不要问什么?闭眼享受就可以了。

选型

InfluxDB是一个开源分布式时序、事件和指标数据库。使用 Go 语言编写,无需外部依赖。

应用:性能监控,应用程序指标,物联网传感器数据和实时分析等的后端存储。

  • 强大的类SQL语法
  • 内置http支持,使用http读写
  • 基于事件:它支持任意的事件数据
  • 无结构(无模式):可以是任意数量的列
  • 可度量性:你可以实时对大量数据进行计算
  • 持续高并发写入、无更新、数据压缩存储、低查询延时
  • 支持min, max, sum, count, mean, median 等一系列函数
  • 基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等)

改造

InfluxDB 安装

首先你得先有个 Influxdb 数据库,建议使用 Docker 方式安装,更多可以参考文末链接。

需要注意的是,从1.1.0版开始不推荐使用管理员界面,并将在1.3.0版中删除。默认情况下禁用。如果需要,仍可以通过设置如下环境变量来启用它。

以下端口很重要,并由InfluxDB使用。

  • 8086 HTTP API端口
  • 8083 管理员界面端口(如果已启用,1.7.8貌似启用也不好使),官方推荐使用chronograf

通过该命令, 生成默认配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run --rm influxdb influxd config > influxdb.conf

创建并运行容器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d \
        -p 8086:8086 \
        -p 8083:8083 \
        -e INFLUXDB_ADMIN_ENABLED=true \
        -v $PWD/data:/var/lib/influxdb/ \
        -v $PWD/config/influxdb.conf:/etc/influxdb/influxdb.conf:ro \
        --name influx \
        influxdb -config /etc/influxdb/influxdb.conf

生产环境一定要开启权限验证,修改 influxdb.conf 配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[http]
  enabled = true
  bind-address = ":8086"
  auth-enabled = true # 鉴权

创建用户:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 进入容器
docker exec -it influx  /bin/sh
# 连接
influx
# 创建用户
CREATE USER admin with PASSWORD 'admin' WITH ALL PRIVILEGES

退出重新登录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 用户密码登录
influx -username admin -password admin
# 创建数据库
CREATE DATABASE sentinel_log
Sentinel 控制台改造

pom.xml引入 influxdb 官方开源工具包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
     <groupId>org.influxdb</groupId>
     <artifactId>influxdb-java</artifactId>
     <version>2.15</version>
</dependency>

配置文件引入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 自行替换 API 地址:端口
spring.influx.url=http://127.0.0.1:8086
spring.influx.user=admin
spring.influx.password=admin
spring.influx.database=sentinel_log

配置数据源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * InfluxDb 配置
 * 创建者 爪哇笔记
 * 网址 https://blog.52itstyle.vip
 */
@Configuration
public class InfluxDbConfig {

    @Value("${spring.influx.url:''}")
    private String influxDBUrl;

    @Value("${spring.influx.user:''}")
    private String userName;

    @Value("${spring.influx.password:''}")
    private String password;

    @Value("${spring.influx.database:''}")
    private String database;

    @Bean
    public InfluxDB influxDB(){
        InfluxDB influxDB = InfluxDBFactory.connect(influxDBUrl, userName, password);
        try {
            /**
             * 异步插入:
             * enableBatch这里第一个是point的个数,第二个是时间,单位毫秒
             * point的个数和时间是联合使用的,如果满100条或者2000毫秒
             * 满足任何一个条件就会发送一次写的请求。
             */
            influxDB.setDatabase(database)
                    .enableBatch(100,2000, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            influxDB.setRetentionPolicy("autogen");
        }
        influxDB.setLogLevel(InfluxDB.LogLevel.BASIC);
        return influxDB;
    }
}

实现 MetricsRepository 接口,重写实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 数据 CURD
 * 创建者 爪哇笔记
 * 网址 https://blog.52itstyle.vip
 */
@Component("inInfluxdbMetricsRepository")
public class InInfluxdbMetricsRepository implements MetricsRepository<MetricEntity> {

    @Autowired
    public InfluxDB influxDB;

    @Override
    public synchronized void save(MetricEntity metric) {
       //省略代码,太长了,参考内存写法,参考 saveAll 这里是单条插入
    }

    @Override
    public synchronized void saveAll(Iterable<MetricEntity> metrics) {
        if (metrics == null) {
            return;
        }
        BatchPoints batchPoints = BatchPoints.builder()
                .tag("async", "true")
                .consistency(InfluxDB.ConsistencyLevel.ALL)
                .build();
        metrics.forEach(metric->{
            Point point = Point
                    .measurement("sentinelInfo")
                    //这里使用微妙、如果还有覆盖数据就使用纳秒,保证 time 和 tag 唯一就可以
                    .time(System.currentTimeMillis(), TimeUnit.MICROSECONDS)
                    .tag("app",metric.getApp())//tag 数据走索引
                    .addField("gmtCreate", metric.getGmtCreate().getTime())
                    .addField("gmtModified", metric.getGmtModified().getTime())
                    .addField("timestamp", metric.getTimestamp().getTime())
                    .addField("resource", metric.getResource())
                    .addField("passQps", metric.getPassQps())
                    .addField("successQps", metric.getSuccessQps())
                    .addField("blockQps", metric.getBlockQps())
                    .addField("exceptionQps", metric.getExceptionQps())
                    .addField("rt", metric.getRt())
                    .addField("count", metric.getCount())
                    .addField("resourceCode", metric.getResourceCode())
                    .build();
            batchPoints.point(point);
        });
        //批量插入
        influxDB.write(batchPoints);
    }

    @Override
    public synchronized List<MetricEntity> queryByAppAndResourceBetween(String app, String resource, long startTime, long endTime) {
       //省略代码,太长了,参考内存写法
    }

    @Override
    public synchronized List<String> listResourcesOfApp(String app) {
       //省略代码,太长了,参考内存写法
    }
}

分别修改 MetricFetcherMetricControllermetricStore 的注入方式,使用 Influxdb 实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 注入
 * 创建者 爪哇笔记
 * 网址 https://blog.52itstyle.vip
 */
@Autowired
@Qualifier("inInfluxdbMetricsRepository")
private MetricsRepository<MetricEntity> metricStore;

配置完成后,我们重启控制台,然后访问客户端项目,如果控制台打印以下数据,说明配置成功:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2019-09-21 19:47:25 [sentinel-dashboard-metrics-fetchWorker-thread-2] INFO  okhttp3.OkHttpClient - --> POST http://118.190.247.102:8086/write?db=sentinel_log&precision=n&consistency=all (486-byte body)
2019-09-21 19:47:25 [sentinel-dashboard-metrics-fetchWorker-thread-2] INFO  okhttp3.OkHttpClient - <-- 204 No Content http://118.190.247.102:8086/write?db=sentinel_log&precision=n&consistency=all (46ms, 0-byte body)

多访问几次客户端项目,然后登陆控制台查看,出现以下效果,说明改造成功:

注意事项:

  • 官方前端并没有实现按照时间范围的查询搜索,需要自行实现
  • 官方控制台实时监控默认查询的是最近一分钟的热点资源排行,见方法 listResourcesOfApp
  • 官方控制台实时监控右侧 Table 默认查询的是最近五分钟的热点访问详情,见方法 queryTopResourceMetric

小结

对于官方五分钟的阉割版,时序数据库实现的流控数据存储,对于生产环境还是很有帮助的,比如实时数据分析,热点资源、监控预警等等。小伙伴们还可以根据实际生产需求结合ChronografGrafana 做出更炫酷的大屏监控。

源码

https://gitee.com/52itstyle/sentinel-dashboard

参考

https://cloud.tencent.com/developer/article/1549864

https://hub.docker.com/_/influxdb

https://hub.docker.com/_/chronograf

https://github.com/influxdata/influxdb-java

https://github.com/influxdata/influxdb-python

https://help.aliyun.com/document_detail/97578.htm

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
彻底搞懂时序数据库InfluxDB,在SpringBoot整合InfluxDB
之前介绍了运维监控系统Prometheus,然后就有朋友问我关于时序数据库的情况,所以这里总结一下时序数据库,并以InfluxDB为例,介绍时序数据库的功能特性和使用方式,希望能对大家有所帮助。
章为忠学架构
2023/10/06
20.2K0
彻底搞懂时序数据库InfluxDB,在SpringBoot整合InfluxDB
SpringBoot 2.x 开发案例之整合时序数据库 Influxdb
InfluxDB是一个时间序列数据库,旨在处理较高的写入和查询负载。它是TICK堆栈的组成部分 。InfluxDB旨在用作涉及大量时间戳数据的任何用例的后备存储,包括DevOps监控,应用程序指标,IoT传感器数据和实时分析。。
小柒2012
2021/08/12
3.8K0
influxDb_ef mongodb
InfluxDB(时序数据库)(influx,[ˈɪnflʌks],流入,涌入),常用的一种使用场景:监控数据统计。每毫秒记录一下电脑内存的使用情况,然后就可以根据统计的数据,利用图形化界面(InfluxDB V1一般配合Grafana)制作内存使用情况的折线图;可以理解为按时间记录一些数据(常用的监控数据、埋点统计数据等),然后制作图表做统计;
全栈程序员站长
2022/11/01
1.1K0
influxDb_ef mongodb
性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控
本文我们将介绍如何使用JMeter+InfluxDB+Grafana打造压测可视化实时监控。
高楼Zee
2019/07/17
2.5K0
性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控
如何使用CentOS 7上的TICK堆栈监控系统指标
TICK堆栈是来自时间序列数据库InfluxDB的开发人员的产品集合。它由以下组件组成:
木纸鸢
2018/08/01
2.6K0
如何使用CentOS 7上的TICK堆栈监控系统指标
安装influxdb监控套件
进入 https://grafana.com/dashboards/928 按它的配置,修改telegraf的配置。 下载json文件,进入new dashboard,然后导入这个json。 简直吊爆了。
超级大猪
2019/11/22
1.1K0
springboot2输出metrics到influxdb
本文主要研究一下如何将springboot2的metrics输出到influxdb
code4it
2018/09/17
1.9K0
利用TICK搭建Docker容器可视化监控中心
性能监控是容器服务必不可少的基础设施,容器化应用运行于宿主机上,我们需要知道该容器的运行情况,包括 CPU使用率、内存占用、网络状况以及磁盘空间等等一系列信息。在我的前文《Docker容器可视化监控中心搭建》之中我们就实践过Docker容器的可视化监控,在那篇文章中我们是使用了 cAdvisor + influxdb + grafana 技术栈来完成的。然而容器化世界里向来不会只有一种方法来实现某项功能,可以说有一百条大路来通到罗马,因此本文再来探讨另一种称为 TICK 的技术栈方案来实现Docker容器的性能监控。
CodeSheep
2018/07/05
1.6K0
利用TICK搭建Docker容器可视化监控中心
从SpringBoot构建十万博文聊聊Tomcat集群监控
在十万博文终极架构中,我们使用了Tomcat集群,但这并不能保证系统不会出问题,为了保证系统的稳定运行,我们还需要对 Tomcat 进行有效的运维监控手段,不至于问题出现或者许久一段时间才知道。凌晨一点这个锅可谁都不想背,为此基于目前的情况搭建了以下这么一套监控预警系统。
小柒2012
2019/12/05
5730
性能测试实时监听工具Influx+Grafana
非GUI方式运行Jmeter来制造负载时,对于测试结果的监听是十分简陋的,仅仅是在控制台打印,或者存到文件,并不能实时地监控到结果,这种状况是能不忍受的。近年来,时序数据库崛起,辅以Dashboard工具,他们能够高效地对监控数据进行展示。
漫谈测试
2025/01/16
1260
性能测试实时监听工具Influx+Grafana
服务器实时监控平台Telegraf+InfluxDB+Grafana
InfluxDB是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。
wangmcn
2022/07/26
2K0
服务器实时监控平台Telegraf+InfluxDB+Grafana
InfluxDB和Grafana集成
在这个例子中,我们将在同一台机器(Ubuntu 16.04)上安装InfluxDB和Grafana,然后配置两者,以便Grafana可以可视化存储在InfluxDB中的数据。我们将使用InfluxDB版本1.3.5和Grafana版本4.4.3。
后场技术
2020/09/03
1.8K0
InfluxDB和Grafana集成
Grafana + InfluxDB 实现 Jmeter 压测的图形化监控
本方案采用 Grafana + InfluxDB 实时展示 Jmeter 的压测数据,下面为本文实验的压测指标数据流向图。
鲍远林
2020/10/23
4.7K0
Grafana + InfluxDB 实现 Jmeter 压测的图形化监控
基于 Njmon + InfluxDB + Grafana 实现性能指标实时可视监控
基于 Njmon + InfluxDB + Grafana 实现性能指标实时可视监控
叨叨软件测试
2020/04/14
2.5K2
基于 Njmon + InfluxDB + Grafana 实现性能指标实时可视监控
如何将 Spring Boot Actuator 的指标信息输出到 InfluxDB 和 Prometheus
Spring Boot Actuator是Spring Boot 2发布后修改最多的项目之一。它经过了主要的改进,旨在简化定制,并包括一些新功能,如支持其他Web技术,例如新的反应模块 - SpringWebFlux。它还为 InfluxDB添加了开箱即用的支持,这是一个开源时间序列数据库,旨在处理大量带时间戳的数据。与 SpringBoot1.5使用的版本相比,它实际上是一个很大的简化。您可以通过阅读我之前的一篇文章使用Grafana和InfluxDB自定义指标可视化来了解自己有多少。我在那里描述了如何使用 @ExportMetricsWriter bean将[Spring Boot Actuator生成的指标导出到InfluxDB。示例Spring Boot应用程序已在分支主文件中的GitHub存储库sample-spring-graphite上提供该文章。对于本文,我创建了分支spring2,它展示了如何实现与使用Spring Boot 2.0版本之前相同的功能。弹簧启动执行器。
程序猿DD
2019/05/10
5.1K0
如何将 Spring Boot Actuator 的指标信息输出到 InfluxDB 和 Prometheus
SpringBoot 2.0 + Nacos + Sentinel 流控规则集中存储
Sentinel 原生版本的规则管理通过API 将规则推送至客户端并直接更新到内存中,并不能直接用于生产环境。不过官方也提供了一种 Push模式,扩展读数据源ReadableDataSource,规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。这里我们通过配置 Nacos 来实现流控规则的统一存储配置。
小柒2012
2019/12/05
1.2K0
influxdb安装和学习
https://docs.docker.com/samples/library/influxdb/
Ryan-Miao
2019/06/21
1.6K0
Springboot2 Metrics之actuator集成influxdb, Grafana提供监控和报警
到目前为止,各种日志收集,统计监控开源组件数不胜数,即便如此还是会有很多人只是tail -f查看一下日志文件。随着容器化技术的成熟,日志和metrics度量统计已经不能仅仅靠tail -f来查看了,你甚至都不能进入部署的机器。因此,日志收集和metrics统计就必不可少。日志可以通过logstash或者filebeat收集到ES中用来查阅。对于各种统计指标,springboot提供了actuator组件,可以对cpu, 内存,线程,request等各种指标进行统计,并收集起来。本文将粗略的集成influxdb来实现数据收集,以及使用Grafana来展示。
Ryan-Miao
2019/06/22
2.2K0
Telegraf+Influxdb+Grafana 轻量级监控系统部署
本方案中采用 数据存储(InfluxDB),数据采集(Telegraf),数据展示(Grafana )。
IT大咖说
2020/08/11
4.6K0
Telegraf+Influxdb+Grafana 轻量级监控系统部署
1.InfluxDB数据库快速入门与基础使用
[TOC] 0x00 前言简述 InfluxDB 介绍 Q: 什么是InfluxDB? InfluxDB 采用Go语言开发是一个开源时间序列平台, 是一个可编程且高性能的时间序列数据库,具有跨 OS
全栈工程师修炼指南
2022/09/29
8.6K0
1.InfluxDB数据库快速入门与基础使用
推荐阅读
相关推荐
彻底搞懂时序数据库InfluxDB,在SpringBoot整合InfluxDB
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验