Документация

Настройка голосового провайдера

Версия v2.3.1 · Обновлено

Настройка голосового провайдера#

Основная конфигурация IncidentRelay#

IncidentRelay читает настройки голосового провайдера из основного файла конфигурации.

Пример:

[voice]
provider = stub
providers_dir = /usr/local/lib/incidentrelay/voice_providers
callback_secret = change-me
text_template = IncidentRelay alert {alert_id}. {title}. Severity {severity}. {message}. Press 1 to acknowledge. Press 2 to resolve.
dtmf_actions = {"1": "acknowledge", "2": "resolve"}

[voice_provider]
api_url = https://voice.example.com/api
api_token = ${VOICE_API_TOKEN}
timeout = 10

Настройки#

provider#

Имя провайдера по умолчанию.

Канал уведомлений может переопределить это значение в своей собственной конфигурации:

{
  "provider": "mango"
}

providers_dir#

Каталог, в котором хранятся пользовательские модули провайдеров.

Рекомендуемое значение:

/usr/local/lib/incidentrelay/voice_providers

callback_secret#

Глобальный резервный секрет для голосовых колбэков.

URL колбэков провайдера используют такой формат:

/api/integrations/voice/callback/{channel_id}/{secret}

Если конфигурация канала содержит callback_secret, IncidentRelay использует секрет канала вместо глобального.

Имена файлов провайдеров#

Имена файлов провайдеров должны содержать только буквы, цифры и подчёркивание.

Допустимые примеры:

mango.py
zadarma.py
internal_pbx.py
voice_gateway_1.py

Недопустимые примеры:

mango-provider.py
my.provider.py
provider backup.py

Имя провайдера, используемое в конфигурации канала, — это имя файла без .py.

Пример файла:

/usr/local/lib/incidentrelay/voice_providers/mango.py

Имя провайдера:

"provider": "mango"

Конфигурация канала#

Пример конфигурации голосового канала:

{
  "provider": "example_http",
  "call_on_severities": ["critical", "high"],
  "test_phone": "+77001234567",
  "callback_secret": "change-me-channel-secret",
  "text_template": "IncidentRelay alert {alert_id}. {title}. Severity {severity}. {message}. Press 1 to acknowledge. Press 2 to resolve.",
  "dtmf_actions": {
    "1": "acknowledge",
    "2": "resolve"
  },
  "provider_config": {
    "api_url": "https://voice.example.com/api",
    "api_token": "${VOICE_API_TOKEN}",
    "from": "+77000000000",
    "timeout": 10
  }
}

Поля конфигурации канала#

provider#

Имя модуля провайдера.

"provider": "mango"

call_on_severities#

Список уровней важности, которые должны инициировать телефонный вызов.

"call_on_severities": ["critical", "high"]

Если этот список пуст, IncidentRelay не будет звонить никому по реальным алертам.

phone#

Необязательный резервный номер телефона.

Для реальных алертов IncidentRelay обычно использует номер телефона назначенного пользователя.

"phone": "+77001234567"

test_phone#

Номер телефона, используемый для тестовых вызовов.

"test_phone": "+77001234567"

callback_secret#

Необязательный секрет колбэка на уровне канала.

Если он опущен, IncidentRelay использует глобальную конфигурацию:

[voice]
callback_secret = change-me

text_template#

Шаблон произносимого сообщения.

Поддерживаемые плейсхолдеры:

{alert_id}
{event_type}
{title}
{message}
{severity}
{status}
{team}
{assignee}
{source}

Пример:

"text_template": "Alert {alert_id}. {title}. Severity {severity}. Press 1 to acknowledge. Press 2 to resolve."

dtmf_actions#

Сопоставляет цифры телефонной клавиатуры с действиями IncidentRelay.

"dtmf_actions": {
  "1": "acknowledge",
  "2": "resolve"
}

Поддерживаемые действия:

acknowledge
resolve

provider_config#

Настройки, специфичные для провайдера.

IncidentRelay передаёт этот объект в конструктор провайдера.

"provider_config": {
  "api_url": "https://voice.example.com/api",
  "api_token": "${VOICE_API_TOKEN}",
  "from": "+77000000000",
  "timeout": 10
}

Секреты следует хранить в переменных окружения и ссылаться на них как ${ENV_NAME}.

"api_token": "${VOICE_API_TOKEN}"

Проверка конфигурации#

Провайдер может определить validate_config().

Этот метод вызывается перед использованием провайдера.

class Provider(BaseVoiceProvider):
    name = "mango"

    @classmethod
    def validate_config(cls, config):
        """Validate required provider settings."""

        required_fields = ["api_url", "api_token"]

        missing = [
            field
            for field in required_fields
            if not config.get(field)
        ]

        if missing:
            raise RuntimeError(
                f"mango provider config requires: {', '.join(missing)}"
            )

Используйте этот метод для ранней проверки обязательных полей.

Хорошие сообщения об ошибках валидации важны, потому что они отображаются в логах и помогают пользователям быстрее исправить конфигурацию канала.