Skip to content

Commit

Permalink
Remove MetricsEventsListener
Browse files Browse the repository at this point in the history
  • Loading branch information
rtufisi committed Jun 24, 2024
1 parent 57fcfce commit 6165134
Show file tree
Hide file tree
Showing 10 changed files with 23 additions and 539 deletions.
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Provides metrics for Keycloak user/admin events and user/client/session count. T

[aerogear/keycloak-metrics-spi](https://github.com/aerogear/keycloak-metrics-spi) is an alternative to this plugin but is not well maintained. This implementation is different:

* no Prometheus push (event listener only adds counter to Micrometer)
* no Prometheus push (event store custom implementation only adds counter to Micrometer)
* no realm specific Prometheus endpoint, only `/metrics` (from Quarkus)
* no jvm/http metrics, this is [already](https://www.keycloak.org/server/configuration-metrics#_available_metrics) included in Keycloak
* different metric names, can relace model ids with name (see [configuration](#kc_metrics_event_replace_ids))
Expand Down Expand Up @@ -56,6 +56,10 @@ keycloak_event_admin_total{error="",operation="CREATE",realm="9039a0b5-e8c9-437a

## Configuration

### `KC_COMMUNITY_EVENTS_METRICS_ENABLED`

Set to `true` (the default false) than the events metrics gets counted using micrometer

### `KC_METRICS_EVENT_REPLACE_IDS`

Set to `true` (the default value) than replace model ids from events with names:
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
<!-- ===================================================================== -->
<!-- ============================== Libaries ============================= -->
<!-- ===================================================================== -->

<java.version>17</java.version>
<version.org.keycloak>24.0.5</version.org.keycloak>
<version.org.keycloak.test>${version.org.keycloak}</version.org.keycloak.test>
<version.org.testcontainers>1.18.3</version.org.testcontainers>
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package io.kokuwa.keycloak.metrics.store;

import io.kokuwa.keycloak.metrics.CommunityProfiles;
import io.micrometer.core.instrument.Metrics;
import jakarta.persistence.EntityManager;
import org.jboss.logging.Logger;
Expand All @@ -20,30 +19,32 @@ public class MicrometerEventStoreProvider extends JpaEventStoreProvider {

private final boolean replaceIds;
private final KeycloakSession session;
private final boolean isEventsMetricsEnabled;

public MicrometerEventStoreProvider(KeycloakSession session,
EntityManager em,
boolean replaceIds) {
boolean replaceIds,
boolean isEventsMetricsEnabled) {
super(session, em);
this.replaceIds = replaceIds;
this.session = session;
this.isEventsMetricsEnabled = isEventsMetricsEnabled;
}

@Override
public void onEvent(Event event) {
super.onEvent(event);
var isEventsMetricsEnabled = CommunityProfiles.isEventsMetricsEnabled();
if (isEventsMetricsEnabled) {
addEvent(event);
log.info("User Event registered ");
countUserEvent(event);
}
}

@Override
public void onEvent(AdminEvent event, boolean includeRepresentation) {
super.onEvent(event, includeRepresentation);
var isEventsMetricsEnabled = CommunityProfiles.isEventsMetricsEnabled();
if (isEventsMetricsEnabled) {
addAdminEvent(event);
countAdminEvent(event);
}
}

Expand All @@ -69,7 +70,7 @@ private String toBlank(Object value) {
return value == null ? "" : value.toString();
}

void addEvent(Event event) {
void countUserEvent(Event event) {
session
.getTransactionManager()
.enlistAfterCompletion(
Expand All @@ -94,7 +95,7 @@ protected void rollbackImpl() {
});
}

void addAdminEvent(AdminEvent event) {
void countAdminEvent(AdminEvent event) {
session
.getTransactionManager()
.enlistAfterCompletion(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,51 +1,36 @@
package io.kokuwa.keycloak.metrics.store;

import io.kokuwa.keycloak.metrics.CommunityProfiles;
import io.kokuwa.keycloak.metrics.event.MetricsEventListenerFactory;
import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.connections.jpa.JpaConnectionProvider;
import org.keycloak.events.EventStoreProvider;
import org.keycloak.events.jpa.JpaEventStoreProviderFactory;
import org.keycloak.models.KeycloakSession;

import java.util.stream.Collectors;

public class MicrometerEventStoreProviderFactory extends JpaEventStoreProviderFactory {
private static final Logger log = Logger.getLogger(MicrometerEventStoreProviderFactory.class);

public static final String ID = "jpa"; // Override default event store provider
private boolean replaceIds;
private boolean isEventsMetricsEnabled;

@Override
public EventStoreProvider create(KeycloakSession session) {
//removeMetricsEventsListenerIfExists(session);

JpaConnectionProvider connection = session.getProvider(JpaConnectionProvider.class);
return new MicrometerEventStoreProvider(session, connection.getEntityManager(), replaceIds);
return new MicrometerEventStoreProvider(session, connection.getEntityManager(), replaceIds, isEventsMetricsEnabled);
}

public void init(Config.Scope config) {
replaceIds = "true".equals(System.getenv().getOrDefault("KC_METRICS_EVENT_REPLACE_IDS", "true"));
log.info(replaceIds ? "Configured with model names." : "Configured with model ids.");

isEventsMetricsEnabled = CommunityProfiles.isEventsMetricsEnabled();
log.info("Admin event metrics enabled: " + isEventsMetricsEnabled);
}

@Override
public String getId() {
return ID;
}

// we need to remove 'metrics-listener' if already exists in realm, and KC_COMMUNITY_EVENTS_METRICS_ENABLED=true otherwise the keycloak_1 | 2024-06-22 06:37:29,059 ERROR [org.keycloak.services] (executor-thread-3) KC-SERVICES0083: Event listener 'metrics-listener' registered, but provider not found
//Todo: This approach gives Unique index or primary key violation: "PUBLIC.PRIMARY_KEY_C38 ON PUBLIC.REALM_EVENTS_LISTENERS(REALM_ID, ""VALUE"") VALUES ( /* key:4 */ '32497f09-6079-42d3-8f56-9e4654b53e5e', 'jboss-logging')"; SQL statement:
//Todo: Approach is same on AdminRealmEvents.updateRealmEventsConfig. xgp any idea why?
private static void removeMetricsEventsListenerIfExists(KeycloakSession session) {
var eventsMetricsEnabled = CommunityProfiles.isEventsMetricsEnabled();
if (eventsMetricsEnabled) {
var events = session.getContext().getRealm().getEventsListenersStream()
.filter(eventListener -> !MetricsEventListenerFactory.ID.equals(eventListener))
.collect(Collectors.toSet());

session.getContext().getRealm().setEventsListeners(events);
}
}
}

This file was deleted.

Loading

0 comments on commit 6165134

Please sign in to comment.