sentinel prometheus指标收集及资源规则正则表达式实现

sentinel 支持 prometheus 收集指标

实现原理

在这里插入图片描述

在 sentinel-extension 模块下,新增 sentinel-prometheus-metric-exporter 模块。依赖Prometheus 提供的 simpleclient 和 simpleclient_httpserver 来实现 exporter。
依赖 simpleclient 主要是为了实现自定义Collector:SentinelCollector, SentinelCollector 继承了抽象类 Collector,实现 collect 方法来获取指标样本数据。指标样本数据的获取是通过 MetricSearcher 对象读取 metrics.log 文件内容得到的。

metrics.log 文件内容,包含时间、资源名、通过 QPS、block QPS 等数据:

在这里插入图片描述
simpleclient_httpserver 主要用来实现一个简单的 HTTP 服务器,接收来自 Prometheus 获取指标数据的请求。
在这里插入图片描述

代码说明

public void init() throws Exception {HTTPServer server = null;try {// 注册自定义 Collectornew SentinelCollector().register();// 开启http服务供prometheus调用// 默认只提供一个接口 http://ip:port/metrics,返回所有指标int promPort = PrometheusGlobalConfig.getPromFetchPort();server = new HTTPServer(promPort);} catch (Throwable e) {RecordLog.warn("[PromExporterInit] failed to init prometheus exporter with exception:", e);}HTTPServer finalServer = server;Runtime.getRuntime().addShutdownHook(new Thread(() -> {if (finalServer != null) {finalServer.stop();}}));}

init 方法启动,先注册 SentinelCollector ,然后启动 HTTPServer 用于接收 prometheus 等请求。

public List<MetricFamilySamples> collect() {// 初始化指标读取对象if (searcher == null) {synchronized (lock) {if (searcher == null) {searcher = new MetricSearcher(MetricWriter.METRIC_BASE_DIR,MetricWriter.formMetricFileName(SentinelConfig.getAppName(), PidUtil.getPid()));}RecordLog.warn("[SentinelCollector] init sentinel metrics searcher with appName:{}", appName);lastFetchTime = System.currentTimeMillis() / ONE_SECOND * ONE_SECOND;}}List<MetricFamilySamples> list = new ArrayList<>();long endTime = System.currentTimeMillis() / ONE_SECOND * ONE_SECOND - (long) delayTime * ONE_SECOND;try {// 读取指标数据List<MetricNode> nodes = searcher.findByTimeAndResource(lastFetchTime, endTime, identify);if(nodes == null){return list;}if(nodes.size() > fetchSize){nodes = nodes.subList(0,fetchSize);}GaugeMetricFamily metricFamily = new GaugeMetricFamily(appName, MetricConstants.METRIC_HELP,Arrays.asList(MetricConstants.RESOURCE, MetricConstants.CLASSIFICATION,MetricConstants.METRIC_TYPE));for (MetricNode node : nodes) {// 转化成 prometheus 要求的指标数据模型long recordTime = node.getTimestamp();for (String type : types) {double val = getTypeVal(node,type);metricFamily.addMetric(Arrays.asList(node.getResource(), String.valueOf(node.getClassification()),type), val,recordTime);}}list.add(metricFamily);} catch (Exception e) {RecordLog.warn("[SentinelCollector] failed to fetch sentinel metrics with exception:", e);}finally {lastFetchTime = endTime + ONE_SECOND;}return list;}

SentinelCollector collect 方法实现具体的读取 metrics.log 文件逻辑。

sentinel 支持资源规则正则表达式匹配

主要是通过增加 RuleManager 来统一管理普通规则和正则规则,为了减少正则解析/匹配所带来的性能损耗,增加了资源和匹配后的正则限流规则缓存,当获取资源规则时直接从Map 中读取缓存,避免每次都重新进行一次正则匹配。这是一种典型的空间换时间的做法。

另外在修改完规则后,更新时也会根据现有的缓存关系,重新构建新的缓存关系。

类图:
在这里插入图片描述

代码解析

    private Map<Pattern, List<R>> regexRules = new HashMap<>();// 缓存资源和对应的正则规则private Map<String, List<R>> regexCacheRules = new HashMap<>();private Map<String, List<R>> simpleRules = new HashMap<>();

获取规则

public List<R> getRules(String resource) {List<R> result = new ArrayList<>(simpleRules.getOrDefault(resource, Collections.emptyList()));if (regexRules.isEmpty()) {return result;}if (regexCacheRules.containsKey(resource)) {result.addAll(regexCacheRules.get(resource));return result;}synchronized (this) {if (regexCacheRules.containsKey(resource)) {result.addAll(regexCacheRules.get(resource));return result;}List<R> compilers = matcherFromRegexRules(resource);regexCacheRules.put(resource, compilers);result.addAll(compilers);return result;}}

引用参考

  1. https://github.com/alibaba/Sentinel/pull/3173
  2. https://github.com/alibaba/Sentinel/pull/3251
  3. https://prometheus.wang/exporter/client_library_java.html
  4. https://www.yuque.com/g/liushi-8bggz/vb1nye/nl0e93ri1ouwf9u0/collaborator/join?token=rDXFoa8BMH6VCeD9&source=doc_collaborator#%20%E3%80%8APrometheus%E5%AF%B9%E6%8E%A5%E3%80%8B

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/526206.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络编程套接字(3)——Java数据报套接字(UDP协议)

目录 一、Java数据报套接字通信模型 二、UDP数据报套接字编程 1、DatagramSocket &#xff08;1&#xff09;DatagramSocket构造方法 &#xff08;2&#xff09;DatagramSocket方法 2、DatagramPacket &#xff08;1&#xff09;DatagramPacket构造方法 &#xff08;2&…

高吞吐SFTP连接池设计方案

背景 在现代的数据驱动环境中&#xff0c;安全文件传输协议&#xff08;SFTP&#xff09;扮演着至关重要的角色&#xff0c;它提供了一种安全、可靠的文件传输方式。我们目前项目是一个大型数据集成平台&#xff0c;跟上下游有很多文件对接是通过SFTP协议&#xff0c;当需要处…

考研数学——高数:重积分

直角坐标系下二重积分 助记1&#xff1a; 因为一重积分求出的是二维平面的面积&#xff0c;类比得到二重积分得到的是三维的体积 而用之前求旋转体体积的思路&#xff1a;已知截面面积可求得体积。来表示二重积分 在控制一个变量不变&#xff08;x / y&#xff09;时&#x…

基于人工智能自动问答客服系统

在计算机及网络技术的飞速发展的今天&#xff0c;学校教育单位词语管理信息化、网络化是必然的趋势。然而我们利用计算机和网络技术来开发关于聊天自动控制管理系统是必不可少的&#xff0c;使用这样的技术有利于实现场景词语自动执行&#xff0c;减轻管理员的工作负荷&#xf…

【Android 内存优化】KOOM 快手开源框架线上内存监控方案-源码剖析

文章目录 前言OOMMonitorInitTask.INSTANCE.initOOMMonitor.INSTANCE.startLoopsuper.startLoopcall() LoopState.Terminate dumpAndAnalysisdumpstartAnalysisService回到startLoop方法总结 前言 这篇文章主要剖析KOOM的Java层源码设计逻辑。 使用篇请看上一篇: 【Android …

实验二(一):IPV4编址及IPV4路由基础实验

一实验介绍 1.关于本实验 IPv4( Internet Protocol Version 4)是 TCP/IP 协议族中最为核心的协议之一。 它工作在 TCP/IP参考模型的网际互联层&#xff0c;该层与 OSI参考模型的网络层相对应。 网络层提供了无连接数据传输服务&#xff0c;即网络在发送分组时不需要先建立连…

深度学习在硬件和计算平台上的优化:实现更快、更高效的突破

引言 深度学习&#xff0c;作为机器学习领域的一个子集&#xff0c;通过模拟人脑神经元的连接方式&#xff0c;构建复杂的网络结构来处理和分析数据。然而&#xff0c;随着深度学习模型规模的不断扩大和复杂度的提高&#xff0c;其对计算资源的需求也呈指数级增长。因此&#…

远程连接Linux系统

图形化、命令行 对于操作系统的使用&#xff0c;有2种使用形式&#xff1a; 图形化页面使用操作系统 图形化&#xff1a;使用操作系统提供的图形化页面&#xff0c;以获得图形化反馈的形式去使用操作系统。 以命令的形式使用操作系统 命令行&#xff1a;使用操作系统提供的各…

OpenCV学习笔记(五)——图片的缩放、旋转、平移、裁剪以及翻转操作

目录 图像的缩放 图像的平移 图像的旋转 图像的裁剪 图像的翻转 图像的缩放 OpenCV中使用cv2.resize()函数进行缩放&#xff0c;格式为&#xff1a; resize_imagecv2.resize(image,(new_w,new_h),插值选项) 其中image代表的是需要缩放的对象&#xff0c;(new_w,new_h)表…

1950-2022年各区县逐年平均降水量数据

1950-2022年各区县逐年平均降水量数据 1、时间&#xff1a;1950-2022年 2、指标&#xff1a;省逐年平均降水量 3、范围&#xff1a;33省&#xff08;不含澳门&#xff09;、360地级市、2800个县 4、指标解释&#xff1a;逐年平均降水数据是指当年的日降水量的年平均值&…

Swift 入门学习:集合(Collection)类型趣谈-上

概览 集合的概念在任何编程语言中都占有重要的位置&#xff0c;正所谓&#xff1a;“古来聚散地&#xff0c;宿昔长荆棘&#xff1b;游人聚散中&#xff0c;一片湖光里”。把那一片片、一瓣瓣、一粒粒“可耐”的小精灵全部收拢、吸纳的井然有序、条条有理&#xff0c;怎能不让…

chrome高内存占用问题

chrome号称内存杀手不是盖的&#xff0c;不设设置的话&#xff0c;经常被它内存耗尽死机是常事。以下自用方法 1 自带的memory saver chrome://settings/performance PerformanceMemory Saver When on, Chromium frees up memory from inactive tabs. This gives active tab…