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

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Рекомендации по использованию Prometheus C++?

Сообщение Anonymous »

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

Подробнее здесь: https://stackoverflow.com/questions/528 ... ometheus-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»