Skip to content

Commit

Permalink
Test default events metrics handling
Browse files Browse the repository at this point in the history
  • Loading branch information
rtufisi committed Jun 18, 2024
1 parent bdf9159 commit 4c17a89
Show file tree
Hide file tree
Showing 9 changed files with 165 additions and 34 deletions.
3 changes: 3 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 19 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
version: '3'

services:
keycloak:
image: quay.io/keycloak/keycloak:25.0.0
environment:
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: admin
KC_HTTP_RELATIVE_PATH: /auth
KC_HEALTH_ENABLED: 'true'
KC_METRICS_ENABLED: 'true'
KC_COMMUNITY_EVENTS_METRICS_ENABLED: 'true'
JAVA_OPTS: '-agentlib:jdwp=transport=dt_socket,address=*:8787,server=y,suspend=n'
ports:
- 8080:8080
- 8787:8787
volumes:
- ./target/keycloak-event-metrics-1.0.1-SNAPSHOT.jar:/opt/keycloak/providers/keycloak-event-metrics.jar
command: [ "start-dev" ]
11 changes: 4 additions & 7 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,6 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>io.kokuwa.maven</groupId>
<artifactId>maven-parent</artifactId>
<version>0.6.15</version>
<relativePath/>
</parent>

<groupId>io.kokuwa.keycloak</groupId>
<artifactId>keycloak-event-metrics</artifactId>
<version>1.0.1-SNAPSHOT</version>
Expand Down Expand Up @@ -105,6 +98,10 @@
<artifactId>keycloak-server-spi-private</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-model-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-admin-client</artifactId>
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/io/kokuwa/keycloak/metrics/CommunityProfiles.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.kokuwa.keycloak.metrics;

public class CommunityProfiles {
private static final String ENV_EVENTS_METRICS_ENABLED = "KC_COMMUNITY_EVENTS_METRICS_ENABLED";
private static final String PROP_EVENTS_METRICS_ENABLED = "kc.community.events.metrics.enabled";

private static final boolean isEventsMetricsEnabled;

static {
isEventsMetricsEnabled =
Boolean.parseBoolean(System.getenv(ENV_EVENTS_METRICS_ENABLED))
|| Boolean.parseBoolean(System.getProperty(PROP_EVENTS_METRICS_ENABLED));
}

private CommunityProfiles() {
}

public static boolean isEventsMetricsEnabled() {
return isEventsMetricsEnabled;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@

import java.util.Optional;


import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.events.Event;
import org.keycloak.events.EventListenerProvider;
import org.keycloak.events.admin.AdminEvent;
import org.keycloak.models.KeycloakContext;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.provider.EnvironmentDependentProviderFactory;

import io.micrometer.core.instrument.Metrics;

import io.kokuwa.keycloak.metrics.CommunityProfiles;
/**
* Listener for {@link Event} and {@link AdminEvent}.
*
Expand Down Expand Up @@ -68,4 +71,5 @@ private String getRealmName(String id) {
private String toBlank(Object value) {
return value == null ? "" : value.toString();
}

}
Original file line number Diff line number Diff line change
@@ -1,41 +1,58 @@
package io.kokuwa.keycloak.metrics.event;

import io.kokuwa.keycloak.metrics.CommunityProfiles;
import org.jboss.logging.Logger;
import org.keycloak.Config;
import org.keycloak.Config.Scope;
import org.keycloak.events.EventListenerProvider;
import org.keycloak.events.EventListenerProviderFactory;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.provider.EnvironmentDependentProviderFactory;

/**
* Factory for {@link MetricsEventListener}.
*
* @author Stephan Schnabel
*/
public class MetricsEventListenerFactory implements EventListenerProviderFactory {

private static final Logger log = Logger.getLogger(MetricsEventListenerFactory.class);
private boolean replaceIds;

@Override
public String getId() {
return "metrics-listener";
}

@Override
public void init(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.");
}

@Override
public void postInit(KeycloakSessionFactory factory) {}

@Override
public EventListenerProvider create(KeycloakSession session) {
return new MetricsEventListener(replaceIds, session);
}

@Override
public void close() {}
public class MetricsEventListenerFactory implements EventListenerProviderFactory, EnvironmentDependentProviderFactory {

private static final Logger log = Logger.getLogger(MetricsEventListenerFactory.class);
private boolean replaceIds;

@Override
public String getId() {
return "metrics-listener";
}

@Override
public void init(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.");
}

@Override
public void postInit(KeycloakSessionFactory factory) {
}

@Override
public EventListenerProvider create(KeycloakSession session) {
return new MetricsEventListener(replaceIds, session);
}

@Override
public void close() {
}

@Override
public boolean isSupported() {
log.info("MetricsEventListenerFactory is supported:" + !CommunityProfiles.isEventsMetricsEnabled());
return !CommunityProfiles.isEventsMetricsEnabled();
}

@Override
public boolean isSupported(Config.Scope config) {
log.info("MetricsEventListenerFactory is supported:" + !CommunityProfiles.isEventsMetricsEnabled());
return !CommunityProfiles.isEventsMetricsEnabled();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package io.kokuwa.keycloak.metrics.store;

import jakarta.persistence.EntityManager;
import org.keycloak.events.jpa.JpaEventStoreProvider;
import org.keycloak.models.KeycloakSession;

public class MicrometerEventStoreProvider extends JpaEventStoreProvider {

public MicrometerEventStoreProvider(KeycloakSession session, EntityManager em) {
super(session, em);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package io.kokuwa.keycloak.metrics.store;

import io.kokuwa.keycloak.metrics.CommunityProfiles;
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 org.keycloak.provider.EnvironmentDependentProviderFactory;


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

public static final String ID = "jpa"; // Override default event store provider

@Override
public EventStoreProvider create(KeycloakSession session) {
JpaConnectionProvider connection = session.getProvider(JpaConnectionProvider.class);
return new MicrometerEventStoreProvider(session, connection.getEntityManager());
}

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

@Override
public boolean isSupported() {
log.info("MicrometerEventStore is supported:"+ CommunityProfiles.isEventsMetricsEnabled());
return CommunityProfiles.isEventsMetricsEnabled();
}

@Override
public boolean isSupported(Config.Scope config) {
log.info("MicrometerEventStore is supported:"+ CommunityProfiles.isEventsMetricsEnabled());
return CommunityProfiles.isEventsMetricsEnabled();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#
# Copyright 2016 Red Hat, Inc. and/or its affiliates
# and other contributors as indicated by the @author tags.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

io.kokuwa.keycloak.metrics.store.MicrometerEventStoreProviderFactory

0 comments on commit 4c17a89

Please sign in to comment.