This adds a facility to capture events such as requests, request execution and scheduled jobs.
Simply add to the classpath
Maven
<dependency>
<groupId>com.oath.microservices</groupId>
<artifactId>micro-events</artifactId>
<version>x.yz</version>
</dependency>
Gradle
compile 'com.oath.microservices:micro-events:x.yz'
Job names are configurable as either
- SIMPLE (simple class name)
- PACKAGE (last part of package + simple class name)
- FULL (canononical class name)
e.g.
micro.events.job.name.format:SIMPLE
or
micro.events.job.name.format:SIMPLE
@Component
@Path("/status")
public class EventStatusResource implements RestResource {
private final EventBus bus;
@Autowired //micro-events plugin configures a Guava EventBus as a Spring bean
public EventStatusResource(EventBus bus ){
this.bus = bus;
}
@GET
@Produces("text/plain")
@Path("/ping")
public String ping() {
//Post RequestEvents starting
bus.post(RequestEvents.start("get", 1l));
try{
return "ok";
}finally{
//and RequestEvents finishing
bus.post(RequestEvents.finish("get",1l));
}
}
}
Active and recently finished events become available at https://hostname::port/context/active/requests
Any Spring Bean implementing com.aol.micro.server.events.ScheduledJob will have start / completion tracking for the scheduleAndLog() method. Event details will be added to the eventually consistent ActiveEvents class, and recent & currently active events will be visible via the ActiveResource.
@Component
public class Job implements ScheduledJob<Job>{
@Override
public SystemData<String,String> scheduleAndLog() {
return SystemData.<String,String>builder().errors(0).processed(2).build();
}
}
Metrics about each job are captured in a SystemData object which will be also posted to a Guava EventBus, to allow custom processors to handle the completion event, for example, an EventBus listener that posts info to a simple-react Queue or Topic (via the Pipes class in the micro-reactive plugin) or an RxJava Observable.
public class SystemData<K, V> {
private final Integer processed;
private final Integer errors;
private final Map<K, V> dataMap;
private SystemData(Integer processed, Integer errors, Map<K, V> dataMap) {
this.processed = processed;
this.errors = errors;
this.dataMap = dataMap;
}
}
Inject in the micro-events Guava Event Bus to your class as Spring Bean, and implement a method annotated with the Guava @Subscribe annotation that takes SystemData as a single parameter.
public class Subscriber {
@Autowired
public Subsciber(EventBus eventBus){
bus.register(this);
}
@Subscribe
public void listenForJobEvents(SystemData data){
logsStats(data);
}
}
To capture requests or Queries post a AddQuery event to the configured Guava event bus when the Query starts, and a RemoveQuery event when it finishes. There are static helper methods on the RequestEvents class to help with this. E.g.
bus.post(RequestEvents.start("get request", correlationId));
try{
return "ok";
}finally{
bus.post(RequestEvents.finish("get request",correlationId));
}
- /active/requests shows currently active and recently completed requests
- /active/jobs shows currently active and recently completed jobs
{
"removed": 0,
"added": 1,
"active": {
"1-32": {
"freeMemory": 135573448,
"startedAt": 1438634550597,
"startedAtFormatted": "2015.08.03 at 21:42:30 IST",
"processingThread": 32,
"correlationId": 1,
"query": "get",
"type": "default",
"additionalData": null
}
},
"events": 1,
"recently-finished": [
{
"event": {
"freeMemory": 135573448,
"startedAt": 1438634550597,
"startedAtFormatted": "2015.08.03 at 21:42:30 IST",
"processingThread": 32,
"correlationId": 1,
"query": "get",
"type": "default",
"additionalData": null
},
"completed": 1438634550598,
"completed-formated": "2015.08.03 at 21:42:30 IST",
"time-taken": 1,
"memory-change": 0
}
]
}
{
"removed": 0,
"added": 9304,
"active": {
"id_app.events.com.aol.micro.server.Job-15": {
"freeMemory": 222866800,
"startedAt": 1438634384118,
"startedAtFormatted": "2015.08.03 at 21:39:44 IST",
"processingThread": 15,
"type": "app.events.com.aol.micro.server.Job",
"timesExecuted": 9304
},
"id_app.events.com.aol.micro.server.Job-16": {
"freeMemory": 115960832,
"startedAt": 1438634382652,
"startedAtFormatted": "2015.08.03 at 21:39:42 IST",
"processingThread": 16,
"type": "app.events.com.aol.micro.server.Job",
"timesExecuted": 8143
},
"id_app.events.com.aol.micro.server.Job-17": {
"freeMemory": 117375880,
"startedAt": 1438634382107,
"startedAtFormatted": "2015.08.03 at 21:39:42 IST",
"processingThread": 17,
"type": "app.events.com.aol.micro.server.Job",
"timesExecuted": 7720
}
},
"events": 9304,
"recently-finished": [
{
"event": {
"freeMemory": 220814872,
"startedAt": 1438634371998,
"startedAtFormatted": "2015.08.03 at 21:39:31 IST",
"processingThread": 16,
"type": "app.events.com.aol.micro.server.Job",
"timesExecuted": 9
},
"completed": 1438634371999,
"completed-formated": "2015.08.03 at 21:39:31 IST",
"time-taken": 1,
"memory-change": -447624
},
{
"event": {
"freeMemory": 221845600,
"startedAt": 1438634371996,
"startedAtFormatted": "2015.08.03 at 21:39:31 IST",
"processingThread": 16,
"type": "app.events.com.aol.micro.server.Job",
"timesExecuted": 8
},
"completed": 1438634371996,
"completed-formated": "2015.08.03 at 21:39:31 IST",
"time-taken": 0,
"memory-change": 0
},
{
"event": {
"freeMemory": 222293016,
"startedAt": 1438634371992,
"startedAtFormatted": "2015.08.03 at 21:39:31 IST",
"processingThread": 16,
"type": "app.events.com.aol.micro.server.Job",
"timesExecuted": 7
},
"completed": 1438634371992,
"completed-formated": "2015.08.03 at 21:39:31 IST",
"time-taken": 0,
"memory-change": 0
},
{
"event": {
"freeMemory": 222740728,
"startedAt": 1438634371988,
"startedAtFormatted": "2015.08.03 at 21:39:31 IST",
"processingThread": 16,
"type": "app.events.com.aol.micro.server.Job",
"timesExecuted": 6
},
"completed": 1438634371989,
"completed-formated": "2015.08.03 at 21:39:31 IST",
"time-taken": 1,
"memory-change": 0
},
{
"event": {
"freeMemory": 222753672,
"startedAt": 1438634371985,
"startedAtFormatted": "2015.08.03 at 21:39:31 IST",
"processingThread": 16,
"type": "app.events.com.aol.micro.server.Job",
"timesExecuted": 5
},
"completed": 1438634371985,
"completed-formated": "2015.08.03 at 21:39:31 IST",
"time-taken": 0,
"memory-change": 0
},
{
"event": {
"freeMemory": 222753704,
"startedAt": 1438634371982,
"startedAtFormatted": "2015.08.03 at 21:39:31 IST",
"processingThread": 16,
"type": "app.events.com.aol.micro.server.Job",
"timesExecuted": 4
},
"completed": 1438634371982,
"completed-formated": "2015.08.03 at 21:39:31 IST",
"time-taken": 0,
"memory-change": 0
},
{
"event": {
"freeMemory": 222753704,
"startedAt": 1438634371979,
"startedAtFormatted": "2015.08.03 at 21:39:31 IST",
"processingThread": 16,
"type": "app.events.com.aol.micro.server.Job",
"timesExecuted": 3
},
"completed": 1438634371979,
"completed-formated": "2015.08.03 at 21:39:31 IST",
"time-taken": 0,
"memory-change": 0
},
{
"event": {
"freeMemory": 223648616,
"startedAt": 1438634371977,
"startedAtFormatted": "2015.08.03 at 21:39:31 IST",
"processingThread": 15,
"type": "app.events.com.aol.micro.server.Job",
"timesExecuted": 2
},
"completed": 1438634371977,
"completed-formated": "2015.08.03 at 21:39:31 IST",
"time-taken": 0,
"memory-change": 0
},
{
"event": {
"freeMemory": 226284664,
"startedAt": 1438634371955,
"startedAtFormatted": "2015.08.03 at 21:39:31 IST",
"processingThread": 15,
"type": "app.events.com.aol.micro.server.Job",
"timesExecuted": 1
},
"completed": 1438634371965,
"completed-formated": "2015.08.03 at 21:39:31 IST",
"time-taken": 10,
"memory-change": -894784
}
]
}