Рекомендации по использованию Prometheus C ++?

Я посмотрел на синтаксис пример в Prometheus-CPP и очень похоже идти один в основной документации Prometheus, и я не уверен, как я должен использовать подобный код в моем приложении 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 имеет свой глобальный объект «регистра», поэтому, вероятно, предполагается, что я просто добавлю несколько глобалов «встречного семейства», а затем огромную кучу глобальных «встречных» переменных. Это означает, что программа не будет работать вообще, если прометей не сможет инициализироваться, но по крайней мере каждый счетчик будет установлен только один раз. По крайней мере, библиотека счетчиков находится в одном месте, поэтому ее легко увидеть и упорядочить.

Решение второе: поток-обертка, который предоставляет методы Increment ()

Я мог бы объявить все эти переменные с автоматическими ссылками в одном гигантском методе, завершить метод вызовом «while not terminated sleep» и запустить его как поток. Затем представьте эти локальные переменные счетчика с помощью набора методов Increment. Но кажется, что я работаю против намерений автора библиотеки.

Решение третье: сделать это правильно ??

Я действительно хочу одну строку на счетчик приращения, в идеале как метод для инъецируемого / смоделируемого класса. Желательно с другим Прометей обертка. Моя программа должна работать, даже если 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, и у меня нет представителя, чтобы создать его, извините)

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]