package com.intrbiz.bergamot.ui.router;
import com.intrbiz.balsa.engine.route.Router;
import com.intrbiz.balsa.http.HTTP.HTTPStatus;
import com.intrbiz.bergamot.cluster.ClusterManager;
import com.intrbiz.bergamot.data.BergamotDB;
import com.intrbiz.bergamot.ui.BergamotApp;
import com.intrbiz.bergamot.ui.model.health.ClusterHealth;
import com.intrbiz.bergamot.ui.model.health.DatabaseHealth;
import com.intrbiz.bergamot.ui.model.health.DatabaseModuleHealth;
import com.intrbiz.bergamot.ui.model.health.HealthCheck;
import com.intrbiz.bergamot.ui.model.health.HealthError;
import com.intrbiz.bergamot.ui.model.health.ReleaseHealth;
import com.intrbiz.data.DataManager;
import com.intrbiz.data.db.DatabaseAdapter;
import com.intrbiz.lamplighter.data.LamplighterDB;
import com.intrbiz.metadata.Any;
import com.intrbiz.metadata.Catch;
import com.intrbiz.metadata.JSON;
import com.intrbiz.metadata.Prefix;
import com.intrbiz.metadata.Text;
@Prefix("/health")
public class HealthRouter extends Router<BergamotApp>
{
@SuppressWarnings("rawtypes")
private static final Class[] DATABASE_MODULES = { BergamotDB.class, LamplighterDB.class };
@Any("/ok")
@Text
public String ok()
{
return "OK";
}
@Any("/check")
@JSON()
public HealthCheck check()
{
HealthCheck health = new HealthCheck();
health.setRelease(this.checkRelease());
health.setCluster(this.checkCluster());
health.setDatabase(this.checkDB());
return health;
}
@Any("/check/release")
@JSON()
public ReleaseHealth checkRelease()
{
return new ReleaseHealth(BergamotApp.VERSION.NAME, BergamotApp.VERSION.NUMBER, BergamotApp.VERSION.CODE_NAME);
}
@Any("/check/db")
@JSON()
@SuppressWarnings("unchecked")
public DatabaseHealth checkDB()
{
DatabaseHealth health = new DatabaseHealth();
for (Class<? extends DatabaseAdapter> adpCls : DATABASE_MODULES)
{
try (DatabaseAdapter adp = DataManager.get().databaseAdapter(adpCls))
{
health.getModules().add(new DatabaseModuleHealth(adpCls.getSimpleName(), adp.getName(), adp.getVersion()));
}
}
return health;
}
@Any("/check/cluster")
@JSON()
public ClusterHealth checkCluster()
{
ClusterHealth health = new ClusterHealth();
ClusterManager manager = app().getClusterManager();
health.setMembers(manager.getMemberCount());
health.setProcessingPools(manager.getProcessPoolCount());
return health;
}
@Catch()
@Any("/check**")
@JSON(status = HTTPStatus.InternalServerError)
public HealthError checkError()
{
Throwable t = balsa().getException();
return new HealthError(t == null ? "" : t.getMessage());
}
}