Add Prometheus-backed home server status
This commit is contained in:
+113
@@ -1939,3 +1939,116 @@ def hardcore_leaderboard_points_combined():
|
||||
return jsonify(rows[:100])
|
||||
|
||||
# --- end Hardcore stats aggregator -------------------------------------------
|
||||
|
||||
|
||||
@app.get("/api/server-status")
|
||||
def public_server_status():
|
||||
import json
|
||||
import os
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
|
||||
prometheus_url = os.environ.get("PROMETHEUS_URL", "http://5.0.0.20:9090").rstrip("/")
|
||||
|
||||
def prom_value(query):
|
||||
url = prometheus_url + "/api/v1/query?" + urllib.parse.urlencode({"query": query})
|
||||
try:
|
||||
with urllib.request.urlopen(url, timeout=2.5) as resp:
|
||||
data = json.loads(resp.read().decode("utf-8"))
|
||||
except Exception:
|
||||
return 0
|
||||
|
||||
if data.get("status") != "success":
|
||||
return 0
|
||||
|
||||
total = 0.0
|
||||
for result in data.get("data", {}).get("result", []):
|
||||
value = result.get("value", [None, "0"])[1]
|
||||
try:
|
||||
total += float(value)
|
||||
except (TypeError, ValueError):
|
||||
pass
|
||||
|
||||
return int(total)
|
||||
|
||||
def q(metric, labels):
|
||||
label_text = ",".join(f'{k}="{v}"' for k, v in labels.items())
|
||||
return f'sum({metric}{{{label_text}}}) or vector(0)'
|
||||
|
||||
def newserv(region, service, ship, version):
|
||||
return prom_value(q("pso_newserv_clients_connected", {
|
||||
"region": region,
|
||||
"service": service,
|
||||
"ship": ship,
|
||||
"version": version,
|
||||
}))
|
||||
|
||||
def adhoc(region, game):
|
||||
return prom_value(q("psppeeps_adhoc_connected_clients_by_product", {
|
||||
"region": region,
|
||||
"service": f"{region}-psppeeps-adhoc",
|
||||
"ship": "psp",
|
||||
"game": game,
|
||||
}))
|
||||
|
||||
us = {
|
||||
"alis_v2": newserv("us", "us-newserv-live", "live", "v2"),
|
||||
"alis_v3": newserv("us", "us-newserv-live", "live", "v3"),
|
||||
"alis_bb": newserv("us", "us-newserv-live", "live", "v4"),
|
||||
"abion_hcbb": newserv("us", "us-newserv-hardcore", "hardcore", "v4"),
|
||||
"adhoc_psp1": adhoc("us", "psp1"),
|
||||
"adhoc_psp2i": adhoc("us", "psp2i"),
|
||||
}
|
||||
|
||||
eu = {
|
||||
"palma_v2": newserv("eu", "eu-newserv-live", "live", "v2"),
|
||||
"palma_v3": newserv("eu", "eu-newserv-live", "live", "v3"),
|
||||
"palma_bb": newserv("eu", "eu-newserv-live", "live", "v4"),
|
||||
"aiedo_hcbb": newserv("eu", "eu-newserv-hardcore", "hardcore", "v4"),
|
||||
"adhoc_psp1": adhoc("eu", "psp1"),
|
||||
"adhoc_psp2i": adhoc("eu", "psp2i"),
|
||||
}
|
||||
|
||||
us_total = sum(us.values())
|
||||
eu_total = sum(eu.values())
|
||||
|
||||
return jsonify({
|
||||
"servers": [
|
||||
{
|
||||
"label": "US Server",
|
||||
"players": us_total,
|
||||
"ships": [
|
||||
{"label": "Alis", "rows": [
|
||||
{"label": "V2", "players": us["alis_v2"]},
|
||||
{"label": "V3", "players": us["alis_v3"]},
|
||||
{"label": "BB", "players": us["alis_bb"]},
|
||||
]},
|
||||
{"label": "Abion", "rows": [
|
||||
{"label": "HC/BB", "players": us["abion_hcbb"]},
|
||||
]},
|
||||
{"label": "AdHoc-US", "rows": [
|
||||
{"label": "PSP1", "players": us["adhoc_psp1"]},
|
||||
{"label": "PSP2i", "players": us["adhoc_psp2i"]},
|
||||
]},
|
||||
],
|
||||
},
|
||||
{
|
||||
"label": "EU Server",
|
||||
"players": eu_total,
|
||||
"ships": [
|
||||
{"label": "Palma", "rows": [
|
||||
{"label": "V2", "players": eu["palma_v2"]},
|
||||
{"label": "V3", "players": eu["palma_v3"]},
|
||||
{"label": "BB", "players": eu["palma_bb"]},
|
||||
]},
|
||||
{"label": "Aiedo", "rows": [
|
||||
{"label": "HC/BB", "players": eu["aiedo_hcbb"]},
|
||||
]},
|
||||
{"label": "AdHoc-EU", "rows": [
|
||||
{"label": "PSP1", "players": eu["adhoc_psp1"]},
|
||||
{"label": "PSP2i", "players": eu["adhoc_psp2i"]},
|
||||
]},
|
||||
],
|
||||
},
|
||||
],
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user