prometheus/client_python:如何在不重新启动的情况下分配新注册表?

2024-04-11

我编写了一个小脚本来检测 Flask 应用程序,我想编写单元测试,其中每个测试都可以针对模拟 Flask 应用程序编写请求并测试指标,而无需处理来自以前测试方法的指标/请求,如下所示:

def test_grouped_codes():
    app = create_app()
    instrument(app)
    # test stuff

但我无法“重置”注册表,因此我总是收到错误“CollectorRegistry 中的时间序列重复”。

如何在运行时重置 Prometheus Python 客户端库的注册表(或将其设置为空注册表)?

除其他外,我尝试了以下方法,但它不起作用:

def create_app():
    app = Flask(__name__)
    registry = CollectorRegistry()  # Create new registry.
    prometheus_client.REGISTRY = registry  # Try to override global registry.
    prometheus_client.registry.REGISTRY = registry  # Try to override global registry.

    @app.route("/")
    def home():
        return "Hello World!"

    # More functions ...

    @app.route("/metrics")
    @FlaskInstrumentator.do_not_track()
    def metrics():
        data = generate_latest(registry)
        headers = {
            "Content-Type": CONTENT_TYPE_LATEST,
            "Content-Length": str(len(data))}
        return data, 200, headers

    return app

我在堆栈溢出上发现了以下问答here https://stackoverflow.com/questions/57095978/reset-collectorregistry-of-prometheus-lib-after-each-unit-test。 @brian-brazil 建议在模块级别声明指标,但随后我必须对我想避免的标签名称进行硬编码。一些使用handler, 其他method or path所以我想保留它的可定制性。


好的,感谢提示this https://stackoverflow.com/a/57096527/7391331@Xitrum“取消注册方法”的回答我找到了一个解决方案:

collectors = list(REGISTRY._collector_to_names.keys())
for collector in collectors:
    REGISTRY.unregister(collector)

现在所有测试都可以从自己的注册表开始:

def test_metrics_endpoint_availability():
    app = create_app()
    FlaskInstrumentator(app).instrument()
    client = app.test_client()

    response = client.get("/")
    response = client.get("/metrics")
    
    # Test stuff
    

def test_grouped_status_codes():
    app = create_app()
    FlaskInstrumentator(app).instrument()
    client = app.test_client()

    client.get("/does_not_exist")  # Should be ignored.
    client.get("/does_not_exist")  # Should be ignored.
    client.post("/")
    client.post("/")
    
    # Test stuff

编辑2023

这是我用于 atm 单元测试的辅助函数:

from prometheus_client import REGISTRY

def reset_prom_collectors() -> None:
    """Resets collectors in the default Prometheus registry.

    Modifies the `REGISTRY` registry. Supposed to be called at the beginning
    of individual test functions. Else registry is reused across test functions
    and so we can run into errors like duplicate metrics or unexpected values
    for metrics.
    """

    # Unregister all collectors.
    collectors = list(REGISTRY._collector_to_names.keys())
    print(f"before unregister collectors={collectors}")
    for collector in collectors:
        REGISTRY.unregister(collector)
    print(f"after unregister collectors={list(REGISTRY._collector_to_names.keys())}")

    # Import default collectors.
    from prometheus_client import gc_collector, platform_collector, process_collector

    # Re-register default collectors.
    process_collector.ProcessCollector()
    platform_collector.PlatformCollector()
    gc_collector.GCCollector()

    print(f"after re-register collectors={list(REGISTRY._collector_to_names.keys())}")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

prometheus/client_python:如何在不重新启动的情况下分配新注册表? 的相关文章

  • 如何从 java 客户端正确使用 Prometheus Histogram 来跟踪大小而不是延迟?

    我有一个处理集合的 API 该API的执行时间与集合大小有关 集合越大 花费的时间就越多 我正在研究如何使用普罗米修斯做到这一点 但不确定我是否正确地做事 该领域的文档有点缺乏 我做的第一件事是定义一个摘要指标来衡量 API 的执行时间 我
  • 如何将零值(向量(0)与 PromQL 中的指标值合并

    我在用着flexlm exporter https github com mjtrangoni flexlm exporter将我的许可证使用情况导出到 Prometheus 并从 Prometheus 导出到自定义服务 不是 Grafan
  • 使用 golang prometheus testutil 进行单元测试

    我们可以断言使用以下方法注册和收集指标testutil CollectAndCount and testutil CollectAndCompare等等 但是有没有办法通过指标名称和标签来收集指标 如果是 CounterVec 以供参考ht
  • 有没有办法使用 prometheus 监控 kube cron 作业

    有没有办法监控 kube cronjob 我有一个 kube cronjob 它在我的集群上每 10 分钟运行一次 有没有一种方法可以在每次我的 cronjob 由于某些错误而失败时收集指标 或者在我的 cronjob 在一定时间后尚未完成
  • 如何在 Prometheus 或 Grafana 上编写“或”逻辑运算符

    我需要编写一个使用我定义的任何不同作业的查询 job traefik OR job cadvisor OR job prometheus 是否可以编写逻辑二元运算符 普罗米修斯有一个or逻辑二元运算符 但您在这里问的是向量选择器 您可以为此
  • 如何覆盖 Apache Flink 中的配置值?

    我正在尝试将 Apache Flink 的指标收集到 Prometheus 中 Flink 文档说我需要将以下行添加到我的 flink conf yaml 中 metrics reporter promgateway class org a
  • 通过 Kafka 报告 (prometheus) 指标

    我正在寻找一种将 Prometheus 与应用程序解耦的方法 通过在中间放置 Kafka 来实现如下目标 Application metrics gt Kafka gt Prometheus 为了解决这个问题我有两个问题 是否有任何 Jav
  • 普罗米修斯上的多个目标

    我已经在Centos上配置了prometheus 版本详细信息如下 prometheus 2 5 0 linux 386 我在 prometheus yml 配置文件中添加了两个目标 所有服务器节点导出器都在运行 配置如下 scrape c
  • 如何从多个 python-flask 子进程收集普罗米修斯指标?

    我有 main 函数 它生成两个单独的子进程 这两个子流程共享指标 如何共享两个流程的指标并保持更新 这是我的片段 以供更多理解 from multiprocessing import Process import prometheus c
  • 带有正则表达式的标签-普罗米修斯

    我正在尝试使用正则表达式添加新标签 名称实例是pr na01 na02 A我试图只得到pr na01 所以我这样做了 source labels meta ec2 tag Name regex target label test repla
  • 每次出现错误时使用 prometheus 创建警报

    我是普罗米修斯和警报系统的新手 我开发了一个微服务并添加了指标代码 以便在出现错误时获取增量总数 现在我正在尝试创建一个警报 以便每当错误增加时 它应该标记出来并发送邮件 但我无法针对这种情况形成正确的查询 我使用了诸如 error tot
  • Prometheus 中的最小 scrape_interval 是多少?

    我想知道普罗米修斯的最短时间是多少scrape interval范围 根据普罗米修斯文档 https prometheus io docs prometheus latest configuration configuration 此参数的
  • Prometheus 警报管理器不发送警报 k8s

    我使用 Prometheus Operator 0 3 4 和警报管理器 0 20 但它不起作用 即我看到警报被触发 在警报选项卡上的 Prometheus UI 上 但我没有收到任何电子邮件警报 通过查看日志 我看到以下内容 知道吗 请参
  • 如何获取prometheus中(当前)建立的TCP连接数(kubernetes监控)

    我在 Linux 中使用此命令来查看 当前 建立的 TCP 连接 netstat ant grep ESTABLISHED wc l 我如何将此命令转换为 PromQL 每个节点 我在 kubernetes 集群中使用带有节点导出器的 pr
  • 如何使用 Prometheus 警报规则检测新指标

    假设我有一个指标request failures对于用户 对于每个用户 我向指标添加一个唯一的标签值 所以对于用户来说u1 当请求失败两次时 我得到以下指标 request failures user name u1 2 我还有一条规则 当
  • Prometheus:如何根据 Consul 标签删除目标

    我的 Prometheus 服务器从 Consul 获取其目标列表 或 服务 用 Consul 的行话来说 我只想监视这些目标的子集 这应该可以通过普罗米修斯的正则表达式机制实现 但我无法正确配置 这是怎么做到的 我已经搜索过网络 但没有一
  • Prometheus 来源的时间序列:如何将空值设置为零?

    使用 Docker Grafana 8 1 5 使用时间序列图 我正在绘制Prometheus Counter来源 有一个label as a time series 按标签 并且需要将所有空 缺失值填充为零 这是应用于的查询Prometh
  • Docker容器CPU使用率监控

    根据 docker 的文档 我们可以通过以下方式获取 docker 容器的 CPU 使用率码头工人统计命令 CPU 列将给出容器正在使用的主机 CPU 的百分比 假设我限制容器使用 50 的主机单个 CPU 我可以通过 cpus 0 5 选
  • 普罗米修斯警报中缺少标签

    我对 Prometheus 警报规则有疑问 我设置了各种 cAdvisor 特定警报 例如 alert ContainerCpuUsage expr sum rate container cpu usage seconds total 3m
  • PromQL:查询警报是否被静音

    我已成功消除了当前已关闭节点的警报 并且在我们有时间物理替换它之前会持续一段时间 虽然我认为沉默会阻止警报在 Slack 通道中重新出现 但我也想在我们在 Prometheus 之上运行的 Grafana 仪表板上删除它 这是对 grafa

随机推荐

  • Java中对象的类型切换

    所以我想知道一种在Java中切换有效类型的简单方法 如下所示 我知道这不能编译 但我想要这个功能 public void put Object obj if obj instanceof Integer else if obj instan
  • JButton 中的图标位置

    是否有可能更改 JButton 中的图标图像位置 现在看起来是这样的 我想将图标移到更左边 我尝试更改文本对齐方式 但它无法按我想要的方式工作 myButton setHorizontalTextPosition SwingConstant
  • 将有符号整数转换为无符号长整型的最佳方法?

    对于 Java 中的某些哈希函数 最好将值视为无符号整数 例如 用于与其他实现进行比较 但 Java 仅支持有符号类型 我们可以将有符号的int到 未签名 long像这样 public static final int BITS PER B
  • Scrum 故事和幕后特色 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 据我了解 Scrum 待办事项由一系列代表最终用户的故事组成 并进一步分解为功能 如果是这样的话 所有与故事没有真正联系但仍然有用的幕后功
  • PyQt4、QThread 和打开大文件而不冻结 GUI

    我想问如何从磁盘读取大文件并保持 PyQt4 UI 响应 不阻塞 我已将文件的负载移至 QThread 子类 但我的 GUI 线程被冻结 有什么建议么 我想这一定是GIL的问题 但我不知道如何排序 编辑 我正在使用 GDCM 项目中的 vt
  • HBase如何实现对HDFS的随机访问?

    鉴于HBase是一个数据库 其文件存储在HDFS中 那么它如何实现对HDFS中单个数据的随机访问呢 这是通过什么方法实现的呢 From Apache HBase 参考指南 http hbase apache org book archite
  • 事件+适配器模式

    我在泛型类上有一个适配器模式 它本质上在类型之间进行适应 class A
  • 如何在我的 Swift 项目中使用 Objective-C 项目

    注 我知道如何从 Swift 调用 Objective C 代码 https stackoverflow com q 24002369 6521116 但我不知道下面 我想用这个EsptouchForIOS的演示 https github
  • @AutoConfigureAfter 未按预期工作

    我有 3 个 spring boot starter 项目 其中一个自动配置类具有以下代码 Configuration ConditionalOnClass value Config class AutoConfigureAfter val
  • SQL查询结果需要返回WHERE子句中的所有记录,甚至重复

    我是 Microsoft SQL Server 的新手 需要一个查询来返回 WHERE 子句中列出的所有记录 甚至是重复的记录 我所拥有的只会返回 3 行 我正在使用 C 读入并解析文本文件 使用该文本文件 我创建一个查询以从数据库获取结果
  • Xcode:多人共享相同的 Bundle ID

    我正在和朋友一起开发 iOS 应用程序 我们都以个人身份报名参加了 Apple 开发计划 我们没有组织 我们正在使用 git 并且希望能够从 Mac 构建应用程序 但我无法编译 因为 Bundle ID 已被我的朋友使用 是否有可能在不成为
  • 将数据库文件从文件资源管理器中的 /assets 复制到 /data/data 文件夹 - Android

    我在文件资源管理器中将数据库文件从 assets 复制到 data data 文件夹时遇到问题 我搜索了这个网站 找到了很多答案 但找不到适合我的情况的适当答案 我已经使用 SQLite Manager 在外部创建了数据库并将其导入到资产文
  • 在 R 中的 DT::datatable 中包含表容器

    我是 HTML 和交互式表格的新手 并且在构建表格容器来为我的数据集添加标题时遇到了麻烦 有没有一种简单的方法可以为我的数据集插入表头 我希望第 2 5 列 不包括第 1 列中的日期 和第 6 9 列分别具有标题 部门 和 行业 我在下面包
  • 如何使用 scala 2.12 重建 apache Livy

    我正在使用 Spark 3 1 1 它使用 Scala 2 12 以及从下载的预构建 Livyhere https livy incubator apache org download 使用 Scala 2 11 可以找到名为repl 2
  • 即使速度非常低,物体也会立即移动到新位置

    我想将一个对象缓慢地从其原始位置移动到稍高的位置 但此代码会立即将对象移动到最高位置 即使我使用非常慢的速度 如 0 0001f 我在另一个代码中仅调用 LiftObj 1 次 并告诉它运行直到达到 liftOffset 这段代码有什么问题
  • Java 指令重新排序示例不起作用

    我需要一些帮助 我正在尝试创建一个示例 表明需要 volatility 来防止指令重新排序 在这个例子中 我试图证明 b gt a 仅当发生重新排序时才发生 并且 volatile 会阻止它 问题是 每次运行我都会得到 b gt a 而且我
  • React-pdf 图像不渲染

    我一直在尝试将图像添加到react pdf PDF文档中 但是 无论我做什么 图像都不会显示在 PDF 中 除了一些非常具体的图像 由于某种原因 我发现其他人也有同样的问题 但没有解决方案或解决方法 任何帮助将不胜感激 这是我使用的代码 使
  • 为什么 YouTube api 搜索从不同的服务器返回不同的结果?

    我们注意到从返回的搜索结果v3 搜索 API https developers google com youtube v3 docs search list根据服务器位置的不同而有所不同 我已经确认代码是完全相同的 当我使用 api 文档网
  • PHP excel - 数据循环?

    我有一个数据数组的数组 所以基本格式是 sheet array array a1 data b1 data c1 data d1 data array a2 data b2 data c2 data d2 data array a3 dat
  • prometheus/client_python:如何在不重新启动的情况下分配新注册表?

    我编写了一个小脚本来检测 Flask 应用程序 我想编写单元测试 其中每个测试都可以针对模拟 Flask 应用程序编写请求并测试指标 而无需处理来自以前测试方法的指标 请求 如下所示 def test grouped codes app c