Интеграция микрометра с DynaTrace

У меня есть приложение Spring Boot, которое требует экспорта метрик в DynaTrace. Я нашел красивую библиотеку (io.micrometer: micrometer-registry-dynatrace: latest.release) с веб-сайта Micrometer с инструкциями по настройке библиотеки и началу ее использования. Следуя их инструкциям, я заметил, что Tomcat не запускается, и я не уверен, почему. В моем файле build.gradle я импортирую «io.micrometer: micrometer-registry-dynatrace: latest.release». Я проделывал это на каждом этапе, чтобы попытаться изолировать проблему, и хотя в основном он хочет, чтобы я предоставил элементы конфигурации DynaTrace, именно в этот момент Tomcat не может запуститься. Со всем добавленным я получил следующий результат из трассировки стека: org.springframework.boot.web.server.WebServerException: невозможно запустить встроенный Tomcat. Есть идеи относительно того, почему это происходит?

management:
  endpoint:
    metrics:
      enabled: true
    prometheus:
      enabled: true
  endpoints:
    web:
      exposure:
        include: "info, health, metrics, prometheus, dynatrace"
  metrics:
    tags:
      application: ${spring.application.name}
      instance: ${HOSTNAME:defaultInstance}
    export:
      prometheus:
        enabled: true
      dynatrace:
        api-token: ${DYNATRACE_TOKEN:token}
        uri: ${DYNATRACE_URL:url} # using dev environment for now
        device-id: ${DYNATRACE_DEVICEID:device}
        enabled: true
        step: 5s
package package.name;

import io.micrometer.core.instrument.Clock;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.lang.Nullable;
import io.micrometer.dynatrace.DynatraceConfig;
import io.micrometer.dynatrace.DynatraceMeterRegistry;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Configuration
@Data
public class DynaTrace {
  @Value("${management.metrics.export.dynatrace.api-token}")
  String MY_TOKEN;

  @Value("${management.metrics.export.dynatrace.uri}")
  String MY_DYNATRACE_URI;

  @Value("${management.metrics.export.dynatrace.device-id}")
  String MY_DEVICE_ID;

  DynatraceConfig dynatraceConfig = new DynatraceConfig() {
    @Override
    public String apiToken() {
      return MY_TOKEN;
    }

    @Override
    public String uri() {
      return MY_DYNATRACE_URI;
    }

    @Override
    public String deviceId() {
      return MY_DEVICE_ID;
    }

    @Override
    @Nullable
    public String get(String k) {
      return null;
    }
  };
  MeterRegistry registry = new DynatraceMeterRegistry(dynatraceConfig, Clock.SYSTEM);
}

person Greg U.    schedule 05.12.2019    source источник
comment
Не могли бы вы поделиться полной трассировкой стека исключения?   -  person Andy Wilkinson    schedule 09.12.2019
comment
Слишком долго для публикации в комментарии, но конец трассировки стека выглядит следующим образом: вложенное исключение - это io.micrometer.core.instrument.config.MissingRequired ConfigurationException: apiToken должен быть настроен для передачи метрик в Dynatrace Кажется, я установил мой токен неправильный. У меня есть он в формате «Авторизация: токен Api-Token», как указано в DynaTrace, но я не могу заставить приложение его принять.   -  person Greg U.    schedule 09.12.2019


Ответы (1)


Я также только что попробовал настроить микрометр Spring Dynatrace и столкнулся с некоторыми исключениями, пока не настроил правильную продолжительность. Из примера кода, которым вы поделились, я заметил, что этот метод отсутствует.

 @Configuration
public class DynatraceMicrometerConfig implements DynatraceConfig {

  private final DevopsProdTenant devopsTenant = new DevopsProdTenant();

  private static final String METRIC_CUSTOM_ID = "CUSTOM_EXTENSION_DEVICE";

  @Override public String get(String key) {
    return null;
  }

  @Override public String apiToken() {
    return devopsTenant.getDecryptedApiToken();
  }

  @Override public String uri() {
    return devopsTenant.getUrl();
  }

  @Override public String deviceId() {
    return METRIC_CUSTOM_ID;
  }

//  @Override public Duration step() {
//    return Duration.parse("PT10S");
//  }
}

Используемый нами файл gradle содержит тот же импорт, что и тот, который вы используете, но мы не полагаемся на свойства приложения, поскольку нам нужно импортировать uri и токен из внешней библиотеки (однако то же самое должно работать с использованием свойств приложения).

person Andreea Buga    schedule 09.12.2019
comment
Я добавил это, но не повезло. После некоторой работы / расследования с тех пор, как я опубликовал этот вопрос, я думаю, что токен api не работает правильно. Я не думаю, что правильно установил его в yaml или в переменных моей среды. Наш стандарт вводит переменные среды в yaml, поэтому не могу отклоняться от этого, какие-либо мысли о том, как правильно настроить токен? Я использую формат, указанный в DynaTrace, но вложенное исключение io.micrometer.core.instrument.config.MissingRequiredC onfigurationException: необходимо установить apiToken для передачи метрик в Dynatrace. - person Greg U.; 09.12.2019
comment
Итак, я справился с проблемой apiToken (я думаю), и ваше предложение вызвало ошибку java.time.format.DateTimeParseException: текст не может быть проанализирован на Duration. Я взял его обратно, но все еще получаю сообщение об ошибке. Вы когда-нибудь сталкивались с этой ошибкой, пока ваша команда работала над ней? - person Greg U.; 09.12.2019
comment
Да, у нас также возникает эта ошибка при попытке использовать строку продолжительности, которая не может быть проанализирована, или при попытке использовать целое число (статический метод Duration.of ()). Вы используете точное значение продолжительности из предыдущего примера? Не могли бы вы проверить, соответствует ли строка продолжительности, которую вы используете, одному из показанных здесь шаблонов: logicbig.com/how-to/code-snippets/? - person Andreea Buga; 10.12.2019
comment
Да, я использую приведенный вами пример (PT10S). Он совпадает с опубликованной вами ссылкой - person Greg U.; 10.12.2019
comment
Вы также можете выбрать шаг по умолчанию (который составляет 1 минуту) и не переопределять метод step () (поскольку он не является обязательным). В нашем случае это тоже сработало. - person Andreea Buga; 10.12.2019
comment
Большинство моих попыток заключались в том, чтобы не отменять пошаговый метод, поскольку мы либо 1) настраиваем его в вашем файле application.yaml, либо 2) ничего не делаем и позволяем ему перейти к шагу по умолчанию. Проблема в том, что где-то он все еще пытается проанализировать текст как Duration, и я не уверен, где это происходит ... даже если у нас нет ссылок на step где-либо. Мне почти кажется, что он теряется где-то в глубине Spring с двумя конкурирующими библиотеками. - person Greg U.; 10.12.2019