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 {
            // 注册自定义 Collector
            new 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于手机是否支持h264的问题的解决方案

目录 现象 原理 修改内容 现象 开始以为是手机不支持h264的编码 。机器人chatgpt一通乱扯。 后来检查了下手机&#xff0c;明显是有h264嘛。 终于搞定&#xff0c;不枉凌晨三点起来思考 原理 WebRTC 默认使用的视频编码器是VP8和VP9&#xff0c;WebRTC内置了这两种编码器…

flink重温笔记(十二): flink 高级特性和新特性(1)——End-to-End Exactly-Once(端到端精确一致性语义)

Flink学习笔记 前言&#xff1a;今天是学习 flink 的第 12 天啦&#xff01;学习了 flink 高级特性和新特性之 End-to-End Exactly-Once&#xff08;端到端精确一致性语义&#xff09;&#xff0c;主要是解决大数据领域数据从数据源到数据落点的一致性&#xff0c;不会容易造成…

计算机组成原理之机器:存储器之辅助存储器

计算机组成原理之机器&#xff1a;存储器之辅助存储器 笔记来源&#xff1a;哈尔滨工业大学计算机组成原理&#xff08;哈工大刘宏伟&#xff09; Chapter3&#xff1a;存储器之辅助存储器 3.1 概述 3.2 磁记录原理 通不同方向电流时磁化方向不同&#xff0c;由此区分写入…

逆向分析 FSViewer 并写出注册机

逆向分析 FSViewer 并写出注册机 FSViewer是一款老牌的图片管理查看编辑软件, 个人使用免费, 商用收费 本文将逆向分析FSViewer 7.5版本的注册算法并编写注册机 0. 前言 最近在整理之前的资料, 发现了一篇几年前刚学逆向那会儿写的文章, 是跟着看雪一位大牛的文章做的, 但逆向…

基于yolov5的番茄检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的小番茄检测系统&#xff0c;系统既能够实现图像检测&#xff0c;也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的番茄检测系统是在pytorch框架下实现的&#xff0c;这是一个完整的项目&…

Vue 项目性能优化指南:提升应用速度与效率

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【前端】-初始前端以及html的学习

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

(未解决)macOS matplotlib 中文是方框

reference&#xff1a; Mac OS系统下实现python matplotlib包绘图显示中文(亲测有效)_mac plt 中文值-CSDN博客 module ‘matplotlib.font_manager‘ has no attribute ‘_rebuild‘解决方法_font_manager未解析-CSDN博客 # 问题描述&#xff08;笑死 显而易见 # solve 找到…

CleanMyMac X4.15.0专为macOS设计的清理和优化工具

CleanMyMac X 是一款专为 macOS 设计的清理和优化工具。其基本功能和特点主要包括&#xff1a; 系统清理&#xff1a;CleanMyMac X 可以扫描并清除 macOS 系统中的垃圾文件&#xff0c;如缓存、日志、无用的语言文件等&#xff0c;从而释放硬盘空间并提高系统性能。应用程序管…

贪心算法(greedy algorithm,又称贪婪算法)详解(附例题)

目录 基本思想一&#xff09;概念二&#xff09;找出全局最优解的要求三&#xff09;求解时应考虑的问题四&#xff09;基本步骤五&#xff09;贪心策略选择六&#xff09;实际应用 1.零钱找回问题2.背包问题3.哈夫曼编码4.单源路径中的Djikstra算法5.最小生成树Prim算法 基本…

备考银行科技岗刷题笔记(持续更新版)

银行考试计算机部分复习 IEEE 802.11的帧格式 1.1 IEEE 802.11是什么&#xff1f; 802.11是国际电工电子工程学会&#xff08;IEEE&#xff09;为无线局域网络制定的标准。目前在802.11的基础上开发出了802.11a、802.11b、802.11g、802.11n、802.11ac。并且为了保证802.11更…

【电工学笔记】上册第一、二章

电工学 上次考试败在了单位&#xff0c;这次单位 一定要记熟。 第一章 电源或信号源的电压或电流称为激励,它推动电路工作; 由激励所产生的电压和电流称为响应。 复杂电路中,一般无法事先判断某个支路电流的 实际方向或者某个电路元件电压的实际方向 140V/4算不出总电阻的 …

thingsboard如何自定义udp-transport

0、参考netty实现udp的文章 https://github.com/narkhedesam/Netty-Simple-UDP-TCP-server-client/blob/master/netty-udp/src/com/sam/netty_udp/server/MessageDecoder.java 调试工具使用的是:卓岚TCP&UDP调试工具 1、在common\transport下面创建udp模块,仿照mqtt的创…

基于 HBase Phoenix 构建实时数仓(2)—— HBase 完全分布式安装

目录 一、开启 HDFS 机柜感知 1. 增加 core-site.xml 配置项 2. 创建机柜感知脚本 3. 创建机柜配置信息文件 4. 分发相关文件到其它节点 5. 重启 HDFS 使机柜感知生效 二、主机规划 三、安装配置 HBase 完全分布式集群 1. 在所有节点上配置环境变量 2. 解压、配置环境…

海外互联网专线主要解决企业哪些办公问题?

海外互联网专线 是一种专门为跨境企业提供的网络连接服务&#xff0c;旨在解决企业在海外办公过程中遇到的各种网络问题。海外互联网专线如何成为解决企业办公难题的利器&#xff0c;为企业提供稳定、高速的网络连接? 1、跨国远程办公&#xff1a; 随着全球化进程的加速&…

MyBatis Oracle 批量插入数据

MyBatis Oracle 批量插入数据 1.需求描述2.实现方案2.1 循环 insert 插入2.2 insert all 插入2.3 insert union all 插入 3.分析总结 系统&#xff1a;Win10 JDK&#xff1a;1.8.0_351 IDEA&#xff1a;2022.3.3 1.需求描述 在一次项目中实施过程中&#xff0c;后台需要将地区…

垃圾收集器底层算法

垃圾收集器底层算法 三色标记 在并发标记的过程中&#xff0c;因为标记期间应用线程还在继续跑&#xff0c;对象间的引用可能发生变化&#xff0c;多标和漏标的情况就有可能发生&#xff0c;这里我们引入“三色标记”来给大家解释下把Gcroots可达性分析遍历对象过程中遇到对象…

Apache的安装与目录结构

Apache的安装与目录结构 一、Apache是什么&#xff1f;Apache官网Apache下载地址 二、Apache的安装1.Apache在Windows安装1.启动“命令”窗口2.切换目录3.进行安装4.卸载命令5.启动Apache 服务 2.Apache在linux安装1.linux安装代码1.在 Fedora/CentOS/Red Hat Enterprise Linux…

Python 读取写入excel文件

使用Python读取和写入excel的xlsx、xls文件 目录 读取xlsx文件 安装三方库 引入三方库 读取数据 打开文件 表名 最大行数 最大列数 读取一张表 读取整个文件 返回xls整体内容 安装三方包 读取内容 写入xls文件 引入三方库 创建文件并写入数据 报错及解决 报错…

qt自定义时间选择控件窗口

效果如图&#xff1a; 布局如图&#xff1a; 参考代码&#xff1a; //DateTimeSelectWidget #ifndef DATETIMESELECTWIDGET_H #define DATETIMESELECTWIDGET_H#include <QWidget> #include <QDateTime>namespace Ui { class DateTimeSelectWidget; }class DateTim…