Elasticsearch クラスターの状態を監視する
Elasticsearch クラスターの健康状態を監視するための基本的なウォッチを簡単に構成できます:
- ウォッチをスケジュールし、入力を定義する ことで、クラスターの健康状態を取得します。
- 条件を追加する ことで、健康状態を評価し、アクションが必要かどうかを判断します。
- クラスターが RED の場合は、アクションを実行する ことができます。
ウォッチをスケジュールし、入力を追加する
ウォッチの スケジュール は、ウォッチがどのくらいの頻度でトリガーされるかを制御します。ウォッチの 入力 は、評価したいデータを取得します。
スケジュールを定義する最も簡単な方法は、間隔を指定することです。たとえば、次のスケジュールは 10 秒ごとに実行されます:
Python
resp = client.watcher.put_watch(
id="cluster_health_watch",
trigger={
"schedule": {
"interval": "10s"
}
},
)
print(resp)
Js
const response = await client.watcher.putWatch({
id: "cluster_health_watch",
trigger: {
schedule: {
interval: "10s",
},
},
});
console.log(response);
Console
PUT _watcher/watch/cluster_health_watch
{
"trigger" : {
"schedule" : { "interval" : "10s" }
}
}
スケジュールは通常、より頻繁に実行されるように構成されます。この例では、間隔を 10 秒に設定して、ウォッチがトリガーされるのを簡単に確認できます。 このウォッチは非常に頻繁に実行されるため、実験が終わったら ウォッチを削除する のを忘れないでください。 |
クラスターの状態を取得するには、クラスター健康 API を呼び出すことができます:
Python
resp = client.cluster.health(
pretty=True,
)
print(resp)
Ruby
response = client.cluster.health(
pretty: true
)
puts response
Js
const response = await client.cluster.health({
pretty: "true",
});
console.log(response);
Console
GET _cluster/health?pretty
ウォッチに健康状態をロードするには、クラスター健康 API を呼び出す HTTP 入力 を追加するだけです:
Python
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)
Js
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);
Console
PUT _watcher/watch/cluster_health_watch
{
"trigger" : {
"schedule" : { "interval" : "10s" }
},
"input" : {
"http" : {
"request" : {
"host" : "localhost",
"port" : 9200,
"path" : "/_cluster/health"
}
}
}
}
セキュリティを使用している場合、ウォッチ構成の一部として認証情報を提供する必要があります:
Python
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)
Js
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);
Console
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"
}
}
}
}
}
}
このようなウォッチ構成で使用するために必要な最小限の権限を持つユーザーを作成することをお勧めします。
クラスターの構成によっては、キーストア、トラストストア、または証明書など、ウォッチがクラスターにアクセスする前に追加の設定が必要な場合があります。詳細については、Watcher 設定 を参照してください。
ウォッチ履歴を確認すると、ウォッチが実行されるたびにクラスターの状態が watch_record
の一部として記録されていることがわかります。
たとえば、次のリクエストはウォッチ履歴から最後の 10 件のウォッチレコードを取得します:
Python
resp = client.search(
index=".watcher-history*",
sort=[
{
"result.execution_time": "desc"
}
],
)
print(resp)
Ruby
response = client.search(
index: '.watcher-history*',
body: {
sort: [
{
'result.execution_time' => 'desc'
}
]
}
)
puts response
Js
const response = await client.search({
index: ".watcher-history*",
sort: [
{
"result.execution_time": "desc",
},
],
});
console.log(response);
Console
GET .watcher-history*/_search
{
"sort" : [
{ "result.execution_time" : "desc" }
]
}
条件を追加する
条件 は、ウォッチにロードしたデータを評価し、アクションが必要かどうかを判断します。クラスターの状態をウォッチにロードする入力を定義したので、その状態をチェックする条件を定義できます。
たとえば、状態が RED であるかどうかを確認する条件を追加できます。
Python
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)
Js
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);
Console
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
の一部として記録されていることがわかります。
条件が満たされたかどうかを確認するには、次のクエリを実行できます。
Python
resp = client.search(
index=".watcher-history*",
pretty=True,
query={
"match": {
"result.condition.met": True
}
},
)
print(resp)
Ruby
response = client.search(
index: '.watcher-history*',
pretty: true,
body: {
query: {
match: {
'result.condition.met' => true
}
}
}
)
puts response
Js
const response = await client.search({
index: ".watcher-history*",
pretty: "true",
query: {
match: {
"result.condition.met": true,
},
},
});
console.log(response);
Console
GET .watcher-history*/_search?pretty
{
"query" : {
"match" : { "result.condition.met" : true }
}
}
アクションを実行する
ウォッチ履歴に watch_records
を記録するのは良いことですが、Watcher の本当の力はアラートに応じて何かを行うことができることです。ウォッチの アクション は、ウォッチ条件が真のときに何をするかを定義します。メールを送信したり、サードパーティの Webhook を呼び出したり、ウォッチ条件が満たされたときに Elasticsearch インデックスにドキュメントを書き込んだり、ログに記録したりできます。
たとえば、状態が RED のときにクラスターの状態情報をインデックスするアクションを追加できます。
Python
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": "[email protected]",
"subject": "Cluster Status Warning",
"body": "Cluster status is RED"
}
}
},
)
print(resp)
Js
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: "[email protected]",
subject: "Cluster Status Warning",
body: "Cluster status is RED",
},
},
},
});
console.log(response);
Console
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" : "[email protected]",
"subject" : "Cluster Status Warning",
"body" : "Cluster status is RED"
}
}
}
}
Watcher がメールを送信するには、elasticsearch.yml
構成ファイルにメールアカウントを設定し、Elasticsearch を再起動する必要があります。メールアカウントを追加するには、xpack.notification.email.account
プロパティを設定します。
たとえば、次のスニペットは work
という名前の Gmail アカウントを構成します:
Yaml
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>
通知を送信したいメールアドレスで <email> を置き換えます。 |
|
Gmail ユーザー名(通常は Gmail アドレス)で <username> を置き換えます。 |
|
Gmail パスワードで <password> を置き換えます。 |
メールアカウントに高度なセキュリティオプションが有効になっている場合、Watcher からメールを送信するために追加の手順を実行する必要があります。詳細については、メールアカウントの構成 を参照してください。
ウォッチ履歴や status_index
を確認して、アクションが実行されたことを確認できます。
Python
resp = client.search(
index=".watcher-history*",
pretty=True,
query={
"match": {
"result.condition.met": True
}
},
)
print(resp)
Ruby
response = client.search(
index: '.watcher-history*',
pretty: true,
body: {
query: {
match: {
'result.condition.met' => true
}
}
}
)
puts response
Js
const response = await client.search({
index: ".watcher-history*",
pretty: "true",
query: {
match: {
"result.condition.met": true,
},
},
});
console.log(response);
Console
GET .watcher-history*/_search?pretty
{
"query" : {
"match" : { "result.condition.met" : true }
}
}
ウォッチを削除する
cluster_health_watch
は 10 秒ごとに実行されるように構成されているため、実験が終わったら削除することを確認してください。そうしないと、無限にスパムを受け取ることになります。
ウォッチを削除するには、ウォッチ削除 API を使用します:
Python
resp = client.watcher.delete_watch(
id="cluster_health_watch",
)
print(resp)
Ruby
response = client.watcher.delete_watch(
id: 'cluster_health_watch'
)
puts response
Js
const response = await client.watcher.deleteWatch({
id: "cluster_health_watch",
});
console.log(response);
Console
DELETE _watcher/watch/cluster_health_watch