in publishfunction/cwmetricstream.py [0:0]
def lambda_handler(event, context):
print json.dumps(event)
events_int = defaultdict(int)
events_float = defaultdict(float)
for record in event['Records']:
for metric in record['dynamodb']['NewImage']['MetricDetails']['L']:
try: event_timestamp = metric['M']['EVENTTIMESTAMP']['N']
except Exception as e:
event_timestamp='NULL'
if event_timestamp!='NULL':
timestamp = float(event_timestamp) / 1000
event_time = datetime.utcfromtimestamp(timestamp).strftime('%Y-%m-%dT%H:%M:%S')
metric_field = metric['M']['METRICTYPE']['S']
if metric_field=='agent_count' or metric_field=='event_count' or metric_field=='referral_count' or metric_field=='top_pages':
if metric['M']['METRICITEM']['S'] == 'null':
event_type = metric_field + ':No referrer' # split on : later
else:
event_type = metric_field + ':' + metric['M']['METRICITEM']['S'] # split on : later
event_value = metric['M']['UNITVALUEINT']['N'] # these metric types all have int values
events_int[(event_type, event_time)] = int(event_value)
elif metric_field == 'event_anomaly': # anomalies need to be split on :
event_type_list = metric['M']['METRICITEM']['S'].split(':')
event_type = metric_field + ':' + event_type_list[0] # split on : later
event_value = metric['M']['UNITVALUEFLOAT']['N'] # anomalies events have float values
events_float[(event_type, event_time)] = float(event_value)
elif metric_field == 'visitor_count':
event_type = metric_field
event_value = metric['M']['UNITVALUEINT']['N'] # visitor count events have int values
events_int[(event_type, event_time)] = int(event_value)
else: event_type = 'NULL'
if event_type!='NULL' and event_timestamp!='NULL':
if 'NULL' in metric['M']['UNITVALUEFLOAT']:
events_int[(event_type, event_time)] = int(event_value)
else:
events_float[(event_type, event_time)] = float(event_value)
for key,val in events_int.iteritems():
print "%s, %s = %d" % (key[0], key[1], val)
put_cloudwatch_metric(key[0], key[1], int(val))
for key,val in events_float.iteritems():
print "%s, %s = %f" % (key[0], key[1], val)
put_cloudwatch_metric(key[0], key[1], float(val))
return 'Successfully processed {} records.'.format(len(event['Records']))