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中对象的类型切换

    所以我想知道一种在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