Skip to content

Commit

Permalink
Do not add metrics for clients which never had a session (#39)
Browse files Browse the repository at this point in the history
  • Loading branch information
sschnabe authored May 2, 2023
1 parent 99a01e5 commit 131b33f
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -68,20 +68,24 @@ public void close() {}
private void scrape(KeycloakSession session) {
session.realms().getRealmsStream().forEach(realm -> {
var tagRealm = Tag.of("realm", realm.getName());
gauge("keycloak_users", Set.of(tagRealm), session.users().getUsersCount(realm));
gauge("keycloak_clients", Set.of(tagRealm), session.clients().getClientsCount(realm));
gauge("keycloak_users", Set.of(tagRealm), session.users().getUsersCount(realm), true);
gauge("keycloak_clients", Set.of(tagRealm), session.clients().getClientsCount(realm), true);
var sessions = session.sessions();
var activeSessions = sessions.getActiveClientSessionStats(realm, false);
realm.getClientsStream().forEach(client -> {
var tags = Set.of(tagRealm, Tag.of("client", client.getClientId()));
gauge("keycloak_offline_sessions", tags, sessions.getOfflineSessionsCount(realm, client));
gauge("keycloak_active_user_sessions", tags, sessions.getActiveUserSessions(realm, client));
gauge("keycloak_active_client_sessions", tags, activeSessions.getOrDefault(client.getId(), 0L));
gauge("keycloak_offline_sessions", tags, sessions.getOfflineSessionsCount(realm, client), false);
gauge("keycloak_active_user_sessions", tags, sessions.getActiveUserSessions(realm, client), false);
gauge("keycloak_active_client_sessions", tags, activeSessions.getOrDefault(client.getId(), 0L), false);
});
});
}

private void gauge(String name, Set<Tag> tags, long value) {
values.computeIfAbsent(name + tags, s -> Metrics.gauge(name, tags, new AtomicLong())).set(value);
private void gauge(String name, Set<Tag> tags, long value, boolean force) {
var key = name + tags;
if (!force && value == 0 && !values.containsKey(key)) {
return;
}
values.computeIfAbsent(key, s -> Metrics.gauge(name, tags, new AtomicLong())).set(value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -135,12 +135,12 @@ void scrape() {
task().run(session);
assertUsersCount(realmModel, 0);
assertClientsCount(realmModel, 0);
assertOfflineSessions(realmModel, client1Model, 0);
assertOfflineSessions(realmModel, client2Model, 0);
assertActiveUserSessions(realmModel, client1Model, 0);
assertActiveUserSessions(realmModel, client2Model, 0);
assertActiveClientSessions(realmModel, client1Model, 0);
assertActiveClientSessions(realmModel, client2Model, 0);
assertOfflineSessions(realmModel, client1Model, null);
assertOfflineSessions(realmModel, client2Model, null);
assertActiveUserSessions(realmModel, client1Model, null);
assertActiveUserSessions(realmModel, client2Model, null);
assertActiveClientSessions(realmModel, client1Model, null);
assertActiveClientSessions(realmModel, client2Model, null);

// initial values

Expand All @@ -155,12 +155,12 @@ void scrape() {
task().run(session);
assertUsersCount(realmModel, 10);
assertClientsCount(realmModel, 20);
assertOfflineSessions(realmModel, client1Model, 0);
assertOfflineSessions(realmModel, client1Model, null);
assertOfflineSessions(realmModel, client2Model, 1);
assertActiveUserSessions(realmModel, client1Model, 2);
assertActiveUserSessions(realmModel, client2Model, 3);
assertActiveClientSessions(realmModel, client1Model, 5);
assertActiveClientSessions(realmModel, client2Model, 0);
assertActiveClientSessions(realmModel, client2Model, null);

// updated values

Expand Down Expand Up @@ -199,27 +199,31 @@ private static void assertClientsCount(RealmModel realm, int count) {
assertGauge("keycloak_clients", realm, null, count);
}

private static void assertActiveClientSessions(RealmModel realm, ClientModel client, int count) {
private static void assertActiveClientSessions(RealmModel realm, ClientModel client, Integer count) {
assertGauge("keycloak_active_client_sessions", realm, client, count);
}

private static void assertActiveUserSessions(RealmModel realm, ClientModel client, int count) {
private static void assertActiveUserSessions(RealmModel realm, ClientModel client, Integer count) {
assertGauge("keycloak_active_user_sessions", realm, client, count);
}

private static void assertOfflineSessions(RealmModel realm, ClientModel client, int count) {
private static void assertOfflineSessions(RealmModel realm, ClientModel client, Integer count) {
assertGauge("keycloak_offline_sessions", realm, client, count);
}

private static void assertGauge(String name, RealmModel realm, ClientModel client, int count) {
private static void assertGauge(String name, RealmModel realm, ClientModel client, Integer count) {
var gauges = Metrics.globalRegistry.getMeters().stream()
.filter(Gauge.class::isInstance)
.filter(gauge -> gauge.getId().getName().equals(name))
.filter(gauge -> gauge.getId().getTag("realm").equals(realm.getName()))
.filter(gauge -> client == null || gauge.getId().getTag("client").equals(client.getClientId()))
.map(Gauge.class::cast)
.toList();
assertEquals(1, gauges.size());
assertEquals(count, gauges.get(0).value());
if (count == null) {
assertEquals(0, gauges.size());
} else {
assertEquals(1, gauges.size());
assertEquals(count.doubleValue(), gauges.get(0).value());
}
}
}

0 comments on commit 131b33f

Please sign in to comment.