Sentinel 提供了一套完整的实时监控体系,用于收集和展示应用程序的运行时数据,包括流量统计、异常统计、系统指标等。这些数据主要用于流量控制、降级和系统健康度的监控。Sentinel 的监控数据可以分为两大部分:内存中的实时数据和持久化的数据。
1. 内存中的实时数据
Sentinel 在内存中维护了一系列的数据结构来记录实时的监控数据。这些数据主要用于展示当前系统的运行状态,包括但不限于:
- 流量统计:每秒请求的数量、成功请求的数量、失败请求的数量等。
- 异常统计:异常发生次数、异常比例等。
- 系统指标:CPU 使用率、负载、内存使用情况、线程池状态等。
这些数据是短暂的,并且会随着时间和滑动窗口的移动而更新。Sentinel 使用滑动时间窗来统计一段时间内的数据,这有助于快速响应系统的瞬时压力变化。
2. 持久化的数据
虽然 Sentinel 主要关注的是实时数据,但有时也需要将一些重要的监控数据持久化下来,以便于后续分析和审计。Sentinel 支持将监控数据持久化到外部存储系统,如数据库、文件系统或其他第三方存储服务。
持久化数据的方式
-
Dashboard:Sentinel Dashboard 是 Sentinel 的管理界面,它本身可以作为一个数据持久化中心。当 Sentinel 客户端与 Dashboard 连接时,可以将监控数据上报给 Dashboard,Dashboard 会存储这些数据,并提供可视化界面来展示这些数据。
-
日志文件:如果没有连接到 Dashboard,Sentinel 也可以将监控数据输出到本地的日志文件中。这种方式适用于简单的日志审计需求。
-
自定义数据源:Sentinel 提供了可插拔的数据源接口,允许用户自定义数据源来实现数据的持久化。例如,可以编写插件将监控数据写入到 MySQL 数据库、Elasticsearch、Kafka 等。
实现自定义数据源
如果你想实现自定义的数据源,可以参考以下步骤:
-
创建数据源:实现
com.alibaba.csp.sentinel.datasource.DataSource
接口,定义如何从外部系统读取数据。import com.alibaba.csp.sentinel.datasource.DataSource; import com.alibaba.csp.sentinel.datasource.ReadableDataSource; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule; public class MyCustomDataSource<T, R> implements DataSource<T, List<R>> { @Override public ReadableDataSource<T, List<R>> createDataSource() { // 实现数据读取逻辑 return null; } }
-
实现数据转换器:实现
com.alibaba.csp.sentinel.datasource.Converter
接口,定义如何将外部系统中的数据转换为 Sentinel 可以理解的格式。import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule; public class ParamFlowRuleConverter implements Converter<String, List<ParamFlowRule>> { @Override public List<ParamFlowRule> convert(String source) { // 实现数据转换逻辑 return null; } }
-
加载数据源:在应用启动时,注册自定义的数据源和转换器。
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager; public class CustomDataSourceExample { public static void initCustomDataSource() { DataSource<String, List<ParamFlowRule>> dataSource = new NacosDataSource<>( "nacos-server-address", "your-data-id", "your-group-id", new ParamFlowRuleNacosConverter() ); ParamFlowRuleManager.register2Property(dataSource.getProperty()); } }
总结
Sentinel 的监控数据主要分为内存中的实时数据和持久化的数据。内存中的数据主要用于实时监控,而持久化的数据则用于长期保存重要信息。通过自定义数据源和转换器,可以将监控数据持久化到各种存储系统中,满足不同的存储需求。这对于后续的数据分析、审计和问题排查都非常重要。