Add option to replace model ids with model names, fix #3 (#6)

This commit is contained in:
Stephan Schnabel 2023-03-10 13:31:06 +01:00 committed by GitHub
parent 62bdac4717
commit db929056f3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 225 additions and 53 deletions

View file

@ -1,8 +1,12 @@
package io.kokuwa.keycloak.metrics;
import java.util.Optional;
import org.jboss.logging.Logger;
import org.keycloak.events.Event;
import org.keycloak.events.EventListenerProvider;
import org.keycloak.events.admin.AdminEvent;
import org.keycloak.models.KeycloakSession;
import io.micrometer.core.instrument.MeterRegistry;
@ -13,18 +17,23 @@ import io.micrometer.core.instrument.MeterRegistry;
*/
public class MicrometerEventListener implements EventListenerProvider, AutoCloseable {
private static final Logger log = Logger.getLogger(MicrometerEventListener.class);
private final MeterRegistry registry;
private final KeycloakSession session;
private final boolean replace;
public MicrometerEventListener(MeterRegistry registry) {
public MicrometerEventListener(MeterRegistry registry, KeycloakSession session, boolean replaceId) {
this.registry = registry;
this.session = session;
this.replace = replaceId;
}
@Override
public void onEvent(Event event) {
registry.counter("keycloak_event_user",
"realm", toBlank(event.getRealmId()),
"realm", toBlank(replace ? getRealmName(event.getRealmId()) : event.getRealmId()),
"type", toBlank(event.getType()),
"client", toBlank(event.getClientId()),
"client", toBlank(replace ? getClientId(event.getRealmId(), event.getClientId()) : event.getClientId()),
"error", toBlank(event.getError()))
.increment();
}
@ -32,7 +41,7 @@ public class MicrometerEventListener implements EventListenerProvider, AutoClose
@Override
public void onEvent(AdminEvent event, boolean includeRepresentation) {
registry.counter("keycloak_event_admin",
"realm", toBlank(event.getRealmId()),
"realm", toBlank(replace ? getRealmName(event.getRealmId()) : event.getRealmId()),
"resource", toBlank(event.getResourceType()),
"operation", toBlank(event.getOperationType()),
"error", toBlank(event.getError()))
@ -45,4 +54,24 @@ public class MicrometerEventListener implements EventListenerProvider, AutoClose
private String toBlank(Object value) {
return value == null ? "" : value.toString();
}
private String getRealmName(String realmId) {
var model = session.realms().getRealm(realmId);
if (model == null) {
log.warnv("Failed to resolve realm with id", realmId);
return realmId;
}
return model.getName();
}
private String getClientId(String realmId, String clientId) {
var model = Optional.ofNullable(session.realms().getRealm(realmId))
.map(realm -> realm.getClientById(clientId))
.orElse(null);
if (model == null) {
log.warnv("Failed to resolve client with id {} in realm {}", clientId, realmId);
return clientId;
}
return model.getClientId();
}
}

View file

@ -2,6 +2,7 @@ package io.kokuwa.keycloak.metrics;
import javax.enterprise.inject.spi.CDI;
import org.jboss.logging.Logger;
import org.keycloak.Config.Scope;
import org.keycloak.events.EventListenerProvider;
import org.keycloak.events.EventListenerProviderFactory;
@ -17,7 +18,9 @@ import io.micrometer.core.instrument.MeterRegistry;
*/
public class MicrometerEventListenerFactory implements EventListenerProviderFactory {
private static final Logger log = Logger.getLogger(MicrometerEventListener.class);
private MeterRegistry registry;
private boolean replace;
@Override
public String getId() {
@ -25,7 +28,10 @@ public class MicrometerEventListenerFactory implements EventListenerProviderFact
}
@Override
public void init(Scope config) {}
public void init(Scope config) {
replace = "true".equals(System.getenv("KC_METRICS_EVENT_REPLACE_IDS"));
log.info(replace ? "Configured with model names." : "Configured with model ids.");
}
@Override
public void postInit(KeycloakSessionFactory factory) {
@ -34,7 +40,7 @@ public class MicrometerEventListenerFactory implements EventListenerProviderFact
@Override
public EventListenerProvider create(KeycloakSession session) {
return new MicrometerEventListener(registry);
return new MicrometerEventListener(registry, session, replace);
}
@Override