|
import json |
|
import boto3 |
|
import time |
|
import uuid |
|
import os |
|
|
|
from urllib import request |
|
from urllib.parse import urlencode |
|
from urllib.request import Request, urlopen |
|
from urllib.error import HTTPError |
|
from statistics import mean |
|
|
|
from statics import get_api_gateway_payload, NoRedirect |
|
from statics import request_path, host, lambda_name, api_gateway_endpoint, cloudfront_endpoint |
|
|
|
session = boto3.session.Session(aws_access_key_id=os.getenv("aws_access_key_id"), |
|
aws_secret_access_key=os.getenv("aws_secret_access_key"), |
|
region_name=os.getenv("region_name")) |
|
|
|
def get_uuid(): |
|
return str(uuid.uuid1()).lower() |
|
|
|
def call_lambda ( direct_origin_request = None): |
|
|
|
# Generate a unique payload |
|
origin_request = direct_origin_request or get_uuid() |
|
print(f"Running request w/ x-origin-request-id = {origin_request}") |
|
req_payload = get_api_gateway_payload(origin_request) |
|
|
|
# Start your clocks! |
|
timer = time.time() |
|
lambda_res = session.client('lambda').invoke(FunctionName=lambda_name, |
|
InvocationType='RequestResponse', |
|
Payload=req_payload) |
|
|
|
# How long did it take? |
|
duration = "{0:.2f}".format((time.time() - timer)*1000) |
|
|
|
# Some validation |
|
resp = json.loads(lambda_res['Payload'].read()) |
|
redir = resp['headers']['Location'] |
|
request_id = resp['headers'].get('x-request-id') |
|
origin_request_id = resp['headers'].get('x-origin-request-id') |
|
|
|
print (f" - x-request-id = {request_id}") |
|
|
|
return duration |
|
|
|
def test_lambda_directly(): |
|
# warm up lambda from cold-start: |
|
cold_start_uuid = get_uuid() |
|
print(f"Warming things up with {cold_start_uuid}") |
|
call_lambda(cold_start_uuid) |
|
|
|
# Make 3 requests |
|
direct_origin_request = get_uuid() |
|
durations = [] |
|
for i in range(1,4): |
|
print (f"Making Request {i} of 3 ({direct_origin_request})") |
|
duration = call_lambda(direct_origin_request) |
|
durations.append(float(duration)) |
|
|
|
avg = mean(durations) |
|
print(f"Avg duration for direct lambda test was {avg:.2f}: {durations}") |
|
return avg |
|
|
|
def make_url(host): |
|
return f"{host}/{request_path}" |
|
|
|
def make_request (url, cookie, origin_request = None ): |
|
origin_request = origin_request or get_uuid() |
|
headers = {"cookie": cookie, "x-origin-request-id": origin_request } |
|
timer = time.time() |
|
|
|
opener = request.build_opener(NoRedirect) |
|
request.install_opener(opener) |
|
|
|
req = Request( url, headers=headers) |
|
try: |
|
resp = urlopen(req) |
|
except HTTPError as e: |
|
resp = e |
|
except Exception as E: |
|
print(f"Could not hit {url}: {E}") |
|
return None |
|
|
|
# Return our time a milliseconds |
|
duration = "{0:.2f}".format((time.time() - timer)*1000)\ |
|
|
|
print (f"Response Headers: {resp.getheaders()}") |
|
req_id = resp.getheader('x-request-id') |
|
origin_req_id = resp.getheader('x-origin-request-id') |
|
print (f"Executed {req_id}/{origin_req_id} in {duration} milliseconds") |
|
|
|
return(duration) |
|
|
|
def test_url(request_url): |
|
cookie = os.getenv("COOKIE", "") |
|
url = make_url(request_url) |
|
|
|
# warm up lambda from cold-start: |
|
cold_start_uuid = get_uuid() |
|
print(f"Warming things up with {cold_start_uuid}") |
|
make_request(url, cookie, cold_start_uuid) |
|
|
|
# Make 3 requests |
|
direct_origin_request = get_uuid() |
|
durations = [] |
|
for i in range(1,4): |
|
print (f"Making Request {i} of 3 ({direct_origin_request})") |
|
duration = make_request(url, cookie, direct_origin_request) |
|
durations.append(float(duration)) |
|
|
|
avg = mean(durations) |
|
print(f"Avg duration for {request_url} test was {avg:.2f}: {durations}") |
|
return avg |
|
|
|
|
|
def lambda_handler(event, context): |
|
|
|
test_lambda_directly() |
|
|
|
test_url(api_gateway_endpoint) |
|
|
|
test_url(cloudfront_endpoint) |
|
|
|
|
|
lambda_handler(None, None) |