Skip to content

Commit

Permalink
Fix tests under Flask 2.2.0
Browse files Browse the repository at this point in the history
The behavior has changed in pallets/flask@a406c29
where we can no longer call setup methods after a request - which impacted our test setup
  • Loading branch information
rycus86 committed Aug 2, 2022
1 parent af49709 commit fa68d47
Show file tree
Hide file tree
Showing 3 changed files with 156 additions and 37 deletions.
119 changes: 110 additions & 9 deletions tests/test_defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@ class DefaultsTest(BaseTestCase):
def test_simple(self):
metrics = self.metrics()

@self.app.route('/test')
def test():
return 'OK'

self.assertMetric(
'flask_exporter_info', '1.0',
('version', metrics.version)
)

@self.app.route('/test')
def test():
return 'OK'

self.client.get('/test')
self.client.get('/test')

Expand Down Expand Up @@ -292,6 +292,8 @@ def test():
)

def test_custom_defaults_prefix(self):
self.assumeBeforeFlaskVersion('2.2.0')

metrics = self.metrics(defaults_prefix='www')

self.assertAbsent(
Expand Down Expand Up @@ -323,22 +325,56 @@ def test():
('method', 'GET'), ('path', '/test'), ('status', 200)
)

def test_no_defaults_prefix(self):
metrics = self.metrics(defaults_prefix=NO_PREFIX)
def test_custom_defaults_prefix__F220(self):
self.assumeMinimumFlaskVersion('2.2.0')

metrics = self.metrics(defaults_prefix='www')

@self.app.route('/test')
def test():
return 'OK'

self.assertAbsent(
'flask_exporter_info',
('version', metrics.version)
)
self.assertMetric(
'exporter_info', '1.0',
'www_exporter_info', '1.0',
('version', metrics.version)
)

self.client.get('/test')
self.client.get('/test')

self.assertAbsent(
'flask_http_request_total',
('method', 'GET'), ('status', 200)
)
self.assertMetric(
'www_http_request_total', '2.0',
('method', 'GET'), ('status', 200)
)
self.assertMetric(
'www_http_request_duration_seconds_count', '2.0',
('method', 'GET'), ('path', '/test'), ('status', 200)
)

def test_no_defaults_prefix(self):
metrics = self.metrics(defaults_prefix=NO_PREFIX)

@self.app.route('/test')
def test():
return 'OK'

self.assertAbsent(
'flask_exporter_info',
('version', metrics.version)
)
self.assertMetric(
'exporter_info', '1.0',
('version', metrics.version)
)

self.client.get('/test')
self.client.get('/test')
self.client.get('/test')
Expand All @@ -357,6 +393,8 @@ def test():
)

def test_late_defaults_export(self):
self.assumeBeforeFlaskVersion('2.2.0')

metrics = self.metrics(export_defaults=False)

@self.app.route('/test')
Expand Down Expand Up @@ -411,7 +449,42 @@ def test():
('method', 'GET'), ('path', '/test'),
)

def test_late_defaults_export__F220(self):
self.assumeMinimumFlaskVersion('2.2.0')

metrics = self.metrics(export_defaults=False)

@self.app.route('/test')
def test():
return 'OK'

metrics.export_defaults(prefix='late')

self.assertMetric(
'late_exporter_info', '1.0',
('version', metrics.version)
)

self.client.get('/test')
self.client.get('/test')
self.client.get('/test')

self.assertMetric(
'late_http_request_total', '3.0',
('method', 'GET'), ('status', 200)
)
self.assertMetric(
'late_http_request_duration_seconds_count', '3.0',
('method', 'GET'), ('path', '/test'), ('status', 200)
)
self.assertAbsent(
'flask_http_request_exceptions_total',
('method', 'GET'), ('path', '/test'),
)

def test_export_latencies_as_summary(self):
self.assumeBeforeFlaskVersion('2.2.0')

metrics = self.metrics(export_defaults=False)

@self.app.route('/test')
Expand Down Expand Up @@ -453,20 +526,48 @@ def test():
('le', '+Inf'), ('method', 'GET'), ('path', '/test'), ('status', 200)
)

def test_export_latencies_as_summary__F220(self):
self.assumeMinimumFlaskVersion('2.2.0')

metrics = self.metrics(export_defaults=False)

@self.app.route('/test')
def test():
return 'OK'

metrics.export_defaults(latency_as_histogram=False)

self.client.get('/test')
self.client.get('/test')
self.client.get('/test')

self.assertMetric(
'flask_http_request_duration_seconds_sum', '[0-9.e-]+',
('method', 'GET'), ('path', '/test'), ('status', 200)
)
self.assertMetric(
'flask_http_request_duration_seconds_count', '3.0',
('method', 'GET'), ('path', '/test'), ('status', 200)
)
self.assertAbsent(
'flask_http_request_duration_seconds_bucket',
('le', '+Inf'), ('method', 'GET'), ('path', '/test'), ('status', 200)
)

def test_non_automatic_endpoint_registration(self):
metrics = self.metrics(path=None)

@self.app.route('/test')
def test():
return 'OK'

metrics.register_endpoint('/manual/metrics')

self.client.get('/test')

no_metrics_response = self.client.get('/metrics')
self.assertEqual(no_metrics_response.status_code, 404)

metrics.register_endpoint('/manual/metrics')

self.client.get('/test')

self.assertMetric(
Expand Down
56 changes: 28 additions & 28 deletions tests/test_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,6 @@ def test_histogram(self):
def test1():
return 'OK'

self.client.get('/test/1')

self.assertMetric('hist_1_count', '1.0')
self.assertMetric('hist_1_bucket', '1.0', ('le', '2.5'))

@self.app.route('/test/2')
@metrics.histogram('hist_2', 'Histogram 2', labels={
'uri': lambda: request.path,
Expand All @@ -25,6 +20,19 @@ def test1():
def test2():
return 'OK'

@self.app.route('/test/<int:x>/<int:y>')
@metrics.histogram('hist_3', 'Histogram 3', labels={
'x_value': lambda: request.view_args['x'],
'y_value': lambda: request.view_args['y']
}, buckets=(0.7, 2.9))
def test3(x, y):
return 'OK: %d/%d' % (x, y)

self.client.get('/test/1')

self.assertMetric('hist_1_count', '1.0')
self.assertMetric('hist_1_bucket', '1.0', ('le', '2.5'))

self.client.get('/test/2')

self.assertMetric(
Expand All @@ -36,14 +44,6 @@ def test2():
('le', '1.0'), ('uri', '/test/2'), ('code', 200)
)

@self.app.route('/test/<int:x>/<int:y>')
@metrics.histogram('hist_3', 'Histogram 3', labels={
'x_value': lambda: request.view_args['x'],
'y_value': lambda: request.view_args['y']
}, buckets=(0.7, 2.9))
def test3(x, y):
return 'OK: %d/%d' % (x, y)

self.client.get('/test/3/4')

self.assertMetric(
Expand All @@ -63,10 +63,6 @@ def test_summary(self):
def test1():
return 'OK'

self.client.get('/test/1')

self.assertMetric('sum_1_count', '1.0')

@self.app.route('/test/2')
@metrics.summary('sum_2', 'Summary 2', labels={
'uri': lambda: request.path,
Expand All @@ -76,6 +72,10 @@ def test1():
def test2():
return 'OK'

self.client.get('/test/1')

self.assertMetric('sum_1_count', '1.0')

self.client.get('/test/2')

self.assertMetric(
Expand All @@ -93,10 +93,6 @@ def test1():

return 'OK'

self.client.get('/test/1')

self.assertMetric('gauge_1', '0.0')

@self.app.route('/test/<int:a>')
@metrics.gauge('gauge_2', 'Gauge 2', labels={
'uri': lambda: request.path,
Expand All @@ -110,6 +106,10 @@ def test2(a):

return 'OK: %d' % a

self.client.get('/test/1')

self.assertMetric('gauge_1', '0.0')

self.client.get('/test/2')

self.assertMetric(
Expand All @@ -125,13 +125,6 @@ def test_counter(self):
def test1():
return 'OK'

self.client.get('/test/1')
self.assertMetric('cnt_1_total', '1.0')
self.client.get('/test/1')
self.assertMetric('cnt_1_total', '2.0')
self.client.get('/test/1')
self.assertMetric('cnt_1_total', '3.0')

@self.app.route('/test/2')
@metrics.counter('cnt_2', 'Counter 2', labels={
'uri': lambda: request.path,
Expand All @@ -140,6 +133,13 @@ def test1():
def test2():
return 'OK'

self.client.get('/test/1')
self.assertMetric('cnt_1_total', '1.0')
self.client.get('/test/1')
self.assertMetric('cnt_1_total', '2.0')
self.client.get('/test/1')
self.assertMetric('cnt_1_total', '3.0')

self.client.get('/test/2')

self.assertMetric(
Expand Down
18 changes: 18 additions & 0 deletions tests/unittest_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,21 @@ def assertAbsent(self, name, *labels, **kwargs):
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))

0 comments on commit fa68d47

Please sign in to comment.