Отслеживание состояния кластера Elasticsearch
Вы легко можете настроить базовый смотритель для мониторинга состояния вашего кластера Elasticsearch:
- Установите расписание смотрителя и добавьте входные данные, которые получат статус состояния кластера.
- Добавьте условие, которое оценивает состояние здоровья, чтобы определить, требуется ли действие.
- Выполните действие, если состояние кластера — RED.
Расписание смотрителя и добавление входных данных
Расписание смотрителя контролирует частоту запуска смотрителя. Входные данные смотрителя получают данные, которые вы хотите оценить.
Самый простой способ определить расписание — указать интервал. Например, следующее расписание выполняется каждые 10 секунд:
resp = client.watcher.put_watch(
id="cluster_health_watch",
trigger={
"schedule": {
"interval": "10s"
}
},
)
print(resp) const response = await client.watcher.putWatch({
id: "cluster_health_watch",
trigger: {
schedule: {
interval: "10s",
},
},
});
console.log(response); PUT _watcher/watch/cluster_health_watch
{
"trigger" : {
"schedule" : { "interval" : "10s" }
}
} | Расписания обычно настраиваются на менее частые запуски. В этом примере интервал установлен на 10 секунд, чтобы вы могли легко наблюдать за запусками смотрителя. Поскольку этот смотритель запускается так часто, не забудьте удалить смотритель, когда закончите эксперименты. |
Чтобы получить состояние вашего кластера, вы можете вызвать API состояния кластера:
resp = client.cluster.health(
pretty=True,
)
print(resp) response = client.cluster.health( pretty: true ) puts response
const response = await client.cluster.health({
pretty: "true",
});
console.log(response); GET _cluster/health?pretty
Чтобы загрузить состояние здоровья в свой смотритель, просто добавьте HTTP-входные данные, которые вызывают API состояния кластера:
resp = client.watcher.put_watch(
id="cluster_health_watch",
trigger={
"schedule": {
"interval": "10s"
}
},
input={
"http": {
"request": {
"host": "localhost",
"port": 9200,
"path": "/_cluster/health"
}
}
},
)
print(resp) const response = await client.watcher.putWatch({
id: "cluster_health_watch",
trigger: {
schedule: {
interval: "10s",
},
},
input: {
http: {
request: {
host: "localhost",
port: 9200,
path: "/_cluster/health",
},
},
},
});
console.log(response); PUT _watcher/watch/cluster_health_watch
{
"trigger" : {
"schedule" : { "interval" : "10s" }
},
"input" : {
"http" : {
"request" : {
"host" : "localhost",
"port" : 9200,
"path" : "/_cluster/health"
}
}
}
} Если вы используете безопасность, вам также потребуется предоставить некоторые учетные данные аутентификации в настройках смотрителя:
resp = client.watcher.put_watch(
id="cluster_health_watch",
trigger={
"schedule": {
"interval": "10s"
}
},
input={
"http": {
"request": {
"host": "localhost",
"port": 9200,
"path": "/_cluster/health",
"auth": {
"basic": {
"username": "elastic",
"password": "x-pack-test-password"
}
}
}
}
},
)
print(resp) const response = await client.watcher.putWatch({
id: "cluster_health_watch",
trigger: {
schedule: {
interval: "10s",
},
},
input: {
http: {
request: {
host: "localhost",
port: 9200,
path: "/_cluster/health",
auth: {
basic: {
username: "elastic",
password: "x-pack-test-password",
},
},
},
},
},
});
console.log(response); PUT _watcher/watch/cluster_health_watch
{
"trigger" : {
"schedule" : { "interval" : "10s" }
},
"input" : {
"http" : {
"request" : {
"host" : "localhost",
"port" : 9200,
"path" : "/_cluster/health",
"auth": {
"basic": {
"username": "elastic",
"password": "x-pack-test-password"
}
}
}
}
}
} Было бы разумно создать пользователя с минимальными привилегиями, необходимыми для использования такой конфигурации смотрителя.
В зависимости от конфигурации вашего кластера могут потребоваться дополнительные параметры, прежде чем смотритель сможет получить доступ к вашему кластеру, такие как хранилища ключей, хранилища доверенных сертификатов или сертификаты. Дополнительную информацию см. в Настройках смотрителя.
Если вы проверите историю смотрителя, вы увидите, что состояние кластера записывается в качестве части watch_record каждый раз, когда смотритель выполняется.
Например, следующий запрос извлекает последние десять записей истории смотрителя:
resp = client.search(
index=".watcher-history*",
sort=[
{
"result.execution_time": "desc"
}
],
)
print(resp) response = client.search(
index: '.watcher-history*',
body: {
sort: [
{
'result.execution_time' => 'desc'
}
]
}
)
puts response const response = await client.search({
index: ".watcher-history*",
sort: [
{
"result.execution_time": "desc",
},
],
});
console.log(response); GET .watcher-history*/_search
{
"sort" : [
{ "result.execution_time" : "desc" }
]
} Добавить условие
Условие оценивает данные, загруженные в смотритель, и определяет, требуется ли какое-либо действие. Поскольку вы определили входные данные, которые загружают состояние кластера в смотритель, вы можете определить условие, которое проверяет это состояние.
Например, вы можете добавить условие, чтобы проверить, является ли состояние RED.
resp = client.watcher.put_watch(
id="cluster_health_watch",
trigger={
"schedule": {
"interval": "10s"
}
},
input={
"http": {
"request": {
"host": "localhost",
"port": 9200,
"path": "/_cluster/health"
}
}
},
condition={
"compare": {
"ctx.payload.status": {
"eq": "red"
}
}
},
)
print(resp) const response = await client.watcher.putWatch({
id: "cluster_health_watch",
trigger: {
schedule: {
interval: "10s",
},
},
input: {
http: {
request: {
host: "localhost",
port: 9200,
path: "/_cluster/health",
},
},
},
condition: {
compare: {
"ctx.payload.status": {
eq: "red",
},
},
},
});
console.log(response); PUT _watcher/watch/cluster_health_watch
{
"trigger" : {
"schedule" : { "interval" : "10s" }
},
"input" : {
"http" : {
"request" : {
"host" : "localhost",
"port" : 9200,
"path" : "/_cluster/health"
}
}
},
"condition" : {
"compare" : {
"ctx.payload.status" : { "eq" : "red" }
}
}
} | Расписания обычно настраиваются на менее частые запуски. В этом примере интервал установлен на 10 секунд, чтобы вы могли легко наблюдать за запусками смотрителя. |
Если вы проверите историю смотрителя, вы увидите, что результат условия записывается как часть watch_record каждый раз, когда смотритель выполняется.
Чтобы проверить, было ли выполнено условие, можно запустить следующий запрос.
resp = client.search(
index=".watcher-history*",
pretty=True,
query={
"match": {
"result.condition.met": True
}
},
)
print(resp) response = client.search(
index: '.watcher-history*',
pretty: true,
body: {
query: {
match: {
'result.condition.met' => true
}
}
}
)
puts response const response = await client.search({
index: ".watcher-history*",
pretty: "true",
query: {
match: {
"result.condition.met": true,
},
},
});
console.log(response); GET .watcher-history*/_search?pretty
{
"query" : {
"match" : { "result.condition.met" : true }
}
} Выполнить действие
Запись watch_records в истории смотрителя — хорошо, но настоящая мощь смотрителя заключается в возможности выполнения чего-либо в ответ на предупреждение. Действия смотрителя определяют, что делать, когда условие смотрителя истинно — вы можете отправлять электронные письма, вызывать сторонние веб-хуки или записывать документы в индекс Elasticsearch или журнал, когда выполняется условие смотрителя.
Например, вы можете добавить действие для индексирования информации о состоянии кластера, когда состояние RED.
resp = client.watcher.put_watch(
id="cluster_health_watch",
trigger={
"schedule": {
"interval": "10s"
}
},
input={
"http": {
"request": {
"host": "localhost",
"port": 9200,
"path": "/_cluster/health"
}
}
},
condition={
"compare": {
"ctx.payload.status": {
"eq": "red"
}
}
},
actions={
"send_email": {
"email": {
"to": "username@example.org",
"subject": "Cluster Status Warning",
"body": "Cluster status is RED"
}
}
},
)
print(resp) const response = await client.watcher.putWatch({
id: "cluster_health_watch",
trigger: {
schedule: {
interval: "10s",
},
},
input: {
http: {
request: {
host: "localhost",
port: 9200,
path: "/_cluster/health",
},
},
},
condition: {
compare: {
"ctx.payload.status": {
eq: "red",
},
},
},
actions: {
send_email: {
email: {
to: "username@example.org",
subject: "Cluster Status Warning",
body: "Cluster status is RED",
},
},
},
});
console.log(response); PUT _watcher/watch/cluster_health_watch
{
"trigger" : {
"schedule" : { "interval" : "10s" }
},
"input" : {
"http" : {
"request" : {
"host" : "localhost",
"port" : 9200,
"path" : "/_cluster/health"
}
}
},
"condition" : {
"compare" : {
"ctx.payload.status" : { "eq" : "red" }
}
},
"actions" : {
"send_email" : {
"email" : {
"to" : "username@example.org",
"subject" : "Cluster Status Warning",
"body" : "Cluster status is RED"
}
}
}
} Для отправки электронной почты смотрителем необходимо настроить учетную запись электронной почты в вашей elasticsearch.yml конфигурации и перезапустить Elasticsearch. Чтобы добавить учетную запись электронной почты, установите свойство xpack.notification.email.account.
Например, следующий фрагмент настраивает одну учетную запись Gmail с именем work:
xpack.notification.email.account:
work:
profile: gmail
email_defaults:
from: <email>
smtp:
auth: true
starttls.enable: true
host: smtp.gmail.com
port: 587
user: <username>
password: <password> | Замените | |
| Замените | |
| Замените |
Если для вашей учетной записи электронной почты включены расширенные параметры безопасности, вам необходимо выполнить дополнительные шаги для отправки электронной почты из смотрителя. Дополнительную информацию см. в Настройке учетных записей электронной почты.
Вы можете проверить историю смотрителя или status_index, чтобы убедиться, что действие было выполнено.
resp = client.search(
index=".watcher-history*",
pretty=True,
query={
"match": {
"result.condition.met": True
}
},
)
print(resp) response = client.search(
index: '.watcher-history*',
pretty: true,
body: {
query: {
match: {
'result.condition.met' => true
}
}
}
)
puts response const response = await client.search({
index: ".watcher-history*",
pretty: "true",
query: {
match: {
"result.condition.met": true,
},
},
});
console.log(response); GET .watcher-history*/_search?pretty
{
"query" : {
"match" : { "result.condition.met" : true }
}
} Удалить смотритель
Поскольку cluster_health_watch настроен на выполнение каждые 10 секунд, убедитесь, что вы его удалите, когда закончите экспериментировать. В противном случае вы будете получать бесконечные спам-сообщения.
Чтобы удалить смотритель, используйте API удаления смотрителя:
resp = client.watcher.delete_watch(
id="cluster_health_watch",
)
print(resp) response = client.watcher.delete_watch( id: 'cluster_health_watch' ) puts response
const response = await client.watcher.deleteWatch({
id: "cluster_health_watch",
});
console.log(response); DELETE _watcher/watch/cluster_health_watch
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/watch-cluster-status.html