根据官方wiki文档,sentinel控制台的实时监控数据,默认仅存储 5 分钟以内的数据。如需持久化,需要定制实现相关接口。
1.自行扩展实现 MetricsRepository 接口;
2.注册成 Spring Bean 并在相应位置通过 @Qualifier 注解指定对应的 bean name 即可。
本文先学习官方提供的接口梳理思路,然后使用Spring Data JPA编写一个MySQL存储实现。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
首先看接口定义:
repository.metric包下的MetricsRepository接口
该接口定义了4个方法,分别用于保存和查询sentinel的metric数据。注释其实很清楚了,这里简单过一下:
save:保存单个metric
saveAll:保存多个metric
queryByAppAndResourceBetween:通过应用名名称、资源名称、开始时间、结束时间查询metric列表
listResourcesOfApp:通过应用名称查询资源列表
注:发现跟接口定义跟Spring Data JPA用法很像,即某个实体类Xxx对应一个XxxRepository,方法的命令也很规范,save、queryBy...
结合控制台【实时监控】菜单的界面,大概能猜到列表页面的查询流程:
菜单属于某一个应用,这里应用名称是sentinel-dashborad;
先通过应用名称查询应用下所有的资源,图中看到有2个,资源名称分别是/resource/machineResource.json、/flow/rules.json;// listResourcesOfApp方法
再通过应用名称、资源名称、时间等查询metric列表用于呈现统计图表;// queryByAppAndResourceBetween方法
在MetricsRepository类名上Ctrl+H查看类继承关系(Type Hiberarchy):
默认提供了一个用内存存储的实现类:InMemoryMetricsRepository
在MetricsRepository类的各个方法上,通过Ctrl+Alt+H 查看方法调用关系(Call Hierarchy) :
可以看到,MetricsRepository接口的
save方法被它的实现类InMemoryMetricsRepository的saveAll调用,再往上走被MetricFetcher调用,用于保存metric数据;
queryByAppAndResourceBetween、listResourcesOfApp被MetricController调用,用于查询metric数据;
------------------------------------------------------------------------------------------------------------------