Я использую Micrometer Cloudwatch 1.1.3, поставляемый с Gradle как compile 'io.micrometer:micrometer-registry-cloudwatch:1.1.3'
В Java я могу создать CloudWatchConfig
, выполнив следующие действия:
CloudWatchConfig cloudWatchConfig = new CloudWatchConfig() {
@Override
public String get(String s) {
return "my-service-metrics";
}
@Override
public boolean enabled() {
return true;
}
@Override
public Duration step() {
return Duration.ofSeconds(30);
}
@Override
public int batchSize() {
return CloudWatchConfig.MAX_BATCH_SIZE;
}
};
Я думаю, что эквивалентом в Kotlin должно быть:
val cloudWatchConfig = CloudWatchConfig {
fun get(s:String) = "my-service-metrics"
fun enabled() = true
fun step() = Duration.ofSeconds(30)
fun batchSize() = CloudWatchConfig.MAX_BATCH_SIZE
}
Компилятор Koltin завершается ошибкой, указывая на последнюю строку в блоке: fun batchSize() = CloudWatchConfig.MAX_BATCH_SIZE
, говоря, что ожидал значение типа String?
После большой отладки я смог это исправить, вернув toString функции step.Вы не можете просто передать любую строку, так как она будет проанализирована, как если бы она была сгенерирована Duration.Мой код Kotlin теперь работает и выглядит следующим образом:
val cloudWatchConfig = CloudWatchConfig {
fun get(s:String) = "my-service-metrics"
fun enabled() = true
fun step() = Duration.ofSeconds(30)
fun batchSize() = CloudWatchConfig.MAX_BATCH_SIZE
step().toString()
}
После просмотра интерфейсов CloudWatchConfig, StepRegisteryConfig и MeterRegistryConfig я не могу понять, почему это так.Почему Колтин делает это, и почему он ожидает строку продолжительности?