Skip to content

Commit d898764

Browse files
authored
Improve Realm ID resolution for Quarkus 3.24+ (#2163)
In Quarkus 3.24, it is now possible to retrieve context locals inside HttpServerMetricsTagsContributor. This greatly simplifies our RealmIdTagContributor implementation. It is also now possible to return null from ValueExpressionResolver. This is not a big deal, but still better than returning "".
1 parent b501bfc commit d898764

File tree

2 files changed

+5
-29
lines changed

2 files changed

+5
-29
lines changed

runtime/service/src/main/java/org/apache/polaris/service/quarkus/metrics/QuarkusValueExpressionResolver.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ public class QuarkusValueExpressionResolver implements ValueExpressionResolver {
3131
@Inject QuarkusMetricsConfiguration metricsConfiguration;
3232

3333
@Override
34+
@Nullable
3435
public String resolve(@Nonnull String expression, @Nullable Object parameter) {
3536
// TODO maybe replace with CEL of some expression engine and make this more generic
3637
if (metricsConfiguration.realmIdTag().enableInApiMetrics()
3738
&& parameter instanceof RealmContext realmContext
3839
&& expression.equals("realmIdentifier")) {
3940
return realmContext.getRealmIdentifier();
4041
}
41-
// FIXME cannot return null here, see https://github.com/quarkusio/quarkus/issues/47891
42-
return "";
42+
return null;
4343
}
4444
}

runtime/service/src/main/java/org/apache/polaris/service/quarkus/metrics/RealmIdTagContributor.java

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,49 +20,25 @@
2020

2121
import io.micrometer.core.instrument.Tags;
2222
import io.quarkus.micrometer.runtime.HttpServerMetricsTagsContributor;
23-
import io.vertx.core.http.HttpServerRequest;
2423
import jakarta.enterprise.context.ApplicationScoped;
2524
import jakarta.inject.Inject;
2625
import org.apache.polaris.core.context.RealmContext;
27-
import org.apache.polaris.service.context.RealmContextResolver;
26+
import org.apache.polaris.service.quarkus.context.RealmContextFilter;
2827

2928
@ApplicationScoped
3029
public class RealmIdTagContributor implements HttpServerMetricsTagsContributor {
3130

3231
public static final String TAG_REALM = "realm_id";
3332

34-
private static final Tags UNFINISHED_RESOLUTION_TAGS = Tags.of(TAG_REALM, "???");
35-
3633
@Inject QuarkusMetricsConfiguration metricsConfiguration;
37-
@Inject RealmContextResolver realmContextResolver;
3834

3935
@Override
4036
public Tags contribute(Context context) {
41-
// FIXME retrieve the realm context from context.requestContextLocalData()
42-
// after upgrading to Quarkus 3.24
4337
if (!metricsConfiguration.realmIdTag().enableInHttpMetrics()) {
4438
return Tags.empty();
4539
}
46-
HttpServerRequest request = context.request();
47-
try {
48-
return realmContextResolver
49-
.resolveRealmContext(
50-
request.absoluteURI(),
51-
request.method().name(),
52-
request.path(),
53-
request.headers()::get)
54-
.thenApply(this::successfulResolutionTags)
55-
.toCompletableFuture()
56-
// get the result of the CompletableFuture if it's already completed,
57-
// otherwise return UNFINISHED_RESOLUTION_TAGS as this code is executed on
58-
// an event loop thread, and we don't want to block it.
59-
.getNow(UNFINISHED_RESOLUTION_TAGS);
60-
} catch (Exception e) {
61-
return Tags.empty();
62-
}
63-
}
64-
65-
private Tags successfulResolutionTags(RealmContext realmContext) {
40+
RealmContext realmContext =
41+
context.requestContextLocalData(RealmContextFilter.REALM_CONTEXT_KEY);
6642
return Tags.of(TAG_REALM, realmContext.getRealmIdentifier());
6743
}
6844
}

0 commit comments

Comments
 (0)