alert-autoconf

Форк
0
/
alert.py 
118 строк · 3.7 Кб
1
#!/usr/bin/env python3
2

3
import os
4
import argparse
5
import logging
6
import pkg_resources
7

8
from collections import ChainMap
9

10
from redis import Redis
11

12
from alert_autoconf import LOG_FORMAT, LOG_LEVEL
13
from alert_autoconf import config
14
from alert_autoconf import defaults
15
from alert_autoconf import teamcity
16
from alert_autoconf.moira import MoiraAlert
17
from moira_client import Moira
18
from moira_client import RetryPolicy
19

20

21
def parse_params() -> dict:
22
    """
23
    Разбор параметров из командной строки
24
    :return: набор параметров
25
    """
26
    parser = argparse.ArgumentParser(add_help=True)
27
    defaults = {
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

37
    parser.add_argument(
38
        "-c", "--config", help="Path to trigger description", required=False
39
    )
40
    parser.add_argument("-u", "--url", help="Alerting system api url", required=False)
41
    parser.add_argument("-l", "--log-level", help="Log level.", required=False)
42
    parser.add_argument("-U", "--user", help="User name.", required=False)
43
    parser.add_argument("-p", "--password", help="User password.", required=False)
44
    parser.add_argument("-t", "--token", help="Triggers token.", required=False)
45
    parser.add_argument(
46
        "-s", "--redis_token_storage", help="Token storage.", required=True
47
    )
48
    parser.add_argument(
49
        "-C", "--cluster",
50
        help="Cluster name. If specified, {cluster} will be replaced with this name.",
51
        required=False,
52
    )
53

54
    namespace = parser.parse_args()
55
    if namespace.token is None:
56
        if namespace.cluster is None:
57
            parser.error("At least one of -t/--token and -C/--cluster is required")
58
        namespace.token = "kubernetes:{}".format(namespace.cluster)
59
    command_line_args = {k: v for k, v in vars(namespace).items() if v}
60

61
    return ChainMap(command_line_args, os.environ, defaults)
62

63

64
def main():
65
    logging.basicConfig(level=logging.getLevelName(LOG_LEVEL), format=LOG_FORMAT)
66

67
    logger = logging.getLogger("alert")
68

69
    params = parse_params()
70

71
    log_level = params["log_level"].upper()
72
    if LOG_LEVEL != log_level:
73
        logger.setLevel(logging.getLevelName(log_level))
74

75
    # urllib3 logging is too verbose, set it at WARNING or more
76
    loglevel_as_int = logging._nameToLevel[log_level.upper()]
77
    # `loglevel_as_int` is 50 for CRITICAL, 10 for DEBUG
78
    logging.getLogger("urllib3").setLevel(max(logging.WARNING, loglevel_as_int))
79
    # after this line, the loglevel for urllib3 is CRITICAL, ERROR or WARNING
80

81
    if not params["url"].startswith("http://"):
82
        params["url"] = "{}{}".format("http://", params["url"])
83

84
    moira = Moira(
85
        params["url"],
86
        auth_user=params["user"],
87
        auth_pass=params["password"],
88
        auth_custom={
89
            "User-Agent": _make_user_agent(),
90
        },
91
        retry_policy=RetryPolicy(
92
            max_tries=3,
93
            delay=1,
94
            backoff=1.5,
95
        ),
96
    )
97

98
    redis = Redis.from_url(params["redis_token_storage"])
99

100
    alert = MoiraAlert(moira=moira, redis=redis, token=params["token"])
101

102
    data = config.read_from_file(params["config"], cluster_name=params.get("cluster"))
103
    defaults.apply_defaults(data, redis)
104

105
    alert.setup(data)
106

107

108
def _make_user_agent():
109
    distribution = pkg_resources.get_distribution("alert-autoconf")
110
    user_agent = f'{distribution.project_name}/{distribution.version}'
111
    teamcity_build_id = teamcity.get_teamcity_build_id()
112
    if teamcity_build_id is not None:
113
        user_agent = f'{user_agent} (TeamCity; https://tmct.yourdomain.ru/viewLog.html?buildId={teamcity_build_id})'
114
    return user_agent
115

116

117
if __name__ == "__main__":
118
    main()
119

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.