Skip to content

Instantly share code, notes, and snippets.

@aburnett
Last active August 4, 2019 11:58
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aburnett/9914c6fbf20632d6da1c62aa6de32f69 to your computer and use it in GitHub Desktop.
Save aburnett/9914c6fbf20632d6da1c62aa6de32f69 to your computer and use it in GitHub Desktop.
Publish AWS Step Function per-activity backlog as Cloudwatch metric
public void metricPendingActivities() {
AWSStepFunctions client = AWSStepFunctionsClientBuilder.defaultClient();
ListStateMachinesRequest lsmr = new ListStateMachinesRequest();
//TODO: paging
ListStateMachinesResult machinesResult = client.listStateMachines(lsmr);
Map<String, Long> counts = machinesResult.getStateMachines()
.stream()
.map(m -> {
ListExecutionsRequest executionsReq = new ListExecutionsRequest()
.withMaxResults(100)
.withStateMachineArn(m.getStateMachineArn())
.withStatusFilter(ExecutionStatus.RUNNING);
ListExecutionsResult res = client.listExecutions(executionsReq);
return res.getExecutions();
})
.flatMap(l -> l.stream())
.map(e -> {
GetExecutionHistoryRequest req = new GetExecutionHistoryRequest()
.withExecutionArn(e.getExecutionArn())
.withReverseOrder(true);
GetExecutionHistoryResult res = client.getExecutionHistory(req);
return res.getEvents();
})
.map(h -> h.get(0))
.filter(h -> h.getActivityScheduledEventDetails() != null)
.map(h -> h.getActivityScheduledEventDetails())
.collect(Collectors.groupingBy(
ActivityScheduledEventDetails::getResource,
Collectors.counting()));
ListActivitiesRequest actr = new ListActivitiesRequest();
client.listActivities(actr).getActivities().forEach(a -> {
if(!counts.containsKey(a.getActivityArn()))
counts.put(a.getActivityArn(), 0L);
});
AmazonCloudWatch cw = AmazonCloudWatchClientBuilder.defaultClient();
counts.entrySet().forEach(e -> {
PutMetricDataRequest req = new PutMetricDataRequest()
.withNamespace("MyCompany/Custom")
.withMetricData(new MetricDatum()
.withMetricName("PendingTasks")
.withValue(e.getValue().doubleValue())
.withDimensions(new Dimension()
.withName("ActivityArn")
.withValue(e.getKey())));
cw.putMetricData(req);
});
}
@aburnett
Copy link
Author

aburnett commented Mar 2, 2017

This won't work for machines with parallel branches however

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment