alert-autoconf
118 строк · 3.7 Кб
1#!/usr/bin/env python3
2
3import os4import argparse5import logging6import pkg_resources7
8from collections import ChainMap9
10from redis import Redis11
12from alert_autoconf import LOG_FORMAT, LOG_LEVEL13from alert_autoconf import config14from alert_autoconf import defaults15from alert_autoconf import teamcity16from alert_autoconf.moira import MoiraAlert17from moira_client import Moira18from moira_client import RetryPolicy19
20
21def parse_params() -> dict:22"""23Разбор параметров из командной строки
24:return: набор параметров
25"""
26parser = argparse.ArgumentParser(add_help=True)27defaults = {28"url": "localhost",29"config": "etc/example.yaml",30"log_level": LOG_LEVEL,31"user": None,32"password": None,33"token": None,34"redis_token_storage": None,35}36
37parser.add_argument(38"-c", "--config", help="Path to trigger description", required=False39)40parser.add_argument("-u", "--url", help="Alerting system api url", required=False)41parser.add_argument("-l", "--log-level", help="Log level.", required=False)42parser.add_argument("-U", "--user", help="User name.", required=False)43parser.add_argument("-p", "--password", help="User password.", required=False)44parser.add_argument("-t", "--token", help="Triggers token.", required=False)45parser.add_argument(46"-s", "--redis_token_storage", help="Token storage.", required=True47)48parser.add_argument(49"-C", "--cluster",50help="Cluster name. If specified, {cluster} will be replaced with this name.",51required=False,52)53
54namespace = parser.parse_args()55if namespace.token is None:56if namespace.cluster is None:57parser.error("At least one of -t/--token and -C/--cluster is required")58namespace.token = "kubernetes:{}".format(namespace.cluster)59command_line_args = {k: v for k, v in vars(namespace).items() if v}60
61return ChainMap(command_line_args, os.environ, defaults)62
63
64def main():65logging.basicConfig(level=logging.getLevelName(LOG_LEVEL), format=LOG_FORMAT)66
67logger = logging.getLogger("alert")68
69params = parse_params()70
71log_level = params["log_level"].upper()72if LOG_LEVEL != log_level:73logger.setLevel(logging.getLevelName(log_level))74
75# urllib3 logging is too verbose, set it at WARNING or more76loglevel_as_int = logging._nameToLevel[log_level.upper()]77# `loglevel_as_int` is 50 for CRITICAL, 10 for DEBUG78logging.getLogger("urllib3").setLevel(max(logging.WARNING, loglevel_as_int))79# after this line, the loglevel for urllib3 is CRITICAL, ERROR or WARNING80
81if not params["url"].startswith("http://"):82params["url"] = "{}{}".format("http://", params["url"])83
84moira = Moira(85params["url"],86auth_user=params["user"],87auth_pass=params["password"],88auth_custom={89"User-Agent": _make_user_agent(),90},91retry_policy=RetryPolicy(92max_tries=3,93delay=1,94backoff=1.5,95),96)97
98redis = Redis.from_url(params["redis_token_storage"])99
100alert = MoiraAlert(moira=moira, redis=redis, token=params["token"])101
102data = config.read_from_file(params["config"], cluster_name=params.get("cluster"))103defaults.apply_defaults(data, redis)104
105alert.setup(data)106
107
108def _make_user_agent():109distribution = pkg_resources.get_distribution("alert-autoconf")110user_agent = f'{distribution.project_name}/{distribution.version}'111teamcity_build_id = teamcity.get_teamcity_build_id()112if teamcity_build_id is not None:113user_agent = f'{user_agent} (TeamCity; https://tmct.yourdomain.ru/viewLog.html?buildId={teamcity_build_id})'114return user_agent115
116
117if __name__ == "__main__":118main()119