parent
62bdac4717
commit
db929056f3
8 changed files with 225 additions and 53 deletions
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue