Elasticsearch クラスターの状態を監視する

Elasticsearch クラスターの健康状態を監視するための基本的なウォッチを簡単に構成できます:

ウォッチをスケジュールし、入力を追加する

ウォッチの スケジュール は、ウォッチがどのくらいの頻度でトリガーされるかを制御します。ウォッチの 入力 は、評価したいデータを取得します。

スケジュールを定義する最も簡単な方法は、間隔を指定することです。たとえば、次のスケジュールは 10 秒ごとに実行されます:

Python

  1. resp = client.watcher.put_watch(
  2. id="cluster_health_watch",
  3. trigger={
  4. "schedule": {
  5. "interval": "10s"
  6. }
  7. },
  8. )
  9. print(resp)

Js

  1. const response = await client.watcher.putWatch({
  2. id: "cluster_health_watch",
  3. trigger: {
  4. schedule: {
  5. interval: "10s",
  6. },
  7. },
  8. });
  9. console.log(response);

Console

  1. PUT _watcher/watch/cluster_health_watch
  2. {
  3. "trigger" : {
  4. "schedule" : { "interval" : "10s" }
  5. }
  6. }
スケジュールは通常、より頻繁に実行されるように構成されます。この例では、間隔を 10 秒に設定して、ウォッチがトリガーされるのを簡単に確認できます。
このウォッチは非常に頻繁に実行されるため、実験が終わったら ウォッチを削除する のを忘れないでください。

クラスターの状態を取得するには、クラスター健康 API を呼び出すことができます:

Python

  1. resp = client.cluster.health(
  2. pretty=True,
  3. )
  4. print(resp)

Ruby

  1. response = client.cluster.health(
  2. pretty: true
  3. )
  4. puts response

Js

  1. const response = await client.cluster.health({
  2. pretty: "true",
  3. });
  4. console.log(response);

Console

  1. GET _cluster/health?pretty

ウォッチに健康状態をロードするには、クラスター健康 API を呼び出す HTTP 入力 を追加するだけです:

Python

  1. resp = client.watcher.put_watch(
  2. id="cluster_health_watch",
  3. trigger={
  4. "schedule": {
  5. "interval": "10s"
  6. }
  7. },
  8. input={
  9. "http": {
  10. "request": {
  11. "host": "localhost",
  12. "port": 9200,
  13. "path": "/_cluster/health"
  14. }
  15. }
  16. },
  17. )
  18. print(resp)

Js

  1. const response = await client.watcher.putWatch({
  2. id: "cluster_health_watch",
  3. trigger: {
  4. schedule: {
  5. interval: "10s",
  6. },
  7. },
  8. input: {
  9. http: {
  10. request: {
  11. host: "localhost",
  12. port: 9200,
  13. path: "/_cluster/health",
  14. },
  15. },
  16. },
  17. });
  18. console.log(response);

Console

  1. PUT _watcher/watch/cluster_health_watch
  2. {
  3. "trigger" : {
  4. "schedule" : { "interval" : "10s" }
  5. },
  6. "input" : {
  7. "http" : {
  8. "request" : {
  9. "host" : "localhost",
  10. "port" : 9200,
  11. "path" : "/_cluster/health"
  12. }
  13. }
  14. }
  15. }

セキュリティを使用している場合、ウォッチ構成の一部として認証情報を提供する必要があります:

Python

  1. resp = client.watcher.put_watch(
  2. id="cluster_health_watch",
  3. trigger={
  4. "schedule": {
  5. "interval": "10s"
  6. }
  7. },
  8. input={
  9. "http": {
  10. "request": {
  11. "host": "localhost",
  12. "port": 9200,
  13. "path": "/_cluster/health",
  14. "auth": {
  15. "basic": {
  16. "username": "elastic",
  17. "password": "x-pack-test-password"
  18. }
  19. }
  20. }
  21. }
  22. },
  23. )
  24. print(resp)

Js

  1. const response = await client.watcher.putWatch({
  2. id: "cluster_health_watch",
  3. trigger: {
  4. schedule: {
  5. interval: "10s",
  6. },
  7. },
  8. input: {
  9. http: {
  10. request: {
  11. host: "localhost",
  12. port: 9200,
  13. path: "/_cluster/health",
  14. auth: {
  15. basic: {
  16. username: "elastic",
  17. password: "x-pack-test-password",
  18. },
  19. },
  20. },
  21. },
  22. },
  23. });
  24. console.log(response);

Console

  1. PUT _watcher/watch/cluster_health_watch
  2. {
  3. "trigger" : {
  4. "schedule" : { "interval" : "10s" }
  5. },
  6. "input" : {
  7. "http" : {
  8. "request" : {
  9. "host" : "localhost",
  10. "port" : 9200,
  11. "path" : "/_cluster/health",
  12. "auth": {
  13. "basic": {
  14. "username": "elastic",
  15. "password": "x-pack-test-password"
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }

このようなウォッチ構成で使用するために必要な最小限の権限を持つユーザーを作成することをお勧めします。

クラスターの構成によっては、キーストア、トラストストア、または証明書など、ウォッチがクラスターにアクセスする前に追加の設定が必要な場合があります。詳細については、Watcher 設定 を参照してください。

ウォッチ履歴を確認すると、ウォッチが実行されるたびにクラスターの状態が watch_record の一部として記録されていることがわかります。

たとえば、次のリクエストはウォッチ履歴から最後の 10 件のウォッチレコードを取得します:

Python

  1. resp = client.search(
  2. index=".watcher-history*",
  3. sort=[
  4. {
  5. "result.execution_time": "desc"
  6. }
  7. ],
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. index: '.watcher-history*',
  3. body: {
  4. sort: [
  5. {
  6. 'result.execution_time' => 'desc'
  7. }
  8. ]
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. index: ".watcher-history*",
  3. sort: [
  4. {
  5. "result.execution_time": "desc",
  6. },
  7. ],
  8. });
  9. console.log(response);

Console

  1. GET .watcher-history*/_search
  2. {
  3. "sort" : [
  4. { "result.execution_time" : "desc" }
  5. ]
  6. }

条件を追加する

条件 は、ウォッチにロードしたデータを評価し、アクションが必要かどうかを判断します。クラスターの状態をウォッチにロードする入力を定義したので、その状態をチェックする条件を定義できます。

たとえば、状態が RED であるかどうかを確認する条件を追加できます。

Python

  1. resp = client.watcher.put_watch(
  2. id="cluster_health_watch",
  3. trigger={
  4. "schedule": {
  5. "interval": "10s"
  6. }
  7. },
  8. input={
  9. "http": {
  10. "request": {
  11. "host": "localhost",
  12. "port": 9200,
  13. "path": "/_cluster/health"
  14. }
  15. }
  16. },
  17. condition={
  18. "compare": {
  19. "ctx.payload.status": {
  20. "eq": "red"
  21. }
  22. }
  23. },
  24. )
  25. print(resp)

Js

  1. const response = await client.watcher.putWatch({
  2. id: "cluster_health_watch",
  3. trigger: {
  4. schedule: {
  5. interval: "10s",
  6. },
  7. },
  8. input: {
  9. http: {
  10. request: {
  11. host: "localhost",
  12. port: 9200,
  13. path: "/_cluster/health",
  14. },
  15. },
  16. },
  17. condition: {
  18. compare: {
  19. "ctx.payload.status": {
  20. eq: "red",
  21. },
  22. },
  23. },
  24. });
  25. console.log(response);

Console

  1. PUT _watcher/watch/cluster_health_watch
  2. {
  3. "trigger" : {
  4. "schedule" : { "interval" : "10s" }
  5. },
  6. "input" : {
  7. "http" : {
  8. "request" : {
  9. "host" : "localhost",
  10. "port" : 9200,
  11. "path" : "/_cluster/health"
  12. }
  13. }
  14. },
  15. "condition" : {
  16. "compare" : {
  17. "ctx.payload.status" : { "eq" : "red" }
  18. }
  19. }
  20. }
スケジュールは通常、より頻繁に実行されるように構成されます。この例では、間隔を 10 秒に設定して、ウォッチがトリガーされるのを簡単に確認できます。

ウォッチ履歴を確認すると、条件の結果がウォッチが実行されるたびに watch_record の一部として記録されていることがわかります。

条件が満たされたかどうかを確認するには、次のクエリを実行できます。

Python

  1. resp = client.search(
  2. index=".watcher-history*",
  3. pretty=True,
  4. query={
  5. "match": {
  6. "result.condition.met": True
  7. }
  8. },
  9. )
  10. print(resp)

Ruby

  1. response = client.search(
  2. index: '.watcher-history*',
  3. pretty: true,
  4. body: {
  5. query: {
  6. match: {
  7. 'result.condition.met' => true
  8. }
  9. }
  10. }
  11. )
  12. puts response

Js

  1. const response = await client.search({
  2. index: ".watcher-history*",
  3. pretty: "true",
  4. query: {
  5. match: {
  6. "result.condition.met": true,
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. GET .watcher-history*/_search?pretty
  2. {
  3. "query" : {
  4. "match" : { "result.condition.met" : true }
  5. }
  6. }

アクションを実行する

ウォッチ履歴に watch_records を記録するのは良いことですが、Watcher の本当の力はアラートに応じて何かを行うことができることです。ウォッチの アクション は、ウォッチ条件が真のときに何をするかを定義します。メールを送信したり、サードパーティの Webhook を呼び出したり、ウォッチ条件が満たされたときに Elasticsearch インデックスにドキュメントを書き込んだり、ログに記録したりできます。

たとえば、状態が RED のときにクラスターの状態情報をインデックスするアクションを追加できます。

Python

  1. resp = client.watcher.put_watch(
  2. id="cluster_health_watch",
  3. trigger={
  4. "schedule": {
  5. "interval": "10s"
  6. }
  7. },
  8. input={
  9. "http": {
  10. "request": {
  11. "host": "localhost",
  12. "port": 9200,
  13. "path": "/_cluster/health"
  14. }
  15. }
  16. },
  17. condition={
  18. "compare": {
  19. "ctx.payload.status": {
  20. "eq": "red"
  21. }
  22. }
  23. },
  24. actions={
  25. "send_email": {
  26. "email": {
  27. "to": "[email protected]",
  28. "subject": "Cluster Status Warning",
  29. "body": "Cluster status is RED"
  30. }
  31. }
  32. },
  33. )
  34. print(resp)

Js

  1. const response = await client.watcher.putWatch({
  2. id: "cluster_health_watch",
  3. trigger: {
  4. schedule: {
  5. interval: "10s",
  6. },
  7. },
  8. input: {
  9. http: {
  10. request: {
  11. host: "localhost",
  12. port: 9200,
  13. path: "/_cluster/health",
  14. },
  15. },
  16. },
  17. condition: {
  18. compare: {
  19. "ctx.payload.status": {
  20. eq: "red",
  21. },
  22. },
  23. },
  24. actions: {
  25. send_email: {
  26. email: {
  27. to: "[email protected]",
  28. subject: "Cluster Status Warning",
  29. body: "Cluster status is RED",
  30. },
  31. },
  32. },
  33. });
  34. console.log(response);

Console

  1. PUT _watcher/watch/cluster_health_watch
  2. {
  3. "trigger" : {
  4. "schedule" : { "interval" : "10s" }
  5. },
  6. "input" : {
  7. "http" : {
  8. "request" : {
  9. "host" : "localhost",
  10. "port" : 9200,
  11. "path" : "/_cluster/health"
  12. }
  13. }
  14. },
  15. "condition" : {
  16. "compare" : {
  17. "ctx.payload.status" : { "eq" : "red" }
  18. }
  19. },
  20. "actions" : {
  21. "send_email" : {
  22. "email" : {
  23. "to" : "[email protected]",
  24. "subject" : "Cluster Status Warning",
  25. "body" : "Cluster status is RED"
  26. }
  27. }
  28. }
  29. }

Watcher がメールを送信するには、elasticsearch.yml 構成ファイルにメールアカウントを設定し、Elasticsearch を再起動する必要があります。メールアカウントを追加するには、xpack.notification.email.account プロパティを設定します。

たとえば、次のスニペットは work という名前の Gmail アカウントを構成します:

Yaml

  1. xpack.notification.email.account:
  2. work:
  3. profile: gmail
  4. email_defaults:
  5. from: <email>
  6. smtp:
  7. auth: true
  8. starttls.enable: true
  9. host: smtp.gmail.com
  10. port: 587
  11. user: <username>
  12. password: <password>
通知を送信したいメールアドレスで <email> を置き換えます。
Gmail ユーザー名(通常は Gmail アドレス)で <username> を置き換えます。
Gmail パスワードで <password> を置き換えます。

メールアカウントに高度なセキュリティオプションが有効になっている場合、Watcher からメールを送信するために追加の手順を実行する必要があります。詳細については、メールアカウントの構成 を参照してください。

ウォッチ履歴や status_index を確認して、アクションが実行されたことを確認できます。

Python

  1. resp = client.search(
  2. index=".watcher-history*",
  3. pretty=True,
  4. query={
  5. "match": {
  6. "result.condition.met": True
  7. }
  8. },
  9. )
  10. print(resp)

Ruby

  1. response = client.search(
  2. index: '.watcher-history*',
  3. pretty: true,
  4. body: {
  5. query: {
  6. match: {
  7. 'result.condition.met' => true
  8. }
  9. }
  10. }
  11. )
  12. puts response

Js

  1. const response = await client.search({
  2. index: ".watcher-history*",
  3. pretty: "true",
  4. query: {
  5. match: {
  6. "result.condition.met": true,
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. GET .watcher-history*/_search?pretty
  2. {
  3. "query" : {
  4. "match" : { "result.condition.met" : true }
  5. }
  6. }

ウォッチを削除する

cluster_health_watch は 10 秒ごとに実行されるように構成されているため、実験が終わったら削除することを確認してください。そうしないと、無限にスパムを受け取ることになります。

ウォッチを削除するには、ウォッチ削除 API を使用します:

Python

  1. resp = client.watcher.delete_watch(
  2. id="cluster_health_watch",
  3. )
  4. print(resp)

Ruby

  1. response = client.watcher.delete_watch(
  2. id: 'cluster_health_watch'
  3. )
  4. puts response

Js

  1. const response = await client.watcher.deleteWatch({
  2. id: "cluster_health_watch",
  3. });
  4. console.log(response);

Console

  1. DELETE _watcher/watch/cluster_health_watch