diff --git a/src/main/java/it/pleaseopen/keycloak/metrics/MetricsEventListener.java b/src/main/java/it/pleaseopen/keycloak/metrics/MetricsEventListener.java index 8cc02db..344c86f 100644 --- a/src/main/java/it/pleaseopen/keycloak/metrics/MetricsEventListener.java +++ b/src/main/java/it/pleaseopen/keycloak/metrics/MetricsEventListener.java @@ -4,17 +4,15 @@ import org.keycloak.events.Event; import org.keycloak.events.EventListenerProvider; import org.keycloak.events.admin.AdminEvent; -import org.keycloak.models.RealmProvider; public class MetricsEventListener implements EventListenerProvider { public final static String ID = "native-metrics-listener"; private final static Logger logger = Logger.getLogger(MetricsEventListener.class); - private final RealmProvider realmProvider; - public MetricsEventListener(RealmProvider realmProvider) { - this.realmProvider = realmProvider; + public MetricsEventListener() { + } @Override @@ -23,37 +21,37 @@ public void onEvent(Event event) { switch (event.getType()) { case LOGIN: - PrometheusExporter.instance().recordLogin(event, realmProvider); + PrometheusExporter.instance().recordLogin(event); break; case CLIENT_LOGIN: - PrometheusExporter.instance().recordClientLogin(event, realmProvider); + PrometheusExporter.instance().recordClientLogin(event); break; case REGISTER: - PrometheusExporter.instance().recordRegistration(event, realmProvider); + PrometheusExporter.instance().recordRegistration(event); break; case REFRESH_TOKEN: - PrometheusExporter.instance().recordRefreshToken(event, realmProvider); + PrometheusExporter.instance().recordRefreshToken(event); break; case CODE_TO_TOKEN: - PrometheusExporter.instance().recordCodeToToken(event, realmProvider); + PrometheusExporter.instance().recordCodeToToken(event); break; case REGISTER_ERROR: - PrometheusExporter.instance().recordRegistrationError(event, realmProvider); + PrometheusExporter.instance().recordRegistrationError(event); break; case LOGIN_ERROR: - PrometheusExporter.instance().recordLoginError(event, realmProvider); + PrometheusExporter.instance().recordLoginError(event); break; case CLIENT_LOGIN_ERROR: - PrometheusExporter.instance().recordClientLoginError(event, realmProvider); + PrometheusExporter.instance().recordClientLoginError(event); break; case REFRESH_TOKEN_ERROR: - PrometheusExporter.instance().recordRefreshTokenError(event, realmProvider); + PrometheusExporter.instance().recordRefreshTokenError(event); break; case CODE_TO_TOKEN_ERROR: - PrometheusExporter.instance().recordCodeToTokenError(event, realmProvider); + PrometheusExporter.instance().recordCodeToTokenError(event); break; default: - PrometheusExporter.instance().recordGenericEvent(event, realmProvider); + PrometheusExporter.instance().recordGenericEvent(event); } } @@ -61,7 +59,7 @@ public void onEvent(Event event) { public void onEvent(AdminEvent event, boolean includeRepresentation) { logAdminEventDetails(event); - PrometheusExporter.instance().recordGenericAdminEvent(event, realmProvider); + PrometheusExporter.instance().recordGenericAdminEvent(event); } private void logEventDetails(Event event) { diff --git a/src/main/java/it/pleaseopen/keycloak/metrics/MetricsEventListenerFactory.java b/src/main/java/it/pleaseopen/keycloak/metrics/MetricsEventListenerFactory.java index 77de721..fb70e57 100644 --- a/src/main/java/it/pleaseopen/keycloak/metrics/MetricsEventListenerFactory.java +++ b/src/main/java/it/pleaseopen/keycloak/metrics/MetricsEventListenerFactory.java @@ -10,7 +10,7 @@ public class MetricsEventListenerFactory implements EventListenerProviderFactory @Override public EventListenerProvider create(KeycloakSession session) { - return new MetricsEventListener(session.realms()); + return new MetricsEventListener(); } @Override diff --git a/src/main/java/it/pleaseopen/keycloak/metrics/PrometheusExporter.java b/src/main/java/it/pleaseopen/keycloak/metrics/PrometheusExporter.java index a24ea53..50266f7 100644 --- a/src/main/java/it/pleaseopen/keycloak/metrics/PrometheusExporter.java +++ b/src/main/java/it/pleaseopen/keycloak/metrics/PrometheusExporter.java @@ -12,8 +12,6 @@ import org.keycloak.events.EventType; import org.keycloak.events.admin.AdminEvent; import org.keycloak.events.admin.OperationType; -import org.keycloak.models.RealmModel; -import org.keycloak.models.RealmProvider; import java.io.BufferedWriter; import java.io.IOException; @@ -118,15 +116,14 @@ private static io.micrometer.core.instrument.Counter.Builder createCounter(final * Count generic user event * * @param event User event - * @param realmProvider */ - public void recordGenericEvent(final Event event, RealmProvider realmProvider) { + public void recordGenericEvent(final Event event) { final String counterName = buildCounterName(event.getType()); if (counters.get(counterName) == null) { - logger.warnf("Counter for event type %s does not exist. Realm: %s", event.getType().name(), nullToEmpty(getRealmName(event.getRealmId(), realmProvider))); + logger.warnf("Counter for event type %s does not exist. Realm: %s", event.getType().name(), nullToEmpty(event.getRealmName())); return; } - counters.get(counterName).tags("realm",nullToEmpty(getRealmName(event.getRealmId(), realmProvider))).register(meterRegistry).increment(); + counters.get(counterName).tags("realm",nullToEmpty(event.getRealmName())).register(meterRegistry).increment(); //pushAsync(); } @@ -134,15 +131,14 @@ public void recordGenericEvent(final Event event, RealmProvider realmProvider) { * Count generic admin event * * @param event Admin event - * @param realmProvider */ - public void recordGenericAdminEvent(final AdminEvent event, RealmProvider realmProvider) { + public void recordGenericAdminEvent(final AdminEvent event) { final String counterName = buildCounterName(event.getOperationType()); if (counters.get(counterName) == null) { logger.warnf("Counter for admin event operation type %s does not exist. Resource type: %s, realm: %s", event.getOperationType().name(), event.getResourceType().name(), event.getRealmId()); return; } - counters.get(counterName).tags("realm",nullToEmpty(getRealmName(event.getRealmId(), realmProvider)), "resource", event.getResourceType().name()).register(meterRegistry).increment(); + counters.get(counterName).tags("realm",nullToEmpty(event.getRealmName()), "resource", event.getResourceType().name()).register(meterRegistry).increment(); //pushAsync(); } @@ -151,12 +147,11 @@ public void recordGenericAdminEvent(final AdminEvent event, RealmProvider realmP * Increase the number of currently logged in users * * @param event Login event - * @param realmProvider */ - public void recordLogin(final Event event, RealmProvider realmProvider) { + public void recordLogin(final Event event) { final String provider = getIdentityProvider(event); - meterRegistry.counter(totalLoginsAttempts, "realm", nullToEmpty(getRealmName(event.getRealmId(), realmProvider)), "provider", provider, "client_id", nullToEmpty(event.getClientId())).increment(); - meterRegistry.counter(totalLogins, "realm", nullToEmpty(getRealmName(event.getRealmId(), realmProvider)), "provider", provider, "client_id", nullToEmpty(event.getClientId())).increment(); + meterRegistry.counter(totalLoginsAttempts, "realm", nullToEmpty(event.getRealmName()), "provider", provider, "client_id", nullToEmpty(event.getClientId())).increment(); + meterRegistry.counter(totalLogins, "realm", nullToEmpty(event.getRealmName()), "provider", provider, "client_id", nullToEmpty(event.getClientId())).increment(); //pushAsync(); } @@ -164,11 +159,10 @@ public void recordLogin(final Event event, RealmProvider realmProvider) { * Increase the number registered users * * @param event Register event - * @param realmProvider */ - public void recordRegistration(final Event event, RealmProvider realmProvider) { + public void recordRegistration(final Event event) { final String provider = getIdentityProvider(event); - meterRegistry.counter(totalRegistrations, "realm", nullToEmpty(getRealmName(event.getRealmId(), realmProvider)), "provider", provider, "client_id", nullToEmpty(event.getClientId())).increment(); + meterRegistry.counter(totalRegistrations, "realm", nullToEmpty(event.getRealmName()), "provider", provider, "client_id", nullToEmpty(event.getClientId())).increment(); //pushAsync(); } @@ -176,11 +170,10 @@ public void recordRegistration(final Event event, RealmProvider realmProvider) { * Increase the number of failed registered users attemps * * @param event RegisterError event - * @param realmProvider */ - public void recordRegistrationError(final Event event, RealmProvider realmProvider) { + public void recordRegistrationError(final Event event) { final String provider = getIdentityProvider(event); - meterRegistry.counter(totalRegistrationsErrors, "realm", nullToEmpty(getRealmName(event.getRealmId(), realmProvider)), "provider", provider, "client_id", nullToEmpty(event.getClientId()), "error", nullToEmpty(event.getError())).increment(); + meterRegistry.counter(totalRegistrationsErrors, "realm", nullToEmpty(event.getRealmName()), "provider", provider, "client_id", nullToEmpty(event.getClientId()), "error", nullToEmpty(event.getError())).increment(); //pushAsync(); } @@ -188,13 +181,12 @@ public void recordRegistrationError(final Event event, RealmProvider realmProvid * Increase the number of failed login attempts * * @param event LoginError event - * @param realmProvider */ - public void recordLoginError(final Event event, RealmProvider realmProvider) { + public void recordLoginError(final Event event) { final String provider = getIdentityProvider(event); - meterRegistry.counter(totalLoginsAttempts, "realm", nullToEmpty(getRealmName(event.getRealmId(), realmProvider)), "provider", provider, "client_id", nullToEmpty(event.getClientId())).increment(); - meterRegistry.counter(totalFailedLoginAttempts, "realm", nullToEmpty(getRealmName(event.getRealmId(), realmProvider)), "provider", provider, "client_id", nullToEmpty(event.getClientId()), "error", nullToEmpty(event.getError())).increment(); + meterRegistry.counter(totalLoginsAttempts, "realm", nullToEmpty(event.getRealmName()), "provider", provider, "client_id", nullToEmpty(event.getClientId())).increment(); + meterRegistry.counter(totalFailedLoginAttempts, "realm", nullToEmpty(event.getRealmName()), "provider", provider, "client_id", nullToEmpty(event.getClientId()), "error", nullToEmpty(event.getError())).increment(); //pushAsync(); } @@ -202,11 +194,10 @@ public void recordLoginError(final Event event, RealmProvider realmProvider) { * Increase the number of currently client logged * * @param event ClientLogin event - * @param realmProvider */ - public void recordClientLogin(final Event event, RealmProvider realmProvider) { + public void recordClientLogin(final Event event) { final String provider = getIdentityProvider(event); - meterRegistry.counter(totalClientLogins, "realm",nullToEmpty(getRealmName(event.getRealmId(), realmProvider)), "provider", provider, "client_id", nullToEmpty(event.getClientId())).increment(); + meterRegistry.counter(totalClientLogins, "realm",nullToEmpty(event.getRealmName()), "provider", provider, "client_id", nullToEmpty(event.getClientId())).increment(); //pushAsync(); } @@ -214,11 +205,10 @@ public void recordClientLogin(final Event event, RealmProvider realmProvider) { * Increase the number of failed login attempts * * @param event ClientLoginError event - * @param realmProvider */ - public void recordClientLoginError(final Event event, RealmProvider realmProvider) { + public void recordClientLoginError(final Event event) { final String provider = getIdentityProvider(event); - meterRegistry.counter(totalFailedClientLoginAttempts, "realm",nullToEmpty(getRealmName(event.getRealmId(), realmProvider)), "provider", provider, "client_id", nullToEmpty(event.getClientId()), "error", nullToEmpty(event.getError())).increment(); + meterRegistry.counter(totalFailedClientLoginAttempts, "realm",nullToEmpty(event.getRealmName()), "provider", provider, "client_id", nullToEmpty(event.getClientId()), "error", nullToEmpty(event.getError())).increment(); //pushAsync(); } @@ -226,11 +216,10 @@ public void recordClientLoginError(final Event event, RealmProvider realmProvide * Increase the number of refreshes tokens * * @param event RefreshToken event - * @param realmProvider */ - public void recordRefreshToken(final Event event, RealmProvider realmProvider) { + public void recordRefreshToken(final Event event) { final String provider = getIdentityProvider(event); - meterRegistry.counter(totalRefreshTokens, "realm", nullToEmpty(getRealmName(event.getRealmId(), realmProvider)), "provider", provider, "client_id", nullToEmpty(event.getClientId())).increment(); + meterRegistry.counter(totalRefreshTokens, "realm", nullToEmpty(event.getRealmName()), "provider", provider, "client_id", nullToEmpty(event.getClientId())).increment(); //pushAsync(); } @@ -238,11 +227,10 @@ public void recordRefreshToken(final Event event, RealmProvider realmProvider) { * Increase the number of failed refreshes tokens attempts * * @param event RefreshTokenError event - * @param realmProvider */ - public void recordRefreshTokenError(final Event event, RealmProvider realmProvider) { + public void recordRefreshTokenError(final Event event) { final String provider = getIdentityProvider(event); - meterRegistry.counter(totalRefreshTokensErrors, "realm", nullToEmpty(getRealmName(event.getRealmId(), realmProvider)), "provider", provider, "client_id", nullToEmpty(event.getClientId()), "error", nullToEmpty(event.getError())).increment(); + meterRegistry.counter(totalRefreshTokensErrors, "realm", nullToEmpty(event.getRealmName()), "provider", provider, "client_id", nullToEmpty(event.getClientId()), "error", nullToEmpty(event.getError())).increment(); //pushAsync(); } @@ -250,11 +238,10 @@ public void recordRefreshTokenError(final Event event, RealmProvider realmProvid * Increase the number of code to tokens * * @param event CodeToToken event - * @param realmProvider */ - public void recordCodeToToken(final Event event, RealmProvider realmProvider) { + public void recordCodeToToken(final Event event) { final String provider = getIdentityProvider(event); - meterRegistry.counter(totalCodeToTokens, "realm", nullToEmpty(getRealmName(event.getRealmId(), realmProvider)), "provider", provider, "client_id", nullToEmpty(event.getClientId())).increment(); + meterRegistry.counter(totalCodeToTokens, "realm", nullToEmpty(event.getRealmName()), "provider", provider, "client_id", nullToEmpty(event.getClientId())).increment(); //pushAsync(); } @@ -262,11 +249,10 @@ public void recordCodeToToken(final Event event, RealmProvider realmProvider) { * Increase the number of failed code to tokens attempts * * @param event CodeToTokenError event - * @param realmProvider */ - public void recordCodeToTokenError(final Event event, RealmProvider realmProvider) { + public void recordCodeToTokenError(final Event event) { final String provider = getIdentityProvider(event); - meterRegistry.counter(totalCodeToTokensErrors, "realm", nullToEmpty(getRealmName(event.getRealmId(), realmProvider)), "provider", provider, "client_id", nullToEmpty(event.getClientId()), "error", nullToEmpty(event.getError())).increment(); + meterRegistry.counter(totalCodeToTokensErrors, "realm", nullToEmpty(event.getRealmName()), "provider", provider, "client_id", nullToEmpty(event.getClientId()), "error", nullToEmpty(event.getError())).increment(); //pushAsync(); } @@ -288,23 +274,6 @@ private String getIdentityProvider(Event event) { return identityProvider; } - /** - * Retrieve the real realm name in the event by id from the RealmProvider. - * - * @param realmId Id of Realm - * @param realmProvider RealmProvider instance - * @return Realm name - */ - private String getRealmName(String realmId, RealmProvider realmProvider) { - RealmModel realm = null; - if (realmId != null) { - realm = realmProvider.getRealm(realmId); - } - if (realm != null) { - return realm.getName(); - } - return null; - } /** * Write the Prometheus formatted values of all counters and * gauges to the stream diff --git a/src/test/java/it/pleaseopen/keycloak/metrics/PrometheusExporterTest.java b/src/test/java/it/pleaseopen/keycloak/metrics/PrometheusExporterTest.java index 51e1bda..7e7beb8 100644 --- a/src/test/java/it/pleaseopen/keycloak/metrics/PrometheusExporterTest.java +++ b/src/test/java/it/pleaseopen/keycloak/metrics/PrometheusExporterTest.java @@ -13,8 +13,6 @@ import org.keycloak.events.admin.AdminEvent; import org.keycloak.events.admin.OperationType; import org.keycloak.events.admin.ResourceType; -import org.keycloak.models.RealmModel; -import org.keycloak.models.RealmProvider; import uk.org.webcompere.systemstubs.rules.EnvironmentVariablesRule; import java.io.IOException; @@ -28,21 +26,12 @@ @SuppressWarnings("unchecked") public class PrometheusExporterTest { - private static final String DEFAULT_REALM_ID = "2af8c4d4-4d58-4d74-9ad7-eef9aac06a90"; private static final String DEFAULT_REALM_NAME = "myrealm"; - private static final RealmProvider realmProvider = mock(RealmProvider.class); - MeterRegistry meterRegistry; @Before - public void setupRealmProvider() { - RealmModel realm = mock(RealmModel.class); - when(realm.getName()).thenReturn(DEFAULT_REALM_NAME); - when(realmProvider.getRealm(DEFAULT_REALM_ID)).thenReturn(realm); - RealmModel otherRealm = mock(RealmModel.class); - when(otherRealm.getName()).thenReturn("OTHER_REALM"); - when(realmProvider.getRealm("OTHER_REALM_ID")).thenReturn(otherRealm); + public void setupRegistry() { meterRegistry = new SimpleMeterRegistry(); Metrics.globalRegistry.add(meterRegistry); } @@ -73,50 +62,50 @@ public void shouldRegisterCountersForAllKeycloakEvents() { @Test public void shouldCorrectlyCountLoginAttemptsForSuccessfulAndFailedAttempts() throws IOException { // with LOGIN event - final Event login1 = createEvent(EventType.LOGIN, DEFAULT_REALM_ID, "THE_CLIENT_ID"); - PrometheusExporter.instance().recordLogin(login1, realmProvider); + final Event login1 = createEvent(EventType.LOGIN, DEFAULT_REALM_NAME, "THE_CLIENT_ID"); + PrometheusExporter.instance().recordLogin(login1); assertMetric("keycloak_login_attempts", 1, "provider", "keycloak","client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); assertMetric("keycloak_logins", 1, "provider", "keycloak", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); // with LOGIN_ERROR event - final Event event2 = createEvent(EventType.LOGIN_ERROR, DEFAULT_REALM_ID, "THE_CLIENT_ID", "user_not_found"); - PrometheusExporter.instance().recordLoginError(event2, realmProvider); + final Event event2 = createEvent(EventType.LOGIN_ERROR, DEFAULT_REALM_NAME, "THE_CLIENT_ID", "user_not_found"); + PrometheusExporter.instance().recordLoginError(event2); assertMetric("keycloak_login_attempts", 2, "provider", "keycloak", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); assertMetric("keycloak_failed_login_attempts", 1, "provider", "keycloak", "error", "user_not_found", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); } @Test public void shouldCorrectlyCountLoginWhenIdentityProviderIsDefined() throws IOException { - final Event login1 = createEvent(EventType.LOGIN, DEFAULT_REALM_ID, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); - PrometheusExporter.instance().recordLogin(login1, realmProvider); + final Event login1 = createEvent(EventType.LOGIN, DEFAULT_REALM_NAME, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); + PrometheusExporter.instance().recordLogin(login1); assertMetric("keycloak_logins", 1, "provider", "THE_ID_PROVIDER", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); - final Event login2 = createEvent(EventType.LOGIN, DEFAULT_REALM_ID, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); - PrometheusExporter.instance().recordLogin(login2, realmProvider); + final Event login2 = createEvent(EventType.LOGIN, DEFAULT_REALM_NAME, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); + PrometheusExporter.instance().recordLogin(login2); assertMetric("keycloak_logins", 2, "provider", "THE_ID_PROVIDER", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); } @Test public void shouldCorrectlyCountLoginWhenIdentityProviderIsNotDefined() throws IOException { final Event login1 = createEvent(EventType.LOGIN); - PrometheusExporter.instance().recordLogin(login1, realmProvider); + PrometheusExporter.instance().recordLogin(login1); assertMetric("keycloak_logins", 1, "provider", "keycloak", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); final Event login2 = createEvent(EventType.LOGIN); - PrometheusExporter.instance().recordLogin(login2, realmProvider); + PrometheusExporter.instance().recordLogin(login2); assertMetric("keycloak_logins", 2, "provider", "keycloak", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); } @Test public void shouldCorrectlyCountLoginsFromDifferentProviders() throws IOException { // with id provider defined - final Event login1 = createEvent(EventType.LOGIN, DEFAULT_REALM_ID, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); - PrometheusExporter.instance().recordLogin(login1, realmProvider); + final Event login1 = createEvent(EventType.LOGIN, DEFAULT_REALM_NAME, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); + PrometheusExporter.instance().recordLogin(login1); assertMetric("keycloak_logins", 1, "provider", "THE_ID_PROVIDER", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); // without id provider defined - final Event login2 = createEvent(EventType.LOGIN, DEFAULT_REALM_ID, "THE_CLIENT_ID"); - PrometheusExporter.instance().recordLogin(login2, realmProvider); + final Event login2 = createEvent(EventType.LOGIN, DEFAULT_REALM_NAME, "THE_CLIENT_ID"); + PrometheusExporter.instance().recordLogin(login2); assertMetric("keycloak_logins", 1, "provider", "keycloak", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); assertMetric("keycloak_logins", 1, "provider", "THE_ID_PROVIDER", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); } @@ -124,12 +113,12 @@ public void shouldCorrectlyCountLoginsFromDifferentProviders() throws IOExceptio @Test public void shouldRecordLoginsPerRealm() throws IOException { // realm 1 - final Event login1 = createEvent(EventType.LOGIN, DEFAULT_REALM_ID, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); - PrometheusExporter.instance().recordLogin(login1, realmProvider); + final Event login1 = createEvent(EventType.LOGIN, DEFAULT_REALM_NAME, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); + PrometheusExporter.instance().recordLogin(login1); // realm 2 - final Event login2 = createEvent(EventType.LOGIN, "OTHER_REALM_ID", "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); - PrometheusExporter.instance().recordLogin(login2, realmProvider); + final Event login2 = createEvent(EventType.LOGIN, "OTHER_REALM", "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); + PrometheusExporter.instance().recordLogin(login2); assertMetric("keycloak_logins", 1, "provider", "THE_ID_PROVIDER", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); assertMetric("keycloak_logins", 1, "provider", "THE_ID_PROVIDER", "client_id", "THE_CLIENT_ID", "realm", "OTHER_REALM"); @@ -138,13 +127,13 @@ public void shouldRecordLoginsPerRealm() throws IOException { @Test public void shouldCorrectlyCountLoginError() throws IOException { // with id provider defined - final Event event1 = createEvent(EventType.LOGIN_ERROR, DEFAULT_REALM_ID, "THE_CLIENT_ID", "user_not_found", tuple("identity_provider", "THE_ID_PROVIDER")); - PrometheusExporter.instance().recordLoginError(event1, realmProvider); + final Event event1 = createEvent(EventType.LOGIN_ERROR, DEFAULT_REALM_NAME, "THE_CLIENT_ID", "user_not_found", tuple("identity_provider", "THE_ID_PROVIDER")); + PrometheusExporter.instance().recordLoginError(event1); assertMetric("keycloak_failed_login_attempts", 1, "provider", "THE_ID_PROVIDER", "error", "user_not_found", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); // without id provider defined - final Event event2 = createEvent(EventType.LOGIN_ERROR, DEFAULT_REALM_ID, "THE_CLIENT_ID", "user_not_found"); - PrometheusExporter.instance().recordLoginError(event2, realmProvider); + final Event event2 = createEvent(EventType.LOGIN_ERROR, DEFAULT_REALM_NAME, "THE_CLIENT_ID", "user_not_found"); + PrometheusExporter.instance().recordLoginError(event2); assertMetric("keycloak_failed_login_attempts", 1, "provider", "keycloak", "error", "user_not_found", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); assertMetric("keycloak_failed_login_attempts", 1, "provider", "THE_ID_PROVIDER", "error", "user_not_found", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); } @@ -152,13 +141,13 @@ public void shouldCorrectlyCountLoginError() throws IOException { @Test public void shouldCorrectlyCountRegister() throws IOException { // with id provider defined - final Event event1 = createEvent(EventType.REGISTER, DEFAULT_REALM_ID, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); - PrometheusExporter.instance().recordRegistration(event1, realmProvider); + final Event event1 = createEvent(EventType.REGISTER, DEFAULT_REALM_NAME, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); + PrometheusExporter.instance().recordRegistration(event1); assertMetric("keycloak_registrations", 1, "provider", "THE_ID_PROVIDER", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); // without id provider defined - final Event event2 = createEvent(EventType.REGISTER, DEFAULT_REALM_ID, "THE_CLIENT_ID"); - PrometheusExporter.instance().recordRegistration(event2, realmProvider); + final Event event2 = createEvent(EventType.REGISTER, DEFAULT_REALM_NAME, "THE_CLIENT_ID"); + PrometheusExporter.instance().recordRegistration(event2); assertMetric("keycloak_registrations", 1, "provider", "keycloak", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); assertMetric("keycloak_registrations", 1, "provider", "THE_ID_PROVIDER", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); } @@ -166,13 +155,13 @@ public void shouldCorrectlyCountRegister() throws IOException { @Test public void shouldCorrectlyCountRefreshTokens() throws IOException { // with id provider defined - final Event event1 = createEvent(EventType.REFRESH_TOKEN, DEFAULT_REALM_ID, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); - PrometheusExporter.instance().recordRefreshToken(event1, realmProvider); + final Event event1 = createEvent(EventType.REFRESH_TOKEN, DEFAULT_REALM_NAME, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); + PrometheusExporter.instance().recordRefreshToken(event1); assertMetric("keycloak_refresh_tokens", 1, "provider", "THE_ID_PROVIDER", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); // without id provider defined - final Event event2 = createEvent(EventType.REFRESH_TOKEN, DEFAULT_REALM_ID, "THE_CLIENT_ID"); - PrometheusExporter.instance().recordRefreshToken(event2, realmProvider); + final Event event2 = createEvent(EventType.REFRESH_TOKEN, DEFAULT_REALM_NAME, "THE_CLIENT_ID"); + PrometheusExporter.instance().recordRefreshToken(event2); assertMetric("keycloak_refresh_tokens", 1, "provider", "keycloak", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); assertMetric("keycloak_refresh_tokens", 1, "provider", "THE_ID_PROVIDER", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); } @@ -180,13 +169,13 @@ public void shouldCorrectlyCountRefreshTokens() throws IOException { @Test public void shouldCorrectlyCountRefreshTokensErrors() throws IOException { // with id provider defined - final Event event1 = createEvent(EventType.REFRESH_TOKEN_ERROR, DEFAULT_REALM_ID, "THE_CLIENT_ID", "user_not_found", tuple("identity_provider", "THE_ID_PROVIDER")); - PrometheusExporter.instance().recordRefreshTokenError(event1, realmProvider); + final Event event1 = createEvent(EventType.REFRESH_TOKEN_ERROR, DEFAULT_REALM_NAME, "THE_CLIENT_ID", "user_not_found", tuple("identity_provider", "THE_ID_PROVIDER")); + PrometheusExporter.instance().recordRefreshTokenError(event1); assertMetric("keycloak_refresh_tokens_errors", 1, "provider", "THE_ID_PROVIDER", "error", "user_not_found", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); // without id provider defined - final Event event2 = createEvent(EventType.REFRESH_TOKEN_ERROR, DEFAULT_REALM_ID, "THE_CLIENT_ID", "user_not_found"); - PrometheusExporter.instance().recordRefreshTokenError(event2, realmProvider); + final Event event2 = createEvent(EventType.REFRESH_TOKEN_ERROR, DEFAULT_REALM_NAME, "THE_CLIENT_ID", "user_not_found"); + PrometheusExporter.instance().recordRefreshTokenError(event2); assertMetric("keycloak_refresh_tokens_errors", 1, "provider", "keycloak", "error", "user_not_found", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); assertMetric("keycloak_refresh_tokens_errors", 1, "provider", "THE_ID_PROVIDER", "error", "user_not_found", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); } @@ -194,13 +183,13 @@ public void shouldCorrectlyCountRefreshTokensErrors() throws IOException { @Test public void shouldCorrectlyCountClientLogins() throws IOException { // with id provider defined - final Event event1 = createEvent(EventType.CLIENT_LOGIN, DEFAULT_REALM_ID, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); - PrometheusExporter.instance().recordClientLogin(event1, realmProvider); + final Event event1 = createEvent(EventType.CLIENT_LOGIN, DEFAULT_REALM_NAME, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); + PrometheusExporter.instance().recordClientLogin(event1); assertMetric("keycloak_client_logins", 1, "provider", "THE_ID_PROVIDER", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); // without id provider defined - final Event event2 = createEvent(EventType.CLIENT_LOGIN, DEFAULT_REALM_ID, "THE_CLIENT_ID"); - PrometheusExporter.instance().recordClientLogin(event2, realmProvider); + final Event event2 = createEvent(EventType.CLIENT_LOGIN, DEFAULT_REALM_NAME, "THE_CLIENT_ID"); + PrometheusExporter.instance().recordClientLogin(event2); assertMetric("keycloak_client_logins", 1, "provider", "keycloak", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); assertMetric("keycloak_client_logins", 1, "provider", "THE_ID_PROVIDER", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); } @@ -208,13 +197,13 @@ public void shouldCorrectlyCountClientLogins() throws IOException { @Test public void shouldCorrectlyCountClientLoginAttempts() throws IOException { // with id provider defined - final Event event1 = createEvent(EventType.CLIENT_LOGIN_ERROR, DEFAULT_REALM_ID, "THE_CLIENT_ID", "user_not_found", tuple( "identity_provider", "THE_ID_PROVIDER")); - PrometheusExporter.instance().recordClientLoginError(event1, realmProvider); + final Event event1 = createEvent(EventType.CLIENT_LOGIN_ERROR, DEFAULT_REALM_NAME, "THE_CLIENT_ID", "user_not_found", tuple( "identity_provider", "THE_ID_PROVIDER")); + PrometheusExporter.instance().recordClientLoginError(event1); assertMetric("keycloak_failed_client_login_attempts", 1, "provider", "THE_ID_PROVIDER", "error", "user_not_found", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); // without id provider defined - final Event event2 = createEvent(EventType.CLIENT_LOGIN_ERROR, DEFAULT_REALM_ID, "THE_CLIENT_ID", "user_not_found"); - PrometheusExporter.instance().recordClientLoginError(event2, realmProvider); + final Event event2 = createEvent(EventType.CLIENT_LOGIN_ERROR, DEFAULT_REALM_NAME, "THE_CLIENT_ID", "user_not_found"); + PrometheusExporter.instance().recordClientLoginError(event2); assertMetric("keycloak_failed_client_login_attempts", 1, "provider", "keycloak", "error", "user_not_found", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); assertMetric("keycloak_failed_client_login_attempts", 1, "provider", "THE_ID_PROVIDER", "error", "user_not_found", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); } @@ -222,13 +211,13 @@ public void shouldCorrectlyCountClientLoginAttempts() throws IOException { @Test public void shouldCorrectlyCountCodeToTokens() throws IOException { // with id provider defined - final Event event1 = createEvent(EventType.CODE_TO_TOKEN, DEFAULT_REALM_ID, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); - PrometheusExporter.instance().recordCodeToToken(event1, realmProvider); + final Event event1 = createEvent(EventType.CODE_TO_TOKEN, DEFAULT_REALM_NAME, "THE_CLIENT_ID", tuple("identity_provider", "THE_ID_PROVIDER")); + PrometheusExporter.instance().recordCodeToToken(event1); assertMetric("keycloak_code_to_tokens", 1, "provider", "THE_ID_PROVIDER", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); // without id provider defined - final Event event2 = createEvent(EventType.CODE_TO_TOKEN, DEFAULT_REALM_ID, "THE_CLIENT_ID"); - PrometheusExporter.instance().recordCodeToToken(event2, realmProvider); + final Event event2 = createEvent(EventType.CODE_TO_TOKEN, DEFAULT_REALM_NAME, "THE_CLIENT_ID"); + PrometheusExporter.instance().recordCodeToToken(event2); assertMetric("keycloak_code_to_tokens", 1, "provider", "keycloak", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); assertMetric("keycloak_code_to_tokens", 1, "provider", "THE_ID_PROVIDER", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); } @@ -236,13 +225,13 @@ public void shouldCorrectlyCountCodeToTokens() throws IOException { @Test public void shouldCorrectlyCountCodeToTokensErrors() throws IOException { // with id provider defined - final Event event1 = createEvent(EventType.CODE_TO_TOKEN_ERROR, DEFAULT_REALM_ID, "THE_CLIENT_ID", "user_not_found", tuple( "identity_provider", "THE_ID_PROVIDER")); - PrometheusExporter.instance().recordCodeToTokenError(event1, realmProvider); + final Event event1 = createEvent(EventType.CODE_TO_TOKEN_ERROR, DEFAULT_REALM_NAME, "THE_CLIENT_ID", "user_not_found", tuple( "identity_provider", "THE_ID_PROVIDER")); + PrometheusExporter.instance().recordCodeToTokenError(event1); assertMetric("keycloak_code_to_tokens_errors", 1, "provider", "THE_ID_PROVIDER", "error", "user_not_found", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); // without id provider defined - final Event event2 = createEvent(EventType.CODE_TO_TOKEN_ERROR, DEFAULT_REALM_ID, "THE_CLIENT_ID", "user_not_found"); - PrometheusExporter.instance().recordCodeToTokenError(event2, realmProvider); + final Event event2 = createEvent(EventType.CODE_TO_TOKEN_ERROR, DEFAULT_REALM_NAME, "THE_CLIENT_ID", "user_not_found"); + PrometheusExporter.instance().recordCodeToTokenError(event2); assertMetric("keycloak_code_to_tokens_errors", 1, "provider", "keycloak", "error", "user_not_found", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); assertMetric("keycloak_code_to_tokens_errors", 1, "provider", "THE_ID_PROVIDER", "error", "user_not_found", "client_id", "THE_CLIENT_ID", "realm", DEFAULT_REALM_NAME); } @@ -250,14 +239,14 @@ public void shouldCorrectlyCountCodeToTokensErrors() throws IOException { @Test public void shouldCorrectlyRecordGenericEvents() throws IOException { final Event event1 = createEvent(EventType.UPDATE_EMAIL); - PrometheusExporter.instance().recordGenericEvent(event1, realmProvider); + PrometheusExporter.instance().recordGenericEvent(event1); assertMetric("keycloak_user_event_UPDATE_EMAIL", 1, "realm", DEFAULT_REALM_NAME); - PrometheusExporter.instance().recordGenericEvent(event1, realmProvider); + PrometheusExporter.instance().recordGenericEvent(event1); assertMetric("keycloak_user_event_UPDATE_EMAIL", 2, "realm", DEFAULT_REALM_NAME); final Event event2 = createEvent(EventType.REVOKE_GRANT); - PrometheusExporter.instance().recordGenericEvent(event2, realmProvider); + PrometheusExporter.instance().recordGenericEvent(event2); assertMetric("keycloak_user_event_REVOKE_GRANT", 1, "realm", DEFAULT_REALM_NAME); assertMetric("keycloak_user_event_UPDATE_EMAIL", 2, "realm", DEFAULT_REALM_NAME); } @@ -267,18 +256,18 @@ public void shouldCorrectlyRecordGenericAdminEvents() throws IOException { final AdminEvent event1 = new AdminEvent(); event1.setOperationType(OperationType.ACTION); event1.setResourceType(ResourceType.AUTHORIZATION_SCOPE); - event1.setRealmId(DEFAULT_REALM_ID); - PrometheusExporter.instance().recordGenericAdminEvent(event1, realmProvider); + event1.setRealmName(DEFAULT_REALM_NAME); + PrometheusExporter.instance().recordGenericAdminEvent(event1); assertMetric("keycloak_admin_event_ACTION", 1, "resource", "AUTHORIZATION_SCOPE", "realm", DEFAULT_REALM_NAME); - PrometheusExporter.instance().recordGenericAdminEvent(event1, realmProvider); + PrometheusExporter.instance().recordGenericAdminEvent(event1); assertMetric("keycloak_admin_event_ACTION", 2, "resource", "AUTHORIZATION_SCOPE", "realm", DEFAULT_REALM_NAME); final AdminEvent event2 = new AdminEvent(); event2.setOperationType(OperationType.UPDATE); event2.setResourceType(ResourceType.CLIENT); - event2.setRealmId(DEFAULT_REALM_ID); - PrometheusExporter.instance().recordGenericAdminEvent(event2, realmProvider); + event2.setRealmName(DEFAULT_REALM_NAME); + PrometheusExporter.instance().recordGenericAdminEvent(event2); assertMetric("keycloak_admin_event_UPDATE", 1, "resource", "CLIENT", "realm", DEFAULT_REALM_NAME); assertMetric("keycloak_admin_event_ACTION", 2, "resource", "AUTHORIZATION_SCOPE", "realm", DEFAULT_REALM_NAME); } @@ -289,7 +278,7 @@ public void shouldTolerateNullLabels() throws IOException { nullEvent.setClientId(null); nullEvent.setError(null); nullEvent.setRealmId(null); - PrometheusExporter.instance().recordLoginError(nullEvent, realmProvider); + PrometheusExporter.instance().recordLoginError(nullEvent); assertMetric("keycloak_failed_login_attempts", 1, "provider", "keycloak", "error", "", "client_id", "", "realm", ""); } @@ -302,10 +291,10 @@ private void assertMetric(String metricName, double metricValue, String ... tags this.assertGenericMetric(metricName, metricValue, tags); } - private Event createEvent(EventType type, String realm, String clientId, String error, Tuple... tuples) { + private Event createEvent(EventType type, String realmName, String clientId, String error, Tuple... tuples) { final Event event = new Event(); event.setType(type); - event.setRealmId(realm); + event.setRealmName(realmName); event.setClientId(clientId); if (tuples != null) { event.setDetails(new HashMap<>()); @@ -322,12 +311,12 @@ private Event createEvent(EventType type, String realm, String clientId, String return event; } - private Event createEvent(EventType type, String realm, String clientId, Tuple... tuples) { - return this.createEvent(type, realm, clientId, (String) null, tuples); + private Event createEvent(EventType type, String realmName, String clientId, Tuple... tuples) { + return this.createEvent(type, realmName, clientId, (String) null, tuples); } private Event createEvent(EventType type) { - return createEvent(type, DEFAULT_REALM_ID, "THE_CLIENT_ID",(String) null); + return createEvent(type, DEFAULT_REALM_NAME, "THE_CLIENT_ID",(String) null); } private static Tuple tuple(L left, R right) {