Created
August 29, 2017 09:06
-
-
Save steynovich/3092ea2c2a02e9c0792b036cac879952 to your computer and use it in GitHub Desktop.
ecs-task-metrics.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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