Перейти к основному содержимому
Версия: 4.1

Создание скрипта активного действия

Общие правила

Скрипты для активных действий универсальны и для инцидентов, и для агрегаций. Их можно использовать как при одиночном мануальном запуске, так и при переходе на новый статус в Workflow как в pre-actions, так и в post-actions.

Создать скрипт для Активных действий можно на двух языках программирования: JavaScript (NodeJS) и Python. Для этого необходимо создать файл скрипта в папке smart-monitor-incident-manager/common/actions или $OSD_HOME/config/actions.

осторожно

Если скрипты будут созданы в $OSD_HOME/config/actions, то при обновлении плагинов они будут сохранены, в противном случае они будут потеряны при обновлении.

У всех скриптов должны быть уникальные имена, иначе нужный скрипт может быть распознан некорректно.

Вне зависимости от выбранного языка в скрипт при выполнении действия для инцидента будут переданы следующие данные:

{
"currentUser": {
"backend_roles": [
// backend роли текущего пользователя
],
"roles": [
// роли текущего пользователя
]
},
"incidentId": "zGQt4o8BqXcWBDa4I1DFGDH5", // ID инцидента
"index": ".incident-index-2023.21", // индекс, в котором хранится инцидент
"log": "", // логи инцидента
"metadata": {
"incidentId": "zGQt4o8BqXcWBDa4I1DFGDH5", // ID инцидента
"incidentTitle": "Exchange: антиспам пропустил письмо", // Название инцидента
"incidentDescription": "Антиспам пропустил письмо", // Описание инцидента
"index": ".smos_incident-2024.23",
"urlToIncident": "https://smarthost.ru/incident-manager/...", // URL инцидента
"baseFields": {
// базовые поля инцидента, которые были заданы при настройке
},
"additionalFields": {
// дополнительные поля инцидента, которые были заданы при настройке, а также дополнительные поля из самого инцидента
}
},
"sideEffects": {},
"target": "manual", // manual - флаг того, что используется активное действие или новый статус Workflow
"workflowId": "my-workflow" // ID workflow инцидента
}

При выполнении скрипта активного действия для агрегации будут переданы следующие параметры:

{
"currentUser": {
"backend_roles": [
// backend роли текущего пользователя
],
"roles": [
// роли текущего пользователя
]
},
"aggregationId": "zGQt4o8BqXcWBDa4I1DFGDH5", // ID агрегации
"index": ".incident_of_aggregation_results", // индекс, в котором хранится агрегация
"log": "",
"metadata": {
"aggregationId": "zGQt4o8BqXcWBDa4I1DFGDH5", // ID агрегации
"aggregationTitle": "Exchange: антиспам пропустил письма", // Название агрегации
"aggregationDescription": "Exchange: антиспам пропустил письма с архивом", // Описание агрегации
"index": ".incident_of_aggregation_results", // индекс, в котором хранится агрегация
"urlToAggregation": "https://smarthost.ru//incident-manager/aggregations-result...", // URL агрегации
"baseFields": {
// базовые поля агрегации, которые были заданы при настройке
},
"additionalFields": {
// дополнительные поля агрегации, которые были заданы при настройке, а также поля для сравнения из самой агрегации
}
},
"sideEffects": {},
"target": "manual" // manual - флаг того, что используется активное действие или новый статус Workflow
}
Обратите внимание!

Скрипты, которые вызваны с target "manual" не могут изменять сам инцидент или агрегацию. Если хотите сделать действие, которое изменит агрегацию или инцидент, то выполните это действие как pre-action в Workflow при переходе на новый статус.

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

При создании активного действия на JavaScript можно руководствоваться следующим шаблоном функция

/** ! Функция для выполнения активных действий
* @param doc - JSON с активными действиями
* @param metadata - метаданные переданные сущности (агрегации или инцидента)
* @param entities - переданный список инцидентов (используется при массовом редактировании статуса Workflow)
* @param currentUser - текущий пользователя
* @param logger - функция логирования
*/
export default async (doc, metadata, entities, currentUser, logger) => {
// тело функции
};

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

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

При создании активного действия на Python можно воспользоваться следующим шаблоном.

import json


class Object:
# Вспомогательная функция для конвертации объекта в JSON
def toJSON(self):
return json.dumps(self, default=lambda o: o.__dict__, sort_keys=True, indent=1)


""" Функция выполнения активных действий
@param: doc - сущность (и) (агрегации или инцидента),
@param: metadata - метаданные переданные сущности (агрегации или инцидента)
@param: entities - переданный список инцидентов (используется при массовом редактировании статуса Workflow)
@param: currentUser - текущий пользователя
"""


def my_func(doc, metadata, entities, currentUser):
# код функции
print(output.toJSON()) # Вывести данные doc


if __name__ == "__main__":
_json = input() # Считывание данных из потока происходит через stdin
res = json.loads(_json)
my_func(
doc=res.get("doc"),
metadata=res.get("metadata"),
entities=res.get("entities"),
currentUser=res.get("currentUser"),
)

Параметры в активное действие на python передаются через входной поток консоли(stdin). Выходящие параметры, изменённой сущности инцидента или агрегации (doc) необходимо передать через выходной поток (stdout). Данный пример не является эталонными и можно использовать любые методы и функции, которые будет удобно.