Skip to content

Commit 9ed5e1e

Browse files
authored
Merge pull request #11 from Minei3oat/metrics
Add prometheus metrics endpoint for nfregexes
2 parents a8dc0ba + 71d3019 commit 9ed5e1e

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

backend/routers/nfregex.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import re
33
import secrets
44
import sqlite3
5-
from fastapi import APIRouter, HTTPException
5+
from fastapi import APIRouter, Response, HTTPException
66
from pydantic import BaseModel
77
from modules.nfregex.nftables import FiregexTables
88
from modules.nfregex.firewall import STATUS, FirewallManager
@@ -275,3 +275,26 @@ async def add_new_service(form: ServiceAddForm):
275275
await firewall.reload()
276276
await refresh_frontend()
277277
return {'status': 'ok', 'service_id': srv_id}
278+
279+
@app.get('/metrics', response_class = Response)
280+
async def metrics():
281+
"""Aggregate metrics"""
282+
stats = db.query("""
283+
SELECT
284+
s.name,
285+
s.status,
286+
r.regex,
287+
r.is_blacklist,
288+
r.mode,
289+
r.is_case_sensitive,
290+
r.blocked_packets,
291+
r.active
292+
FROM regexes r LEFT JOIN services s ON s.service_id = r.service_id;
293+
""")
294+
metrics = []
295+
sanitize = lambda s : s.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n')
296+
for stat in stats:
297+
props = f'service_name="{sanitize(stat["name"])}",regex="{sanitize(b64decode(stat["regex"]).decode())}",mode="{stat["mode"]}",is_case_sensitive="{stat["is_case_sensitive"]}"'
298+
metrics.append(f'firegex_blocked_packets{{{props}}} {stat["blocked_packets"]}')
299+
metrics.append(f'firegex_active{{{props}}} {int(stat["active"] and stat["status"] == "active")}')
300+
return "\n".join(metrics)

0 commit comments

Comments
 (0)