services/jenkins-run-statistics/aws_utils.py (35 lines of code) (raw):

#!/usr/bin/env python # -*- coding: utf-8 -*- # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. import time from datetime import datetime, timedelta, timezone import logging from collections import namedtuple import boto3 from botocore.exceptions import ClientError AwsServiceObjectsTuple = namedtuple('AwsServiceObjectsTuple', ['dynamo_db', 'cloudwatch']) CLOUDWATCH_MAXIMUM_LOOKBACK_TIMEFRAME_SECONDS = 60 * 60 * 24 * 7 * 2 def generate_aws_service_objects(region_name): """ Generate AWS Boto objects :return: AwsServiceObjectsTuple object """ dynamo_db = boto3.resource('dynamodb', region_name=region_name) cloudwatch = boto3.client('cloudwatch') return AwsServiceObjectsTuple(dynamo_db=dynamo_db, cloudwatch=cloudwatch) def publish_cloudwatch_metric(cloudwatch, metric_namespace, metric_name, value, unix_timestamp, dimensions, unit='Milliseconds'): # CloudWatch does not allow submission older than 2 weeks. if time.time() - unix_timestamp >= CLOUDWATCH_MAXIMUM_LOOKBACK_TIMEFRAME_SECONDS: logging.info('Skipping submission of CloudWatch metric that was older than 2 weeks.') return try: cloudwatch.put_metric_data( MetricData=[ { 'MetricName': metric_name, 'Dimensions': [{'Name': name, 'Value': value} for name, value in dimensions.items()], 'Unit': unit, 'Value': value, 'Timestamp': datetime.utcfromtimestamp(unix_timestamp) } ], Namespace=metric_namespace ) except ClientError as e: if e.response['Error']['Code'] == 'InvalidParameterValue': logging.info('Skipping submission of CloudWatch metric that was older than 2 weeks.') logging.exception('Exception:') else: raise