60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
#!/usr/bin/env python3
|
||
"""CLI v2 (aws cli) в нагрузке: 50 циклов send/receive/delete с замером латентности.
|
||
Запуск на ВМ: python3 tests/cli_load_test.py"""
|
||
import boto3
|
||
import subprocess
|
||
import time
|
||
import os
|
||
import re
|
||
|
||
ENV = dict(os.environ)
|
||
EP = 'https://sqs.containerk8s.dev.nubes.ru'
|
||
sqs = boto3.client('sqs', endpoint_url=EP, region_name='us-east-1')
|
||
|
||
|
||
def cli(*a, tmo=20):
|
||
t = time.time()
|
||
p = subprocess.run(['aws', '--endpoint-url', EP, '--region', 'us-east-1', 'sqs', *a],
|
||
env=ENV, capture_output=True, text=True, timeout=tmo)
|
||
return p, time.time() - t
|
||
|
||
|
||
def main():
|
||
q = 'cliload-%d' % int(time.time())
|
||
sqs.create_queue(QueueName=q)
|
||
u = EP + '/' + q
|
||
lat = {'send': [], 'receive': [], 'delete': []}
|
||
failed = 0
|
||
for i in range(50):
|
||
p, t = cli('send-message', '--queue-url', u, '--message-body', 'msg-%d' % i)
|
||
lat['send'].append(t)
|
||
if p.returncode != 0:
|
||
failed += 1
|
||
print('send FAIL', i, p.stderr[:120])
|
||
continue
|
||
p, t = cli('receive-message', '--queue-url', u, '--max-number-of-messages', '1', '--visibility-timeout', '3')
|
||
lat['receive'].append(t)
|
||
m = re.search(r'"ReceiptHandle":\s*"([^"]+)"', p.stdout)
|
||
if not m:
|
||
failed += 1
|
||
print('receive FAIL', i, p.stdout[:100], p.stderr[:100])
|
||
continue
|
||
p, t = cli('delete-message', '--queue-url', u, '--receipt-handle', m.group(1))
|
||
lat['delete'].append(t)
|
||
if p.returncode != 0:
|
||
failed += 1
|
||
print('delete FAIL', i, p.stderr[:120])
|
||
for k in lat:
|
||
v = sorted(lat[k])
|
||
n = len(v)
|
||
if n:
|
||
print('%s: n=%d p50=%.0fms p95=%.0fms max=%.0fms' % (k, n, v[n // 2] * 1000, v[int(n * .95)] * 1000, v[-1] * 1000))
|
||
else:
|
||
print('%s: n=0' % k)
|
||
sqs.delete_queue(QueueUrl=u)
|
||
print('CLI load done, failed=%d' % failed)
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main()
|