#!/usr/bin/env python3 import os import re import sys import boto3 import subprocess from datetime import datetime def main(sample_count=5): try: _, from_location, to_location, hostname = sys.argv except ValueError: print("usage: {} ".format( os.path.basename(sys.argv[0]))) sys.exit(1) client = boto3.client("cloudwatch") now = datetime.now() patt = re.compile( "round-trip min/avg/max = " "(?P[0-9]+\.[0-9]+)/(?P[0-9]+\.[0-9]+)/" "(?P[0-9]+\.[0-9]+) (?P.*)") out = subprocess.run( ["ping", "-c", str(sample_count), hostname], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # Prevent failing with an error if the ping fails match = patt.search(out.stdout.decode("us-ascii")) if not match: return 1 val = match.groupdict() client.put_metric_data( Namespace="VPNLatency", MetricData=[ { "MetricName": "PingRTT", "Dimensions": [ { "Name": "From Location", "Value": from_location, }, { "Name": "To Location", "Value": to_location, } ], "Timestamp": now, "StatisticValues": { "SampleCount": sample_count, "Sum": float(val["avg"]) * sample_count, "Minimum": float(val["min"]), "Maximum": float(val["max"]), }, "Unit": "Milliseconds" }, { "MetricName": "PingRTT", "Dimensions": [ { "Name": "From Location", "Value": from_location, }, ], "Timestamp": now, "StatisticValues": { "SampleCount": sample_count, "Sum": float(val["avg"]) * sample_count, "Minimum": float(val["min"]), "Maximum": float(val["max"]), }, "Unit": "Milliseconds" }, { "MetricName": "PingRTT", "Dimensions": [ { "Name": "To Location", "Value": to_location, } ], "Timestamp": now, "StatisticValues": { "SampleCount": sample_count, "Sum": float(val["avg"]) * sample_count, "Minimum": float(val["min"]), "Maximum": float(val["max"]), }, "Unit": "Milliseconds" }, ] ) return 0 if __name__ == "__main__": sys.exit(main())