100 lines
4.5 KiB
Python
100 lines
4.5 KiB
Python
# prometheus.py
|
|
# Used for providing metrics to Prometheus
|
|
# https://prometheus.io/docs/instrumenting/writing_exporters/
|
|
|
|
import time
|
|
from flask import Blueprint, Response, abort
|
|
from datetime import datetime, timedelta
|
|
from sqlalchemy import func
|
|
|
|
from app.models.user import User
|
|
from app.models.placeserver_players import PlaceServerPlayer
|
|
from app.models.placeservers import PlaceServer
|
|
from app.models.gameservers import GameServer
|
|
from app.models.game_session_log import GameSessionLog
|
|
from app.models.asset import Asset
|
|
|
|
from app.extensions import get_remote_address
|
|
from config import Config
|
|
|
|
config = Config()
|
|
|
|
PrometheusRoute = Blueprint('prometheus', __name__, url_prefix='/')
|
|
|
|
@PrometheusRoute.before_request
|
|
def before_request():
|
|
if not config.PROMETHEUS_ENABLED:
|
|
return abort( 404 )
|
|
ClientRemoteAddress = get_remote_address()
|
|
if ClientRemoteAddress not in config.PROMETHEUS_ALLOWED_IPS:
|
|
return abort( 404 )
|
|
|
|
|
|
@PrometheusRoute.route('/metrics', methods=['GET'])
|
|
def metrics():
|
|
StartingMeasureTime = time.time()
|
|
|
|
UsersOnlineCount = User.query.filter(User.lastonline > (datetime.utcnow() - timedelta(minutes=1))).count()
|
|
UsersIngame = PlaceServerPlayer.query.count()
|
|
UsersInReservedServers = PlaceServerPlayer.query.join( PlaceServer, PlaceServerPlayer.serveruuid == PlaceServer.serveruuid ).filter(PlaceServer.reservedServerAccessCode != None).count()
|
|
ActivePlaceServers = PlaceServer.query.count()
|
|
ActiveReservedPlaceServers = PlaceServer.query.filter(PlaceServer.reservedServerAccessCode != None).count()
|
|
UsersSignedUpPast24Hours = User.query.filter(User.created > (datetime.utcnow() - timedelta(days=1))).count()
|
|
GameServersTotalMemoryUsage = GameServer.query.with_entities( func.sum(GameServer.RCCmemoryUsage) ).scalar() # Megabytes
|
|
UniqueGameSessionsPast24Hours = GameSessionLog.query.filter(GameSessionLog.joined_at > (datetime.utcnow() - timedelta(days=1))).distinct(GameSessionLog.user_id).count()
|
|
GameSessionsPast24Hours = GameSessionLog.query.filter(GameSessionLog.joined_at > (datetime.utcnow() - timedelta(days=1))).count()
|
|
TotalUsersSignedUp = User.query.count()
|
|
TotalAssets = Asset.query.count()
|
|
|
|
TimeTaken = time.time() - StartingMeasureTime
|
|
|
|
PROMETHEUS_RESPONSE = f"""# HELP syntaxeco_users_online The number of users currently online
|
|
# TYPE syntaxeco_users_online gauge
|
|
syntaxeco_users_online {UsersOnlineCount}
|
|
|
|
# HELP syntaxeco_users_ingame The number of users currently in a game
|
|
# TYPE syntaxeco_users_ingame gauge
|
|
syntaxeco_users_ingame {UsersIngame}
|
|
|
|
# HELP syntaxeco_active_placeservers The number of active place servers
|
|
# TYPE syntaxeco_active_placeservers gauge
|
|
syntaxeco_active_placeservers {ActivePlaceServers}
|
|
|
|
# HELP syntaxeco_active_reserved_placeservers The number of active reserved place servers
|
|
# TYPE syntaxeco_active_reserved_placeservers gauge
|
|
syntaxeco_active_reserved_placeservers {ActiveReservedPlaceServers}
|
|
|
|
# HELP syntaxeco_users_in_reserved_servers The number of users currently in reserved servers
|
|
# TYPE syntaxeco_users_in_reserved_servers gauge
|
|
syntaxeco_users_in_reserved_servers {UsersInReservedServers}
|
|
|
|
# HELP syntaxeco_users_signed_up_past_24_hours The number of users that signed up in the past 24 hours
|
|
# TYPE syntaxeco_users_signed_up_past_24_hours gauge
|
|
syntaxeco_users_signed_up_past_24_hours {UsersSignedUpPast24Hours}
|
|
|
|
# HELP syntaxeco_gameservers_total_memory_usage The total memory usage of all game servers
|
|
# TYPE syntaxeco_gameservers_total_memory_usage gauge
|
|
syntaxeco_gameservers_total_memory_usage {GameServersTotalMemoryUsage}
|
|
|
|
# HELP syntaxeco_unique_gamesessions_past_24_hours The number of unique game sessions in the past 24 hours
|
|
# TYPE syntaxeco_unique_gamesessions_past_24_hours gauge
|
|
syntaxeco_unique_gamesessions_past_24_hours {UniqueGameSessionsPast24Hours}
|
|
|
|
# HELP syntaxeco_gamesessions_past_24_hours The number of game sessions in the past 24 hours
|
|
# TYPE syntaxeco_gamesessions_past_24_hours gauge
|
|
syntaxeco_gamesessions_past_24_hours {GameSessionsPast24Hours}
|
|
|
|
# HELP syntaxeco_total_users_signed_up The total number of users that have signed up
|
|
# TYPE syntaxeco_total_users_signed_up gauge
|
|
syntaxeco_total_users_signed_up {TotalUsersSignedUp}
|
|
|
|
# HELP syntaxeco_total_assets The total number of assets
|
|
# TYPE syntaxeco_total_assets gauge
|
|
syntaxeco_total_assets {TotalAssets}
|
|
|
|
# HELP syntaxeco_prometheus_request_time The time taken to generate the Prometheus metrics
|
|
# TYPE syntaxeco_prometheus_request_time gauge
|
|
syntaxeco_prometheus_request_time {TimeTaken}
|
|
"""
|
|
|
|
return Response(PROMETHEUS_RESPONSE, mimetype="text/plain") |