Skip to content

Commit

Permalink
Fix #24.
Browse files Browse the repository at this point in the history
  • Loading branch information
n0nuser committed Mar 22, 2022
1 parent a170128 commit 865cf0c
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 107 deletions.
52 changes: 26 additions & 26 deletions monitor_agent/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from .core.command import Command

try:
config_file = Settings()
config = Settings()
except json.decoder.JSONDecodeError as msg:
print('Error in "settings.json".', msg, file=sys.stderr)
exit()
Expand Down Expand Up @@ -46,10 +46,10 @@ async def thresholds():
async def mod_settings():
# if token:
# blablabla
return config_file.read_settings_file(config_file.abs_file_path)
return config.read_settings_file(config.abs_file_path)


if config_file.metric_endpoint:
if config.metrics.get_endpoint:

@api.get(endpoints["metrics"])
async def metrics_endpoint():
Expand All @@ -70,7 +70,7 @@ async def mod_settings(settings: UploadFile):
# if token:
# blablabla
data: str = settings.file.read().decode()
return config_file.write_settings(data)
return config.write_settings(data)


@api.post(endpoints["thresholds"])
Expand All @@ -86,18 +86,18 @@ async def mod_settings(


@api.on_event("startup")
@repeat_every(seconds=config_file.post_interval, logger=logger, wait_first=True)
@repeat_every(seconds=config.metrics.post_interval, logger=logger, wait_first=True)
def periodic():
# https://github.com/tiangolo/fastapi/issues/520
# https://fastapi-utils.davidmontague.xyz/user-guide/repeated-tasks/#the-repeat_every-decorator
# Changed Timeloop for this
elapsed_time, data = send_metrics_adapter([static, dynamic])
send_metrics(
url=config_file.post_metric_url,
url=config.metrics.post_url,
elapsed_time=elapsed_time,
data=data,
file_enabled=config_file.metric_enable_file,
file_path=config_file.metric_file,
file_enabled=config.metrics.enable_logfile,
file_path=config.metrics.log_filename,
)
alert = {}
if data["cpu_percent"] >= thresholds["cpu_percent"]:
Expand All @@ -107,29 +107,29 @@ def periodic():
if data["process"]:
alert["processes"] = data["process"]
if alert:
r = requests.post(config_file.alert_url, json={"alert": alert})
r = requests.post(config.alerts.url, json={"alert": alert})


def start():
"""Launched with `poetry run start` at root level"""
uvicorn.run(
"monitor_agent.main:api",
host=config_file.host,
port=config_file.port,
reload=config_file.reload,
workers=config_file.workers,
log_level=config_file.log_level,
host=config.uvicorn.host,
port=config.uvicorn.port,
reload=config.uvicorn.reload,
workers=config.uvicorn.workers,
log_level=config.uvicorn.log_level,
interface="asgi3",
debug=config_file.debug,
backlog=config_file.backlog,
timeout_keep_alive=config_file.timeout_keep_alive,
limit_concurrency=config_file.limit_concurrency,
limit_max_requests=config_file.limit_max_requests,
ssl_keyfile=config_file.ssl_keyfile,
ssl_keyfile_password=config_file.ssl_keyfile_password,
ssl_certfile=config_file.ssl_certfile,
ssl_version=config_file.ssl_version,
ssl_cert_reqs=config_file.ssl_cert_reqs,
ssl_ca_certs=config_file.ssl_ca_certs,
ssl_ciphers=config_file.ssl_ciphers,
debug=config.uvicorn.debug,
backlog=config.uvicorn.backlog,
timeout_keep_alive=config.uvicorn.timeout_keep_alive,
limit_concurrency=config.uvicorn.limit_concurrency,
limit_max_requests=config.uvicorn.limit_max_requests,
ssl_keyfile=config.uvicorn.ssl_keyfile,
ssl_keyfile_password=config.uvicorn.ssl_keyfile_password,
ssl_certfile=config.uvicorn.ssl_certfile,
ssl_version=config.uvicorn.ssl_version,
ssl_cert_reqs=config.uvicorn.ssl_cert_reqs,
ssl_ca_certs=config.uvicorn.ssl_ca_certs,
ssl_ciphers=config.uvicorn.ssl_ciphers,
)
52 changes: 29 additions & 23 deletions monitor_agent/settings.json
Original file line number Diff line number Diff line change
@@ -1,25 +1,31 @@
{
"alert_url": "",
"backlog": 2048,
"debug": true,
"host": "0.0.0.0",
"limit_concurrency": null,
"limit_max_requests": null,
"log_level": "trace",
"metric_enable_file": false,
"metric_endpoint": true,
"metric_file": "metrics.json",
"port": 8000,
"post_interval": 60,
"post_metric_url": "http://httpbin.org/post",
"reload": true,
"ssl_ca_certs": null,
"ssl_cert_reqs": null,
"ssl_certfile": null,
"ssl_ciphers": null,
"ssl_keyfile": null,
"ssl_keyfile_password": null,
"ssl_version": null,
"timeout_keep_alive": 5,
"workers": 4
"uvicorn": {
"host":"0.0.0.0",
"port":8000,
"workers":4,
"reload":true,
"debug":true,
"log_level":"trace",
"ssl_keyfile":null,
"ssl_keyfile_password":null,
"ssl_certfile":"None",
"ssl_version":3,
"ssl_cert_reqs":null,
"ssl_ca_certs":null,
"ssl_ciphers":"TLSv1",
"limit_concurrency":null,
"limit_max_requests":null,
"backlog":2048,
"timeout_keep_alive":5
},
"metrics": {
"get_endpoint":true,
"post_url":"http://httpbin.org/post",
"post_interval":60,
"enable_logfile":false,
"log_filename":"metrics.json"
},
"alerts":{
"url":"127.0.0.1:8000/alerts"
}
}
65 changes: 7 additions & 58 deletions monitor_agent/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,6 @@
import sys
import json

main_parameters = [
"host",
"port",
"workers",
"reload",
"debug",
"log_level",
"backlog",
"timeout_keep_alive",
"metric_endpoint",
"post_metric_url",
"post_interval",
"metric_enable_file",
"metric_file",
"alert_url",
]

optional_parameters = [
"ssl_keyfile",
"ssl_keyfile_password",
"ssl_certfile",
"ssl_version",
"ssl_cert_reqs",
"ssl_ca_certs",
"ssl_ciphers",
"limit_concurrency",
"limit_max_requests",
]

config_parameters = main_parameters + optional_parameters
rel_path = "settings.json"
dir = os.path.dirname(__file__) # <-- absolute dir the script is in
abs_file_path = os.path.join(dir, rel_path)
Expand All @@ -46,8 +16,8 @@ def _read_settings_file(self):
try:
f = open(abs_file_path, "r")
data = f.read()
data_dict = _validate_json(data)
data_str, data_dict = _format_json_file(data_dict, abs_file_path)
data_dict = json.loads(data)
data_str, data_dict = _write_file(data_dict, abs_file_path)
except (json.JSONDecodeError, ValueError, FileNotFoundError) as msg:
print(msg, file=sys.stderr)
exit()
Expand All @@ -56,8 +26,8 @@ def _read_settings_file(self):

def write_settings(self, data: str):
try:
data_dict = _validate_json(data)
data_str, data_dict = _format_json_file(data_dict, abs_file_path)
data_dict = json.loads(data)
data_str, data_dict = _write_file(data_dict, abs_file_path)
except (json.JSONDecodeError, ValueError) as msg:
return {"status": f"Error: {msg}", "data": data}

Expand All @@ -77,29 +47,8 @@ def dict_keys_iterator(dictionary: dict):
yield key


def _validate_json(data: str):
data_dict = json.loads(data)

keys = [key for key in dict_keys_iterator(data_dict)]

diff_total = list(set(keys) - set(config_parameters))
if len(diff_total) > 0:
raise ValueError(f"Config file contains invalid parameters: {diff_total}")

diff_main = list(set(main_parameters) - set(keys))
if len(diff_main) > 0:
raise ValueError(f"Config file does not contain main parameters: {diff_main}")
return data_dict

# Need to validate type of data


def _format_json_file(data: dict, path: str):
data_dict = data.copy()
for key in optional_parameters:
if key not in data_dict.keys():
data_dict[key] = None
def _write_file(data: dict, path: str):
f = open(path, "w")
data_str: str = json.dumps(data_dict, indent=4, sort_keys=True)
data_str: str = json.dumps(data, indent=4, sort_keys=True)
f.write(data_str)
return data_str, data_dict
return data_str, data

0 comments on commit 865cf0c

Please sign in to comment.