Skip to content

Commit 377bc64

Browse files
committed
Rename /metrics/ to /metrics and use self._metrics in MetricsContainer instead of the global MetricsContainer
1 parent d8d2aec commit 377bc64

File tree

7 files changed

+56
-56
lines changed

7 files changed

+56
-56
lines changed

src/asgi_monitor/integrations/fastapi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def setup_metrics(
8686
)
8787
if include_metrics_endpoint:
8888
app.add_route(
89-
path="/metrics/",
89+
path="/metrics",
9090
route=get_metrics,
9191
methods=["GET"],
9292
name="Get Prometheus metrics",

src/asgi_monitor/integrations/starlette.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ def setup_metrics(
216216
)
217217
if include_metrics_endpoint:
218218
app.add_route(
219-
path="/metrics/",
219+
path="/metrics",
220220
route=get_metrics,
221221
methods=["GET"],
222222
name="Get Prometheus metrics",

src/asgi_monitor/metrics/container.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,66 +20,66 @@ def __init__(self, prefix: str = "asgi") -> None:
2020
def app_info(self) -> Gauge:
2121
metric_name = f"{self._prefix}_app_info"
2222

23-
if metric_name not in MetricsContainer._metrics:
24-
MetricsContainer._metrics[metric_name] = Gauge(
23+
if metric_name not in self._metrics:
24+
self._metrics[metric_name] = Gauge(
2525
name=metric_name,
2626
documentation="ASGI application information",
2727
labelnames=["app_name"],
2828
)
29-
return cast("Gauge", MetricsContainer._metrics[metric_name])
29+
return cast("Gauge", self._metrics[metric_name])
3030

3131
def request_count(self) -> Counter:
3232
metric_name = f"{self._prefix}_requests_total"
3333

34-
if metric_name not in MetricsContainer._metrics:
35-
MetricsContainer._metrics[metric_name] = Counter(
34+
if metric_name not in self._metrics:
35+
self._metrics[metric_name] = Counter(
3636
name=metric_name,
3737
documentation="Total count of requests by method and path",
3838
labelnames=["app_name", "method", "path"],
3939
)
40-
return cast("Counter", MetricsContainer._metrics[metric_name])
40+
return cast("Counter", self._metrics[metric_name])
4141

4242
def response_count(self) -> Counter:
4343
metric_name = f"{self._prefix}_responses_total"
4444

45-
if metric_name not in MetricsContainer._metrics:
46-
MetricsContainer._metrics[metric_name] = Counter(
45+
if metric_name not in self._metrics:
46+
self._metrics[metric_name] = Counter(
4747
name=metric_name,
4848
documentation="Total count of responses by method, path and status codes",
4949
labelnames=["app_name", "method", "path", "status_code"],
5050
)
51-
return cast("Counter", MetricsContainer._metrics[metric_name])
51+
return cast("Counter", self._metrics[metric_name])
5252

5353
def request_duration(self) -> Histogram:
5454
metric_name = f"{self._prefix}_request_duration_seconds"
5555

56-
if metric_name not in MetricsContainer._metrics:
57-
MetricsContainer._metrics[metric_name] = Histogram(
56+
if metric_name not in self._metrics:
57+
self._metrics[metric_name] = Histogram(
5858
name=metric_name,
5959
documentation="Histogram of request duration by path, in seconds",
6060
labelnames=["app_name", "method", "path"],
6161
)
62-
return cast("Histogram", MetricsContainer._metrics[metric_name])
62+
return cast("Histogram", self._metrics[metric_name])
6363

6464
def requests_in_progress(self) -> Gauge:
6565
metric_name = f"{self._prefix}_requests_in_progress"
6666

67-
if metric_name not in MetricsContainer._metrics:
68-
MetricsContainer._metrics[metric_name] = Gauge(
67+
if metric_name not in self._metrics:
68+
self._metrics[metric_name] = Gauge(
6969
name=metric_name,
7070
documentation="Gauge of requests by method and path currently being processed",
7171
labelnames=["app_name", "method", "path"],
7272
multiprocess_mode="livesum",
7373
)
74-
return cast("Gauge", MetricsContainer._metrics[metric_name])
74+
return cast("Gauge", self._metrics[metric_name])
7575

7676
def requests_exceptions_count(self) -> Counter:
7777
metric_name = f"{self._prefix}_requests_exceptions_total"
7878

79-
if metric_name not in MetricsContainer._metrics:
80-
MetricsContainer._metrics[metric_name] = Counter(
79+
if metric_name not in self._metrics:
80+
self._metrics[metric_name] = Counter(
8181
name=metric_name,
8282
documentation="Total count of exceptions raised by path and exception type",
8383
labelnames=["app_name", "method", "path", "exception_type"],
8484
)
85-
return cast("Counter", MetricsContainer._metrics[metric_name])
85+
return cast("Counter", self._metrics[metric_name])

tests/integration/fastapi/test_middlewares.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ async def test_metrics() -> None:
2929
assert response.status_code == 200
3030
assert_that(response.content.decode()).contains(
3131
'fastapi_app_info{app_name="test"} 1.0',
32-
'fastapi_requests_total{app_name="test",method="GET",path="/metrics/"} 1.0',
33-
'fastapi_requests_created{app_name="test",method="GET",path="/metrics/"}',
34-
'fastapi_requests_in_progress{app_name="test",method="GET",path="/metrics/"} 1.0',
32+
'fastapi_requests_total{app_name="test",method="GET",path="/metrics"} 1.0',
33+
'fastapi_requests_created{app_name="test",method="GET",path="/metrics"}',
34+
'fastapi_requests_in_progress{app_name="test",method="GET",path="/metrics"} 1.0',
3535
)
3636

3737

tests/integration/starlette/test_middlewares.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,9 @@ async def test_metrics() -> None:
134134
assert response.status_code == 200
135135
assert_that(response.content.decode()).contains(
136136
'starlette_app_info{app_name="test"} 1.0',
137-
'starlette_requests_total{app_name="test",method="GET",path="/metrics/"} 1.0',
138-
'starlette_requests_created{app_name="test",method="GET",path="/metrics/"}',
139-
'starlette_requests_in_progress{app_name="test",method="GET",path="/metrics/"} 1.0',
137+
'starlette_requests_total{app_name="test",method="GET",path="/metrics"} 1.0',
138+
'starlette_requests_created{app_name="test",method="GET",path="/metrics"}',
139+
'starlette_requests_in_progress{app_name="test",method="GET",path="/metrics"} 1.0',
140140
)
141141

142142

tests/unit/metrics/test_get_latest.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ def test_get_latest_openmetrics_false(manager: MetricsManager) -> None:
2020
payload=IsBytes,
2121
)
2222
manager.add_app_info()
23-
manager.add_request_in_progress(method="GET", path="/metrics/")
23+
manager.add_request_in_progress(method="GET", path="/metrics")
2424

2525
# Act
2626
response = get_latest_metrics(openmetrics_format=False)
2727

2828
# Assert
2929
assert_that(response).is_equal_to(expected)
3030
assert_that(response.payload.decode()).contains(
31-
'test_requests_in_progress{app_name="asgi-monitor",method="GET",path="/metrics/"} 1.0',
31+
'test_requests_in_progress{app_name="asgi-monitor",method="GET",path="/metrics"} 1.0',
3232
'test_app_info{app_name="asgi-monitor"} 1.0',
3333
)
3434

@@ -41,15 +41,15 @@ def test_get_latest_openmetrics_true(manager: MetricsManager) -> None:
4141
payload=IsBytes,
4242
)
4343
manager.add_app_info()
44-
manager.add_request_in_progress(method="GET", path="/metrics/")
44+
manager.add_request_in_progress(method="GET", path="/metrics")
4545

4646
# Act
4747
response = get_latest_metrics(openmetrics_format=True)
4848

4949
# Assert
5050
assert_that(response).is_equal_to(expected)
5151
assert_that(response.payload.decode()).contains(
52-
'test_requests_in_progress{app_name="asgi-monitor",method="GET",path="/metrics/"} 1.0',
52+
'test_requests_in_progress{app_name="asgi-monitor",method="GET",path="/metrics"} 1.0',
5353
'test_app_info{app_name="asgi-monitor"} 1.0',
5454
)
5555

@@ -58,9 +58,9 @@ def add_metrics() -> None:
5858
manager = MetricsManager(app_name="asgi-monitor", container=MetricsContainer("test"))
5959

6060
for _ in range(10):
61-
manager.inc_requests_count(method="GET", path="/metrics/")
62-
manager.inc_requests_count(method="GET", path="/token/")
63-
manager.inc_requests_count(method="GET", path="/login/")
61+
manager.inc_requests_count(method="GET", path="/metrics")
62+
manager.inc_requests_count(method="GET", path="/token")
63+
manager.inc_requests_count(method="GET", path="/login")
6464

6565

6666
def test_get_latest_metrics_multiprocess(tmpdir: Path) -> None:
@@ -87,7 +87,7 @@ def test_get_latest_metrics_multiprocess(tmpdir: Path) -> None:
8787
# Assert
8888
assert_that(response).is_equal_to(expected)
8989
assert_that(response.payload.decode()).contains(
90-
'test_requests_total{app_name="asgi-monitor",method="GET",path="/metrics/"} 100.0',
91-
'test_requests_total{app_name="asgi-monitor",method="GET",path="/token/"} 100.0',
92-
'test_requests_total{app_name="asgi-monitor",method="GET",path="/login/"} 100.0',
90+
'test_requests_total{app_name="asgi-monitor",method="GET",path="/metrics"} 100.0',
91+
'test_requests_total{app_name="asgi-monitor",method="GET",path="/token"} 100.0',
92+
'test_requests_total{app_name="asgi-monitor",method="GET",path="/login"} 100.0',
9393
)

tests/unit/metrics/test_metrics.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,22 @@ def test_request_count(container: MetricsContainer, manager: MetricsManager) ->
5151
expected.samples = [
5252
Sample(
5353
name="test_requests_total",
54-
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics/"},
54+
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics"},
5555
value=1.0,
5656
timestamp=None,
5757
exemplar=None,
5858
),
5959
Sample(
6060
name="test_requests_created",
61-
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics/"},
61+
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics"},
6262
value=FROZEN_TIMESTAMP,
6363
timestamp=None,
6464
exemplar=None,
6565
),
6666
]
6767

6868
# Act
69-
manager.inc_requests_count(method="GET", path="/metrics/")
69+
manager.inc_requests_count(method="GET", path="/metrics")
7070

7171
# Assert
7272
request_count = container.request_count().collect()
@@ -85,22 +85,22 @@ def test_response_count(container: MetricsContainer, manager: MetricsManager) ->
8585
expected.samples = [
8686
Sample(
8787
name="test_responses_total",
88-
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics/", "status_code": "200"},
88+
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics", "status_code": "200"},
8989
value=1.0,
9090
timestamp=None,
9191
exemplar=None,
9292
),
9393
Sample(
9494
name="test_responses_created",
95-
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics/", "status_code": "200"},
95+
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics", "status_code": "200"},
9696
value=FROZEN_TIMESTAMP,
9797
timestamp=None,
9898
exemplar=None,
9999
),
100100
]
101101

102102
# Act
103-
manager.inc_responses_count(method="GET", path="/metrics/", status_code=200)
103+
manager.inc_responses_count(method="GET", path="/metrics", status_code=200)
104104

105105
# Assert
106106
response_count = container.response_count().collect()
@@ -118,35 +118,35 @@ def test_request_duration(container: MetricsContainer, manager: MetricsManager)
118118
)
119119
expected_sample_bucket_with_exemplar = Sample(
120120
name="test_request_duration_seconds_bucket",
121-
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics/", "le": IsStr},
121+
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics", "le": IsStr},
122122
value=1.0,
123123
timestamp=None,
124124
exemplar=Exemplar(labels={"TraceID": "1234567"}, value=0.0, timestamp=FROZEN_TIMESTAMP),
125125
)
126126
expected_sample_bucket_without_exemplar = Sample(
127127
name="test_request_duration_seconds_bucket",
128-
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics/", "le": IsStr},
128+
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics", "le": IsStr},
129129
value=1.0,
130130
timestamp=None,
131131
exemplar=None,
132132
)
133133
expected_sample_count = Sample(
134134
name="test_request_duration_seconds_count",
135-
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics/"},
135+
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics"},
136136
value=1.0,
137137
timestamp=None,
138138
exemplar=None,
139139
)
140140
expected_sample_sum = Sample(
141141
name="test_request_duration_seconds_sum",
142-
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics/"},
142+
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics"},
143143
value=0.0,
144144
timestamp=None,
145145
exemplar=None,
146146
)
147147
expected_sample_created = Sample(
148148
name="test_request_duration_seconds_created",
149-
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics/"},
149+
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics"},
150150
value=FROZEN_TIMESTAMP,
151151
timestamp=None,
152152
exemplar=None,
@@ -158,7 +158,7 @@ def test_request_duration(container: MetricsContainer, manager: MetricsManager)
158158
# Act
159159
manager.observe_request_duration(
160160
method="GET",
161-
path="/metrics/",
161+
path="/metrics",
162162
duration=after_time - before_time,
163163
exemplar={"TraceID": "1234567"},
164164
)
@@ -189,15 +189,15 @@ def test_requests_in_progress_inc(container: MetricsContainer, manager: MetricsM
189189
expected.samples = [
190190
Sample(
191191
name="test_requests_in_progress",
192-
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics/"},
192+
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics"},
193193
value=1.0,
194194
timestamp=None,
195195
exemplar=None,
196196
),
197197
]
198198

199199
# Act
200-
manager.add_request_in_progress(method="GET", path="/metrics/")
200+
manager.add_request_in_progress(method="GET", path="/metrics")
201201

202202
# Assert
203203
requests_in_progress = container.requests_in_progress().collect()
@@ -215,16 +215,16 @@ def test_requests_in_progress_dec(container: MetricsContainer, manager: MetricsM
215215
expected.samples = [
216216
Sample(
217217
name="test_requests_in_progress",
218-
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics/"},
218+
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics"},
219219
value=0.0,
220220
timestamp=None,
221221
exemplar=None,
222222
),
223223
]
224224

225225
# Act
226-
manager.add_request_in_progress(method="GET", path="/metrics/")
227-
manager.remove_request_in_progress(method="GET", path="/metrics/")
226+
manager.add_request_in_progress(method="GET", path="/metrics")
227+
manager.remove_request_in_progress(method="GET", path="/metrics")
228228

229229
# Assert
230230
requests_in_progress = container.requests_in_progress().collect()
@@ -243,14 +243,14 @@ def test_requests_exceptions_count(container: MetricsContainer, manager: Metrics
243243
expected.samples = [
244244
Sample(
245245
name="test_requests_exceptions_total",
246-
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics/", "exception_type": "RuntimeError"},
246+
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics", "exception_type": "RuntimeError"},
247247
value=1.0,
248248
timestamp=None,
249249
exemplar=None,
250250
),
251251
Sample(
252252
name="test_requests_exceptions_created",
253-
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics/", "exception_type": "RuntimeError"},
253+
labels={"app_name": "asgi-monitor", "method": "GET", "path": "/metrics", "exception_type": "RuntimeError"},
254254
value=FROZEN_TIMESTAMP,
255255
timestamp=None,
256256
exemplar=None,
@@ -260,7 +260,7 @@ def test_requests_exceptions_count(container: MetricsContainer, manager: Metrics
260260
# Act
261261
manager.inc_requests_exceptions_count(
262262
method="GET",
263-
path="/metrics/",
263+
path="/metrics",
264264
exception_type=type(RuntimeError()).__name__,
265265
)
266266

0 commit comments

Comments
 (0)