Заменить значение в динамическом c списке словаря, загруженного из alertmanager yml? - PullRequest
0 голосов
/ 28 мая 2020

Этот вопрос довольно конкретный c, Я успешно выполнил «хочу», но он очень специфичен c для моего варианта использования и, вероятно, некрасиво для Python эксперта, поэтому мне любопытно, может ли он быть более общим c и / или умно.

Мне нужно отредактировать маршрутизацию prometheus alertmanager, хранящуюся в файле yml ( документация здесь )

В моем случае моя маршрутизация (извлечение):

route:
  routes:
    - match:
        product: my_product
        stage: prod
      routes:
        - continue: true
          match_re:
            severity: (info|warning|critical)
          receiver: mattermost
        - continue: true
          match_re:
            severity: (warning|critical)
          receiver: mail_infra
        - match:
            severity: critical
          receiver: sms_voidandnany

Мне нужно отредактировать получатель «sms_voidandnany» (получатель зависит от календаря Google).

Вот мой первый черновик:

with open('alertmanager.yml') as f:
    data = yaml.safe_load(f)
    routes=data['route']['routes']

    for item in routes:
        if item.get('match').get('product') == 'my_product' and item.get('match').get('stage') == 'prod':
            for subitem in item.get('routes'):
                if 'match' in subitem:
                    if subitem.get('match').get('severity') == 'critical':
                        subitem['receiver'] = 'sms_another_user'

with open("alertmanager2.yaml", "w") as f:
    yaml.dump(data, f)

3 if с, 2 цикла, даже я, а не python эксперт и не разработчик, работающий на полную ставку. Я думаю, что это некрасиво.

Видите ли вы лучший способ, больше Pythonisti c способ достичь этого?

Вишенка на торте, как вы думаете, есть ли «простой» способ сделать замену generi c? Структура маршрутизации - динамический c, мы можем сделать маршрутизацию - сопоставление - маршрутизацию - сопоставление и так далее ... Рекурсивная функция?

1 Ответ

1 голос
/ 28 мая 2020

Ваши запросы кажутся здесь более конкретными c, поэтому мы не сможем многое переписать. Но вот моя попытка

import yaml
with open('alertmanager.yml') as f:
    data = yaml.safe_load(f)
    subitems = [subitem for item in data['route']['routes'] for subitem in item.get('routes') if item.get('match').get('product') == 'my_product' and item.get('match').get('stage') == 'prod']

    for subitem in subitems:
        if 'match' in subitem and subitem.get('match').get('severity') == 'critical':
            subitem['receiver'] = 'sms_another_user'

with open("alertmanager2.yaml", "w") as f:
    yaml.dump(data, f)

...