Do not add metrics for clients which never had a session #39
2 changed files with 29 additions and 21 deletions
|
@ -68,20 +68,24 @@ public class MetricsStatsTask implements Provider, ScheduledTask {
|
||||||
private void scrape(KeycloakSession session) {
|
private void scrape(KeycloakSession session) {
|
||||||
session.realms().getRealmsStream().forEach(realm -> {
|
session.realms().getRealmsStream().forEach(realm -> {
|
||||||
var tagRealm = Tag.of("realm", realm.getName());
|
var tagRealm = Tag.of("realm", realm.getName());
|
||||||
gauge("keycloak_users", Set.of(tagRealm), session.users().getUsersCount(realm));
|
gauge("keycloak_users", Set.of(tagRealm), session.users().getUsersCount(realm), true);
|
||||||
gauge("keycloak_clients", Set.of(tagRealm), session.clients().getClientsCount(realm));
|
gauge("keycloak_clients", Set.of(tagRealm), session.clients().getClientsCount(realm), true);
|
||||||
var sessions = session.sessions();
|
var sessions = session.sessions();
|
||||||
var activeSessions = sessions.getActiveClientSessionStats(realm, false);
|
var activeSessions = sessions.getActiveClientSessionStats(realm, false);
|
||||||
realm.getClientsStream().forEach(client -> {
|
realm.getClientsStream().forEach(client -> {
|
||||||
var tags = Set.of(tagRealm, Tag.of("client", client.getClientId()));
|
var tags = Set.of(tagRealm, Tag.of("client", client.getClientId()));
|
||||||
gauge("keycloak_offline_sessions", tags, sessions.getOfflineSessionsCount(realm, client));
|
gauge("keycloak_offline_sessions", tags, sessions.getOfflineSessionsCount(realm, client), false);
|
||||||
gauge("keycloak_active_user_sessions", tags, sessions.getActiveUserSessions(realm, client));
|
gauge("keycloak_active_user_sessions", tags, sessions.getActiveUserSessions(realm, client), false);
|
||||||
gauge("keycloak_active_client_sessions", tags, activeSessions.getOrDefault(client.getId(), 0L));
|
gauge("keycloak_active_client_sessions", tags, activeSessions.getOrDefault(client.getId(), 0L), false);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void gauge(String name, Set<Tag> tags, long value) {
|
private void gauge(String name, Set<Tag> tags, long value, boolean force) {
|
||||||
values.computeIfAbsent(name + tags, s -> Metrics.gauge(name, tags, new AtomicLong())).set(value);
|
var key = name + tags;
|
||||||
|
if (!force && value == 0 && !values.containsKey(key)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
values.computeIfAbsent(key, s -> Metrics.gauge(name, tags, new AtomicLong())).set(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,12 +135,12 @@ public class MetricsStatsTaskTest extends AbstractMockitoTest {
|
||||||
task().run(session);
|
task().run(session);
|
||||||
assertUsersCount(realmModel, 0);
|
assertUsersCount(realmModel, 0);
|
||||||
assertClientsCount(realmModel, 0);
|
assertClientsCount(realmModel, 0);
|
||||||
assertOfflineSessions(realmModel, client1Model, 0);
|
assertOfflineSessions(realmModel, client1Model, null);
|
||||||
assertOfflineSessions(realmModel, client2Model, 0);
|
assertOfflineSessions(realmModel, client2Model, null);
|
||||||
assertActiveUserSessions(realmModel, client1Model, 0);
|
assertActiveUserSessions(realmModel, client1Model, null);
|
||||||
assertActiveUserSessions(realmModel, client2Model, 0);
|
assertActiveUserSessions(realmModel, client2Model, null);
|
||||||
assertActiveClientSessions(realmModel, client1Model, 0);
|
assertActiveClientSessions(realmModel, client1Model, null);
|
||||||
assertActiveClientSessions(realmModel, client2Model, 0);
|
assertActiveClientSessions(realmModel, client2Model, null);
|
||||||
|
|
||||||
// initial values
|
// initial values
|
||||||
|
|
||||||
|
@ -155,12 +155,12 @@ public class MetricsStatsTaskTest extends AbstractMockitoTest {
|
||||||
task().run(session);
|
task().run(session);
|
||||||
assertUsersCount(realmModel, 10);
|
assertUsersCount(realmModel, 10);
|
||||||
assertClientsCount(realmModel, 20);
|
assertClientsCount(realmModel, 20);
|
||||||
assertOfflineSessions(realmModel, client1Model, 0);
|
assertOfflineSessions(realmModel, client1Model, null);
|
||||||
assertOfflineSessions(realmModel, client2Model, 1);
|
assertOfflineSessions(realmModel, client2Model, 1);
|
||||||
assertActiveUserSessions(realmModel, client1Model, 2);
|
assertActiveUserSessions(realmModel, client1Model, 2);
|
||||||
assertActiveUserSessions(realmModel, client2Model, 3);
|
assertActiveUserSessions(realmModel, client2Model, 3);
|
||||||
assertActiveClientSessions(realmModel, client1Model, 5);
|
assertActiveClientSessions(realmModel, client1Model, 5);
|
||||||
assertActiveClientSessions(realmModel, client2Model, 0);
|
assertActiveClientSessions(realmModel, client2Model, null);
|
||||||
|
|
||||||
// updated values
|
// updated values
|
||||||
|
|
||||||
|
@ -199,19 +199,19 @@ public class MetricsStatsTaskTest extends AbstractMockitoTest {
|
||||||
assertGauge("keycloak_clients", realm, null, 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);
|
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);
|
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);
|
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()
|
var gauges = Metrics.globalRegistry.getMeters().stream()
|
||||||
.filter(Gauge.class::isInstance)
|
.filter(Gauge.class::isInstance)
|
||||||
.filter(gauge -> gauge.getId().getName().equals(name))
|
.filter(gauge -> gauge.getId().getName().equals(name))
|
||||||
|
@ -219,7 +219,11 @@ public class MetricsStatsTaskTest extends AbstractMockitoTest {
|
||||||
.filter(gauge -> client == null || gauge.getId().getTag("client").equals(client.getClientId()))
|
.filter(gauge -> client == null || gauge.getId().getTag("client").equals(client.getClientId()))
|
||||||
.map(Gauge.class::cast)
|
.map(Gauge.class::cast)
|
||||||
.toList();
|
.toList();
|
||||||
|
if (count == null) {
|
||||||
|
assertEquals(0, gauges.size());
|
||||||
|
} else {
|
||||||
assertEquals(1, gauges.size());
|
assertEquals(1, gauges.size());
|
||||||
assertEquals(count, gauges.get(0).value());
|
assertEquals(count.doubleValue(), gauges.get(0).value());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue