pbezpal5
(Pavel)
24.Январь.2024 14:20:06
#1
Всем привет! У нас есть проект для интеграционного тестирования api. Используется стек
java
retrofit
juinit
gradle
Поставили задачу написать решение, которое будет отбрасывать метрики по некоторым тестам в prometheus. Может у кого-то есть такой опыт? Или знают какие фреймворки есть для работы с prometheus в Java?
sergueik
(Сергей Кузьмин)
26.Январь.2024 00:43:50
#2
в прометеус нельзя вставить
можно ему показать и настроить чтобы брал сам
в обычных приложениях смотрите как скрещивают спринг актуатор с форматом метрик
но засунуть нельзя
хочется засунуть - переходите на инфлюкс
pbezpal5
(Pavel)
26.Январь.2024 08:08:34
#3
Спасибо большое за ответ! Тут оказалось, что мы переходим на VictoriaMetrics и там вроде бы можно передавать метрики.
pbezpal5
(Pavel)
05.Февраль.2024 12:50:18
#4
Решение оказалось проще, чем я думал.
Описываем метод для отправки метрик в VictoriaMetrics
public interface VictoriaMetricsService {
@POST("endpoint_vm")
Call<Void> sendMetrics(@Body String metrics);
}
Описываем сервис
@SneakyThrows
public void postMetricsToVM(String metrics) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://hostname_vm/")
.addConverterFactory(ScalarsConverterFactory.create())
.build();
VictoriaMetricsService victoriaMetricsService = retrofit.create(VictoriaMetricsService.class);
victoriaMetricsService.sendMetrics(metrics).execute();
}
Делаем TestWatcher
public class MetricsTestWatcher implements TestWatcher, AfterAllCallback {
//Здесь testName=\"%s\" обязательно нужно брать параметр в кавычки, иначе VM не будет видить метрики
private static final String TEMPLATE_METRIC = "%s{testName=\"%s\"} %s";
private static final String SUCCESS_TEST = "1";
private static final String FAILED_TEST = "0";
private String metrics = "";
private String getMetricName(ExtensionContext context) {
return context.getTestClass()
.flatMap(element -> AnnotationSupport.findAnnotation(element, MetricName.class))
.map(MetricName::value)
.orElse("Not exists annotation MetricName");
}
private void getMetrics(ExtensionContext context, String status) {
String metric = String.format(TEMPLATE_METRIC, getMetricName(context), context.getDisplayName(), status);
if (metrics.isEmpty()) metrics = metric;
else metrics = metrics + "\n" + metric;
}
@Override
public void testSuccessful(ExtensionContext context) {
getMetrics(context, SUCCESS_TEST);
}
@Override
public void testFailed(ExtensionContext context, Throwable cause) {
getMetrics(context, FAILED_TEST);
}
@Override
@SneakyThrows
public void afterAll(ExtensionContext extensionContext) {
VictoriaMetricsManager victoriaMetricsManager = new VictoriaMetricsManager();
victoriaMetricsManager.postMetricsToVM(metrics);
}
}
И прикручиваем TestWatcher к тесту
@ExtendWith(MetricsTestWatcher.class)