package org.apereo.cas.monitor; import org.apereo.cas.ticket.registry.TicketRegistry; /** * Monitors the status of a {@link TicketRegistry} * for exposing internal * state information used in status reports. * * @author Marvin S. Addison * @since 3.5.0 */ public class SessionMonitor implements Monitor<SessionStatus> { /** Ticket registry instance that exposes state info. */ private final TicketRegistry registryState; /** Threshold above which warnings are issued for session count. */ private int sessionCountWarnThreshold = -1; /** Threshold above which warnings are issued for service ticket count. */ private int serviceTicketCountWarnThreshold = -1; public SessionMonitor(final TicketRegistry ticketRegistry, final int stCountThreshold, final int sessionCountWarnThreshold) { this.registryState = ticketRegistry; this.serviceTicketCountWarnThreshold = stCountThreshold; this.sessionCountWarnThreshold = sessionCountWarnThreshold; } @Override public String getName() { return SessionMonitor.class.getSimpleName(); } @Override public SessionStatus observe() { try { final long sessionCount = this.registryState.sessionCount(); final long ticketCount = this.registryState.serviceTicketCount(); if (sessionCount == Integer.MIN_VALUE || ticketCount == Integer.MIN_VALUE) { return new SessionStatus(StatusCode.UNKNOWN, String.format("Ticket registry %s reports unknown session and/or ticket counts.", this.registryState.getClass().getName()), sessionCount, ticketCount); } final StringBuilder msg = new StringBuilder(); StatusCode code = StatusCode.OK; if (this.sessionCountWarnThreshold > -1 && sessionCount > this.sessionCountWarnThreshold) { code = StatusCode.WARN; msg.append(String.format( "Session count (%s) is above threshold %s. ", sessionCount, this.sessionCountWarnThreshold)); } else { msg.append(sessionCount).append(" sessions. "); } if (this.serviceTicketCountWarnThreshold > -1 && ticketCount > this.serviceTicketCountWarnThreshold) { code = StatusCode.WARN; msg.append(String.format( "Service ticket count (%s) is above threshold %s.", ticketCount, this.serviceTicketCountWarnThreshold)); } else { msg.append(ticketCount).append(" service tickets."); } return new SessionStatus(code, msg.toString(), sessionCount, ticketCount); } catch (final Exception e) { return new SessionStatus(StatusCode.ERROR, e.getMessage()); } } }