feat: Add Prometheus metrics for requests

Adds gauge for requests by type and status

Signed-off-by: moson <moson@archlinux.org>
This commit is contained in:
moson 2023-07-23 22:46:44 +02:00
parent e45878a058
commit 375895f080
No known key found for this signature in database
GPG key ID: 4A4760AB4EE15296
3 changed files with 31 additions and 3 deletions

View file

@ -24,6 +24,12 @@ PACKAGES = Gauge(
["state"],
multiprocess_mode="livemax",
)
REQUESTS = Gauge(
"aur_requests",
"Number of AUR requests by type and status",
["type", "status"],
multiprocess_mode="livemax",
)
def instrumentator():

View file

@ -1,6 +1,8 @@
from sqlalchemy import func
from aurweb import config, db, time
from aurweb.cache import db_count_cache
from aurweb.models import PackageBase, PackageRequest, User
from aurweb.cache import db_count_cache, db_query_cache
from aurweb.models import PackageBase, PackageRequest, RequestType, User
from aurweb.models.account_type import TRUSTED_USER_AND_DEV_ID, TRUSTED_USER_ID, USER_ID
from aurweb.models.package_request import (
ACCEPTED_ID,
@ -8,7 +10,7 @@ from aurweb.models.package_request import (
PENDING_ID,
REJECTED_ID,
)
from aurweb.prometheus import PACKAGES, USERS
from aurweb.prometheus import PACKAGES, REQUESTS, USERS
cache_expire = config.getint("cache", "expiry_time_statistics", 300)
@ -131,6 +133,20 @@ def update_prometheus_metrics():
count = stats.get_count(counter)
PACKAGES.labels(state).set(count)
# Requests gauge
query = (
db.get_session()
.query(PackageRequest, func.count(PackageRequest.ID), RequestType.Name)
.join(RequestType)
.group_by(RequestType.Name, PackageRequest.Status)
)
results = db_query_cache("request_metrics", query, cache_expire)
for record in results:
status = record[0].status_display()
count = record[1]
rtype = record[2]
REQUESTS.labels(type=rtype, status=status).set(count)
def _get_counts(counters: list[str]) -> dict[str, int]:
stats = Statistics(cache_expire)

View file

@ -144,6 +144,7 @@ def test_update_prometheus_metrics(test_data):
assert "aur_users{" not in metrics
assert "aur_packages{" not in metrics
assert "aur_requests{" not in metrics
# Let's update our metrics. We should find our gauges now
update_prometheus_metrics()
@ -151,3 +152,8 @@ def test_update_prometheus_metrics(test_data):
assert 'aur_users{type="user"} 9.0' in metrics
assert 'aur_packages{state="updated"} 9.0' in metrics
assert 'aur_requests{status="Pending",type="orphan"} 6.0' in metrics
assert 'aur_requests{status="Closed",type="orphan"} 1.0' in metrics
assert 'aur_requests{status="Accepted",type="orphan"} 1.0' in metrics
assert 'aur_requests{status="Rejected",type="orphan"} 1.0' in metrics
assert 'aur_requests{status="Pending",type="deletion"} 1.0' in metrics