Prometheus C ++的使用指南?

时间:2018-10-18 22:53:36

标签: c++ prometheus

我已经在主要的Prometheus文档中查看了语法example in prometheus-cpp和语法similar go one,但不确定如何在C ++应用程序中使用类似的代码。 Go使用全局变量保存计数器,C ++使用检测函数中的局部引用。自动引用意味着我不能轻易将计数器放入包装器,但是每次我想增加一个计数器都需要10行开销。

天真的看起来像这样:

void SomeClass::a_little_method() {
    auto start = get_accurate_time();

    // actual code that the method
    // uses to do whatever it does
    // in less than ten lines of code

    auto& counter_family = BuildCounter()
            .Name("little_method")
            .Help("little method execution count and duration")
            .Labels({
        {"My Application", "metrics"}
    })
    .Register(*global_registry_pointer);
    auto& call_counter = counter_family.Add({
        {"calls", "count"}
    });
    auto& execution_timer = counter_family.Add({
        {"calls", "duration"}
    });
    call_counter.Increment();
    execution_timer.Increment(get_accurate_time() - start);
}

检测比代码要检测的要多得多。随着更多事物的检测,情况变得更糟,普罗米修斯指南“每条日志行应有一个计数器”意味着每条日志行获得8或10行普罗米修斯的修辞。并且创建了两个局部变量,使用一次,然后销毁。

解决方案一:更多全局变量

Prometheus-cpp具有其全局“注册表”对象,因此大概的目的是我只添加一堆“ counter family”全局变量,然后添加一大堆全局“ counter”变量。这意味着如果prometheus无法初始化,该程序将根本不会运行,但是至少每个计数器只能设置一次。至少柜台的图书馆都集中在一个地方,因此很容易看到和整理。

解决方案二:公开Increment()方法的包装线程

我可以在一个巨型方法中声明所有这些自动引用变量,并通过“同时未终止睡眠”调用完成该方法,然后将其作为线程运行。然后通过一组增量方法公开那些局部计数器变量。但这似乎是我在违背图书馆作者的意图。

解决方案三:正确执行吗?

我真的希望每个计数器增加一行,理想情况下是作为可注入/可模拟类的方法。最好与其他prometheus wrapper duration wrapper一起使用。即使prometheus不可用或由于某种原因而无法运行,我的程序也应该运行(我未在运行服务器,其唯一目的是与prometheus一起玩)。

SomeClass::SomeClass(... prometheus...)
SomeClass::wrap_a_little_method() {
    prometheus.observe_duration([&]() {
        a_little_method();
    }
    prometheus.Increment(a_little_method_call_count);
}

(没有prometheus-cpp标记,对不起,我没有代表来创建一个)

0 个答案:

没有答案