Java Retrofit JUnit как откидывать метрики в Prometheus

Всем привет! У нас есть проект для интеграционного тестирования api. Используется стек

  • java
  • retrofit
  • juinit
  • gradle
    Поставили задачу написать решение, которое будет отбрасывать метрики по некоторым тестам в prometheus. Может у кого-то есть такой опыт? Или знают какие фреймворки есть для работы с prometheus в Java?

в прометеус нельзя вставить

можно ему показать и настроить чтобы брал сам

в обычных приложениях смотрите как скрещивают спринг актуатор с форматом метрик

но засунуть нельзя

хочется засунуть - переходите на инфлюкс

Спасибо большое за ответ! Тут оказалось, что мы переходим на VictoriaMetrics и там вроде бы можно передавать метрики.

Решение оказалось проще, чем я думал.

Описываем метод для отправки метрик в 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)