---
# Документация: http://stash.msk.avito.ru/projects/PYTHON/repos/alert-autoconf/browse/README.md
version: '1.1'

variables:
  call_list: >
    1. Звонить по списку, ожидать ответа 5 минут:
      * <https://duty.avito.ru/today/?billing-mnz-arch-duty|дежурному> по сервису
      * Владельцу сервиса — `satitov`
      * Последовательно звонить инженерам команд `billing-mnz-arch-duty` (Billing.MNZ, Billing.Arch)
  links: >
    • <#CBQJ8152A>
    • <https://mntr.avito.ru/grafana/d/000000576/service-fiscalization?orgId=1|Grafana>
    • <https://mntr.avito.ru/grafana/d/B90XgOS7k/fiscalization-24x7?orgId=1&viewPanel=2|24x7 Grafana>
    • <https://paas.k.avito.ru/services/service-fiscalization|PaaS>
    • <https://people.avito.ru/units/d0908dbf-b1ee-4dbc-a6b5-c6c4f59b12dc|Команда Billing.MNZ>
    • <https://people.avito.ru/units/c581fa85-c9a7-442d-ba01-313bbb7c3c4a|Команда Billing.Arch>

triggers:
    - name: Процент ошибок сервиса
      desc: >-
          [reason] Перегруженность. Баги.

          Проблемы с фискализацией чеков.

          [action]
          {{ .call_list }}

          [links]
          {{ .links }}
      targets:
          - alias(offset(scale(asPercent(sum(apps.services.fiscalization.service.api.*.request_time.2*.count), sum(apps.services.fiscalization.service.api.*.request_time.{2*,3*,5*}.count)), -1), 100),'Процент ошибок')
          - alias(movingMax(event(resources.deployer.service-fiscalization.prod.deploy), '5min'), 'service_deploy')
      ttl: 600
      ttl_state: OK
      time_start: "10:00"       # Время начала применения данного триггера
      time_end: "22:00"         # Время окончания применения данного триггера
      expression: "(t1 > 1 && t2 < 1) ? ERROR : OK"
      saturation:
      - type: 'take-screenshot'
        parameters:
          url: 'https://mntr.avito.ru/grafana/d/B90XgOS7k/fiscalization-24x7?orgId=1&viewPanel=2'
      pending_interval: 900
      tags:
          - MONAD
          - service-fiscalization

    - name: Время ответа сервиса
      desc: >-
          [reason] Перегруженность. Баги.

          Проблемы с фискализацией чеков.

          [action]
          {{ .call_list }}

          [links]
          {{ .links }}
      targets:
          - aliasByNode(transformNull(apps.services.fiscalization.service.api.*.request_time.*.percentile.95, 0), -6,-5)
          - alias(movingMax(event(resources.deployer.service-fiscalization.prod.deploy), '5min'), 'service_deploy')
      ttl: 600
      ttl_state: OK
      time_start: "10:00"       # Время начала применения данного триггера
      time_end: "22:00"         # Время окончания применения данного триггера
      expression: "(t1 > 15000 && t2 < 1) ? ERROR : OK"
      saturation:
      - type: 'take-screenshot'
        parameters:
          url: 'https://mntr.avito.ru/grafana/d/B90XgOS7k/fiscalization-24x7?orgId=1&viewPanel=4'
      pending_interval: 600
      tags:
          - MONAD
          - service-fiscalization

    - name: Процент успешных запросов к провайдерам
      desc: >-
          [reason] Ошибки на стороне провайдера фискализации или на стороне сервиса фискализации

          Проблемы с фискализацией чеков.

          [action]
          {{ .call_list }}

          [links]
          {{ .links }}
      targets:
          - aliasByNode(
                scale(
                    divideSeries(
                        sumSeries(apps.services.fiscalization.client.atol.request.*.2*.*.count),
                        sumSeries(apps.services.fiscalization.client.atol.request.*.*.*.count)
                    ),
                100),
            4)
          - aliasByNode(
                scale(
                    divideSeries(
                        sumSeries(apps.services.fiscalization.client.chekonline.request.*.2*.*.count),
                        sumSeries(apps.services.fiscalization.client.chekonline.request.*.2*.*.count)
                    ),
              100),
            4)
          - aliasByNode(
                scale(
                    divideSeries(
                        sumSeries(apps.services.fiscalization.client.orangedata.request.*.2*.*.count),
                        sumSeries(apps.services.fiscalization.client.orangedata.request.*.2*.*.count)
                    ),
                100),
            4)
      ttl: 600
      ttl_state: ERROR
      time_start: "10:00"       # Время начала применения данного триггера
      time_end: "22:00"         # Время окончания применения данного триггера
      expression: "(t1 < 97) || (t2 < 97) || (t3 < 97) ? ERROR : OK"
      saturation:
      - type: 'take-screenshot'
        parameters:
          url: 'https://mntr.avito.ru/grafana/d/B90XgOS7k/fiscalization-24x7?orgId=1&viewPanel=6'
      pending_interval: 600

      tags:
          - MONAD
          - service-fiscalization

    - name: Чеки с ошибкой
      desc: >-
          [reason] Ошибки на стороне провайдера фискализации или на стороне сервиса фискализации

          Проблемы с фискализацией чеков.
          Чеки нужно обязательно перепослать в течение того же дня, когда произошла ошибка, до
          полуночи. Почти всегда проблемы связаны с внешним провайдером. Самое безопасное в этом
          случае — повторить чек с тем же id. В худшем случае, чек всплывет обратно примерно через
          час. К сожалению, это не всегда помогает и иногда нужно перефискализировать чек, это
          делается по информации от внешнего провайдера.

          [action]

          В рабочее время:
          команда сервиса сама переотправляет чеки / разбирается с проблемами

          --------
          В нерабочее время (с 8 до 20 + выходные):
          Если в сутки падения чеков еще будут рабочие часы и нет роста упавших чеков в течение
          10 минут — можно ждать рабочего времени. Например:
            * если падение в час ночи понедельника — дожидаемся рабочих часов
            * если падение в час ночи субботы — идем по негативному флоу, но при желании можно не будить сразу же дежурного по сервису, а призвать его днем
            * если падение в десять часов вечера вторника — идем по негативному флоу

          --------
          Негативный flow:
          Если все условия совпадают:
            * упавших чеков по метрике незначительное количество (можно прокликать руками)
            * метрика не растет 10 минут
            * время до 22:00 (чтобы иметь возможность отловить всплывший обратно чек и рефискализировать его)
            * ранее этот чек не переотправлялся по кнопке

          Можно не звать дежурного, а получить id упавших чеков и переотправить их.
          Для этого надо получить чеки из базы фискализации запросом с помощью psql (подставив нужную дату)

          ----------
          psql postgresql://pgbouncer-dev-fiscalization-rs-rs01.db.avito-sd:6404/fiscalization -c "
            select id from receipts where fiscalization_status = 'fail' and created_at >= '2022-01-12'
          "

          --------------------------------------

          11c3e370-26fd-49ab-9669-31b3ae6cd6f0
          (1 row)

          ----------

          затем перейти в админку фискализации, используя id чека:
          https://adm.avito.ru/gwip/billing/fiscalization/receipts/11c3e370-26fd-49ab-9669-31b3ae6cd6f0

          затем нажать кнопку "повторить"

          Если хотя бы какие-то условия не совпадают, нужно:

          [action]
          {{ .call_list }}

          [links]
          {{ .links }}

      targets:
          - alias(event(apps.services.fiscalization.failed-receipts.receipts-count), 'Чеки с ошибкой')
      ttl: 3600
      ttl_state: OK
      expression: "(t1 > 1000) ? ERROR : OK"
      saturation:
      - type: 'take-screenshot'
        parameters:
          url: 'https://mntr.avito.ru/grafana/d/B90XgOS7k/fiscalization-24x7?orgId=1&viewPanel=8'
      pending_interval: 3600
      tags:
          - MONAD
          - service-fiscalization

    - name: Загруженность очередей
      desc: >-
          [reason] Загружена одна или несколько очередей

          Может вызвать деградацию сервиса и задержки с фискализацией

          [action]
          {{ .call_list }}

          [links]
          {{ .links }}
      targets:
          - aliasByNode(scale(apps.services.fiscalization.queues.*.utilization.median, 100), 4)
      ttl: 600
      ttl_state: OK
      expression: "(t1 > 80) ? ERROR : OK"
      time_start: "06:00"       # Время начала применения данного триггера
      time_end: "23:59"         # Время окончания применения данного триггера
      saturation:
      - type: 'take-screenshot'
        parameters:
          url: 'https://mntr.avito.ru/grafana/d/B90XgOS7k/fiscalization-24x7?orgId=1&viewPanel=10'
      pending_interval: 600
      tags:
          - MONAD
          - service-fiscalization

# список способов оповещения
alerting:
    # оповещение владельца сервиса при любом срабатывании алерта со статусом ERROR
    - tags:
          - service-fiscalization
          - ERROR
      contacts:
          - type: send-sms
            value: "satitov"
          - type: mail
            value: "satitov@avito.ru"
          - type: mattermost
            value: 'duty_billing-mnz-arch-duty' # отправляем сообщение текущему дежурному
          - type: mattermost
            value: '~billing-mnz-monitoring' # дублируем сообщение в канал мониторинга команды

    # оповещение в мониторинг 24x7
    - tags:
          - service-fiscalization
          - MONAD
          - ERROR
      contacts:
          - type: mattermost
            value: 'duty_billing-mnz-arch-duty' # отправляем сообщение текущему дежурному
          - type: mattermost
            value: '~billing-mnz-monitoring' # дублируем сообщение в канал мониторинга команды
      escalations:
          - contacts:
                - type: mattermost
                  value: '~billing-unit-monitoring' # эскалируем сообщение в общих канал мониторинга юнита
            offset_in_minutes: 5
          - contacts: # эскалируем сообщение в мониторинг 24x7
                - type: mattermost
                  value: '~spb_monitoring'
                - type: jira
                  value: 'group_spb_monitoring'
            offset_in_minutes: 5 # через 5 минут после первого срабатывания


==== alert_yaml.checkstyle.xml ====

WARNING alert_yaml.checkstyle:0: info Uuid задачи на валидацию: 41744352-9ab1-4e77-8874-9cde02e4cee7 (alert.yaml)

ERROR   alert_yaml.checkstyle:11: error Line: 11. Field: desc. Value: [reason] Перегруженность. Баги.
Проблемы с фискализацией чеков.
[action] {{ .call_list }}
[links] {{.... Description: Value error, unexpected '.' (alert.yaml)

INFO    <<<<<< Action output end
ERROR   Action "docker@avito/actions-alert:0.4 validate-alert" finished with error: exit status 1 (took 1.009946959s)
INFO    Workflow finished, took 6.693895834s

в чем поблема?