metrics_reporter.py (3275B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\victoriametrics\metrics_reporter.py 2 from __future__ import print_function 3 import os 4 import platform 5 import time 6 try: 7 import requests 8 except ImportError: 9 print('Unable to import requests, sending metrics will fail') 10 11 VICTORIA_METRICS_BASE_URL = 'https://vm-single.dev.evetech.net/api/v1/import/csv?' 12 13 def _format_url_and_payload(results, branch_name, machine_type, metric_prefix, measurement_name): 14 time_stamp = '%d' % time.time() 15 machine_name = platform.node() 16 python_version = platform.python_version() 17 data_list = [('time', 'unix_s', time_stamp), 18 ('label', 'branch', branch_name.replace(' ', '_')), 19 ('label', 'machine', machine_name), 20 ('label', 'machine_type', machine_type.replace(' ', '_')), 21 ('label', 'python_version', python_version)] 22 if measurement_name is not None: 23 data_list.append(('label', 'measurement_name', measurement_name.replace(' ', '_').replace(',', '').replace('(', '').replace(')', ''))) 24 url_format = 'format=' 25 payload = '' 26 i = 1 27 for value_type, key, value in data_list: 28 url_format += '%d:%s:%s,' % (i, value_type, key) 29 payload += '%s,' % value 30 i += 1 31 32 for key, value in results.items(): 33 if isinstance(value, float): 34 key = metric_prefix + key.lower().replace(' ', '_').replace('/', '_').replace('&', '_') 35 url_format += '%d:metric:%s,' % (i, key) 36 payload += '%.6f,' % value 37 i += 1 38 39 url_format = url_format[:-1] 40 payload = payload[:-1] 41 return (url_format, payload) 42 43 44 def _send_metrics(url, payload): 45 r = requests.post(url, data=payload, timeout=10) 46 print('Response code from Victoria Metrics: ', r.status_code) 47 48 49 def _send_metrics_wrapper(url, payload): 50 try: 51 import blue 52 import uthread2 53 try: 54 from scheduler import getcurrent 55 except ImportError: 56 from stackless import getcurrent 57 58 if getcurrent().is_main: 59 print('Sending to vm through tasklet') 60 t = uthread2.StartTasklet(_send_metrics, url, payload) 61 i = 0 62 while t.is_alive(): 63 blue.os.Pump() 64 i += 1 65 if i > 500: 66 raise TimeoutError('Waited too long for sending results') 67 68 else: 69 print('Sending to vm directly') 70 _send_metrics(url, payload) 71 except ImportError: 72 print('Sending without blue') 73 _send_metrics(url, payload) 74 75 76 def send_metrics_to_victoria_metrics(results, base_url = None, branch_name = None, machine_type = None, metric_prefix = 'undefined_test_', measurement_name = None): 77 if base_url is None: 78 base_url = VICTORIA_METRICS_BASE_URL 79 if branch_name is None: 80 branch_name = 'EVE-' + os.getenv('TC_EVE_BRANCH_SHORTNAME', 'UNKNOWN') 81 if branch_name is None: 82 branch_name = 'UNKNOWN' 83 if machine_type is None: 84 machine_type = os.getenv('TC_TEST_MACHINE_TYPE', 'manual') 85 url_format, payload = _format_url_and_payload(results, branch_name, machine_type, metric_prefix, measurement_name) 86 url = base_url + url_format 87 _send_metrics_wrapper(url, payload)