package com.intrbiz.bergamot.health.model; import java.util.Objects; import java.util.UUID; public class KnownDaemon implements Comparable<KnownDaemon> { private final UUID instanceId; private final UUID runtimeId; private final String daemonKind; private final String daemonName; private final long startedAt; private final UUID hostId; private final String hostName; private volatile long lastHeartbeatAt = System.nanoTime(); private volatile long lastHeartbeatTime = System.currentTimeMillis(); private volatile long lastHeartbeatSequence = 0; private volatile int alertCount = 0; private volatile int recoveryCount = 0; private volatile int recoveryHeartbeatCount = 0; private volatile long lastRecoveryTime = System.currentTimeMillis(); private volatile long lastAlertTime = -1; private volatile boolean alive = true; public KnownDaemon(UUID instanceId, UUID runtimeId, String daemonKind, String daemonName, long startedAt, UUID hostId, String hostName) { Objects.requireNonNull(instanceId); this.instanceId = instanceId; this.runtimeId = runtimeId; this.daemonKind = daemonKind; this.daemonName = daemonName; this.startedAt = startedAt; this.hostId = hostId; this.hostName = hostName; } public long getLastHeartbeatAt() { return lastHeartbeatAt; } public void setLastHeartbeatAt(long lastHeartbeatAt) { this.lastHeartbeatAt = lastHeartbeatAt; } public long getLastHeartbeatSequence() { return lastHeartbeatSequence; } public void setLastHeartbeatSequence(long lastHeartbeatSequence) { this.lastHeartbeatSequence = lastHeartbeatSequence; } public UUID getInstanceId() { return instanceId; } public UUID getRuntimeId() { return this.runtimeId; } public String getDaemonKind() { return daemonKind; } public String getDaemonName() { return daemonName; } public long getStartedAt() { return startedAt; } public UUID getHostId() { return this.hostId; } public String getHostName() { return hostName; } public long getLastHeartbeatTime() { return lastHeartbeatTime; } public void setLastHeartbeatTime(long lastHeartbeatTime) { this.lastHeartbeatTime = lastHeartbeatTime; } public int getAlertCount() { return alertCount; } public void setAlertCount(int alertCount) { this.alertCount = alertCount; } public int incAlertCount() { this.alertCount++; return this.alertCount; } public long getLastAlertTime() { return lastAlertTime; } public void setLastAlertTime(long lastAlertTime) { this.lastAlertTime = lastAlertTime; } /** * How long ago was the last heartbeat * * @return the number of milliseconds since the last heartbeat */ public long getLastHeartbeatAge() { return (System.nanoTime() - this.lastHeartbeatAt) / 1_000_000L; } public boolean isLastHeartbeatTooOld() { // was the heartbeat over 30 seconds ago return this.getLastHeartbeatAge() > 30_000L; } public boolean isDaemonLongGone() { // did we last see this daemon over a day ago return this.getLastHeartbeatAge() > 86400_000L; } public boolean isAlive() { return alive; } public void setAlive(boolean alive) { this.alive = alive; } public int getRecoveryCount() { return recoveryCount; } public void setRecoveryCount(int recoveryCount) { this.recoveryCount = recoveryCount; } public int incRecoveryCount() { this.recoveryCount++; return this.recoveryCount; } public int getRecoveryHeartbeatCount() { return recoveryHeartbeatCount; } public void setRecoveryHeartbeatCount(int recoveryHeartbeatCount) { this.recoveryHeartbeatCount = recoveryHeartbeatCount; } public int incRecoveryHeartbeatCount() { this.recoveryHeartbeatCount++; return recoveryHeartbeatCount; } @Override public int compareTo(KnownDaemon o) { return this.instanceId.compareTo(o.instanceId); } public long getLastRecoveryTime() { return lastRecoveryTime; } public void setLastRecoveryTime(long lastRecoveryTime) { this.lastRecoveryTime = lastRecoveryTime; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((instanceId == null) ? 0 : instanceId.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; KnownDaemon other = (KnownDaemon) obj; if (instanceId == null) { if (other.instanceId != null) return false; } else if (!instanceId.equals(other.instanceId)) return false; return true; } }