@mbazydlo
Psst... We are hiring.
No calling husband/wife!
No asking behind a back
No long looks
response = GET /service-status
if (response.status == 200)
return <OK, response.body>
else
return <FAILURE, response.body>GET /service-status
{ monitorResults: [
{
monitorName: "VeAppsDatabaseMonitor",
successful: true,
metaData: {
message: "Database exists succeeded? True"
}
},
{
monitorName: "LiveDataRedisMonitor",
successful: true,
metaData: {
message: "Successfully written and retrieved data from live data redis instance."
}
}
]}sut = new serviceStatus()
sut.isSimple?
sut.isExtensible?
sut.isConsistent?
sut.isDistributed?Developers are responsible for monitoring strategy
You can write monitor for things that failed in the past.
'It won't happen again!'
Service-Status doubles as smoke tests during deployment.
You can check state of application at any point in time, preferably periodically.
Your monitoring verifies everything from application perspective, rather then from yours.
You decide how simple or complex is your monitoring.
Monitor contains documentation about the system, making it easier to understand it's needs.
Monitor is documentation about the system, telling you system expectations.
public interface IServiceStatusMonitor
{
string Name { get; }
MonitorResult Execute();
}public class MonitorResult
{
public string MonitorName { get; }
public bool Successful { get; set; }
public Dictionary<string, string> MetaData { get; set; }
}public class ServiceStatusController : Nancy.NancyModule
{
public ServiceStatusController(List<IServiceStatusMonitor> monitors)
{
Get["/service-status"] =
_ => monitors.AsParallel().Select(x=>x.Execute()).ToList();
Get["/service-status/{monitorName}"] =
params => monitors.First(x=>x.Name == params.monitorName).Execute();
}
}@mbazydlo