Пользовательский Cloudwatch MeterRegistry для микрометра в Spring Boot 2 - PullRequest
0 голосов
/ 05 июля 2019

Мы хотели бы отправить метрики привода в Cloudwatch.Использование предоставленных микрометровых облачных решений MeterRegistry позволяет сделать множество предположений о том, как настроен наш проект, например, вам необходимо зависеть от облачного AWS, который затем делает еще больше предположений.Мы хотели бы написать более легкую реализацию, которая просто вводит CloudWatchAsyncClient и не делает никаких других предположений о нашем проекте.

Однако я не уверен, как.Есть ли пример того, как сделать так, чтобы пользовательская реализация зависела от доступного реестра метрик?

До сих пор я провел некоторые эксперименты со следующим:

public interface CloudWatchConfig extends StepRegistryConfig {
    int MAX_BATCH_SIZE = 20;

    @Override
    default String prefix() {
        return "cloudwatch";
    }

    default String namespace() {
        String v = get(prefix() + ".namespace");
        if (v == null)
            throw new MissingRequiredConfigurationException("namespace must be set to report metrics to CloudWatch");
        return v;
    }

    @Override
    default int batchSize() {
        String v = get(prefix() + ".batchSize");
        if (v == null) {
            return MAX_BATCH_SIZE;
        }
        int vInt = Integer.parseInt(v);
        if (vInt > MAX_BATCH_SIZE)
            throw new InvalidConfigurationException("batchSize must be <= " + MAX_BATCH_SIZE);

        return vInt;
    }
}
@Service
@Log
public class CloudWatchMeterRegistry extends StepMeterRegistry {

    public CloudWatchMeterRegistry(CloudWatchConfig config, Clock clock) {
        super(config, clock);
    }

    @Override
    protected void publish() {
        getMeters().stream().forEach(a -> {
            log.warning(a.getId().toString());
        });
    }

    @Override
    protected TimeUnit getBaseTimeUnit() {
        return TimeUnit.MILLISECONDS;
    }
}
@Configuration
public class MetricsPublisherConfig {
    @Bean
    public CloudWatchConfig cloudWatchConfig() {
        return new CloudWatchConfig() {
            @Override
            public String get(String key) {
                switch (key) {
                    case "cloudwatch.step":
                        return props.getStep();
                    default:
                        return "testtest";
                }

            }
        };
    }
}

Однако, когда я запускаю, метод publish никогда не вызывается, и метрики никогда не регистрируются,Чего мне не хватает, чтобы заставить это работать?

1 Ответ

1 голос
/ 08 июля 2019

Вот пример проекта. Я сам не использую cloudwatch, поэтому у меня не было возможности протестировать его интеграцию с AWS. Оставьте комментарий, если есть какие-либо проблемы, и мы можем попытаться решить их

https://github.com/michaelmcfadyen/spring-boot-cloudwatch

...