Skip to content

Instantly share code, notes, and snippets.

@steynovich
Created August 29, 2017 09:06
Show Gist options
  • Save steynovich/3092ea2c2a02e9c0792b036cac879952 to your computer and use it in GitHub Desktop.
Save steynovich/3092ea2c2a02e9c0792b036cac879952 to your computer and use it in GitHub Desktop.
ecs-task-metrics.py
#!/usr/bin/env python
from __future__ import print_function
from datetime import datetime
import boto3
print('Loading function...')
now = datetime.utcnow()
ecs_client = boto3.client('ecs')
cw_client = boto3.client('cloudwatch')
namespace = 'CG/ECS'
def list_clusters():
cluster_arns = ecs_client.list_clusters()['clusterArns']
clusters_info = ecs_client.describe_clusters(clusters=cluster_arns)['clusters']
return [{'clusterName': cluster['clusterName'], 'clusterArn': cluster['clusterArn']} for cluster in clusters_info]
def list_services(cluster_arn):
paginator = ecs_client.get_paginator('list_services')
response_iterator = paginator.paginate(cluster=cluster_arn)
return [serviceArn
for service in response_iterator
for serviceArn in service['serviceArns']]
def get_metric_data(cluster_arn, cluster_name, services):
response = ecs_client.describe_services(cluster=cluster_arn, services=services)
cluster_desired_count = 0.0
cluster_running_count = 0.0
cluster_pending_count = 0.0
cluster_waiting_count = 0.0
metrics = []
for service in response['services']:
service_name = service['serviceName']
service_desired_count = float(service['desiredCount'])
service_running_count = float(service['runningCount'])
service_pending_count = float(service['pendingCount'])
service_waiting_count = float(service_desired_count - service_running_count) if service_desired_count > service_running_count else 0.0
cluster_desired_count += service_desired_count
cluster_running_count += service_running_count
cluster_pending_count += service_pending_count
cluster_waiting_count += service_waiting_count
service_dimensions = [{'Name': 'ClusterName',
'Value': cluster_name},
{'Name': 'ServiceName',
'Value': service_name}]
service_metric_data = [{
'MetricName': 'DesiredCount',
'Dimensions': service_dimensions,
'Value': service_desired_count,
'Unit': 'None'
},{
'MetricName': 'RunningCount',
'Dimensions': service_dimensions,
'Value': service_pending_count,
'Unit': 'None'
},{
'MetricName': 'PendingCount',
'Dimensions': service_dimensions,
'Value': service_pending_count,
'Unit': 'None'
},{
'MetricName': 'WaitingCount',
'Dimensions': service_dimensions,
'Value': service_waiting_count,
'Unit': 'None'
}]
service_metric = {'Namespace': namespace, 'MetricData': service_metric_data}
metrics.append(service_metric)
cluster_dimensions = [{'Name': 'ClusterName', 'Value': cluster_name}]
cluster_metric_data = [{
'MetricName': 'DesiredCount',
'Dimensions': cluster_dimensions,
'Value': cluster_desired_count,
'Unit': 'None'
},{
'MetricName': 'RunningCount',
'Dimensions': cluster_dimensions,
'Value': cluster_pending_count,
'Unit': 'None'
},{
'MetricName': 'PendingCount',
'Dimensions': cluster_dimensions,
'Value': cluster_pending_count,
'Unit': 'None'
},{
'MetricName': 'WaitingCount',
'Dimensions': cluster_dimensions,
'Value': cluster_waiting_count,
'Unit': 'None'
}]
cluster_metric = {'Namespace': namespace, 'MetricData': cluster_metric_data}
metrics.append(cluster_metric)
return metrics
def lambda_handler(event, context):
dimension_count = 0
metric_count = 0
for cluster in list_clusters():
services = list_services(cluster_arn=cluster['clusterArn'])
metrics = get_metric_data(cluster_arn=cluster['clusterArn'],
cluster_name=cluster['clusterName'],
services=services)
for metric_kwargs in metrics:
try:
cw_client.put_metric_data(**metric_kwargs)
dimension_count += 1
metric_count += len(metric_kwargs['MetricData'])
except Exception as e:
print('ERROR: {error}'.format(error=e))
msg = 'Pushed {dimension_count} dimensions and {metric_count} metrics'.format(dimension_count=dimension_count, metric_count=metric_count)
print(msg)
return msg
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment