MetricsFilter has IndexOutOfBoundsException with Keycloak 25
Opened this issue · 0 comments
zhechense commented
Description
I upgraded Keycloak from version 23 to 25 and also updated my SPI library to keycloak-metrics-spi-6.0.0.jar. After these updates, the /auth/metrics API started throwing IndexOutOfBoundsException. It seems that uriInfo.getMatchedURIs()
is returning an empty list, causing uriInfo.getMatchedURIs().get(0)
to throw an exception.
Any ideas how can I fix this?
{
"timestamp":"2024-09-02T12:59:47.729705Z",
"sequence":10611,
"loggerClassName":"org.jboss.logging.Logger",
"loggerName":"io.quarkus.vertx.http.runtime.QuarkusErrorHandler",
"level":"ERROR",
"message":"HTTP Request to /auth/metrics failed, error id: 1d6214f7-f25b-442b-91d0-baf649cac314-62",
"threadName":"vert.x-eventloop-thread-3",
"threadId":89,
"mdc":{
"trace_flags":"01",
"trace_id":"240ff85f24376b3287e4f17b26955b81",
"span_id":"1fbaa0d82507901b"
},
"ndc":"",
"hostName":"keycloak-green-59f87f7f8-gbk4v",
"processName":"QuarkusEntryPoint",
"processId":1,
"exception":{
"refId":1,
"exceptionType":"java.lang.IndexOutOfBoundsException",
"message":"Index: 0",
"frames":[
{
"class":"java.util.Collections$EmptyList",
"method":"get",
"line":4807
},
{
"class":"org.jboss.aerogear.keycloak.metrics.ResourceExtractor",
"method":"getURI",
"line":74
},
{
"class":"org.jboss.aerogear.keycloak.metrics.MetricsFilter",
"method":"filter",
"line":53
},
{
"class":"org.jboss.aerogear.keycloak.metrics.MetricsFilterProvider",
"method":"filter",
"line":26
},
{
"class":"org.jboss.resteasy.reactive.server.handlers.ResourceResponseFilterHandler",
"method":"handle",
"line":25
},
{
"class":"io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext",
"method":"invokeHandler",
"line":150
},
{
"class":"org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext",
"method":"run",
"line":147
},
{
"class":"org.jboss.resteasy.reactive.server.handlers.RestInitialHandler",
"method":"beginProcessing",
"line":48
},
{
"class":"org.jboss.resteasy.reactive.server.vertx.ResteasyReactiveVertxHandler",
"method":"handle",
"line":23
},
{
"class":"org.jboss.resteasy.reactive.server.vertx.ResteasyReactiveVertxHandler",
"method":"handle",
"line":10
},
{
"class":"io.opentelemetry.javaagent.instrumentation.vertx.RoutingContextHandlerWrapper",
"method":"handle",
"line":39
},
{
"class":"io.opentelemetry.javaagent.instrumentation.vertx.RoutingContextHandlerWrapper",
"method":"handle",
"line":21
},
{
"class":"io.vertx.ext.web.impl.RouteState",
"method":"handleContext",
"line":1285
},
{
"class":"io.vertx.ext.web.impl.RoutingContextImplBase",
"method":"iterateNext",
"line":177
},
{
"class":"io.vertx.ext.web.impl.RoutingContextWrapper",
"method":"next",
"line":200
},
{
"class":"io.quarkus.vertx.http.runtime.options.HttpServerCommonHandlers$1",
"method":"handle",
"line":62
},
{
"class":"io.quarkus.vertx.http.runtime.options.HttpServerCommonHandlers$1",
"method":"handle",
"line":40
},
{
"class":"io.opentelemetry.javaagent.instrumentation.vertx.RoutingContextHandlerWrapper",
"method":"handle",
"line":39
},
{
"class":"io.opentelemetry.javaagent.instrumentation.vertx.RoutingContextHandlerWrapper",
"method":"handle",
"line":21
},
{
"class":"io.vertx.ext.web.impl.RouteState",
"method":"handleContext",
"line":1285
},
{
"class":"io.vertx.ext.web.impl.RoutingContextImplBase",
"method":"iterateNext",
"line":177
},
{
"class":"io.vertx.ext.web.impl.RoutingContextWrapper",
"method":"next",
"line":200
},
{
"class":"io.quarkus.resteasy.reactive.server.runtime.ResteasyReactiveRecorder$13",
"method":"handle",
"line":339
},
{
"class":"io.quarkus.resteasy.reactive.server.runtime.ResteasyReactiveRecorder$13",
"method":"handle",
"line":332
},
{
"class":"io.opentelemetry.javaagent.instrumentation.vertx.RoutingContextHandlerWrapper",
"method":"handle",
"line":39
},
{
"class":"io.opentelemetry.javaagent.instrumentation.vertx.RoutingContextHandlerWrapper",
"method":"handle",
"line":21
},
{
"class":"io.vertx.ext.web.impl.RouteState",
"method":"handleContext",
"line":1285
},
{
"class":"io.vertx.ext.web.impl.RoutingContextImplBase",
"method":"iterateNext",
"line":177
},
{
"class":"io.vertx.ext.web.impl.RoutingContextWrapper",
"method":"next",
"line":200
},
{
"class":"io.vertx.ext.web.impl.RouterImpl",
"method":"handleContext",
"line":250
},
{
"class":"io.opentelemetry.javaagent.instrumentation.vertx.RoutingContextHandlerWrapper",
"method":"handle",
"line":39
},
{
"class":"io.opentelemetry.javaagent.instrumentation.vertx.RoutingContextHandlerWrapper",
"method":"handle",
"line":21
},
{
"class":"io.vertx.ext.web.impl.RouteState",
"method":"handleContext",
"line":1285
},
{
"class":"io.vertx.ext.web.impl.RoutingContextImplBase",
"method":"iterateNext",
"line":177
},
{
"class":"io.vertx.ext.web.impl.RoutingContextImpl",
"method":"next",
"line":137
},
{
"class":"io.vertx.ext.web.impl.RouterImpl",
"method":"handle",
"line":68
},
{
"class":"io.vertx.ext.web.impl.RouterImpl",
"method":"handle",
"line":37
},
{
"class":"io.quarkus.vertx.http.runtime.options.HttpServerCommonHandlers$3",
"method":"handle",
"line":103
},
{
"class":"io.quarkus.vertx.http.runtime.options.HttpServerCommonHandlers$3",
"method":"handle",
"line":100
},
{
"class":"io.quarkus.vertx.http.runtime.options.HttpServerCommonHandlers$2",
"method":"handle",
"line":86
},
{
"class":"io.quarkus.vertx.http.runtime.options.HttpServerCommonHandlers$2",
"method":"handle",
"line":69
},
{
"class":"io.quarkus.vertx.http.runtime.VertxHttpRecorder$1",
"method":"handle",
"line":147
},
{
"class":"io.quarkus.vertx.http.runtime.VertxHttpRecorder$1",
"method":"handle",
"line":123
},
{
"class":"io.vertx.core.impl.ContextImpl",
"method":"emit",
"line":328
},
{
"class":"io.vertx.core.impl.DuplicatedContext",
"method":"emit",
"line":166
},
{
"class":"io.vertx.core.http.impl.Http1xServerConnection",
"method":"handleMessage",
"line":174
},
{
"class":"io.vertx.core.net.impl.ConnectionBase",
"method":"read",
"line":159
},
{
"class":"io.vertx.core.net.impl.VertxHandler",
"method":"channelRead",
"line":153
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"invokeChannelRead",
"line":442
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"invokeChannelRead",
"line":420
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"fireChannelRead",
"line":412
},
{
"class":"io.netty.handler.timeout.IdleStateHandler",
"method":"channelRead",
"line":289
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"invokeChannelRead",
"line":442
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"invokeChannelRead",
"line":420
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"fireChannelRead",
"line":412
},
{
"class":"io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext",
"method":"fireChannelRead",
"line":436
},
{
"class":"io.netty.channel.ChannelInboundHandlerAdapter",
"method":"channelRead",
"line":93
},
{
"class":"io.opentelemetry.javaagent.shaded.instrumentation.netty.v4_1.internal.server.HttpServerRequestTracingHandler",
"method":"channelRead",
"line":57
},
{
"class":"io.netty.channel.CombinedChannelDuplexHandler",
"method":"channelRead",
"line":251
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"invokeChannelRead",
"line":442
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"invokeChannelRead",
"line":420
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"fireChannelRead",
"line":412
},
{
"class":"io.netty.channel.ChannelInboundHandlerAdapter",
"method":"channelRead",
"line":93
},
{
"class":"io.opentelemetry.javaagent.shaded.instrumentation.netty.v4_1.internal.server.HttpServerRequestTracingHandler",
"method":"channelRead",
"line":65
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"invokeChannelRead",
"line":444
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"invokeChannelRead",
"line":420
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"fireChannelRead",
"line":412
},
{
"class":"io.netty.handler.codec.ByteToMessageDecoder",
"method":"fireChannelRead",
"line":346
},
{
"class":"io.netty.handler.codec.ByteToMessageDecoder",
"method":"channelRead",
"line":318
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"invokeChannelRead",
"line":444
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"invokeChannelRead",
"line":420
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"fireChannelRead",
"line":412
},
{
"class":"io.netty.channel.DefaultChannelPipeline$HeadContext",
"method":"channelRead",
"line":1410
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"invokeChannelRead",
"line":440
},
{
"class":"io.netty.channel.AbstractChannelHandlerContext",
"method":"invokeChannelRead",
"line":420
},
{
"class":"io.netty.channel.DefaultChannelPipeline",
"method":"fireChannelRead",
"line":919
},
{
"class":"io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe",
"method":"read",
"line":166
},
{
"class":"io.netty.channel.nio.NioEventLoop",
"method":"processSelectedKey",
"line":788
},
{
"class":"io.netty.channel.nio.NioEventLoop",
"method":"processSelectedKeysOptimized",
"line":724
},
{
"class":"io.netty.channel.nio.NioEventLoop",
"method":"processSelectedKeys",
"line":650
},
{
"class":"io.netty.channel.nio.NioEventLoop",
"method":"run",
"line":562
},
{
"class":"io.netty.util.concurrent.SingleThreadEventExecutor$4",
"method":"run",
"line":997
},
{
"class":"io.netty.util.internal.ThreadExecutorMap$2",
"method":"run",
"line":74
},
{
"class":"io.netty.util.concurrent.FastThreadLocalRunnable",
"method":"run",
"line":30
},
{
"class":"java.lang.Thread",
"method":"run",
"line":1583
}
]
}
}
Expected Behavior
Describe the expected behaviour.
Actual Behavior
Describe the current/actual behaviour.
Environment
- Operating system:
- OpenShift versions:
- Project Versions:
Steps to reproduce
Describe all steps and pre-requirements which are required to be performed in order to reproduce this scenario. ( E.g 1. Action, 2. Action ... )