Сбор и обработка данных
Сбор данных
В Подсистеме существует несколько способов загрузки данных:
- загрузка отдельных документов;
- массовое индексирование нескольких документов;
- использование Data Prepper — серверный сборщик данных Подсистемы, который может пополнять данные для последующего анализа и визуализации;
- использование других инструментов для сбора данных.
Массовое индексирование
Для массового индексирования документов можно использовать Bulk API. Например, если необходимо проиндексировать несколько документов в индексе <index-name>, следует отправить следующий запрос:
POST _bulk
{ "create": { "_index": <index-name>, "_id": "2" } }
{ "name": "Jonathan Powers", "gpa": 3.85, "grad_year": 2025 }
{ "create": { "_index": <index-name>, "_id": "3" } }
{ "name": "Jane Doe", "gpa": 3.52, "grad_year": 2024 }
Поиск по данным
В Подсистеме есть несколько способов поиска данных:
- Язык запросов Domain-Specific Language (DSL) – основной язык запросов Подсистемы, который можно использовать для создания сложных, полностью настраиваемых запросов.
- Язык запросов в строке запроса – упрощенный язык запросов, который можно использовать в параметре поискового запроса или в "Панелях мониторинга" Подсистемы.
- SQL – традиционный язык запросов, который устраняет разрыв между традиционными концепциями реляционных баз данных и гибкостью документоориентированного хранилища данных Подсистемы.
- Piped Processing Language (PPL) – основной язык, используемый для мониторинга в Подсистеме. PPL использует синтаксис конвейера, который объединяет команды в запрос.
- Dashboards Query Language (DQL) – простой текстовый язык запросов для фильтрации данных в "Панелях мониторинга" Подсистемы.
Настоящее руководство содержит краткое введение в поиск с помощью запросов с использованием строки запроса и запросов DSL.
Запросы строки запроса
Запросы в строке запроса легковесны, но эффективны. Запрос можно отправить в строке запроса, используя параметр "q". Например, следующий запрос ищет сотрудников с именем john:
GET /employees/_search?q=name:john
Запрос DSL
Используя DSL, можно создавать более сложные и настраиваемые запросы.
Полнотекстовый поиск
Полнотекстовый поиск осуществляется по полям, отображенным как text. По умолчанию текстовые поля анализируются default-анализатором. Анализатор разбивает текст на термины и переводит его в нижний регистр.
Например, следующий запрос выполняет поиск сотрудников с именем john:
GET / employees /_search
{
"query": {
"match": {
"name": "john"
}
}
}
Поиск по ключевым словам
Поле name содержит подполе name.keyword, которое добавляется Подсистемой автоматически. Если выполнить поиск в поле name.keyword так же, как в предыдущем запросе, то запрос не возвращает обращений, потому что поля keyword должны точно совпадать:
GET /employees/_search
{
"query": {
"match": {
"name.keyword": "john"
}
}
}
Фильтры
Используя логический запрос, можно добавить в запрос условие фильтрации для полей с точными значениями.
Фильтры терминов соответствуют определенным терминам. Например, следующий логический запрос ищет сотрудников, которые уволились в 2022 году:
GET employees/_search
{
"query": {
"bool": {
"filter": [
{ "term": { "dism_year": 2022 }}
]
}
}
}
Составные запросы
Составной запрос позволяет комбинировать несколько запросов или условий фильтрации. Примером составного запроса является логический запрос.
Например, чтобы найти сотрудников, чьи имена соответствуют doe и отфильтровать их по году увольнения и средней зарплате, используют следующий запрос:
GET employees/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "doe"
}
},
{ "range": { "asp": { "gte": 100000, "lte": 200000 } } },
{ "term": { "dism_year": 2022 }}
]
}
}
}
Методы поиска
Наряду с традиционным полнотекстовым поиском, описанным в этом руководстве, Подсистема поддерживает ряд методов поиска на основе машинного обучения (ML), включая k-NN, семантический, мультимодальный, разреженный, гибридный и диалоговый поиск.
Управление индексами
Индексация
Данные индексируются с помощью REST API Подсистемы. Существует два API: индексный API и _bulk API.
В ситуациях, когда новые данные поступают постепенно (например, заказы клиентов от малого бизнеса), можно использовать индексный API для добавления документов по мере их поступления. В ситуациях, когда поток данных менее интенсивный (например, еженедельные обновления маркетингового веб-сайта), можно сгенерировать файл и отправить его в _bulk API. При большом количестве документов объединение запросов в группы и использование _bulk API обеспечивает более высокую производительность. Однако, если документы очень большие, может потребоваться индексировать их по отдельности.
При индексировании документов размер документа _id должен составлять 512 байт или меньше.
Прежде искать данные, они должны быть проиндексированы. Индексирование — это метод, с помощью которого поисковые системы упорядочивают данные для быстрого поиска. Полученная структура называется индексом.
В Подсистеме базовой единицей данных является документ JSON. В рамках индекса Подсистема идентифицирует каждый документ с помощью уникального идентификатора.
Запрос к индексному API выглядит следующим образом:
PUT <index>/_doc/<id>
{ "A JSON": "document" }
Запрос к _bulk API выглядит немного иначе, потому что указывается индекс и идентификатор в массиве данных:
POST _bulk
{ "index": { "_index": "<index>", "_id": "<id>" } }
{ "A JSON": "document" }
Массовые данные должны соответствовать определенному формату, который требует наличия символа новой строки (\n) в конце каждой строки, включая последнюю. Это базовый формат:
Action and metadata\n
Optional document\n
Action and metadata\n
Optional document\n
Документ необязателен, потому что для действий delete документ не требуется. Для других действий (index, create и update) требуется документ. Если нужно, чтобы действие не выполнялось, если документ уже существует, используют действие create вместо действия index.
Чтобы проиндексировать большие объемы данных с помощью команды curl, требуется перейти в папку, в которой сохранен файл, и выполнить следующую команду:
curl -H "Content-Type: application/x-ndjson" -POST https://localhost:9200/data/_bulk -u 'admin:admin' --insecure --data-binary "@data.json"
Если какое-либо из действий в _bulk API не выполняется, Подсистема продолжает выполнять другие действия. Следует изучить массив items в ответе, чтобы понять, что пошло не так. Записи в массиве items расположены в том же порядке, что и действия, указанные в запросе.
Подсистема автоматически создает индекс, если он не существует. Он также автоматически генерирует идентификатор, не указанный в запросе. В этом простом примере автоматически создается индекс фильмов, индексируется документ и ему присваивается уникальный идентификатор:
POST movies/_doc
{ "title": "Spirited Away" }
Автоматическая генерация идентификатора имеет явный недостаток: поскольку в запросе на индексирование не указан идентификатор документа, будет проблематично обновить документ позже. Кроме того, если выполнять этот запрос 10 раз, Подсистема проиндексирует этот документ как 10 разных документов с уникальными идентификаторами. Чтобы указать идентификатор 1, используют следующий запрос (следует обратить внимание на использование PUT вместо POST):
PUT movies/_doc/1
{ "title": "Spirited Away" }
Поскольку идентификатор должен быть указан, если выполнить эту команду 10 раз, то в результате по-прежнему будет только один проиндексированный документ с полем _version с индексом 10.
По умолчанию индексы состоят из одного основного сегмента и одной реплики. Если необходимо указать параметры, отличные от стандартных, следует создать индекс перед добавлением документов:
PUT more-movies
{ "settings": { "number_of_shards": 6, "number_of_replicas": 2 } }
Ограничения на присвоение имен индексам
Индексы Подсистема имеют следующие ограничения на именование:
- все буквы должны быть строчными;
- названия индексов не могут начинаться с подчеркивания (_) или дефиса (-);
- названия индексов не могут содержать пробелы, запятые или следующие символы:
: " * + / \ | ? # > <
Считывание данных
После индексации документа можно получить его, отправив запрос GET на ту же endpoint, которая использовалась для индексации:
GET movies/_doc/1
{
"_index" : "movies",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"title" : "Spirited Away"
}
}
Документ можно найти в объекте _source. Если документ не найден, ключ found равен FALSE и объект _source не является частью ответа.
Чтобы получить несколько документов с помощью одной команды, используют операцию _mget . Формат для получения нескольких документов аналогичен операции _bulk, где в теле запроса необходимо указать индекс и идентификатор:
GET _mget
{
"docs": [
{
"_index": "<index>",
"_id": "<id>"
},
{
"_index": "<index>",
"_id": "<id>"
}
]
}
Для получения только определенных полей в документе:
GET _mget
{
"docs": [
{
"_index": "<index>",
"_id": "<id>",
"_source": "field1"
},
{
"_index": "<index>",
"_id": "<id>",
"_source": "field2"
}
]
}
Чтобы проверить, существует ли документ:
HEAD movies/_doc/<doc-id>
Если документ существует, будет получен ответ "200 OK", а если нет, то ошибка "404 – Not Found".
Обновление данных
Чтобы обновить существующие поля или добавить новые, нужно отправить POST-запрос на операцию _update с изменениями в объекте doc:
POST movies/_update/1
{
"doc": {
"title": "Castle in the Sky",
"genre": ["Animation", "Fantasy"]
}
}
Следует обратить внимание на обновленное поле title и новое поле genre:
GET movies/_doc/1
{
"_index" : "movies",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"title" : "Castle in the Sky",
"genre" : [
"Animation",
"Fantasy"
]
}
}
В документе также есть поле с увеличивающимся значением _version. Рекомендуется использовать это поле, чтобы отслеживать, сколько раз документ обновлялся.
Запросы POST позволяют частично обновлять документы. Чтобы полностью заменить документ, используют запрос PUT:
PUT movies/_doc/1
{
"title": "Spirited Away"
}
Документ с идентификатором 1 будет содержать только поле title, потому что весь документ будет заменен документом, проиндексированным в этом запросе PUT.
Для условного обновления документов используют объект upsert в зависимости от того, существуют ли они уже. Если документ существует, его поле title изменяется на "Castle in the Sky". Если нет, Подсистема индексирует документ в объекте upsert:
POST movies/_update/2
{
"doc": {
"title": "Castle in the Sky"
},
"upsert": {
"title": "Only Yesterday",
"genre": ["Animation", "Fantasy"],
"date": 1993
}
}
Пример ответа:
{
"_index" : "movies",
"_type" : "_doc",
"_id" : "2",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1
}
Каждая операция обновления документа имеет уникальную комбинацию значений _seq_no и _primary_term.
Подсистема сначала записывает обновления в основной сегмент, а затем отправляет эти изменения во все сегменты-реплики. Нестандартная проблема может возникнуть, если несколько пользователей приложения на основе Подсистемы обновляют существующие документы в одном и том же индексе. В этом случае другой пользователь может прочитать и обновить документ из сегмента-реплики до того, как он получит обновление из основного сегмента первого пользователя. В результате операция первого пользователя обновления обновит более старую версию документа. В лучшем случае оба пользователя внесут одинаковые изменения, и документ остается точным. В худшем случае документ будет содержать устаревшую информацию.
Чтобы избежать такой ситуации, используют значения _seq_no и _primary_term в заголовке запроса:
POST movies/_update/2?if_seq_no=3&if_primary_term=1
{
"doc": {
"title": "Castle in the Sky",
"genre": ["Animation", "Fantasy"]
}
}
Если документ был обновлен после того, как был получен, значения _seq_no и _primary_term будут отличаться, и операция обновления завершится ошибкой "409 — Conflict".
При использовании _bulk API следует указать значения _seq_no и _primary_term в метаданных действия.
Удаление данных
Чтобы удалить документ из индекса, используют запрос DELETE:
DELETE movies/_doc/1
При операции DELETE поле _version увеличивается на единицу. Если добавить документ с тем же идентификатором, поле _version увеличится снова. Такое поведение связано с тем, что Подсистема удаляет документ _source, но сохраняет его метаданные.
Шаблоны индексов
Шаблоны индексов позволяют инициализировать новые индексы с помощью предопределенных сопоставлений и настроек. Например, если требуется постоянно индексировать данные журналов, можно определить шаблон индекса, чтобы все эти индексы имели одинаковое количество сегментов и реплик.
Создание шаблона
Чтобы создать шаблон индекса, используют запрос PUT или POST:
PUT _index_template/<template name>
POST _index_template/<template name>
Эта команда создает шаблон с именем daily_logs и применяет его к любому новому индексу, имя которого соответствует шаблону logs-2025-01-*, а также добавляет его к псевдониму my_logs:
PUT _index_template/daily_logs
{
"index_patterns": [
"logs-2025-01-*"
],
"template": {
"aliases": {
"my_logs": {}
},
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"timestamp": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"value": {
"type": "double"
}
}
}
}
}
В результате должен быть получен следующий ответ:
{
"acknowledged": true
}
Если создать индекс с именем logs-2025-01-01, то можно убедиться, что в нем есть сопоставления и настройки из шаблона:
PUT logs-2025-01-01
GET logs-2025-01-01
{
"logs-2025-01-01": {
"aliases": {
"my_logs": {}
},
"mappings": {
"properties": {
"timestamp": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"value": {
"type": "double"
}
}
},
"settings": {
"index": {
"creation_date": "1578107970779",
"number_of_shards": "2",
"number_of_replicas": "1",
"uuid": "U1vMDMOHSAuS2IzPcPHpOA",
"version": {
"created": "7010199"
},
"provided_name": "logs-2025-01-01"
}
}
}
}
Любые дополнительные индексы, соответствующие этому шаблону — logs-2025-01-02, logs-2025-01-03 и так далее, — будут наследовать те же сопоставления и настройки.
Шаблоны индексов не могут содержать ни одного из следующих символов:
: " + / \ | ? # > < , .
Извлечение шаблона
Чтобы перечислить все шаблоны индекса:
GET _cat/templates
GET /_index_template
Чтобы найти шаблон по его названию:
GET _index_template/daily_logs
Чтобы получить список всех шаблонов, соответствующих шаблону:
GET _index_template/daily*
Чтобы проверить, существует ли определенный шаблон:
HEAD _index_template/<name>
Настройка нескольких шаблонов
Для индексов можно создать несколько шаблонов. Если имя индекса соответствует более чем одному шаблону, Подсистема использует сопоставления и настройки из шаблона с наивысшим приоритетом и применяет их к индексу.
Например, имеются два следующих шаблона, которые соответствуют индексу logs-2025-01-02 и конфликтуют в поле number_of_shards:
Шаблон 1:
PUT _index_template/template-01
{
"index_patterns": [
"logs*"
],
"priority": 0,
"template": {
"settings": {
"number_of_shards": 2,
"number_of_replicas": 2
}
}
}
Шаблон 2:
PUT _index_template/template-02
{
"index_patterns": [
"logs-2025-01-*"
],
"priority": 1,
"template": {
"settings": {
"number_of_shards": 3
}
}
}
Поскольку template-02 имеет более высокое значение priority, то и соответственно более высокий приоритет над template-01. Индекс logs-2025-01-02 будет иметь значение number_of_shards равное 3, а number_of_replicas — значение по умолчанию 1.
Удаление шаблона
Шаблон индекса можно удалить, используя его имя:
DELETE _index_template/daily_logs
Составные шаблоны индексов
Управление несколькими шаблонами индексов сопряжено со следующими проблемами:
- если есть дубликаты между шаблонами индексов, хранение этих шаблонов индексов приводит к увеличению размера кластера;
- если требуется внести изменения во все шаблоны индекса, придется вносить изменения вручную для каждого шаблона.
Для решения этих задач можно использовать составные шаблоны индексов. Составные шаблоны индексов позволяют абстрагировать общие настройки, сопоставления и псевдонимы в многократно используемый строительный блок, называемый шаблоном компонента.
Можно комбинировать шаблоны компонентов для создания шаблона индекса.
Настройки и сопоставления, которые указываются непосредственно в запросе создания индекса, переопределяют любые настройки или сопоставления, указанные в шаблоне индекса и шаблонах его компонентов.
Создание шаблона компонента
В качестве примера следует определить два шаблона компонентов —component_template_1 и component_template_2:
Шаблон компонента 1:
PUT _component_template/component_template_1
{
"template": {
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
}
}
}
}
}
Шаблон компонента 2:
PUT _component_template/component_template_2
{
"template": {
"mappings": {
"properties": {
"ip_address": {
"type": "ip"
}
}
}
}
}
Для создания шаблона индекса используют шаблоны компонентов.
При создании шаблонов индекса необходимо включить шаблоны компонентов в список composed_of.
Подсистема применяет шаблоны компонентов в том порядке, в котором они указываются в шаблоне индекса. Настройки, сопоставления и псевдонимы, которые указываются в шаблоне индекса, применяются в последнюю очередь.
PUT _index_template/daily_logs
{
"index_patterns": [
"logs-2025-01-*"
],
"template": {
"aliases": {
"my_logs": {}
},
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"timestamp": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"value": {
"type": "double"
}
}
}
},
"priority": 200,
"composed_of": [
"component_template_1",
"component_template_2"
],
"version": 3,
"_meta": {
"description": "using component templates"
}
}
Если создается индекс с именем logs-2025-01-01, то можно убедиться, что он получает сопоставления и настройки из обоих шаблонов компонентов:
PUT logs-2025-01-01
GET logs-2025-01-01
Пример ответа:
{
"logs-2025-01-01": {
"aliases": {
"my_logs": {}
},
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"ip_address": {
"type": "ip"
},
"timestamp": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"value": {
"type": "double"
}
}
},
"settings": {
"index": {
"creation_date": "1625382479459",
"number_of_shards": "2",
"number_of_replicas": "1",
"uuid": "rYUlpOXDSUSuZifQLPfa5A",
"version": {
"created": "7100299"
},
"provided_name": "logs-2025-01-01"
}
}
}
}
Параметры шаблона индекса
Возможные параметры шаблона приведены в таблице 15.
Псевдонимы индексов
Псевдоним — это виртуальное имя индекса, которое может указывать на один или несколько индексов.
Если данные распределены по нескольким индексам, вместо того чтобы отслеживать, к каким индексам обращаться, можно создать псевдоним и обращаться к нему.
Например, если требуется сохранять журналы в индексах по месяцам и часто запрашивать журналы за предыдущие два месяца, можно создать псевдоним last_2_months и обновлять индексы, на которые он указывает, каждый месяц.
Поскольку можно в любой момент изменить индексы, на которые указывает псевдоним, обращение к индексам с помощью псевдонимов в приложениях позволяет выполнять переиндексацию данных без простоев.
Создание псевдонимов
Чтобы создать псевдоним, используют запрос POST:
POST _aliases
Для указания списка действий, которые требуется выполнить, используют метод actions. Например, эта команда создает псевдоним с именем alias1 и добавляет index-1 к этому псевдониму:
POST _aliases
{
"actions": [
{
"add": {
"index": "index-1",
"alias": "alias1"
}
}
]
}
Возвращается следующий ответ:
{
"acknowledged": true
}
Если запрос не выполняется, нужно убедиться, что добавляемый к псевдониму индекс уже существует.
Также можно создать псевдоним, используя один из следующих запросов:
PUT <index>/_aliases/<alias name>
POST <index>/_aliases/<alias name>
PUT <index>/_alias/<alias name>
POST <index>/_alias/<alias name>
Чтобы проверить, относится ли alias1 к index-1, выполняют одну из следующих команд:
GET /_alias/alias1
GET /index-1/_alias/alias1
Чтобы получить информацию о сопоставлениях индексов и настройках, на которые ссылается псевдоним, выполняют следующую команду:
GET alias1
Добавление или удаление индексов
Возможно выполнить несколько действий с помощью одной и той же операции _aliases. Например, следующая команда удаляет index-1 и добавляет index-2 в alias1:
POST _aliases
{
"actions": [
{
"remove": {
"index": "index-1",
"alias": "alias1"
}
},
{
"add": {
"index": "index-2",
"alias": "alias1"
}
}
]
}
Действия add и remove выполняются атомарно, то есть alias1 никогда не будет указывать одновременно на index-1 и index-2. Также можно добавлять индексы на основе шаблона индекса, как показано в следующем запросе POST:
POST _aliases
{
"actions": [
{
"add": {
"index": "index*",
"alias": "alias1"
}
}
]
}
Действие remove также поддерживает параметр must_exist. Если для параметра задано значение TRUE и указанный псевдоним не существует, возникает исключение. Если для параметра задано значение FALSE, то при отсутствии указанного псевдонима никаких действий не предпринимается. Значение по умолчанию для must_exist — NULL. Исключение возникает только в том случае, если ни один из указанных псевдонимов не существует.
В следующем POST-запросе используется действие remove с параметром must_exist со значением TRUE:
POST _aliases
{
"actions": [
{
"remove": {
"index": "index-1",
"alias": "alias1",
"must_exist": true
}
}
]
}
Управление псевдонимами
Чтобы отобразить распределение псевдонимов на индексы, выполняют следующую команду:
GET _cat/aliases?v
Копировать
Копировать как cURL
Пример ответа:
alias index filter routing.index routing.search
alias1 index-1 * – -
Чтобы проверить, на какие индексы указывает псевдоним, выполняют следующую команду:
GET _alias/alias1
Пример ответа:
{
"index-2": {
"aliases": {
"alias1": {}
}
}
}
Чтобы узнать, какой псевдоним указывает на конкретный индекс, выполняют следующую команду:
GET /index-2/_alias/*
Чтобы получить все имена индексов и их псевдонимы, выполняют следующую команду:
GET /_alias
Чтобы проверить, существует ли псевдоним, выполняют одну из следующих команд:
HEAD /alias1/_alias/
HEAD /_alias/alias1/
HEAD index-1/_alias/alias1/
Добавление псевдонимов при создании индекса
Добавление индекса к псевдониму при создании индекса можно осуществить так, как показано в следующем запросе PUT:
PUT index-1
{
"aliases": {
"alias1": {}
}
}
Создание отфильтрованных псевдонимов
Создание отфильтрованного псевдонима для доступа к подмножеству документов или полей в базовых индексах добавляет только определенное поле временной метки в alias1. Ниже показан пример запроса POST:
POST _aliases
{
"actions": [
{
"add": {
"index": "index-1",
"alias": "alias1",
"filter": {
"term": {
"timestamp": "1574641891142"
}
}
}
}
]
}
Параметры псевдонима индекса
Параметры псевдонима индекса показаны в таблице 16.
Удаление псевдонимов
Чтобы удалить один или несколько псевдонимов из индекса, используют следующий запрос:
DELETE <index>/_alias/<alias>
DELETE <index>/_aliases/<alias>
И <index>, и <alias> в приведенном выше запросе поддерживают списки, разделенные запятыми, и подстановочные выражения. Следует использовать _all вместо <alias> для удаления всех псевдонимов для индексов, перечисленных в <index>.
Например, если alias1 относится к index-1 и index-2, можно выполнить следующую команду, чтобы удалить alias1 из index-1:
DELETE index-1/_alias/alias1
После выполнения запроса alias1 больше не относится к index-1, но по-прежнему относится к index-2.
Потоки данных
Если в Подсистеме загружаются непрерывно генерируемые данные временных рядов, такие как журналы, события и метрики, то, скорее всего, количество документов быстро растет, и нет необходимости обновлять старые документы.
Типичный рабочий процесс для управления данными временных рядов состоит из нескольких этапов, таких как: создание псевдонима индекса для переключения, определение индекса для записи и определение общих сопоставлений и настроек для базовых индексов.
Потоки данных упрощают этот процесс и обеспечивают настройку, которая лучше всего подходит для данных временных рядов, например, если они предназначены в первую очередь для добавления данных, и в каждом документе есть поле с отметкой времени.
Поток данных внутренне состоит из нескольких вспомогательных индексов. Запросы на поиск направляются во все вспомогательные индексы, а запросы на индексирование направляются в последний индекс для записи. Политики ISM позволяют автоматически обрабатывать обновление или удаление индексов.
Работа с потоками данных осуществляется пошагово:
- Шаг 1: Создать шаблон индекса
Чтобы создать поток данных, сначала нужно создать шаблон индекса, который настраивает набор индексов как поток данных. Объект data_stream указывает на то, что это поток данных, а не обычный шаблон индекса. Шаблон индекса совпадает с названием потока данных:
PUT _index_template/logs-template
{
"index_patterns": [
"my-data-stream",
"logs-*"
],
"data_stream": {},
"priority": 100
}
В этом случае в каждом загружаемом документе должно быть поле @timestamp. Также можно определить собственное поле с отметкой времени в качестве свойства объекта data_stream. Кроме того, можно добавить сопоставления индексов и другие настройки, как и в случае с обычным шаблоном индекса.
PUT _index_template/logs-template-nginx
{
"index_patterns": "logs-nginx",
"data_stream": {
"timestamp_field": {
"name": "request_time"
}
},
"priority": 200,
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
}
}
}
В этом случае индекс logs-nginx соответствует шаблонам logs-template и logs-template-nginx. Если имеется несколько подходящих шаблонов, Подсистема выбирает шаблон с более высоким приоритетом.
- Шаг 2: Создать поток данных
После создания шаблона индекса нужно создать поток данных. Для этого можно использовать API потока данных для явного создания потока данных. API потока данных инициализирует первый вспомогательный индекс:
PUT _data_stream/logs-redis
PUT _data_stream/logs-nginx
Также можно напрямую начать прием данных, не создавая поток данных.
Поскольку есть соответствующий шаблон индекса с объектом data_stream, Подсистема автоматически создает поток данных:
POST logs-staging/_doc
{
"message": "login attempt failed",
"@timestamp": "2013-03-01T00:00:00"
}
Чтобы просмотреть информацию о конкретном потоке данных, используют:
GET _data_stream/logs-nginx
Пример ответа:
{
"data_streams" : [
{
"name" : "logs-nginx",
"timestamp_field" : {
"name" : "request_time"
},
"indices" : [
{
"index_name" : ".ds-logs-nginx-000001",
"index_uuid" : "-VhmuhrQQ6ipYCmBhn6vLw"
}
],
"generation" : 1,
"status" : "GREEN",
"template" : "logs-template-nginx"
}
]
}
В ответе можно увидеть название поля с отметкой времени, список вспомогательных индексов и шаблон, используемый для создания потока данных. Кроме того, можно увидеть состояние потока данных, которое соответствует самому низкому статусу всех его вспомогательных индексов.
Чтобы получить дополнительную информацию о потоке данных, используют endpoint _stats:
GET _data_stream/logs-nginx/_stats
Пример ответа:
{
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"data_stream_count" : 1,
"backing_indices" : 1,
"total_store_size_bytes" : 208,
"data_streams" : [
{
"data_stream" : "logs-nginx",
"backing_indices" : 1,
"store_size_bytes" : 208,
"maximum_timestamp" : 0
}
]
}
Чтобы просмотреть информацию обо всех потоках данных, используют следующий запрос:
GET _data_stream
- Шаг 3: Ввод данных в поток данных
Чтобы добавить данные в поток данных, можно использовать обычные API-интерфейсы индексирования. Следует убедиться, что в каждом индексируемом документе есть поле с отметкой времени. Если попытаться добавить документ без поля с отметкой времени, будет получено сообщение об ошибке.
POST logs-redis/_doc
{
"message": "login attempt",
"@timestamp": "2013-03-01T00:00:00"
}
- Шаг 4: Поиск в потоке данных
Поиск в потоке данных можно выполнять так же, как в обычном индексе или псевдониме индекса. Операция поиска применяется ко всем вспомогательным индексам (ко всем данным, присутствующим в потоке):
GET logs-redis/_search
{
"query": {
"match": {
"message": "login"
}
}
}
Пример ответа:
{
"took" : 514,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : ".ds-logs-redis-000001",
"_type" : "_doc",
"_id" : "-rhVmXoBL6BAVWH3mMpC",
"_score" : 0.2876821,
"_source" : {
"message" : "login attempt",
"@timestamp" : "2013-03-01T00:00:00"
}
}
]
}
}
- Шаг 5: Переключение потока данных
Операция переключения создает новый вспомогательный индекс, который становится новым индексом записи для потока данных.
Для выполнения ручной операции переключения в потоке данных:
POST logs-redis/_rollover
Пример ответа:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"old_index" : ".ds-logs-redis-000001",
"new_index" : ".ds-logs-redis-000002",
"rolled_over" : true,
"dry_run" : false,
"conditions" : { }
}
Если теперь выполнить операцию GET над потоком данных logs-redis, то можно убедиться, что идентификатор поколения увеличивается с 1 до 2.
Также можно настроить политику ISM для автоматизации процесса обновления потока данных. Политика ISM применяется к вспомогательным индексам во время их создания. Когда происходит связывание политики с потоком данных, она влияет только на будущие вспомогательные индексы этого потока данных.
Нет необходимости задавать параметр rollover_alias, поскольку политика ISM получает эту информацию из вспомогательного индекса.
- Шаг 6: Управление потоками данных на "Панелях мониторинга" Подсистемы
Чтобы управлять потоками данных в "Панелях мониторинга" Подсистемы, нужно открыть интерфейс, выбрать "Управление индексом", затем "Индексы" или "Индексы, управляемые политикой".
На экране отобразится переключатель для потоков данных, с помощью которого можно показывать или скрывать индексы, относящиеся к потоку данных.
При включении этого переключателя появляется выпадающее меню с несколькими вариантами выбора потока данных, которое можно использовать для фильтрации потоков данных. Также отображается столбец с названием потока данных, в котором содержится индекс.
Возможно выбрать один или несколько потоков данных и применить к ним политику ISM. Также можно применить политику к любому отдельному вспомогательному индексу.
Визуализацию потока данных можно выполнять так же, как и обычного индекса или псевдонима индекса.
- Шаг 7: Удаление потока данных
Операция удаления сначала удаляет вспомогательные индексы потока данных, а затем удаляет сам поток данных.
Чтобы удалить поток данных и все его скрытые резервные индексы:
DELETE _data_stream/<name_of_data_stream>
Возможно использовать подстановочные знаки для удаления более чем одного потока данных.
Рекомендуется удалять данные из потока данных с использованием политики ISM.
Возможно использовать асинхронный поиск, SQL и PPL для прямого запроса данных в потоке. Также можно использовать плагин Security для определения подробных разрешений для имени потока данных.
Переиндексация данных
После создания индекса может потребоваться внести существенные изменения, например, добавить новое поле в каждый документ или объединить несколько индексов в один. Вместо того чтобы удалять индекс, вносить изменения в автономном режиме, а затем снова индексировать данные, можно использовать операцию reindex.
С помощью операции reindex можно скопировать все или часть документов, выбранных с помощью запроса, в другой индекс. Переиндексация — это операция POST. В самой простой форме нужно указать исходный индекс и целевой индекс.
Переиндексация может быть объемной операцией в зависимости от размера исходного индекса. Рекомендуется отключить реплики в целевом индексе, установив number_of_replicas в значение 0, и снова включить их после завершения процесса переиндексации.
Переиндексация всех документов
Для переиндексации можно скопировать все документы из одного индекса в другой.
Сначала нужно создать целевой индекс с нужными сопоставлениями полей и настройками или скопировать их из исходного индекса:
PUT destination
{
"mappings":{
"Add in your desired mappings"
},
"settings":{
"Add in your desired settings"
}
}
Команда reindex копирует все документы из исходного индекса в целевой индекс:
POST _reindex
{
"source":{
"index":"source"
},
"dest":{
"index":"destination"
}
}
Если целевой индекс еще не создан, операция reindex создаст новый целевой индекс с настройками по умолчанию.
Переиндексация из удаленного кластера
Возможно копировать документы из индекса в удаленном кластере, для чего используют опцию remote для указания удаленного имени узла и необходимых учетных данных.
Эта команда обращается к удаленному кластеру, входит в Подсистему, используя имя пользователя и пароль, и копирует все документы из исходного индекса удаленного кластера в целевой индекс локального кластера:
POST _reindex
{
"source":{
"remote":{
"host":"https://<REST_endpoint_of_remote_cluster>:9200",
"username":"YOUR_USERNAME",
"password":"YOUR_PASSWORD"
},
"index": "source"
},
"dest":{
"index":"destination"
}
}
Допустимые параметры указаны в таблице 17.
В таблице 18 перечислены параметры кластера для политики повторных попыток.
Переиндексация подмножества документов
Возможно скопировать определенный набор документов, соответствующий поисковому запросу.
Эта команда копирует в целевой индекс только часть документов, соответствующих запросу:
POST _reindex
{
"source":{
"index":"source",
"query": {
"match": {
"field_name": "text"
}
}
},
"dest":{
"index":"destination"
}
}
Слияние одного или нескольких индексов
Возможно объединить документы из одного или нескольких индексов, добавив исходные индексы в виде списка.
Например, эта команда копирует все документы из двух исходных индексов в один индекс назначения:
POST _reindex
{
"source":{
"index":[
"source_1",
"source_2"
]
},
"dest":{
"index":"destination"
}
}
Следует убедиться, что количество сегментов в исходных и целевых индексах одинаково.
Переиндексация только уникальных документов
Возможно копировать только документы, отсутствующие в целевом индексе, установив для параметра op_type значение create. В этом случае, если документ с таким же идентификатором уже существует, операция игнорирует документ из исходного индекса. Чтобы игнорировать все конфликты версий документов, нужно установить для параметра conflicts значение proceed.
POST _reindex
{
"conflicts":"proceed",
"source":{
"index":"source"
},
"dest":{
"index":"destination",
"op_type":"create"
}
}
Преобразование документов во время переиндексации
Возможно преобразовать свои данные в процессе переиндексации с помощью опции script.
Например, эта команда запускает исходный индекс через безопасный скрипт, который увеличивает значение поля number внутри объекта account перед его копированием в целевой индекс:
POST _reindex
{
"source":{
"index":"source"
},
"dest":{
"index":"destination"
},
"script":{
"lang":"painless",
"source":"ctx._account.number++"
}
}
Также можно указать конвейер обработки данных для их преобразования в процессе переиндексации.
Сначала нужно создать конвейер с определенными параметрами processors. В конвейере приема данных можно использовать несколько различных параметров processors.
Ниже приведен пример конвейера обработки данных, который определяет split-процессор, разделяющий поле text на основе разделителя "пробел" и сохраняющий его в новом поле word. Script-процессор — это безопасный скрипт, который определяет длину поля word и сохраняет ее в новом поле word_count. Remove-процессор удаляет поле test.
PUT _ingest/pipeline/pipeline-test
{
"description": "Splits the text field into a list. Computes the length of the 'word' field and stores it in a new 'word_count' field. Removes the 'test' field.",
"processors": [
{
"split": {
"field": "text",
"separator": "\\s+",
"target_field": "word"
}
},
{
"script": {
"lang": "painless",
"source": "ctx.word_count = ctx.word.length"
}
},
{
"remove": {
"field": "test"
}
}
]
}
После создания конвейера можно использовать операцию reindex:
POST _reindex
{
"source": {
"index": "source"
},
"dest": {
"index": "destination",
"pipeline": "pipeline-test"
}
}
Обновление документов в текущем индексе
Чтобы обновить данные в текущем индексе, не копируя их в другой индекс, используют операцию update_by_query.
Операция update_by_query — это POST-операция, которую можно выполнять с одним индексом за раз:
POST <index_name>/_update_by_query
Если запустить эту команду без параметров, она увеличит номер версии для всех документов в индексе.
Параметры исходного индекса
Параметры для исходного индекса приведены в таблице 19.
Параметры целевого индекса
Параметры для целевого индекса приведены в таблице 20.
Политики
Политики – это документы JSON, которые определяют следующее:
- Состояния, в которых может находиться индекс, включая состояние по умолчанию для новых индексов. Например, можно назвать свои состояния "активный", "отложенный", "удаленный" и так далее;
- Любые действия для выполнения плагином при переходе индекса в другое состояние, например при выполнении операции переключения;
- Условия, которые должны быть соблюдены для перехода индекса в новое состояние, называются переходами. Например, если индексу больше восьми недель, можно перевести его в состояние "удалить".
Другими словами, политика определяет состояния, в которых может находиться индекс, действия, которые необходимо выполнять в каждом состоянии, и условия, которые должны быть соблюдены для перехода между состояниями.
Политики можно полностью гибко настраивать: создать любое состояние, перейти в любое другое состояние и указать любое количество действий в каждом состоянии.
В таблице 21 перечислены соответствующие поля политики.
Состояния
Состояние — это описание статуса, в котором в данный момент находится управляемый индекс. Управляемый индекс может находиться только в одном состоянии одновременно. С каждым состоянием связаны действия, которые выполняются последовательно при переходе в состояние, и переходы, которые проверяются после выполнения всех действий.
В таблице 22 перечислены параметры, которые можно определить для состояния.
Действия
Действия — это шаги, которые последовательно выполняет политика при переходе в определенное состояние.
ISM выполняет действия в том порядке, в котором они определены. Например, если определяются действия A, B, C, D, ISM выполняет действие "A", а затем переходит в режим ожидания в соответствии с настройками кластера plugins.index_state_management.job_interval. По окончании режима ожидания ISM продолжает выполнять оставшиеся действия. Однако если ISM не может успешно выполнить действие "A", операция завершается, и действия "B", "C" и "D" не выполняются.
При необходимости можно задать период ожидания действия, по истечении которого действие будет принудительно прервано. Например, если период ожидания установлен на 1d, а ISM не завершит действие в течение одного дня даже после повторных попыток, действие будет прервано.
В таблице 23 перечислены параметры, которые можно определить для действия.
Параметры операции retry приведены в таблице 24.
В следующем примере действие имеет период ожидания в один час. Политика повторяет это действие три раза с экспоненциальной отсрочкой, с задержкой в 10 минут между каждой попыткой:
"actions": {
"timeout": "1h",
"retry": {
"count": 3,
"backoff": "exponential",
"delay": "10m"
}
}
Операции, поддерживаемые ISM
ISM поддерживает следующие операции:
- force_merge – уменьшает количество сегментов за счет объединения отдельных сегментов. Эта операция пытается привести индекс в состояние "read-only" перед началом процесса объединения. Параметры операции приведены в таблице 25.
Пример:
{
"force_merge": {
"max_num_segments": 1
}
}
- read_only – устанавливает управляемый индекс, доступный только для чтения.
Пример:
{
"read_only": {}
}
Рекомендуется задать для управляемого индекса параметр index.blocks.write в значение TRUE.
Примечание – Это блокирование не препятствует обновлению индекса.
- read_write – делает управляемый индекс доступным для записи.
Пример:
{
"read_write": {}
}
- replica_count – задает количество реплик, которые нужно присвоить индексу.
Параметр number_of_replicas с типом number определяет количество реплик, которые нужно присвоить индексу и является обязательным.
Пример:
{
"replica_count": {
"number_of_replicas": 2
}
}
- shrink – позволяет уменьшить количество основных сегментов в индексах. С помощью этого действия можно указать:
- количество основных сегментов, которые должен содержать целевой индекс;
- максимальный размер сегментов для основных сегментов в целевом индексе;
- процентное значение для уменьшения количества основных сегментов в целевом индексе.
Пример:
"shrink": {
"num_new_shards": 1,
"target_index_name_template": {
"source": "_shrunken"
},
"aliases": [
{
"my-alias": {}
}
],
"switch_aliases": true,
"force_unsafe": false
}
Параметры операции shrink приведены в таблице 26.
Если требуется добавить aliases к действию, параметр должен содержать массив объектов псевдонимов, например,
"aliases": [
{
"my-alias": {}
},
{
"my-second-alias": {
"is_write_index": false,
"filter": {
"multi_match": {
"query": "QUEEN",
"fields": ["speaker", "text_entry"]
}
},
"index_routing" : "1",
"search_routing" : "1"
}
},
]
- close – закрывает управляемый индекс.
Пример:
{
"close": {}
}
Закрытые индексы остаются на диске, но не потребляют ресурсы процессора или памяти. Нельзя читать закрытые индексы, записывать в них данные или выполнять поиск по ним.
Закрытие индекса — хороший вариант, если нужно хранить данные дольше, чем планируется их активно искать, и если на узлах данных достаточно места на диске. Если нужно снова выполнить поиск данных, проще открыть закрытый индекс, чем восстановить его из снимка.
- open – открывает управляемый индекс.
Пример:
{
"open": {}
}
delete – удаляет управляемый индекс.
Пример:
{
"delete": {}
}
- rollover – переключает псевдоним в новый индекс, когда управляемый индекс соответствует одному из условий переключения.
ISM проверяет условия для операций при каждом выполнении политики в соответствии с установленным интервалом, а не постоянно. Переключение будет выполнено, если значение достигнет или превысит установленный предел при выполнении проверки. Например, если min_size установлено значение в 100 ГБ, ISM может проверить индекс при 99 ГБ и не выполнить переполнение. Однако если к моменту следующей проверки индекс превысит лимит (например, 105 ГБ), будет выполнена операция.
Если нужно пропустить действие переключения, можно установить параметр индекса index.plugins.index_state_management.rollover_skip в TRUE. Например, если получено сообщение об ошибке "Отсутствует псевдоним или индекс записи…", можно установить параметр index.plugins.index_state_management.rollover_skip в TRUE и повторить попытку, чтобы пропустить действие переключения.
Формат индекса должен соответствовать шаблону: ^.*-\d+$, например (logs-000001). Можно задать параметр index.plugins.index_state_management.rollover_alias в качестве псевдонима для переключения.
Параметры операции rollover приведены в таблице 27.
Пример:
{
"rollover": {
"min_size": "50gb"
}
}
{
"rollover": {
"min_primary_shard_size": "30gb"
}
}
{
"rollover": {
"min_doc_count": 100000000
}
}
{
"rollover": {
"min_index_age": "30d"
}
}
- notification – отправляет уведомление.
Для уведомлений доступны параметры, перечисленные в таблице 28.
Система назначения должна вернуть ответ, иначе операция уведомления завершится ошибкой.
Пример 1: Уведомление о перезвоне
{
"notification": {
"destination": {
"chime": {
"url": "<url>"
}
},
"message_template": {
"source": "the index is {{ctx.index}}"
}
}
}
Пример 2: Пользовательское уведомление webhook
{
"notification": {
"destination": {
"custom_webhook": {
"url": "https://<your_webhook>"
}
},
"message_template": {
"source": "the index is {{ctx.index}}"
}
}
}
Пример 3: Уведомление о замедлении
{
"notification": {
"destination": {
"slack": {
"url": "https://hooks.slack.com/services/xxx/xxxxxx"
}
},
"message_template": {
"source": "the index is {{ctx.index}}"
}
}
}
Можно использовать переменные ctx в сообщении, чтобы указать ряд параметров политики на основе предыдущих выполнений политики. Например, если в политике есть действие по переключению, можно использовать в сообщении, чтобы указать название переключения.
Для каждой политики доступны параметры ctx-переменных, перечисленные в таблице 29.
- snapshot – создает резервную копию индексов и состояния кластера.
Параметры операции перечислены в таблице 30.
Пример:
{
"snapshot": {
"repository": "my_backup",
"snapshot": ""
}
}
- index_priority – задает приоритет для индекса в определенном состоянии. Нераспределенные сегменты индексов восстанавливаются в порядке их приоритета, если это возможно. Сначала восстанавливаются индексы с более высоким приоритетом, а затем — с более низким.
Параметр операции приведен в таблице 31.
Пример:
"actions": [
{
"index_priority": {
"priority": 50
}
}
]
- allocation – назначает индекс узлу с определенным набором атрибутов. Например, установка require в значение "warm" перемещает данные только на узлы "warm".
Операция имеет следующие параметры, приведенные в таблице 32.
Пример:
"actions": [
{
"allocation": {
"require": { "temp": "warm" }
}
}
]
- rollup – слияние индексов позволяет периодически уменьшать детализацию данных, объединяя старые данные в сводные индексы.
Задания на слияние могут быть непрерывными или прерывистыми. Задание на слияние, созданное с помощью политики ISM, может быть только прерывистым.
Примеры endpoints:
PUT _plugins/_rollup/jobs/<rollup_id>
GET _plugins/_rollup/jobs/<rollup_id>
DELETE _plugins/_rollup/jobs/<rollup_id>
POST _plugins/_rollup/jobs/<rollup_id>/_start
POST _plugins/_rollup/jobs/<rollup_id>/_stop
GET _plugins/_rollup/jobs/<rollup_id>/_explai
Пример сводной политики ISM:
{
"policy": {
"description": "Sample rollup" ,
"default_state": "rollup",
"states": [
{
"name": "rollup",
"actions": [
{
"rollup": {
"ism_rollup": {
"description": "Creating rollup through ISM",
"target_index": "target",
"page_size": 1000,
"dimensions": [
{
"date_histogram": {
"fixed_interval": "60m",
"source_field": "order_date",
"target_field": "order_date",
"timezone": "America/Los_Angeles"
}
},
{
"terms": {
"source_field": "customer_gender",
"target_field": "customer_gender"
}
},
{
"terms": {
"source_field": "day_of_week",
"target_field": "day_of_week"
}
}
],
"metrics": [
{
"source_field": "taxless_total_price",
"metrics": [
{
"sum": {}
}
]
},
{
"source_field": "total_quantity",
"metrics": [
{
"avg": {}
},
{
"max": {}
}
]
}
]
}
}
}
],
"transitions": []
}
]
}
}
Переходы
Переходы определяют условия, которые должны быть выполнены для изменения состояния. После завершения всех действий в текущем состоянии политика начинает проверять условия для переходов.
ISM оценивает переходы в том порядке, в котором они определены. Например, если определены переходы A, B, C, D, ISM перебирает этот список переходов до тех пор, пока не найдет переход, который оценивается как TRUE, после чего останавливается и устанавливает следующее состояние в соответствии с этим переходом. При следующем выполнении ISM игнорирует остальные переходы и начинает работу в этом новом состоянии.
Если не указываются никакие условия для перехода, и он оставляется пустым, то предполагается, что он всегда выполняется. Это означает, что политика переводит индекс в это состояние в момент проверки.
В таблице 33 перечислены параметры, которые можно определить для переходов.
Объект conditions имеет параметры, перечисленные в таблице 34.
В следующем примере индекс переходит в состояние cold через 30 дней:
"transitions": [
{
"state_name": "cold",
"conditions": {
"min_index_age": "30d"
}
}
]
ISM проверяет условия при каждом выполнении политики в соответствии с заданным интервалом.
В этом примере используется условие cron для переключения индексов каждую субботу в 17:00 по тихоокеанскому времени:
"transitions": [
{
"state_name": "cold",
"conditions": {
"cron": {
"cron": {
"expression": "* 17 * * SAT",
"timezone": "America/Los_Angeles"
}
}
}
}
]
Следует обратить внимание, что это условие выполняется не ровно в 17:00; задание по-прежнему выполняется в соответствии с настройкой job_interval. Из-за разницы во времени начала и времени, которое может потребоваться для выполнения действий до проверки условий перехода, не рекомендуется использовать слишком узкие выражения cron. Например, не стоит использовать "15 17 * * SAT" (17:15 в субботу).
Окно в один час, которое используется в этом примере, обычно достаточно, но можно увеличить его до 2–3 часов, чтобы не пропустить это окно и не ждать неделю, пока произойдет переход. В качестве альтернативы можно использовать более широкое выражение, например "* * * * SAT,SUN", чтобы переход происходил в любое время в течение выходных.
Уведомления об ошибках
Операция error_notification отправляет уведомление в случае сбоя управляемого индекса. Она уведомляет одного получателя или канал уведомлений с помощью специального сообщения.
Настройка уведомлений об ошибках на уровне политики осуществляется следующим образом:
{
"policy": {
"description": "hot warm delete workflow",
"default_state": "hot",
"schema_version": 1,
"error_notification": { },
"states": [ ]
}
}
Параметры операции перечислены в таблице 35.
Канал уведомлений должен вернуть ответ, иначе операция error_notification выдаст ошибку.
Пример 1: Уведомление о получении
{
"error_notification": {
"destination": {
"chime": {
"url": "<url>"
}
},
"message_template": {
"source": "The index {{ctx.index}} failed during policy execution."
}
}
}
Пример 2: Пользовательское уведомление webhook
{
"error_notification": {
"destination": {
"custom_webhook": {
"url": "https://<your_webhook>"
}
},
"message_template": {
"source": "The index {{ctx.index}} failed during policy execution."
}
}
}
Пример 3: Уведомление Slack
{
"error_notification": {
"destination": {
"slack": {
"url": "https://hooks.slack.com/services/xxx/xxxxxx"
}
},
"message_template": {
"source": "The index {{ctx.index}} failed during policy execution."
}
}
}
Пример 4. Использование канала уведомлений
{
"error_notification": {
"channel": {
"id": "some-channel-config-id"
},
"message_template": {
"source": "The index {{ctx.index}} failed during policy execution."
}
}
}
Можно использовать те же параметры для переменных ctx при выполнении операции уведомления.
Управляемые индексы
C помощью операций с управляемым индексом можно изменить или обновить политику.
В таблице 36 перечислены параметры операций с управляемым индексированием.
В следующем примере показана политика управляемого индексирования:
{
"managed_index": {
"name": "my_index",
"index": "my_index",
"index_uuid": "sOKSOfkdsoSKeofjIS",
"enabled": true,
"enabled_time": 1553112384,
"last_updated_time": 1553112384,
"schedule": {
"interval": {
"period": 1,
"unit": "MINUTES",
"start_time": 1553112384
}
},
"policy_id": "log_rotation",
"policy_version": 1,
"policy": {...},
"change_policy": null
}
}
Настройки ISM
Значения по умолчанию настроек ISM должны хорошо подходить для большинства случаев использования, поэтому не рекомендуется изменять эти настройки.
ISM сохраняет свою конфигурацию в индексе .opendistro-ism-config. Не следует изменять этот индекс без использования операций API ISM.
Все настройки доступны с помощью операции _cluster/settings. Ни одна из них не требует перезапуска, и все они могут быть помечены persistent или transient. Перечень настроек приведен в таблице 37.
ISM API
Для программирования работы с политиками и управляемыми индексами используют операции управления состоянием индекса.
Создание политики
Пример запроса:
PUT _plugins/_ism/policies/policy_1
{
"policy": {
"description": "ingesting logs",
"default_state": "ingest",
"states": [
{
"name": "ingest",
"actions": [
{
"rollover": {
"min_doc_count": 5
}
}
],
"transitions": [
{
"state_name": "search"
}
]
},
{
"name": "search",
"actions": [],
"transitions": [
{
"state_name": "delete",
"conditions": {
"min_index_age": "5m"
}
}
]
},
{
"name": "delete",
"actions": [
{
"delete": {}
}
],
"transitions": []
}
]
}
}
Пример ответа:
{
"_id": "policy_1",
"_version": 1,
"_primary_term": 1,
"_seq_no": 7,
"policy": {
"policy": {
"policy_id": "policy_1",
"description": "ingesting logs",
"last_updated_time": 1577990761311,
"schema_version": 1,
"error_notification": null,
"default_state": "ingest",
"states": [
{
"name": "ingest",
"actions": [
{
"rollover": {
"min_doc_count": 5
}
}
],
"transitions": [
{
"state_name": "search"
}
]
},
{
"name": "search",
"actions": [],
"transitions": [
{
"state_name": "delete",
"conditions": {
"min_index_age": "5m"
}
}
]
},
{
"name": "delete",
"actions": [
{
"delete": {}
}
],
"transitions": []
}
]
}
}
}
Добавление политики
Операция добавляет политику в индекс. Эта операция не изменяет политику, если она уже есть в индексе.
Пример запроса:
POST _plugins/_ism/add/index_1
{
"policy_id": "policy_1"
}
Пример ответа:
{
"updated_indices": 1,
"failures": false,
"failed_indices": []
}
Если при добавлении политики к индексу используется подстановочный знак *, плагин ISM интерпретирует * как все индексы, включая системные индексы, такие как .opendistro-security, в которых хранятся пользователи, роли и арендаторы. Действие удаления в политике может привести к случайному удалению всех ролей пользователей и арендаторов в кластере. Не следует использовать подстановочный знак * с широкими возможностями, а вместо этого лучше добавлять префикс, например my-logs*, при указании индексов с помощью _ism/add API.
Обновление политики
Операция обновляет политику. Используются параметры seq_no и primary_term для обновления существующей политики. Если эти значения не соответствуют существующей политике или политика не существует, ISM выдаст ошибку.
Возможно, политика, применяемая в данный момент к индексу, не является самой актуальной из доступных. Чтобы получить самую актуальную версию политики используют, например, такой запрос:
PUT _plugins/_ism/policies/policy_1?if_seq_no=7&if_primary_term=1
{
"policy": {
"description": "ingesting logs",
"default_state": "ingest",
"states": [
{
"name": "ingest",
"actions": [
{
"rollover": {
"min_doc_count": 5
}
}
],
"transitions": [
{
"state_name": "search"
}
]
},
{
"name": "search",
"actions": [],
"transitions": [
{
"state_name": "delete",
"conditions": {
"min_index_age": "5m"
}
}
]
},
{
"name": "delete",
"actions": [
{
"delete": {}
}
],
"transitions": []
}
]
}
}
Пример ответа:
{
"_id": "policy_1",
"_version": 2,
"_primary_term": 1,
"_seq_no": 10,
"policy": {
"policy": {
"policy_id": "policy_1",
"description": "ingesting logs",
"last_updated_time": 1577990934044,
"schema_version": 1,
"error_notification": null,
"default_state": "ingest",
"states": [
{
"name": "ingest",
"actions": [
{
"rollover": {
"min_doc_count": 5
}
}
],
"transitions": [
{
"state_name": "search"
}
]
},
{
"name": "search",
"actions": [],
"transitions": [
{
"state_name": "delete",
"conditions": {
"min_index_age": "5m"
}
}
]
},
{
"name": "delete",
"actions": [
{
"delete": {}
}
],
"transitions": []
}
]
}
}
}
Получить политику
Операция получает политику с помощью policy_id.
Пример запроса:
GET _plugins/_ism/policies/policy_1
Пример ответа:
{
"_id": "policy_1",
"_version": 2,
"_seq_no": 10,
"_primary_term": 1,
"policy": {
"policy_id": "policy_1",
"description": "ingesting logs",
"last_updated_time": 1577990934044,
"schema_version": 1,
"error_notification": null,
"default_state": "ingest",
"states": [
{
"name": "ingest",
"actions": [
{
"rollover": {
"min_doc_count": 5
}
}
],
"transitions": [
{
"state_name": "search"
}
]
},
{
"name": "search",
"actions": [],
"transitions": [
{
"state_name": "delete",
"conditions": {
"min_index_age": "5m"
}
}
]
},
{
"name": "delete",
"actions": [
{
"delete": {}
}
],
"transitions": []
}
]
}
}
Удаление политики из индекса
Операция удаляет любую политику ISM из индекса.
Пример запроса:
POST _plugins/_ism/remove/index_1
Пример ответа:
{
"updated_indices": 1,
"failures": false,
"failed_indices": []
}
Обновление политики управляемого индекса
Операция обновляет политику управляемого индекса до новой политики (или до новой версии политики). Можно использовать шаблон индекса для одновременного обновления нескольких индексов. При обновлении нескольких индексов можно включить фильтр состояния, чтобы затрагивать только определенные управляемые индексы. Политика изменений отфильтровывает все существующие управляемые индексы и применяет изменения только к тем, которые находятся в указанном состоянии. Также можно явно указать состояние, в которое переходит управляемый индекс после вступления в силу изменения политики.
Изменение политики — это асинхронный фоновый процесс. Изменения ставятся в очередь и не выполняются сразу фоновым процессом. Эта задержка в выполнении защищает управляемые индексы, которые работают в данный момент, от перехода в нерабочее состояние. Если политика, которую нужно изменить, содержит лишь небольшие изменения в конфигурации, то изменение происходит немедленно. Например, если политика изменяет параметр min_index_age в условии перехода с 1000d на 100d, то это изменение происходит немедленно при следующем выполнении. Если изменение затрагивает состояние, действия или порядок действий в текущем состоянии, в котором находится индекс, то изменение происходит в конце текущего состояния перед переходом в новое состояние.
В этом примере политика, применяемая к индексу index_1, изменяется на policy_1, которая может быть как совершенно новой политикой, так и обновленной версией существующей политики. Процесс применяет изменение только в том случае, если индекс в данный момент находится в состоянии searches. После изменения политики index_1 переходит в состояние delete.
Пример запроса:
POST _plugins/_ism/change_policy/index_1
{
"policy_id": "policy_1",
"state": "delete",
"include": [
{
"state": "searches"
}
]
}
Пример ответа:
{
"updated_indices": 0,
"failures": false,
"failed_indices": []
}
Повторение неудачной попытки индексирования
Операция повторяет неудачное действие для индекса. Чтобы повторная попытка прошла успешно, ISM должен управлять индексом, а индекс должен находиться в состоянии сбоя. Можно использовать шаблоны индексов (*) для повторной попытки нескольких неудачных индексов.
Пример запроса:
POST _plugins/_ism/retry/index_1
{
"state": "delete"
}
Пример ответа:
{
"updated_indices": 0,
"failures": false,
"failed_indices": []
}
Состояние индекса
Операция получает текущее состояние индекса. Можно использовать шаблоны индексов для получения состояния нескольких индексов.
Пример запроса:
GET _plugins/_ism/explain/index_1
Пример ответа:
{
"index_1": {
"index.plugins.index_state_management.policy_id": "policy_1"
}
}
При необходимости можно добавить параметр show_policy в путь запроса, чтобы получить политику, которая в данный момент применяется к индексу. Это полезно для проверки того, является ли политика, применяемая к индексу, последней.
Пример запроса:
GET _plugins/_ism/explain/index_1?show_policy=true
Пример ответа:
{
"index_1": {
"index.plugins.index_state_management.policy_id": "sample-policy",
"index.opendistro.index_state_management.policy_id": "sample-policy",
"index": "index_1",
"index_uuid": "gCFlS_zcTdih8xyxf3jQ-A",
"policy_id": "sample-policy",
"enabled": true,
"policy": {
"policy_id": "sample-policy",
"description": "ingesting logs",
"last_updated_time": 1647284980148,
"schema_version": 13,
"error_notification": null,
"default_state": "ingest",
"states": [...],
"ism_template": null
}
},
"total_managed_indices": 1
}
Удаление политики
Операция удаляет политику с помощью policy_id.
Пример запроса:
DELETE _plugins/_ism/policies/policy_1
Пример ответа:
{
"_index": ".opendistro-ism-config",
"_id": "policy_1",
"_version": 3,
"result": "deleted",
"forced_refresh": true,
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 15,
"_primary_term": 1
}
Проверка предотвращения ошибок
ISM позволяет автоматически запускать действие, но запуск действия может завершиться ошибкой по ряду причин. Можно использовать проверку для предотвращения ошибок, чтобы протестировать действие и исключить сбои.
Чтобы включить проверку предотвращения ошибок, устанавливают для параметра plugins.index_state_management.action_validation.enabled значение TRUE:
PUT _cluster/settings
{
"persistent":{
"plugins.index_state_management.action_validation.enabled": true
}
}
Пример ответа:
{
"acknowledged" : true,
"persistent" : {
"plugins" : {
"index_state_management" : {
"validation_action" : {
"enabled" : "true"
}
}
}
},
"transient" : { }
}
Чтобы проверить статус и сообщение о предотвращении ошибок, передают validate_action=true в endpoint _plugins/_ism/explain:
GET _plugins/_ism/explain/test-000001?validate_action=true
Пример ответа содержит дополнительный объект проверки с сообщением о состоянии проверки:
{
"test-000001" : {
"index.plugins.index_state_management.policy_id" : "test_rollover",
"index.opendistro.index_state_management.policy_id" : "test_rollover",
"index" : "test-000001",
"index_uuid" : "CgKsxFmQSIa8dWqpbSJmyA",
"policy_id" : "test_rollover",
"policy_seq_no" : -2,
"policy_primary_term" : 0,
"rolled_over" : false,
"index_creation_date" : 1667410460649,
"state" : {
"name" : "rollover",
"start_time" : 1667410766045
},
"action" : {
"name" : "rollover",
"start_time" : 1667411127803,
"index" : 0,
"failed" : false,
"consumed_retries" : 0,
"last_retry_time" : 0
},
"step" : {
"name" : "attempt_rollover",
"start_time" : 1667411127803,
"step_status" : "starting"
},
"retry_info" : {
"failed" : true,
"consumed_retries" : 0
},
"info" : {
"message" : "Previous action was not able to update IndexMetaData."
},
"enabled" : false,
"validate" : {
"validation_message" : "Missing rollover_alias index setting [index=test-000001]",
"validation_status" : "re_validating"
}
},
"total_managed_indices" : 1
}
Если передать validate_action=false или не передать значение validate_action в endpoint _plugins/_ism/explain, ответ не будет содержать статус проверки на наличие ошибок и сообщение:
GET _plugins/_ism/explain/test-000001?validate_action=false
или:
GET _plugins/_ism/explain/test-000001
Пример ответа:
{
"test-000001" : {
"index.plugins.index_state_management.policy_id" : "test_rollover",
"index.opendistro.index_state_management.policy_id" : "test_rollover",
"index" : "test-000001",
"index_uuid" : "CgKsxFmQSIa8dWqpbSJmyA",
"policy_id" : "test_rollover",
"policy_seq_no" : -2,
"policy_primary_term" : 0,
"rolled_over" : false,
"index_creation_date" : 1667410460649,
"state" : {
"name" : "rollover",
"start_time" : 1667410766045
},
"action" : {
"name" : "rollover",
"start_time" : 1667411127803,
"index" : 0,
"failed" : false,
"consumed_retries" : 0,
"last_retry_time" : 0
},
"step" : {
"name" : "attempt_rollover",
"start_time" : 1667411127803,
"step_status" : "starting"
},
"retry_info" : {
"failed" : true,
"consumed_retries" : 0
},
"info" : {
"message" : "Previous action was not able to update IndexMetaData."
},
"enabled" : false
},
"total_managed_indices" : 1
}
Преобразования индексов
В то время как задания по объединению индексов позволяют уменьшить детализацию данных, объединяя старые данные в объединенные индексы, задания по преобразованию позволяют создать другое, обобщенное представление данных, ориентированное на определенные поля, чтобы можно было визуализировать или анализировать данные по-разному.
Например, если предположить, что есть данные об организациях, которые распределены по нескольким полям и категориям, и требуется просмотреть сводную информацию по организациям, кварталам и ценам, то можно использовать задание преобразования, чтобы создать новый сводный индекс, распределенный по этим конкретным категориям.
Задания преобразования можно использовать двумя способами:
- С помощью пользовательского интерфейса "Панелей мониторинга" указать индекс, который требуется преобразовать, и дополнительные фильтры данных, которые предполагается использовать для фильтрации исходного индекса. Затем выбрать поля, которые нужно преобразовать, и агрегации, которые необходимо использовать при преобразовании. Наконец, определить расписание для выполнения задания.
- Использовать API преобразований, чтобы указать все сведения о задании: индекс, который требуется преобразовать, целевые группы, которые должен содержать преобразованный индекс, любые агрегации, которые предполагается использовать для группировки столбцов, а также расписание выполнения задания.
На "Панелях мониторинга" Подсистемы отображается подробная сводка по созданным заданиям и соответствующая информация, например связанные индексы и статусы заданий. Можно просмотреть и отредактировать сведения о задании и выбранные параметры перед его созданием и даже просмотреть данные преобразованного индекса, выбирая поля для преобразования. Однако также можно использовать REST API для создания заданий преобразования и предварительного просмотра результатов преобразования, но для этого необходимо знать все необходимые настройки и параметры, чтобы отправить их в теле HTTP-запроса. Отправка конфигураций заданий преобразования в виде скриптов JSON обеспечивает большую переносимость и позволяет делиться заданиями преобразования и воспроизводить их, что сложнее сделать с помощью "Панелей мониторинга" Подсистемы.
Сценарии использования помогут решить, какой метод использовать для создания заданий на преобразование.
Преобразование API
Помимо использования "Панелей мониторинга" Подсистемы также можно использовать REST API для создания, запуска, остановки и выполнения других операций, связанных с заданиями преобразования.
Создание задания преобразования
Операция создает задание преобразования.
Формат запроса:
PUT _plugins/_transform/<transform_id>
Идентификатор преобразования transform_i имеет тип данных string.
В таблице 38 указаны параметры в теле HTTP-запроса.
Следующий запрос создает задание преобразования с идентификатором sample:
PUT _plugins/_transform/sample
{
"transform": {
"enabled": true,
"continuous": true,
"schedule": {
"interval": {
"period": 1,
"unit": "Minutes",
"start_time": 1602100553
}
},
"description": "Sample transform job",
"source_index": "sample_index",
"target_index": "sample_target",
"data_selection_query": {
"match_all": {}
},
"page_size": 1,
"groups": [
{
"terms": {
"source_field": "customer_gender",
"target_field": "gender"
}
},
{
"terms": {
"source_field": "day_of_week",
"target_field": "day"
}
}
],
"aggregations": {
"quantity": {
"sum": {
"field": "total_quantity"
}
}
}
}
}
Пример ответа:
{
"_id": "sample",
"_version": 7,
"_seq_no": 13,
"_primary_term": 1,
"transform": {
"transform_id": "sample",
"schema_version": 7,
"continuous": true,
"schedule": {
"interval": {
"start_time": 1621467964243,
"period": 1,
"unit": "Minutes"
}
},
"metadata_id": null,
"updated_at": 1621467964243,
"enabled": true,
"enabled_at": 1621467964243,
"description": "Sample transform job",
"source_index": "sample_index",
"data_selection_query": {
"match_all": {
"boost": 1.0
}
},
"target_index": "sample_target",
"roles": [],
"page_size": 1,
"groups": [
{
"terms": {
"source_field": "customer_gender",
"target_field": "gender"
}
},
{
"terms": {
"source_field": "day_of_week",
"target_field": "day"
}
}
],
"aggregations": {
"quantity": {
"sum": {
"field": "total_quantity"
}
}
}
}
}
Обновление задания преобразования
Операция обновляет задание преобразования, если transform_id уже существует. Для этого запроса необходимо указать порядковый номер и основной термин обновляемого преобразования. Чтобы получить их, используют вызов API "Получить сведения о задании преобразования".
Формат запроса
PUT _plugins/_transform/<transform_id>?if_seq_no=<seq_no>&if_primary_term=<primary_term>
Операция обновления поддерживает параметры запроса из таблицы 39.
Поля тела запроса для обновления приведены в таблицу 40.
Следующий запрос обновляет задание преобразования с идентификатором sample, порядковым номером 13 и основным термином 1:
PUT _plugins/_transform/sample?if_seq_no=13&if_primary_term=1
{
"transform": {
"enabled": true,
"schedule": {
"interval": {
"period": 1,
"unit": "Minutes",
"start_time": 1602100553
}
},
"description": "Sample transform job",
"source_index": "sample_index",
"target_index": "sample_target",
"data_selection_query": {
"match_all": {}
},
"page_size": 1,
"groups": [
{
"terms": {
"source_field": "customer_gender",
"target_field": "gender"
}
},
{
"terms": {
"source_field": "day_of_week",
"target_field": "day"
}
}
],
"aggregations": {
"quantity": {
"sum": {
"field": "total_quantity"
}
}
}
}
}
Пример ответа:
PUT _plugins/_transform/sample?if_seq_no=13&if_primary_term=1
{
"transform": {
"enabled": true,
"schedule": {
"interval": {
"period": 1,
"unit": "Minutes",
"start_time": 1602100553
}
},
"description": "Sample transform job",
"source_index": "sample_index",
"target_index": "sample_target",
"data_selection_query": {
"match_all": {}
},
"page_size": 1,
"groups": [
{
"terms": {
"source_field": "customer_gender",
"target_field": "gender"
}
},
{
"terms": {
"source_field": "day_of_week",
"target_field": "day"
}
}
],
"aggregations": {
"quantity": {
"sum": {
"field": "total_quantity"
}
}
}
}
}
Получение подробной информации о задании преобразования
Операция возвращает сведения о задании преобразования.
Формат запроса
GET _plugins/_transform/<transform_id>
Следующий запрос возвращает сведения о задании преобразования с идентификатором sample:
GET _plugins/_transform/sample
Пример ответа:
{
"_id": "sample",
"_version": 7,
"_seq_no": 13,
"_primary_term": 1,
"transform": {
"transform_id": "sample",
"schema_version": 7,
"continuous": true,
"schedule": {
"interval": {
"start_time": 1621467964243,
"period": 1,
"unit": "Minutes"
}
},
"metadata_id": null,
"updated_at": 1621467964243,
"enabled": true,
"enabled_at": 1621467964243,
"description": "Sample transform job",
"source_index": "sample_index",
"data_selection_query": {
"match_all": {
"boost": 1.0
}
},
"target_index": "sample_target",
"roles": [],
"page_size": 1,
"groups": [
{
"terms": {
"source_field": "customer_gender",
"target_field": "gender"
}
},
{
"terms": {
"source_field": "day_of_week",
"target_field": "day"
}
}
],
"aggregations": {
"quantity": {
"sum": {
"field": "total_quantity"
}
}
}
}
}
Также можно получить подробную информацию обо всех заданиях преобразования, опустив transform_id.
В таблице 41 указана параметры запроса операции GET API для фильтрации результатов.
Следующий запрос возвращает два результата, начиная с преобразования 8:
GET _plugins/_transform?size=2&from=8
Пример ответа:
{
"total_transforms": 18,
"transforms": [
{
"_id": "sample8",
"_seq_no": 93,
"_primary_term": 1,
"transform": {
"transform_id": "sample8",
"schema_version": 7,
"schedule": {
"interval": {
"start_time": 1622063596812,
"period": 1,
"unit": "Minutes"
}
},
"metadata_id": "y4hFAB2ZURQ2dzY7BAMxWA",
"updated_at": 1622063657233,
"enabled": false,
"enabled_at": null,
"description": "Sample transform job",
"source_index": "sample_index3",
"data_selection_query": {
"match_all": {
"boost": 1.0
}
},
"target_index": "sample_target3",
"roles": [],
"page_size": 1,
"groups": [
{
"terms": {
"source_field": "customer_gender",
"target_field": "gender"
}
},
{
"terms": {
"source_field": "day_of_week",
"target_field": "day"
}
}
],
"aggregations": {
"quantity": {
"sum": {
"field": "total_quantity"
}
}
}
}
},
{
"_id": "sample9",
"_seq_no": 98,
"_primary_term": 1,
"transform": {
"transform_id": "sample9",
"schema_version": 7,
"schedule": {
"interval": {
"start_time": 1622063598065,
"period": 1,
"unit": "Minutes"
}
},
"metadata_id": "x8tCIiYMTE3veSbIJkit5A",
"updated_at": 1622063658388,
"enabled": false,
"enabled_at": null,
"description": "Sample transform job",
"source_index": "sample_index4",
"data_selection_query": {
"match_all": {
"boost": 1.0
}
},
"target_index": "sample_target4",
"roles": [],
"page_size": 1,
"groups": [
{
"terms": {
"source_field": "customer_gender",
"target_field": "gender"
}
},
{
"terms": {
"source_field": "day_of_week",
"target_field": "day"
}
}
],
"aggregations": {
"quantity": {
"sum": {
"field": "total_quantity"
}
}
}
}
}
]
}
Запуск задания по преобразованию
Задания преобразования, созданные с помощью API, автоматически активируются, но если нужно активировать задание вручную, можно использовать операцию запуска API.
Формат запроса:
POST _plugins/_transform/<transform_id>/_start
Следующий запрос запускает задание преобразования с идентификатором sample:
POST _plugins/_transform/sample/_start
Пример ответа:
{
"acknowledged": true
}
Остановка задания преобразования
Операция останавливает задание преобразования.
Формат запроса:
POST _plugins/_transform/<transform_id>/_stop
Следующий запрос останавливает задание преобразования с идентификатором sample:
POST _plugins/_transform/sample/_stop
Пример ответа:
{
"acknowledged": true
}
Получение статуса задания преобразования
Операция возвращает состояние и метаданные задания преобразования.
Формат запроса:
GET _plugins/_transform/<transform_id>/_explain
Следующий запрос возвращает сведения о задании преобразования с идентификатором sample:
GET _plugins/_transform/sample/_explain
Пример ответа:
{
"sample": {
"metadata_id": "PzmjweME5xbgkenl9UpsYw",
"transform_metadata": {
"continuous_stats": {
"last_timestamp": 1621883525672,
"documents_behind": {
"sample_index": 72
}
},
"transform_id": "sample",
"last_updated_at": 1621883525873,
"status": "finished",
"failure_reason": "null",
"stats": {
"pages_processed": 0,
"documents_processed": 0,
"documents_indexed": 0,
"index_time_in_millis": 0,
"search_time_in_millis": 0
}
}
}
}
Предварительный просмотр результатов задания преобразования
Операция возвращает предварительный просмотр того, как будет выглядеть преобразованный индекс.
Образец запроса:
POST _plugins/_transform/_preview
{
"transform": {
"enabled": false,
"schedule": {
"interval": {
"period": 1,
"unit": "Minutes",
"start_time": 1602100553
}
},
"description": "test transform",
"source_index": "sample_index",
"target_index": "sample_target",
"data_selection_query": {
"match_all": {}
},
"page_size": 10,
"groups": [
{
"terms": {
"source_field": "customer_gender",
"target_field": "gender"
}
},
{
"terms": {
"source_field": "day_of_week",
"target_field": "day"
}
}
],
"aggregations": {
"quantity": {
"sum": {
"field": "total_quantity"
}
}
}
}
}
Пример ответа:
{
"documents" : [
{
"quantity" : 862.0,
"gender" : "FEMALE",
"day" : "Friday"
},
{
"quantity" : 682.0,
"gender" : "FEMALE",
"day" : "Monday"
},
{
"quantity" : 772.0,
"gender" : "FEMALE",
"day" : "Saturday"
},
{
"quantity" : 669.0,
"gender" : "FEMALE",
"day" : "Sunday"
},
{
"quantity" : 887.0,
"gender" : "FEMALE",
"day" : "Thursday"
}
]
}
Удаление задания преобразования
Операция удаляет задание преобразования. Эта операция не удаляет исходные или целевые индексы.
Формат запроса:
DELETE _plugins/_transform/<transform_id>
Следующий запрос удаляет задание преобразования с идентификатором sample:
DELETE _plugins/_transform/sample
Пример ответа:
{
"took": 205,
"errors": false,
"items": [
{
"delete": {
"_index": ".opensearch-ism-config",
"_id": "sample",
"_version": 4,
"result": "deleted",
"forced_refresh": true,
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 6,
"_primary_term": 1,
"status": 200
}
}
]
}
Свертка индексов
Данные временных рядов увеличивают затраты на хранение, создают нагрузку на кластер и со временем замедляют агрегацию. Свертка индексов позволяет периодически уменьшать детализацию данных, свертывая старые данные в обобщенные индексы.
Для свертки выбирают требуемые поля и используют свертывание индекса для создания нового индекса, в котором только эти поля сгруппированы по более крупным интервалам времени. В результате можно хранить исторические данные за несколько месяцев или лет с меньшими затратами и такой же производительностью запросов.
Например, если предположить сбор данных о потреблении ресурсов процессора каждые пять секунд и сохранение их на основном узле, то, вместо того чтобы перемещать старые данные на вспомогательный узел только для чтения, можно объединить или сжать эти данные, используя только среднее потребление ресурсов процессора за день или уменьшая интервал на 10% каждую неделю.
Свертку индекса можно использовать тремя способами:
- Использование API для свертки индекса, чтобы по запросу выполнять свертку индекса, который не используется активно, например свернутый индекс. Например, можно выполнить операцию свертки индекса, чтобы преобразовать данные, собранные с интервалом в пять минут, в среднее значение за неделю для анализа тенденций.
- Использование пользовательского интерфейса "Панелей мониторинга" Подсистемы для создания задания по свертыванию индексов, которое будет выполняться по заданному расписанию. Также можно настроить свертывание индексов по мере их активного создания. Например, можно настроить непрерывное свертывание индексов Logstash с интервалом от пяти секунд до одного часа.
- Указание задания по сворачиванию индекса в качестве действия ISM для полного управления индексами. Это позволяет сворачивать индекс после определенного события, например при переключении, достижении определенного возраста индекса, переходе индекса в режим только для чтения и т. д. Также можно последовательно запускать задания по переключению и сворачиванию индекса, при этом переключение сначала перемещает текущий индекс на вспомогательный узел, а затем задание по сворачиванию индекса создает новый индекс с минимизированными данными на основном узле.
Для поиска в целевом индексе можно использовать стандартный _search API. Следует убедиться, что запрос соответствует ограничениям целевого индекса. Например, если не настроена агрегация терминов для поля, не получатся результаты для агрегации терминов. Если не настроена максимальная агрегация, не получатся результаты для максимальной агрегации.
Нельзя получить доступ к внутренней структуре данных в целевом индексе, потому что плагин автоматически переписывает запрос в фоновом режиме в соответствии с целевым индексом. Это сделано для того, чтобы можно было использовать один и тот же запрос для исходного и целевого индексов.
Чтобы запросить целевой индекс, нужно установить size в значение 0:
GET target_index/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"avg_cpu": {
"avg": {
"field": "cpu_usage"
}
}
}
}
При сценарии, в котором собираются сводные данные с 13:00 до 21:00 с почасовыми интервалами и оперативные данные с 19:00 до 23:00 с минутными интервалами, если выполнить агрегацию этих данных в одном запросе с 19:00 до 21:00, можно увидеть пересечение сводных и оперативных данных, потому что они учитываются дважды при агрегации.
Поле doc_count в агрегации сегментов содержит количество документов, собранных в каждом сегменте. При вычислении doc_count сегмента количество документов увеличивается на количество предварительно агрегированных документов в каждом сводном документе. doc_count, возвращаемый при свернутом поиске, представляет собой общее количество совпадающих документов из исходного индекса. Количество документов в каждом сегменте одинаково независимо от того, выполняется ли поиск в исходном индексе или в целевом индексе свернутого поиска.
Чтобы использовать более короткие и простые в написании строки в Query DSL, можно использовать строки запросов для упрощения поисковых запросов в сводных индексах. Чтобы использовать строки запросов, нужно добавить в запрос на поиск по сводным данным следующие поля:
"query": {
"query_string": {
"query": "field_name:field_value"
}
}
При свертывании ISM поле target_index может содержать шаблон, который компилируется при каждом свертывании индексации. Например, если указать поле target_index как rollup_ndx-, исходный индекс log-000001 будет свернут в целевой индекс rollup_ndx-log-000001. Это позволяет свертывать данные в несколько индексов на основе времени, создавая по одному заданию свертывания для каждого исходного индекса.
Параметр в не может содержать подстановочных знаков.
Когда данные объединяются в несколько целевых индексов, можно выполнить один поиск по всем сводным индексам. Чтобы выполнить поиск по нескольким целевым индексам, имеющим один и тот же сводный файл, нужно указать имена индексов в виде списка, разделенного запятыми, или шаблона с подстановочными знаками. Например, с помощью индексов target_index как rollup_ndx- и источника, начинающихся с log, указать шаблон rollup_ndx-log*. Или, чтобы выполнить поиск по свернутым индексам log-000001 и log-000002, нужно указать список rollup_ndx-log-000001,rollup_ndx-log-000002.
Нельзя выполнять поиск по нескольким индексам с накоплением и без накопления с помощью одного запроса.
API свертки индексов
Операции свертки индексов можно использовать для программирования работ с заданиями.
Создание или обновление задания свертки индекса
Операция создает или обновляет задание для сворачивания индекса. Необходимо указать параметры seq_no и primary_term.
Запрос:
PUT _plugins/_rollup/jobs/<rollup_id> // Create
PUT _plugins/_rollup/jobs/<rollup_id>?if_seq_no=1&if_primary_term=1 // Update
{
"rollup": {
"source_index": "nyc-taxi-data",
"target_index": "rollup-nyc-taxi-data",
"schedule": {
"interval": {
"period": 1,
"unit": "Days"
}
},
"description": "Example rollup job",
"enabled": true,
"page_size": 200,
"delay": 0,
"roles": [
"rollup_all",
"nyc_taxi_all",
"example_rollup_index_all"
],
"continuous": false,
"dimensions": [
{
"date_histogram": {
"source_field": "tpep_pickup_datetime",
"fixed_interval": "1h",
"timezone": "America/Los_Angeles"
}
},
{
"terms": {
"source_field": "PULocationID"
}
}
],
"metrics": [
{
"source_field": "passenger_count",
"metrics": [
{
"avg": {}
},
{
"sum": {}
},
{
"max": {}
},
{
"min": {}
},
{
"value_count": {}
}
]
}
]
}
}
Возможные параметры указаны в таблице 42.
Пример ответа:
{
"_id": "<rollup_id>",
"_version": 3,
"_seq_no": 1,
"_primary_term": 1,
"rollup": {
"rollup_id": "<rollup_id>",
"enabled": true,
"schedule": {
"interval": {
"start_time": 1680159934649,
"period": 1,
"unit": "Days",
"schedule_delay": 0
}
},
"last_updated_time": 1680159934649,
"enabled_time": 1680159934649,
"description": "Example rollup job",
"schema_version": 17,
"source_index": "nyc-taxi-data",
"target_index": "rollup-nyc-taxi-data",
"metadata_id": null,
"page_size": 200,
"delay": 0,
"continuous": false,
"dimensions": [
{
"date_histogram": {
"fixed_interval": "1h",
"source_field": "tpep_pickup_datetime",
"target_field": "tpep_pickup_datetime",
"timezone": "America/Los_Angeles"
}
},
{
"terms": {
"source_field": "PULocationID",
"target_field": "PULocationID"
}
}
],
"metrics": [
{
"source_field": "passenger_count",
"metrics": [
{
"avg": {}
},
{
"sum": {}
},
{
"max": {}
},
{
"min": {}
},
{
"value_count": {}
}
]
}
]
}
}
Получение информации о задании свертки индекса
Операция возвращает всю информацию о задании свертки индекса на основе rollup_id.
Запрос:
GET _plugins/_rollup/jobs/<rollup_id>
Пример ответа:
{
"_id": "my_rollup",
"_seqNo": 1,
"_primaryTerm": 1,
"rollup": { ... }
}
Удаление задания свертки индекса
Операция удаляет задание свертки индекса на основе rollup_id.
Запрос:
DELETE _plugins/_rollup/jobs/<rollup_id>
Пример ответа:
200 OK
Запуск или остановка задания свертки индекса
Операция запускает или останавливает задание свертки индекса.
Запрос:
POST _plugins/_rollup/jobs/<rollup_id>/_start
POST _plugins/_rollup/jobs/<rollup_id>/_stop
Пример ответа:
200 OK
Состояние задания свертывания индекса
Операция возвращает подробную информацию метаданных о задании свертки индекса и его текущем ходе выполнения.
Запрос:
GET _plugins/_rollup/jobs/<rollup_id>/_explain
Пример ответа:
{
"example_rollup": {
"rollup_id": "example_rollup",
"last_updated_time": 1602014281,
"continuous": {
"next_window_start_time": 1602055591,
"next_window_end_time": 1602075591
},
"status": "running",
"failure_reason": null,
"stats": {
"pages_processed": 342,
"documents_processed": 489359,
"rollups_indexed": 3420,
"index_time_in_ms": 30495,
"search_time_in_ms": 584922
}
}
}
Настройки свертки индекса
Настройки свертки индекса не рекомендуется изменять, так как значения по умолчанию должны хорошо подходить для большинства случаев использования.
Все настройки доступны с помощью операции _cluster/settings. Ни одна из них не требует перезапуска, и все они могут быть помечены persistent или transient (таблица 43).
Безопасность управления индексами
Использование плагина "Безопасность" совместно с управлением индексами позволяет ограничить действия пользователей, не являющихся администраторами. Например, можно настроить безопасность таким образом, чтобы одна группа пользователей могла только читать политики ISM, а другая — создавать, удалять или изменять политики.
Все данные управления индексами защищены как системные индексы, и только суперадминистратор или администратор с сертификатом Transport Layer Security (TLS) может получить доступ к системным индексам
Основные разрешения
Плагин "Безопасность" поставляется с одной ролью, которая обеспечивает полный доступ к управлению индексами: index_management_full_access.
При включенной защите пользователям нужны не только правильные разрешения на управление индексами, но и разрешения на выполнение действий с задействованными индексами. Например, если пользователь хочет использовать REST API для привязки политики, которая выполняет задание по слиянию, к индексу с именем system-logs, ему понадобятся разрешения на присоединение политики и выполнение задания по слиянию, а также доступ к system-logs.
Наконец, за исключением создания политики, получения политики и удаления политики, пользователям также требуется разрешение indices:admin/opensearch/ism/managedindex для выполнения ISM API.
Ограничение доступа по серверной роли
В Подсистеме можно использовать внутренние роли для настройки детального доступа к политикам и действиям по управлению индексами. Например, пользователи из разных отделов организации могут просматривать разные политики в зависимости от назначенных им ролей и разрешений.
Во-первых, следует убедиться, что у пользователей есть соответствующие внутренние роли. Внутренние роли обычно поступают с сервера LDAP или провайдера SAML. Однако если используется внутренняя база данных пользователей, можно использовать REST API для добавления их вручную.
Следует использовать REST API, чтобы включить следующий параметр:
PUT _cluster/settings
{
"transient": {
"plugins.index_management.filter_by_backend_roles": "true"
}
}
При включенной защите только пользователи, у которых есть хотя бы одна серверная роль, могут просматривать и выполнять политики и действия, соответствующие их ролям.
Обновление поискового анализатора
Обновление поискового анализатора в режиме реального времени можно осуществлять с помощью следующего ISM API:
POST /_plugins/_refresh_search_analyzers/<index or alias or wildcard>
Например, если изменить список синонимов в анализаторе, изменения вступят в силу без необходимости закрывать и открывать индекс.
Чтобы фильтр токенов работал, он должен иметь для updateable значение TRUE:
{
"analyzer": {
"my_synonyms": {
"tokenizer": "whitespace",
"filter": [
"synonym"
]
}
},
"filter": {
"synonym": {
"type": "synonym_graph",
"synonyms_path": "synonyms.txt",
"updateable": true
}
}
}
Предотвращение ошибок ISM
Предотвращение ошибок проверяет действия ISM перед их выполнением, чтобы предотвратить сбои в работе. Кроме того, в ответе API Index Explain выводится дополнительная информация о результатах проверки действий.
Правила проверки и устранение неполадок для действий
rollover
ISM не выполняет действие переключения для индекса ни при одном из следующих условий:
- индекс не является индексом записи;
- у индекса нет псевдонима;
- политика переключения не содержит настройки индекса rollover_alias;
- произошел пропуск действия переключения;
- индекс уже был успешно перенесен с использованием псевдонима.
delete
ISM не выполняет действие delete для индекса ни при одном из следующих условий:
- индекс не существует;
- недопустимое имя индекса;
- индекс является индексом записи для потока данных.
force_merge
ISM не выполняет действие force_merge для индекса, если его набор данных слишком велик и превышает пороговое значение.
replica_count
ISM не выполняет действие replica_count для индекса ни при одном из следующих условий:
- объем данных превышает пороговое значение;
- количество сегментов превышает максимальное.
open
ISM не выполняет действие open для индекса ни при одном из следующих условий:
- индекс заблокирован;
- количество сегментов превышает максимальное.
read_only
ISM не выполняет действие read_only для индекса ни при одном из следующих условий:
- индекс заблокирован;
- объем данных превышает пороговое значение.
read_write
ISM не выполняет действие read_write для индекса, если индекс заблокирован.
close
ISM не выполняет действие close для индекса ни при одном из следующих условий:
- индекс не существует;
- недопустимое имя индекса.
index_priority
ISM не выполняет действие index_priority для индекса, на который нет разрешения read-only-allow-delete.
snapshot
ISM не выполняет действие snapshot для индекса ни при одном из следующих условий:
- индекс не существует;
- недопустимое имя индекса.
transition
ISM не выполняет действие transition для индекса ни при одном из следующих условий:
- индекс не существует;
- недопустимое имя индекса.
Решения по предотвращению ошибок ISM
Решения проблем для каждого действия правила проверки приведены ниже.
Индекс не является индексом записи
Чтобы подтвердить, что индекс является индексом записи, выполняют следующий запрос:
GET <index>/_alias?pretty
Если ответ не содержит "is_write_index" : true, индекс не является индексом записи. Следующий пример подтверждает, что индекс является индексом записи:
{
"<index>" : {
"aliases" : {
"<index_alias>" : {
"is_write_index" : true
}
}
}
}
Чтобы установить индекс в качестве индекса записи, выполняют следующий запрос:
PUT <index>
{
"aliases": {
"<index_alias>" : {
"is_write_index" : true
}
}
}
Индекс не имеет псевдонима
Если у индекса нет псевдонима, можно добавить его, выполнив следующий запрос:
POST _aliases
{
"actions": [
{
"add": {
"index": "<target_index>",
"alias": "<index_alias>"
}
}
]
}
Пропуск действия rollover является истинным
Если происходит пропуск действия rollover, выполняют следующий запрос:
GET <target_index>/_settings?pretty
Если получен ответ в первом примере, можно сбросить его, выполнив запрос во втором примере:
{
"index": {
"opendistro.index_state_management.rollover_skip": true
}
}
Второй пример:
PUT <target_index>/_settings
{
"index": {
"index_state_management.rollover_skip": false
}
}
Этот индекс уже был успешно перенесен
В этом случае следует удалить политику переключения из индекса, чтобы предотвратить повторное появление этой ошибки.
В политике переключения не задается параметр индекса rollover_alias
Чтобы решить эту проблему, добавляют параметр rollover_alias индекса в политику переключения данных. Выполнить следующий запрос:
PUT _index_template/ism_rollover
{
"index_patterns": ["<index_patterns_in_rollover_policy>"],
"template": {
"settings": {
"plugins.index_state_management.rollover_alias": "<rollover_alias>"
}
}
}
Данные слишком большие и превышают пороговое значение
В этом случае проверяют информацию о JVM и увеличивают объем оперативной памяти.
Превышено максимальное количество сегментов
Эта проблема возникает из-за ограничения на количество сегментов на узел или индекс. Следует проверить, есть ли ограничение total_shards_per_node ограничение, выполнив следующий запрос:
GET /_cluster/settings
Если ответ содержит total_shards_per_node, временно увеличить его значение, выполнив следующий запрос:
PUT _cluster/settings
{
"transient":{
"cluster.routing.allocation.total_shards_per_node":100
}
}
Чтобы проверить, есть ли ограничение на количество сегментов для индекса, выполнить следующий запрос:
GET <index>/_settings/index.routing-
Если в ответе содержится настройка из первого примера, увеличить ее значение или установить значение "-1" для неограниченного количества сегментов, как показано во втором примере:
"index" : {
"routing" : {
"allocation" : {
"total_shards_per_node" : "10"
}
}
}
Второй пример:
PUT <index>/_settings
{"index.routing.allocation.total_shards_per_node":-1}
Индекс – это индекс записи для некоторого потока данных
Если все же требуется удалить индекс, проверяют настройки потока данных и изменить индекс записи.
Индекс заблокирован
Как правило, индекс блокируется из-за того, что использование диска превысило пороговое значение, и индекс содержит блок read-only-allow-delete. Чтобы решить эту проблему, можно:
- удалить параметр -index.blocks.read_only_allow_delete-;
- временно увеличить допустимый уровень на диске;
- временно отключить порог выделения диска.
Чтобы предотвратить повторное возникновение проблемы, лучше уменьшить нагрузку на диск, увеличив его объем, добавив новые узлы или удалив ненужные данные или индексы.
Удалить -index.blocks.read_only_allow_delete-, выполнив следующий запрос:
PUT <index>/_settings
{
"index.blocks.read_only_allow_delete": null
}
Увеличить допустимый нижний уровень на диске, выполнив следующий запрос:
PUT _cluster/settings
{
"transient": {
"cluster": {
"routing": {
"allocation": {
"disk": {
"watermark": {
"low": "25.0gb"
}
}
}
}
}
}
}
Отключить пороговое значение выделения диска, выполнив следующий запрос:
PUT _cluster/settings
{
"transient": {
"cluster": {
"routing": {
"allocation": {
"disk": {
"threshold_enabled" : false
}
}
}
}
}
}
API для предотвращения ошибок ISM
API для предотвращения ошибок ISM позволяет включить предотвращение ошибок и проверить статус проверки и сообщение.
Включить проверку предотвращения ошибок
Настроить проверку предотвращения ошибок, установив параметр plugins.index_state_management.action_validation.enabled.
Пример запроса:
PUT _cluster/settings
{
"persistent":{
"plugins.index_state_management.action_validation.enabled": true
}
}
Пример ответа:
{
"acknowledged" : true,
"persistent" : {
"plugins" : {
"index_state_management" : {
"validation_action" : {
"enabled" : "true"
}
}
}
},
"transient" : { }
}
Проверить состояние проверки и сообщение с помощью Explain API
Передать параметр пути "validate_action=true" в URI Explain API, чтобы увидеть статус проверки и сообщение.
Пример запроса:
GET _plugins/_ism/explain/test-000001?validate_action=true
Пример ответа:
{
"test-000001" : {
"index.plugins.index_state_management.policy_id" : "test_rollover",
"index.opendistro.index_state_management.policy_id" : "test_rollover",
"index" : "test-000001",
"index_uuid" : "CgKsxFmQSIa8dWqpbSJmyA",
"policy_id" : "test_rollover",
"policy_seq_no" : -2,
"policy_primary_term" : 0,
"rolled_over" : false,
"index_creation_date" : 1667410460649,
"state" : {
"name" : "rollover",
"start_time" : 1667410766045
},
"action" : {
"name" : "rollover",
"start_time" : 1667411127803,
"index" : 0,
"failed" : false,
"consumed_retries" : 0,
"last_retry_time" : 0
},
"step" : {
"name" : "attempt_rollover",
"start_time" : 1667411127803,
"step_status" : "starting"
},
"retry_info" : {
"failed" : true,
"consumed_retries" : 0
},
"info" : {
"message" : "Previous action was not able to update IndexMetaData."
},
"enabled" : false,
"validate" : {
"validation_message" : "Missing rollover_alias index setting [index=test-000001]",
"validation_status" : "re_validating"
}
},
"total_managed_indices" : 1
}
Если передать параметр без значения или со значением FALSE, то он не возвращает статус проверки и сообщение. Только если передать "validate_action=true" в ответ, он вернет статус проверки и сообщение.
Пример запроса:
GET _plugins/_ism/explain/test-000001?validate_action=false
--- OR ---
GET _plugins/_ism/explain/test-000001
Пример ответа:
{
"test-000001" : {
"index.plugins.index_state_management.policy_id" : "test_rollover",
"index.opendistro.index_state_management.policy_id" : "test_rollover",
"index" : "test-000001",
"index_uuid" : "CgKsxFmQSIa8dWqpbSJmyA",
"policy_id" : "test_rollover",
"policy_seq_no" : -2,
"policy_primary_term" : 0,
"rolled_over" : false,
"index_creation_date" : 1667410460649,
"state" : {
"name" : "rollover",
"start_time" : 1667410766045
},
"action" : {
"name" : "rollover",
"start_time" : 1667411127803,
"index" : 0,
"failed" : false,
"consumed_retries" : 0,
"last_retry_time" : 0
},
"step" : {
"name" : "attempt_rollover",
"start_time" : 1667411127803,
"step_status" : "starting"
},
"retry_info" : {
"failed" : true,
"consumed_retries" : 0
},
"info" : {
"message" : "Previous action was not able to update IndexMetaData."
},
"enabled" : false
},
"total_managed_indices" : 1
}
Настройки уведомлений
В Подсистеме реализовано использование настроек уведомлений, чтобы получать оповещения о длительных операциях индексирования. Возможно настроить автоматические уведомления о завершении длительных операций индексирования с помощью уведомлений в "Панелях мониторинга" Подсистемы или через API.
Настройка параметров уведомлений полезна для длительных операций индексирования, таких как open, reindex, resize и force merge. Когда отправляется запрос на выполнение этих операций и устанавливается для параметра wait_for_completion значение false, операция завершается немедленно, а ответ содержит идентификатор задачи. Можно использовать этот идентификатор задачи для настройки уведомлений для этой операции.
Настройка параметров уведомлений
Можно настроить уведомления о длительных операциях через API с помощью параметров task_id и action_name:
- Одноразовая настройка – если передавать task_id в объект lron_config, задача выполняется один раз, а настройка автоматически удаляется по завершении задачи. Если передавать и task_id, и action_name, action_name игнорируется, но может быть полезен для поиска и отладки настроек уведомлений.
- Глобальная постоянная настройка – если передавать action_name и не передавать task_id в объекте lron_config, задача является глобальной и постоянной и применяется ко всем операциям этого типа действий.
В таблице 44 перечислены параметры для уведомлений о длительных операциях с индексом.
Создание настроек уведомлений
Следующий пример запроса настраивает уведомления о сбое задачи переиндексации:
POST /_plugins/_im/lron
{
"lron_config": {
"task_id":"dQlcQ0hQS2mwF-AQ7icCMw:12354",
"action_name":"indices:data/write/reindex",
"lron_condition": {
"success": false,
"failure": true
},
"channels":[
{"id":"channel1"},
{"id":"channel2"}
]
}
}
Предыдущий запрос приводит к следующему ответу:
{
"_id": "LRON:dQlcQ0hQS2mwF-AQ7icCMw:12354",
"lron_config": {
"lron_condition": {
"success": false,
"failure": true
},
"task_id": "dQlcQ0hQS2mwF-AQ7icCMw:12354",
"action_name": "indices:data/write/reindex",
"channels": [
{
"id": "channel1"
},
{
"id": "channel2"
}
]
}
}
В ответе возвращается идентификатор настройки уведомлений в поле _id. Этот идентификатор можно использовать для чтения, обновления или удаления настроек уведомлений. Для глобальной настройки lron_config идентификатор имеет вид LRON:<action_name> (например, LRON:indices:data/write/reindex).
Примечание – action_name может содержать символ косой черты "/", который должен быть закодирован как %2F в консоли инструментов разработчика. Например, LRON:indices:data/write/reindex становится LRON:indices:data%2Fwrite%2Freindex.
Для задачи lron_config идентификатор представлен в форме LRON:
Получение настроек уведомлений
В следующих примерах извлекаются текущие настроенные параметры уведомлений.
Следующий запрос используется для получения настроек уведомлений с указанным идентификатором настроек уведомлений:
GET /_plugins/_im/lron/<lronID>
Например, следующий запрос извлекает настройки уведомлений для операции reindex:
{
"lron_configs": [
{
"_id": "LRON:indices:data/write/reindex",
"lron_config": {
"lron_condition": {
"success": false,
"failure": true
},
"action_name": "indices:data/write/reindex",
"channels": [
{
"id": "my_chime"
}
]
}
}
],
"total_number": 1
}
Следующий запрос используется для получения всех настроек уведомлений:
GET /_plugins/_im/lron
Ответ содержит все настроенные параметры уведомлений с их идентификаторами:
{
"lron_configs": [
{
"_id": "LRON:indices:admin/open",
"lron_config": {
"lron_condition": {
"success": false,
"failure": false
},
"action_name": "indices:admin/open",
"channels": []
}
},
{
"_id": "LRON:indices:data/write/reindex",
"lron_config": {
"lron_condition": {
"success": false,
"failure": true
},
"action_name": "indices:data/write/reindex",
"channels": [
{
"id": "my_chime"
}
]
}
}
],
"total_number": 2
}
Обновление настройки уведомлений
В следующем примере изменяется существующий параметр уведомления с указанным идентификатором параметра уведомления:
PUT /_plugins/_im/lron/<lronID>
{
"lron_config": {
"task_id":"dQlcQ0hQS2mwF-AQ7icCMw:12354",
"action_name":"indices:data/write/reindex",
"lron_condition": {
"success": false,
"failure": true
},
"channels":[
{"id":"channel1"},
{"id":"channel2"}
]
}
}
Ответ содержит обновленную настройку:
{
"_id": "LRON:dQlcQ0hQS2mwF-AQ7icCMw:12354",
"lron_config": {
"lron_condition": {
"success": false,
"failure": true
},
"task_id": "dQlcQ0hQS2mwF-AQ7icCMw:12354",
"action_name": "indices:data/write/reindex",
"channels": [
{
"id": "channel1"
},
{
"id": "channel2"
}
]
}
}
Удаление настройки уведомлений
В следующем примере удаляется параметр уведомлений с указанным идентификатором параметра уведомлений:
DELETE /_plugins/_im/lron/<lronID>
Например, следующий запрос удаляет настройки уведомлений для операции reindex:
DELETE _plugins/_im/lron/LRON:indices:data%2Fwrite%2Freindex