Где микрометр хранит данные?
Поскольку я сомневаюсь, что мы используем микрометр и прометей в производстве, поскольку прометей извлекает данные из микрометра, и мы просто используем удаленное хранилище данных для прометея, но некоторые данные также хранятся с помощью микрометра ... теперь мой вопрос в том, работает ли мой сервер в производстве Чем хранятся данные микрометра, увеличивается по мере работы или автоматически стирается через некоторое время? значит как микрометр хранит данные на производстве?
2 ответа
Сам микрометр не хранит данные постоянно. Все данные хранятся в памяти. Если приложение перезапускается, счетчики начинают с нуля.
Это задача базы данных временной шкалы. Например, у Prometheus есть такие функции, как
rate()
а также
increase()
которые игнорируют эти сбросы.
Независимо от того, в какой среде ваше приложение использует микрометр (будь то локально, при разработке, приемке или производстве, микрометр будет вести себя одинаково:
- Сбор и хранение метрик в памяти
- Ожидание других инструментов анализа и визуализации метрик для сбора данных:
- Публикация, когда реализация инструментов использует модель push
- Предоставление необходимых конечных точек для инструментов с использованием модели вытягивания, которая является случаем Prometheus
микрометры и любая другая библиотека для сбора метрик, кстати, не может делать предположений о том, когда собранные данные должны быть сброшены или очищены, поскольку она не может делать предположений или даже знать заранее, какие инструменты будут собирать, какие данные и когда.
Между тем, если у вас уже есть полное представление об архитектуре вашего приложения и вы знаете, что будете использовать Prometheus только для сбора метрик, вы можете настроить свою конечную точку на
clear
в
MeterRegistry
после успешного парсинга (на основе образца официальной документации, поскольку вы не предоставили фрагмент о реализации):
PrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
try {
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
server.createContext("/prometheus", httpExchange -> {
String response = prometheusRegistry.scrape(); (1)
httpExchange.sendResponseHeaders(200, response.getBytes().length);
try (OutputStream os = httpExchange.getResponseBody()) {
os.write(response.getBytes());
prometheusRegistry.clear(); // clear the registry upon successful response write
}
});
new Thread(server::start).start();
} catch (IOException e) {
throw new RuntimeException(e);
}