Создание скрипта активного действия
Общие правила
Скрипты для активных действий универсальны и для инцидентов, и для агрегаций. Их можно использовать как при одиночном мануальном запуске, так и при переходе на новый статус в 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": {},
"fields": {
// дополнительные поля инцидента, которые задаются при настройке задания
},
"reviwer": {
// ответственный за инцидент
}
},
"sideEffects": {},
"target": "manual", // manual - флаг того, что используется активное действие или новый статус Workflow
"workflowId": "my-workflow" // ID workflow инцидента
"_source": {
// нетронутый целый инцидент
}
}
При выполнении скрипта активного действия для агрегации будут переданы следующие параметры:
{
"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": {
// дополнительные поля агрегации, которые были заданы при настройке, а также поля для сравнения из самой агрегации
},
"comparation_fields": {
// Поля для сравнения в агрегации
},
"functional_fields": {
// функциональные поля в агрегации
}
},
"sideEffects": {},
"target": "manual" // manual - флаг того, что используется активное действие или новый статус Workflow
"workflowId": "my-workflow" // ID workflow агрегации
"_source": {
// нетроннутый полный результат агрегации
}
}
Скрипты, которые вызваны с target "manual"
не могут изменять сам инцидент или агрегацию. Если хотите сделать действие, которое изменит агрегацию или инцидент, то выполните это действие как pre-action в Workflow при переходе на новый статус.
Использование JavaScript
При создании активного действия на JavaScript можно руководствоваться следующим шаблоном функция
/** ! Функция для выполнения активных действий
* @param doc - JSON с активными действиями
* @param metadata - метаданные переданные сущности (агрегации или инцидента)
* @param entities - переданный список инцидентов (используется при массовом редактировании статуса Workflow)
* @param currentUser - текущий пользователя
* @param index - индекс, в котором хранится сущность (агрегация или инцидент)
* @param log - логи сущности (история изменения агрегации или инцидента)
* @param sideEffects - действия при переходе между статусами
* @param workflowId - ID workflow сущности (агрегации или инцидента)
* @param target - флаг того, что используется активное действие или новый статус Workflow
* @param incidentId - ID инцидента (передается в случае передачи инцидента)
* @param aggregationId - ID агрегации (передается в случае передачи агрегации)
* @param _source - нетроннутый полный результат сущности (агрегации или инцидента)
* @param logger - функция логирования
*/
export default async (doc, metadata, entities, currentUser, index, log, sideEffects, workflowId, target, incidentId, aggregationId, _source, 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 - текущий пользователь
@param: index - индекс, в котором хранится сущность (агрегация или инцидент)
@param: log - логи сущности (история изменения агрегации или инцидента)
@param: sideEffects - действия при переходе между статусами
@param: workflowId - ID workflow сущности (агрегации или инцидента)
@param: target - флаг того, что используется активное действие или новый статус Workflow
@param: incidentId - ID инцидента (передается в случае передачи инцидента)
@param: aggregationId - ID агрегации (передается в случае передачи агрегации)
@param: _source - нетронутый полный результат сущности (агрегации или инцидента)
"""
def my_func(doc, metadata, entities, currentUserr, index, log, sideEffects, workflowId, target, incidentId, aggregationId, _source):
# код функции
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"),
index=res.get("index"),
log=res.get("log"),
sideEffects=res.get("sideEffects"),
workflowId=res.get("workflowId"),
target=res.get("target"),
incidentId=res.get("incidentId"),
aggregationId=res.get("aggregationId"),
_source=res.get("_source"),
)
Параметры в активное действие на python передаются через входной поток консоли(stdin
). Выходящие параметры, изменённой сущности инцидента или агрегации (doc
) необходимо передать через выходной поток (stdout
). Данный пример не является эталонными и можно использовать любые методы и функции, которые будет удобно.