> For the complete documentation index, see [llms.txt](https://itgro-aly.gitbook.io/test-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://itgro-aly.gitbook.io/test-docs/for-admins/status-monitoring/readme.md).

# README

## Мониторинг состояния

Начиная с версий Itgrix bx [3.6.0](file:///changelog-bx.md#3.6.0) и Itgrix amo [2.9.0](file:///changelog-amo.md#2.9.0), в API модуля интеграции добавляется метод проверки статуса приложения `<Asterisk IP>:8077/status`. Периодическая проверка ответа на этот запрос может быть использована для отслеживания состояния приложения и автоматической реакции на проблемы.

## Примеры запросов

Ниже приводятся запросы отдельных элементов статусов с пояснениями их предполагаемого использования. Элементы извлекаются из ответа при помощи утилиты `jq` - процессора json-данных, [доступного для установки](https://stedolan.github.io/jq/download/) на совместимых с Itgrix системах.

Полные данные о состоянии можно получить запросом:

```
curl -s --digest -u <login>:<password> "<Asterisk IP>:8077/status"
```

Здесь `<Asterisk IP>` - адрес сервера Asterisk, на который был установлен модуль.\
`-s` - уменьшает количество промежуточного вывода от `curl`.\
`--digest -u` - указывает способ авторизации.\
`<login>` и `<password>` - логин и пароль от админки.

Реакция на выявляемые состояния приложения в примерах не описана и определяется потребностями пользователя.

Пример ответа:

```json
{
  "app": {
    "c2c": {
      "connected": true,
      "on": true,
      "portal": "example.bitrix24.ru",
      "stayon": false,
      "url": "https://apix.itgrix.ru:9004"
    },
    "calls_queue": {
      "calls": 0,
      "lock": "locked in 384ns"
    },
    "calls_storage": {
      "calls": 0
    },
    "crm": {
      "host": "https://example.bitrix24.ru",
      "manager": {
        "batch_queue": 0,
        "connector": {
          "app_type": "LicenseType_Subscription",
          "authseq": {
            "err": "<nil>",
            "sequences": 0
          },
          "on": true,
          "portal": "example.bitrix24.ru"
        },
        "on": true
      },
      "on": true,
      "users_cache": {
        "last_updated": "2023-05-11 13:03:55.485 +05:00",
        "phones": 39,
        "users": 120
      }
    },
    "crm_type": "bitrix",
    "customizer": {
      "enabled": true,
      "methods": {
        "customize_activity": true,
        "customize_attach_record_url": true,
        "customize_autodistribution": true,
        "customize_entity": true,
        "customize_show_call_card": true,
        "need_registration": true,
        "post_registration": true,
        "process_client_phone": true,
        "process_final_params": true,
        "process_originate_params": true,
        "process_record_file_path": true,
        "process_registration_params": true,
        "process_task_creation_params": true,
        "process_user_phone": true
      },
      "path": "/opt/itgrix_bx/customizer/customize.php",
      "timeout": 2000
    },
    "err": "<nil>",
    "license_manager": {
      "currentLicense": {
        "offline": false,
        "type": "Professional",
        "valid_till": "2025-04-15"
      },
      "on": true,
      "soft_mode": "ready"
    },
    "lock": "locked in 279ns",
    "master": {
      "general": {
        "app_err": "<nil>",
        "app_state": "",
        "app_status": "Ok",
        "app_status_updated": "2023-04-27 08:58:38.172 +05:00"
      }
    },
    "originated": 0,
    "pbx": {
      "ami": {
        "logged_in": true,
        "on": true,
        "pending_actions": 0
      },
      "cel_queue": {
        "calls": 0,
        "pending_events": 0
      },
      "db": {
        "connected": true,
        "dbConnector": {
          "on": true
        }
      },
      "fmc_cache": {
        "last_refresh": "2023-05-11 13:03:55.485 +05:00",
        "phones": 39
      },
      "last_id": 713065,
      "on": true,
      "parked": 0,
      "sql_parser": {
        "originated": 0,
        "transfer_bridges": 0
      },
      "trunks": 2
    },
    "restarting": false,
    "version": "Itgrix_bx v3.10.12"
  },
  "instance": {
    "config": "/etc/itgrix_bx/config.json",
    "index": 0,
    "log": "/var/log/itgrix_bx.log",
    "service": "itgrix_bx"
  }
}
```

### Остановка/перезапуск приложения

С помощью описанных ниже запросов можно отследить когда и почему приложение перестаёт работать.

{% code overflow="wrap" %}

```
curl -s --digest -u <login>:<password> "<Asterisk IP>:8077/status?path=app.master.general.app_state
```

{% endcode %}

Варианты значений `app_state`:

* При нормальной работе будет возвращаться значение `""`.
* Значение `"stopped"` возвращается когда приложение столкнулось с ошибкой, препятствующей дальнейшей работе и ожидает действий со стороны пользователя.
* Значение `"restarting"` возвращается когда приложение перезапускается. Это может быть вызвано проблемой, которая предположительно решится переподключением и/или коротким ожиданием, например при проблемах с сетью. Перезапуск также может быть и штатным, например при изменении настроек подключений.

{% code overflow="wrap" %}

```
curl -s --digest -u <login>:<password> "<Asterisk IP>:8077/status?path=app.master.general.app_status" 
```

{% endcode %}

`app_status` содержит общий статус приложения, который может быть `"Ok"`/`"Warning"`/`"Error"`. Это статус, который отображается вверху главной страницы админки. Во многих случаях он соответствует состоянию работает/перезапускается/остановлено, но в некоторых ситуациях может предоставлять дополнительную информацию. Например, он может помочь отличить штатный перезапуск от перезапуска в результате ошибки.

{% code overflow="wrap" %}

```
curl -s --digest -u <login>:<password> "<Asterisk IP>:8077/status?path=app.master.general.app_err"
```

{% endcode %}

`app_err` содержит детали ошибки, на основании которой формируется текст ошибки под статусом приложения на главной странице. Этот элемент может быть полезен для выяснения причин сбоя.

### Смена лицензии

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

{% code overflow="wrap" %}

```
curl -s --digest -u <login>:<password> "<Asterisk IP>:8077/status?path=app.license_manager.currentLicense.type"
```

{% endcode %}

`license.type` возвращает тип лицензии, отображаемый вверху главной страницы админки. Возможные значения:

* `"Professional"` - оплаченная лицензия с полным функционалом.
* `"Subscription"` - лицензия "по подписке" с ограниченным функционалом.
* `"Free"` - бесплатная лицензия с базовым функционалом.

{% code overflow="wrap" %}

```
curl -s --digest -u <login>:<password> "<Asterisk IP>:8077/status?path=app.license_manager.currentLicense.valid_till"
```

{% endcode %}

`license.valid_till` содержит дату истечения лицензии (последний день когда она имеет силу) в формате `ГГГГ-ММ-ДД`.
