micronaut-projects/micronaut-kafka

ClassCastException (String object cannot be cast to a Number object) in Micrometer while starting up Micronaut 3.8.0 app with Kafka metrics

xiaosongchen1 opened this issue · 2 comments

Expected Behavior

The warning message should not be displayed at all during startup of the Micronaut application.

Actual Behaviour

At startup time of a Micronaut application, there is a warning related to a non-backward compatible change very likely with Micrometer. The warning message states that the value function for the gauge 'kafka.consumer.commit-id' has failed to apply. This results in subsequent logs being logged at debug level. The root cause of the warning is a ClassCastException because a String object cannot be cast to a Number object.

Following warning message log was displayed:
{"timeMillis":1672866882482,"thread":"default-nioEventLoopGroup-16-2","level":"WARN","loggerName":"io.micrometer.core.instrument.internal.DefaultGauge","message":"Failed to apply the value function for the gauge 'kafka.consumer.commit-id'. Note that subsequent logs will be logged at debug level.","thrown":{"commonElementCount":0,"localizedMessage":"class java.lang.String cannot be cast to class java.lang.Number (java.lang.String and java.lang.Number are in module java.base of loader 'bootstrap')","message":"class java.lang.String cannot be cast to class java.lang.Number (java.lang.String and java.lang.Number are in module java.base of loader 'bootstrap')","name":"java.lang.ClassCastException","extendedStackTrace":"java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Number (java.lang.String and java.lang.Number are in module java.base of loader 'bootstrap')\n\tat io.micronaut.configuration.kafka.metrics.builder.KafkaMetricMeterTypeBuilder.lambda$build$0(KafkaMetricMeterTypeBuilder.java:137) ~[micronaut-kafka-4.5.0.jar:4.5.0]\n\tat io.micrometer.core.instrument.Gauge.lambda$builder$0(Gauge.java:58) ~[micrometer-core-1.10.2.jar:1.10.2]\n\tat io.micrometer.core.instrument.StrongReferenceGaugeFunction.applyAsDouble(StrongReferenceGaugeFunction.java:48) ~[micrometer-core-1.10.2.jar:1.10.2]\n\tat io.micrometer.core.instrument.internal.DefaultGauge.value(DefaultGauge.java:53) ~[micrometer-core-1.10.2.jar:1.10.2]\n\tat io.micrometer.prometheus.PrometheusMeterRegistry.lambda$newGauge$5(PrometheusMeterRegistry.java:331) ~[micrometer-registry-prometheus-1.10.2.jar:1.10.2]\n\tat io.micrometer.prometheus.MicrometerCollector.collect(MicrometerCollector.java:75) ~[micrometer-registry-prometheus-1.10.2.jar:1.10.2]\n\tat io.prometheus.client.Collector.collect(Collector.java:45) ~[simpleclient-0.16.0.jar:?]\n\tat io.prometheus.client.CollectorRegistry$MetricFamilySamplesEnumeration.findNextElement(CollectorRegistry.java:204) ~[simpleclient-0.16.0.jar:?]\n\tat io.prometheus.client.CollectorRegistry$MetricFamilySamplesEnumeration.nextElement(CollectorRegistry.java:219) ~[simpleclient-0.16.0.jar:?]\n\tat io.prometheus.client.CollectorRegistry$MetricFamilySamplesEnumeration.nextElement(CollectorRegistry.java:152) ~[simpleclient-0.16.0.jar:?]\n\tat io.prometheus.client.exporter.common.TextFormat.write004(TextFormat.java:71) ~[simpleclient_common-0.16.0.jar:?]\n\tat io.prometheus.client.exporter.common.TextFormat.writeFormat(TextFormat.java:53) ~[simpleclient_common-0.16.0.jar:?]\n\tat io.micrometer.prometheus.PrometheusMeterRegistry.scrape(PrometheusMeterRegistry.java:154) ~[micrometer-registry-prometheus-1.10.2.jar:1.10.2]\n\tat io.micrometer.prometheus.PrometheusMeterRegistry.scrape(PrometheusMeterRegistry.java:149) ~[micrometer-registry-prometheus-1.10.2.jar:1.10.2]\n\tat io.micrometer.prometheus.PrometheusMeterRegistry.scrape(PrometheusMeterRegistry.java:120) ~[micrometer-registry-prometheus-1.10.2.jar:1.10.2]\n\tat io.micrometer.prometheus.PrometheusMeterRegistry.scrape(PrometheusMeterRegistry.java:107) ~[micrometer-registry-prometheus-1.10.2.jar:1.10.2]\n\tat com.liveperson.voice.conversationmanager.controllers.health.PrometheusScrapeController.index(PrometheusScrapeController.java:26) ~[classes/:?]\n\tat com.liveperson.voice.conversationmanager.controllers.health.$PrometheusScrapeController$Definition$Exec.dispatch(Unknown Source) ~[classes/:?]\n\tat io.micronaut.context.AbstractExecutableMethodsDefinition$DispatchedExecutableMethod.invoke(AbstractExecutableMethodsDefinition.java:378) ~[micronaut-inject-3.8.0.jar:3.8.0]\n\tat io.micronaut.context.DefaultBeanContext$4.invoke(DefaultBeanContext.java:594) ~[micronaut-inject-3.8.0.jar:3.8.0]\n\tat io.micronaut.web.router.AbstractRouteMatch.execute(AbstractRouteMatch.java:246) ~[micronaut-router-3.8.0.jar:3.8.0]\n\tat io.micronaut.web.router.RouteMatch.execute(RouteMatch.java:111) ~[micronaut-router-3.8.0.jar:3.8.0]\n\tat io.micronaut.http.context.ServerRequestContext.with(ServerRequestContext.java:103) ~[micronaut-http-3.8.0.jar:3.8.0]\n\tat io.micronaut.http.server.RouteExecutor.lambda$executeRoute$14(RouteExecutor.java:659) ~[micronaut-http-server-3.8.0.jar:3.8.0]\n\tat reactor.core.publisher.FluxDeferContextual.subscribe(FluxDeferContextual.java:49) ~[reactor-core-3.5.0.jar:3.5.0]\n\tat reactor.core.publisher.Flux.subscribe(Flux.java:8660) ~[reactor-core-3.5.0.jar:3.5.0]\n\tat reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:426) ~[reactor-core-3.5.0.jar:3.5.0]\n\tat io.micronaut.reactive.reactor.instrument.ReactorSubscriber.onNext(ReactorSubscriber.java:57) ~[micronaut-runtime-3.8.0.jar:3.8.0]\n\tat reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2508) ~[reactor-core-3.5.0.jar:3.5.0]\n\tat reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:371)

Steps To Reproduce

No response

Environment Information

Micronaut version: 3.8.0
Micrometer version: 4.7.0
Micronaut Kafka version: 4.5.0
Base Docker image: eclipse-temurin:17.0.5_8-jdk-focal (Ubuntu 20.04)

Example Application

No response

Version

3.8.0