File: test_blueprint.py

package info (click to toggle)
prometheus-flask-exporter 0.23.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 896 kB
  • sloc: python: 2,889; sh: 709; makefile: 4
file content (114 lines) | stat: -rw-r--r-- 4,249 bytes parent folder | download
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import sys
import unittest

from flask import Flask, Blueprint, request
from prometheus_client import CollectorRegistry
from prometheus_flask_exporter import PrometheusMetrics, RESTfulPrometheusMetrics


class BlueprintTest(unittest.TestCase):
    def setUp(self):
        self.app = Flask(__name__)
        self.app.testing = True
        self.client = self.app.test_client()

        if sys.version_info.major < 3:
            self.assertRegex = self.assertRegexpMatches
            self.assertNotRegex = self.assertNotRegexpMatches

        registry = CollectorRegistry(auto_describe=True)
        self.metrics = PrometheusMetrics.for_app_factory(registry=registry)

    def test_blueprint(self):
        blueprint = Blueprint('test-blueprint', __name__)

        @blueprint.route('/test')
        @self.metrics.summary('requests_by_status', 'Request latencies by status',
                              labels={'status': lambda r: r.status_code})
        def test():
            return 'OK'

        self.app.register_blueprint(blueprint)
        self.metrics.init_app(self.app)

        self.client.get('/test')

        response = self.client.get('/metrics')
        self.assertEqual(response.status_code, 200)
        self.assertIn('requests_by_status_count{status="200"} 1.0', str(response.data))
        self.assertRegex(str(response.data), 'requests_by_status_sum{status="200"} [0-9.]+')

    def test_restful_with_blueprints(self):
        try:
            from flask_restful import Resource, Api
        except ImportError:
            self.skipTest('Flask-RESTful is not available')
            return

        class SampleResource(Resource):
            status = 200

            @self.metrics.summary('requests_by_status', 'Request latencies by status',
                                  labels={'status': lambda r: r.status_code})
            def get(self):
                if 'fail' in request.args:
                    return 'Not OK', 400
                else:
                    return 'OK'

        blueprint = Blueprint('v1', __name__, url_prefix='/v1')
        api = Api(blueprint)

        api.add_resource(SampleResource, '/sample', endpoint='api_sample')

        self.app.register_blueprint(blueprint)
        self.metrics.init_app(self.app)

        self.client.get('/v1/sample')
        self.client.get('/v1/sample')
        self.client.get('/v1/sample?fail=1')

        response = self.client.get('/metrics')
        self.assertEqual(response.status_code, 200)

        self.assertIn('requests_by_status_count{status="200"} 2.0', str(response.data))
        self.assertRegex(str(response.data), 'requests_by_status_sum{status="200"} [0-9.]+')

        self.assertIn('requests_by_status_count{status="400"} 1.0', str(response.data))
        self.assertRegex(str(response.data), 'requests_by_status_sum{status="400"} [0-9.]+')

    def test_restful_return_none(self):
        try:
            from flask_restful import Resource, Api
        except ImportError:
            self.skipTest('Flask-RESTful is not available')
            return

        api = Api(self.app)
        self.metrics = RESTfulPrometheusMetrics(self.app, api=api)

        class SampleResource(Resource):
            status = 200

            @self.metrics.summary('requests_by_status', 'Request latencies by status',
                                  labels={'status': lambda r: r.status_code})
            def get(self):
                if 'fail' in request.args:
                    return None, 400, {'X-Error': 'Test error'}
                else:
                    return None

        api.add_resource(SampleResource, '/v1/sample', endpoint='api_sample')

        self.client.get('/v1/sample')
        self.client.get('/v1/sample')
        self.client.get('/v1/sample?fail=1')

        response = self.client.get('/metrics')
        self.assertEqual(response.status_code, 200)

        self.assertIn('requests_by_status_count{status="200"} 2.0', str(response.data))
        self.assertRegex(str(response.data), 'requests_by_status_sum{status="200"} [0-9.]+')

        self.assertIn('requests_by_status_count{status="400"} 1.0', str(response.data))
        self.assertRegex(str(response.data), 'requests_by_status_sum{status="400"} [0-9.]+')