Наивно. выглядит так:
Код: Выделить всё
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);
}
Решение первое: больше глобальных переменных
Prometheus-cpp имеет свой глобальный объект «реестр», поэтому, по-видимому, цель состоит в том, чтобы я просто добавил кучу глобальных переменных «семейства счетчиков», а затем огромную кучу глобальных переменных «счетчиков». Это означает, что программа вообще не запустится, если Prometheus не сможет инициализироваться, но, по крайней мере, каждый счетчик устанавливается только один раз. По крайней мере, вся библиотека счетчиков находится в одном месте, поэтому ее легко просматривать и систематизировать.
Решение второе: поток-оболочка, предоставляющая методы Increment()< /strong>
Я мог бы объявить все эти переменные автоматической ссылки в одном гигантском методе, завершить метод вызовом «пока не завершен спящий режим» и запустить его как поток. Затем выставьте эти локальные переменные счетчика с помощью набора методов Increment. Но такое ощущение, что я действую вопреки намерениям автора библиотеки.
Решение третье: сделать это правильно??
Мне действительно нужна одна строка для каждого приращения счетчика, в идеале в качестве метода в инъекционном/мокируемом классе. Предпочтительно с другой оболочкой длительности оболочки Prometheus. Моя программа должна работать, даже если Prometheus недоступен или не может быть запущен по какой-либо причине (я не использую сервер, единственная цель которого — играть с Prometheus).
Код: Выделить всё
SomeClass::SomeClass(... prometheus...)
SomeClass::wrap_a_little_method() {
prometheus.observe_duration([&]() {
a_little_method();
}
prometheus.Increment(a_little_method_call_count);
}
Подробнее здесь: https://stackoverflow.com/questions/528 ... ometheus-c
Мобильная версия