NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)