Source code for acore_server_monitoring_measurement.cron_job

# -*- coding: utf-8 -*-

"""
Implement Cron job running on worldserver EC2 instance.
"""

from pathlib import Path

import pynamodb_mate.api as pm
from simple_aws_ec2.api import EC2MetadataCache
from acore_constants.api import TagKey
from acore_server_metadata.api import Server

from .utils import every
from .paths import path_env_name_cache
from .localmetry import WorldServerStatusMeasurement as Base


[docs]def ensure_ec2_environment(): # pragma: no cover """ Ensure all functions in this module is running inside EC2 environment. """ if ( Path("/home/ubuntu").exists() and Path( "/home/ubuntu/git_repos/acore_server_monitoring_measurement-project/acore_server_monitoring_measurement/cron_job.py" ).exists() ): pass else: raise EnvironmentError("You cannot run this outside of EC2 environment")
def get_env_name() -> str: try: env_name = path_env_name_cache.read_text() except FileNotFoundError: # pragma: no cover server = Server.from_ec2_inside() env_name = server.env_name path_env_name_cache.write_text(env_name) return env_name
[docs]def run_measure_worldserver_cron_job( delay: int = 300, verbose: bool = True, ): """ Measure the worldserver status every 5 minutes. """ if delay % 60 != 0: raise ValueError("delay must be a multiple of 60") ensure_ec2_environment() env_name = get_env_name() class WorldServerStatusMeasurement(Base): class Meta: table_name = f"wserver_infra-{env_name}-server_monitoring" region = "us-east-1" billing_mode = pm.constants.PAY_PER_REQUEST_BILLING_MODE for _ in every(seconds=delay, verbose=verbose): WorldServerStatusMeasurement.measure_on_worldserver_ec2()
[docs]def run_log_to_ec2_tag_cron_job( delay: int = 60, verbose: bool = True, ): """ Put worldserver status measurement to EC2 tags every 1 minutes. """ if delay % 60 != 0: raise ValueError("delay must be a multiple of 60") ensure_ec2_environment() WorldServerStatusMeasurement = Base for _ in every(seconds=delay, verbose=verbose): measurement = WorldServerStatusMeasurement.measure_on_worldserver_ec2( save=False ) tags = { TagKey.WORLDSERVER_MEASURE_TIME: measurement.create_at.isoformat(), TagKey.WORLDSERVER_IS_RDS_EXISTS: str(measurement.is_rds_exists), TagKey.WORLDSERVER_IS_RDS_RUNNING: str(measurement.is_rds_running), TagKey.WORLDSERVER_RDS_STATUS: str(measurement.rds_status), TagKey.WORLDSERVER_CONNECTED_PLAYERS: str(measurement.connected_players), TagKey.WORLDSERVER_CHARACTERS_IN_WORLD: str( measurement.characters_in_world ), TagKey.WORLDSERVER_SERVER_UPTIME: str(measurement.server_uptime), TagKey.WORLDSERVER_CPU_USAGE: str(measurement.cpu_usage), TagKey.WORLDSERVER_MEMORY_USAGE: str(measurement.memory_usage), TagKey.WORLDSERVER_TOTAL_MEMORY: str(measurement.total_memory), TagKey.WORLDSERVER_AVAILABLE_MEMORY: str(measurement.available_memory), } ec2_metadata_cache = EC2MetadataCache.load() instance_id = ec2_metadata_cache.get_instance_id() boto_ses = ec2_metadata_cache.get_boto_ses_from_ec2_inside() ec2_client = boto_ses.client("ec2") ec2_client.create_tags( Resources=[instance_id], Tags=[dict(Key=k, Value=v) for k, v in tags.items()], )