1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
import re
import sys
import unittest
import prometheus_client
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
class BaseTestCase(unittest.TestCase):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if sys.version_info.major < 3:
self.assertRegex = self.assertRegexpMatches
self.assertNotRegex = self.assertNotRegexpMatches
def setUp(self):
self.app = Flask(__name__)
self.app.testing = True
self.client = self.app.test_client()
# reset the underlying Prometheus registry
prometheus_client.REGISTRY = prometheus_client.CollectorRegistry(auto_describe=True)
def metrics(self, **kwargs):
return PrometheusMetrics(self.app, registry=kwargs.pop('registry', None), **kwargs)
def assertMetric(self, name, value, *labels, **kwargs):
if labels:
pattern = r'(?ms).*%s\{(%s)\} %s.*' % (
name, ','.join(
'(?:%s)="(?:%s)"' % (
'|'.join(str(item) for item, _ in labels),
'|'.join(
str(item).replace('+', r'\+').replace('?', r'\?')
for _, item in labels
)
) for _ in labels
), value
)
else:
pattern = '(?ms).*%s %s.*' % (name, value)
response = self.client.get(kwargs.get('endpoint', '/metrics'))
self.assertEqual(response.status_code, 200)
self.assertRegex(
str(response.data), pattern,
msg='Failing metric: %s%s, Regexp didn\'t match' % (name, dict(labels))
)
if not labels:
return
match = re.sub(pattern, r'\1', str(response.data))
for item in labels:
self.assertIn(('%s="%s"' % item), match)
def assertAbsent(self, name, *labels, **kwargs):
if labels:
pattern = r'(?ms).*%s\{(%s)\} .*' % (
name, ','.join(
'(?:%s)="(?:%s)"' % (
'|'.join(str(item) for item, _ in labels),
'|'.join(str(item).replace('+', r'\+') for _, item in labels)
) for _ in labels
)
)
else:
pattern = '.*%s [0-9.]+.*' % name
response = self.client.get(kwargs.get('endpoint', '/metrics'))
self.assertEqual(response.status_code, 200)
self.assertNotRegex(str(response.data), pattern)
def assumeMinimumFlaskVersion(self, version):
from flask import __version__ as flask_version
desired_version = list(map(int, version.split('.')))
actual_version = list(map(int, flask_version.split('.')))
if actual_version < desired_version:
self.skipTest(reason='Flask version %s is before the desired version %s' % (flask_version, version))
def assumeBeforeFlaskVersion(self, version):
from flask import __version__ as flask_version
desired_version = list(map(int, version.split('.')))
actual_version = list(map(int, flask_version.split('.')))
if actual_version >= desired_version:
self.skipTest(reason='Flask version %s is not before the desired version %s' % (flask_version, version))
|