Skip to content

Commit 305f846

Browse files
committed
Prefix all Prometheus metrics with drf_api_logger_ to avoid collisions
Renamed all metric names from drf_api_* to drf_api_logger_* to match the package name and prevent conflicts with custom application metrics. https://claude.ai/code/session_01Xm34otsnCyKstNXxvzgABT
1 parent 13ee15d commit 305f846

3 files changed

Lines changed: 43 additions & 43 deletions

File tree

README.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -403,31 +403,31 @@ urlpatterns = [
403403

404404
```
405405
# Total request and error counts
406-
drf_api_requests_total 15234
407-
drf_api_errors_total 342
408-
drf_api_error_rate_pct 2.24
406+
drf_api_logger_requests_total 15234
407+
drf_api_logger_errors_total 342
408+
drf_api_logger_error_rate_pct 2.24
409409
410410
# Status code distribution
411-
drf_api_responses_total{range="2xx"} 14892
412-
drf_api_responses_total{range="4xx"} 298
413-
drf_api_responses_total{range="5xx"} 44
411+
drf_api_logger_responses_total{range="2xx"} 14892
412+
drf_api_logger_responses_total{range="4xx"} 298
413+
drf_api_logger_responses_total{range="5xx"} 44
414414
415415
# Latency
416-
drf_api_latency_avg_ms 45.2
417-
drf_api_latency_max_ms 3200.5
416+
drf_api_logger_latency_avg_ms 45.2
417+
drf_api_logger_latency_max_ms 3200.5
418418
419419
# Per-method breakdown
420-
drf_api_requests_by_method{method="GET"} 10234
421-
drf_api_requests_by_method{method="POST"} 4100
420+
drf_api_logger_requests_by_method{method="GET"} 10234
421+
drf_api_logger_requests_by_method{method="POST"} 4100
422422
423423
# Per-endpoint stats
424-
drf_api_endpoint_requests{endpoint="/api/users/"} 5200
425-
drf_api_endpoint_errors{endpoint="/api/users/"} 12
426-
drf_api_endpoint_latency_avg_ms{endpoint="/api/users/"} 32.1
424+
drf_api_logger_endpoint_requests{endpoint="/api/users/"} 5200
425+
drf_api_logger_endpoint_errors{endpoint="/api/users/"} 12
426+
drf_api_logger_endpoint_latency_avg_ms{endpoint="/api/users/"} 32.1
427427
428428
# Error types
429-
drf_api_errors_by_type{type="NotFound"} 200
430-
drf_api_errors_by_type{type="Unauthorized"} 98
429+
drf_api_logger_errors_by_type{type="NotFound"} 200
430+
drf_api_logger_errors_by_type{type="Unauthorized"} 98
431431
```
432432

433433
**Prometheus scrape config:**

drf_api_logger/metrics.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -90,45 +90,45 @@ def get_metrics():
9090
def format_prometheus():
9191
m = get_metrics()
9292
lines = []
93-
lines.append('# HELP drf_api_requests_total Total API requests')
94-
lines.append('# TYPE drf_api_requests_total counter')
95-
lines.append('drf_api_requests_total {}'.format(m['counters']['request_total']))
93+
lines.append('# HELP drf_api_logger_requests_total Total API requests')
94+
lines.append('# TYPE drf_api_logger_requests_total counter')
95+
lines.append('drf_api_logger_requests_total {}'.format(m['counters']['request_total']))
9696

97-
lines.append('# HELP drf_api_errors_total Total API errors (4xx + 5xx)')
98-
lines.append('# TYPE drf_api_errors_total counter')
99-
lines.append('drf_api_errors_total {}'.format(m['counters']['error_total']))
97+
lines.append('# HELP drf_api_logger_errors_total Total API errors (4xx + 5xx)')
98+
lines.append('# TYPE drf_api_logger_errors_total counter')
99+
lines.append('drf_api_logger_errors_total {}'.format(m['counters']['error_total']))
100100

101-
lines.append('# HELP drf_api_error_rate_pct Error rate percentage')
102-
lines.append('# TYPE drf_api_error_rate_pct gauge')
103-
lines.append('drf_api_error_rate_pct {}'.format(m['error_rate_pct']))
101+
lines.append('# HELP drf_api_logger_error_rate_pct Error rate percentage')
102+
lines.append('# TYPE drf_api_logger_error_rate_pct gauge')
103+
lines.append('drf_api_logger_error_rate_pct {}'.format(m['error_rate_pct']))
104104

105105
for status_key in ['status_2xx', 'status_3xx', 'status_4xx', 'status_5xx']:
106106
code_range = status_key.replace('status_', '')
107-
lines.append('drf_api_responses_total{{range="{}"}} {}'.format(
107+
lines.append('drf_api_logger_responses_total{{range="{}"}} {}'.format(
108108
code_range, m['counters'][status_key]
109109
))
110110

111-
lines.append('# HELP drf_api_latency_avg_ms Average request latency in milliseconds')
112-
lines.append('# TYPE drf_api_latency_avg_ms gauge')
113-
lines.append('drf_api_latency_avg_ms {}'.format(m['latency']['avg_ms']))
111+
lines.append('# HELP drf_api_logger_latency_avg_ms Average request latency in milliseconds')
112+
lines.append('# TYPE drf_api_logger_latency_avg_ms gauge')
113+
lines.append('drf_api_logger_latency_avg_ms {}'.format(m['latency']['avg_ms']))
114114

115-
lines.append('# HELP drf_api_latency_max_ms Maximum request latency in milliseconds')
116-
lines.append('# TYPE drf_api_latency_max_ms gauge')
117-
lines.append('drf_api_latency_max_ms {}'.format(m['latency']['max_ms']))
115+
lines.append('# HELP drf_api_logger_latency_max_ms Maximum request latency in milliseconds')
116+
lines.append('# TYPE drf_api_logger_latency_max_ms gauge')
117+
lines.append('drf_api_logger_latency_max_ms {}'.format(m['latency']['max_ms']))
118118

119119
for method, count in m['per_method'].items():
120-
lines.append('drf_api_requests_by_method{{method="{}"}} {}'.format(method, count))
120+
lines.append('drf_api_logger_requests_by_method{{method="{}"}} {}'.format(method, count))
121121

122122
for error_type, count in m['per_error_type'].items():
123123
safe_type = error_type.replace('"', '\\"')
124-
lines.append('drf_api_errors_by_type{{type="{}"}} {}'.format(safe_type, count))
124+
lines.append('drf_api_logger_errors_by_type{{type="{}"}} {}'.format(safe_type, count))
125125

126126
for endpoint, stats in sorted(m['per_endpoint'].items(), key=lambda x: -x[1]['count'])[:50]:
127127
safe_ep = endpoint.replace('"', '\\"')
128128
avg_ms = round((stats['latency_sum'] / stats['count']) * 1000, 3) if stats['count'] > 0 else 0
129-
lines.append('drf_api_endpoint_requests{{endpoint="{}"}} {}'.format(safe_ep, stats['count']))
130-
lines.append('drf_api_endpoint_errors{{endpoint="{}"}} {}'.format(safe_ep, stats['errors']))
131-
lines.append('drf_api_endpoint_latency_avg_ms{{endpoint="{}"}} {}'.format(safe_ep, avg_ms))
129+
lines.append('drf_api_logger_endpoint_requests{{endpoint="{}"}} {}'.format(safe_ep, stats['count']))
130+
lines.append('drf_api_logger_endpoint_errors{{endpoint="{}"}} {}'.format(safe_ep, stats['errors']))
131+
lines.append('drf_api_logger_endpoint_latency_avg_ms{{endpoint="{}"}} {}'.format(safe_ep, avg_ms))
132132

133133
return '\n'.join(lines) + '\n'
134134

tests/test_metrics.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ def tearDown(self):
122122

123123
def test_format_empty(self):
124124
output = format_prometheus()
125-
self.assertIn('drf_api_requests_total 0', output)
126-
self.assertIn('drf_api_errors_total 0', output)
125+
self.assertIn('drf_api_logger_requests_total 0', output)
126+
self.assertIn('drf_api_logger_errors_total 0', output)
127127

128128
def test_format_with_data(self):
129129
record_request({
@@ -135,10 +135,10 @@ def test_format_with_data(self):
135135
'execution_time': 0.02, 'error_type': 'BadRequest',
136136
})
137137
output = format_prometheus()
138-
self.assertIn('drf_api_requests_total 2', output)
139-
self.assertIn('drf_api_errors_total 1', output)
140-
self.assertIn('drf_api_latency_avg_ms', output)
141-
self.assertIn('drf_api_latency_max_ms', output)
138+
self.assertIn('drf_api_logger_requests_total 2', output)
139+
self.assertIn('drf_api_logger_errors_total 1', output)
140+
self.assertIn('drf_api_logger_latency_avg_ms', output)
141+
self.assertIn('drf_api_logger_latency_max_ms', output)
142142
self.assertIn('method="GET"', output)
143143
self.assertIn('method="POST"', output)
144144
self.assertIn('type="BadRequest"', output)
@@ -175,7 +175,7 @@ def test_prometheus_view(self):
175175
response = metrics_prometheus(request)
176176
self.assertEqual(response.status_code, 200)
177177
self.assertIn('text/plain', response['Content-Type'])
178-
self.assertIn('drf_api_requests_total 1', response.content.decode())
178+
self.assertIn('drf_api_logger_requests_total 1', response.content.decode())
179179

180180

181181
class TestMiddlewareMetricsIntegration(TestCase):

0 commit comments

Comments
 (0)