Watcherの始め方

アラートを送信するためのウォッチを設定するには:

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

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

ログデータを定期的に検索し、その結果をウォッチに読み込むには、間隔スケジュールと検索入力を使用できます。たとえば、次のウォッチはlogsインデックスで10秒ごとにエラーを検索します:

Python

  1. resp = client.watcher.put_watch(
  2. id="log_error_watch",
  3. trigger={
  4. "schedule": {
  5. "interval": "10s"
  6. }
  7. },
  8. input={
  9. "search": {
  10. "request": {
  11. "indices": [
  12. "logs"
  13. ],
  14. "body": {
  15. "query": {
  16. "match": {
  17. "message": "error"
  18. }
  19. }
  20. }
  21. }
  22. }
  23. },
  24. )
  25. print(resp)

Js

  1. const response = await client.watcher.putWatch({
  2. id: "log_error_watch",
  3. trigger: {
  4. schedule: {
  5. interval: "10s",
  6. },
  7. },
  8. input: {
  9. search: {
  10. request: {
  11. indices: ["logs"],
  12. body: {
  13. query: {
  14. match: {
  15. message: "error",
  16. },
  17. },
  18. },
  19. },
  20. },
  21. },
  22. });
  23. console.log(response);

コンソール

  1. PUT _watcher/watch/log_error_watch
  2. {
  3. "trigger" : {
  4. "schedule" : { "interval" : "10s" }
  5. },
  6. "input" : {
  7. "search" : {
  8. "request" : {
  9. "indices" : [ "logs" ],
  10. "body" : {
  11. "query" : {
  12. "match" : { "message": "error" }
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }
スケジュールは通常、あまり頻繁に実行されるように設定されています。この例では、間隔を10秒に設定しているため、ウォッチがトリガーされるのを簡単に確認できます。
このウォッチは非常に頻繁に実行されるため、実験が終わったらウォッチを削除することを忘れないでください。

ウォッチの履歴を確認すると、ウォッチが10秒ごとにトリガーされていることがわかります。ただし、検索は結果を返さないため、ウォッチペイロードには何も読み込まれません。

たとえば、次のリクエストはウォッチ履歴から最後の10回のウォッチ実行(ウォッチ記録)を取得します:

Python

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

Ruby

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

Js

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

コンソール

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

条件を追加する

条件は、ウォッチに読み込まれたデータを評価し、アクションが必要かどうかを判断します。ログエラーをウォッチに読み込んだので、エラーが見つかったかどうかを確認する条件を定義できます。

たとえば、次の比較条件は、検索入力がヒットを返したかどうかを単純に確認します。

Python

  1. resp = client.watcher.put_watch(
  2. id="log_error_watch",
  3. trigger={
  4. "schedule": {
  5. "interval": "10s"
  6. }
  7. },
  8. input={
  9. "search": {
  10. "request": {
  11. "indices": [
  12. "logs"
  13. ],
  14. "body": {
  15. "query": {
  16. "match": {
  17. "message": "error"
  18. }
  19. }
  20. }
  21. }
  22. }
  23. },
  24. condition={
  25. "compare": {
  26. "ctx.payload.hits.total": {
  27. "gt": 0
  28. }
  29. }
  30. },
  31. )
  32. print(resp)

Js

  1. const response = await client.watcher.putWatch({
  2. id: "log_error_watch",
  3. trigger: {
  4. schedule: {
  5. interval: "10s",
  6. },
  7. },
  8. input: {
  9. search: {
  10. request: {
  11. indices: ["logs"],
  12. body: {
  13. query: {
  14. match: {
  15. message: "error",
  16. },
  17. },
  18. },
  19. },
  20. },
  21. },
  22. condition: {
  23. compare: {
  24. "ctx.payload.hits.total": {
  25. gt: 0,
  26. },
  27. },
  28. },
  29. });
  30. console.log(response);

コンソール

  1. PUT _watcher/watch/log_error_watch
  2. {
  3. "trigger" : { "schedule" : { "interval" : "10s" }},
  4. "input" : {
  5. "search" : {
  6. "request" : {
  7. "indices" : [ "logs" ],
  8. "body" : {
  9. "query" : {
  10. "match" : { "message": "error" }
  11. }
  12. }
  13. }
  14. }
  15. },
  16. "condition" : {
  17. "compare" : { "ctx.payload.hits.total" : { "gt" : 0 }}
  18. }
  19. }

| | 比較条件は、実行コンテキスト内の値と簡単に比較できるようにします。

この比較条件がtrueに評価されるためには、エラーを含むイベントをlogsインデックスに追加する必要があります。たとえば、次のリクエストはlogsインデックスに404エラーを追加します:

Python

  1. resp = client.index(
  2. index="logs",
  3. document={
  4. "timestamp": "2015-05-17T18:12:07.613Z",
  5. "request": "GET index.html",
  6. "status_code": 404,
  7. "message": "Error: File not found"
  8. },
  9. )
  10. print(resp)

Ruby

  1. response = client.index(
  2. index: 'logs',
  3. body: {
  4. timestamp: '2015-05-17T18:12:07.613Z',
  5. request: 'GET index.html',
  6. status_code: 404,
  7. message: 'Error: File not found'
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.index({
  2. index: "logs",
  3. document: {
  4. timestamp: "2015-05-17T18:12:07.613Z",
  5. request: "GET index.html",
  6. status_code: 404,
  7. message: "Error: File not found",
  8. },
  9. });
  10. console.log(response);

コンソール

  1. POST logs/_doc
  2. {
  3. "timestamp": "2015-05-17T18:12:07.613Z",
  4. "request": "GET index.html",
  5. "status_code": 404,
  6. "message": "Error: File not found"
  7. }

このイベントを追加すると、次回ウォッチが実行されるとき、条件はtrueに評価されます。条件の結果は、ウォッチが実行されるたびにwatch_recordの一部として記録されるため、ウォッチ履歴を検索することで条件が満たされたかどうかを確認できます:

Python

  1. resp = client.search(
  2. index=".watcher-history*",
  3. pretty=True,
  4. query={
  5. "bool": {
  6. "must": [
  7. {
  8. "match": {
  9. "result.condition.met": True
  10. }
  11. },
  12. {
  13. "range": {
  14. "result.execution_time": {
  15. "from": "now-10s"
  16. }
  17. }
  18. }
  19. ]
  20. }
  21. },
  22. )
  23. print(resp)

Ruby

  1. response = client.search(
  2. index: '.watcher-history*',
  3. pretty: true,
  4. body: {
  5. query: {
  6. bool: {
  7. must: [
  8. {
  9. match: {
  10. 'result.condition.met' => true
  11. }
  12. },
  13. {
  14. range: {
  15. 'result.execution_time' => {
  16. from: 'now-10s'
  17. }
  18. }
  19. }
  20. ]
  21. }
  22. }
  23. }
  24. )
  25. puts response

コンソール

  1. GET .watcher-history*/_search?pretty
  2. {
  3. "query" : {
  4. "bool" : {
  5. "must" : [
  6. { "match" : { "result.condition.met" : true }},
  7. { "range" : { "result.execution_time" : { "from" : "now-10s" }}}
  8. ]
  9. }
  10. }
  11. }

アクションを設定する

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

たとえば、次のアクションは、エラーが検出されたときにElasticsearchログにメッセージを書き込みます。

Python

  1. resp = client.watcher.put_watch(
  2. id="log_error_watch",
  3. trigger={
  4. "schedule": {
  5. "interval": "10s"
  6. }
  7. },
  8. input={
  9. "search": {
  10. "request": {
  11. "indices": [
  12. "logs"
  13. ],
  14. "body": {
  15. "query": {
  16. "match": {
  17. "message": "error"
  18. }
  19. }
  20. }
  21. }
  22. }
  23. },
  24. condition={
  25. "compare": {
  26. "ctx.payload.hits.total": {
  27. "gt": 0
  28. }
  29. }
  30. },
  31. actions={
  32. "log_error": {
  33. "logging": {
  34. "text": "Found {{ctx.payload.hits.total}} errors in the logs"
  35. }
  36. }
  37. },
  38. )
  39. print(resp)

Js

  1. const response = await client.watcher.putWatch({
  2. id: "log_error_watch",
  3. trigger: {
  4. schedule: {
  5. interval: "10s",
  6. },
  7. },
  8. input: {
  9. search: {
  10. request: {
  11. indices: ["logs"],
  12. body: {
  13. query: {
  14. match: {
  15. message: "error",
  16. },
  17. },
  18. },
  19. },
  20. },
  21. },
  22. condition: {
  23. compare: {
  24. "ctx.payload.hits.total": {
  25. gt: 0,
  26. },
  27. },
  28. },
  29. actions: {
  30. log_error: {
  31. logging: {
  32. text: "Found {{ctx.payload.hits.total}} errors in the logs",
  33. },
  34. },
  35. },
  36. });
  37. console.log(response);

コンソール

  1. PUT _watcher/watch/log_error_watch
  2. {
  3. "trigger" : { "schedule" : { "interval" : "10s" }},
  4. "input" : {
  5. "search" : {
  6. "request" : {
  7. "indices" : [ "logs" ],
  8. "body" : {
  9. "query" : {
  10. "match" : { "message": "error" }
  11. }
  12. }
  13. }
  14. }
  15. },
  16. "condition" : {
  17. "compare" : { "ctx.payload.hits.total" : { "gt" : 0 }}
  18. },
  19. "actions" : {
  20. "log_error" : {
  21. "logging" : {
  22. "text" : "Found {{ctx.payload.hits.total}} errors in the logs"
  23. }
  24. }
  25. }
  26. }

ウォッチを削除する

  1. ウォッチを削除するには、[ウォッチ削除API](/read/elasticsearch-8-15/0bf431b3202d9620.md)を使用します:
  2. #### Python
  3. ``````python
  4. resp = client.watcher.delete_watch(
  5. id="log_error_watch",
  6. )
  7. print(resp)
  8. `

Ruby

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

Js

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

コンソール

  1. DELETE _watcher/watch/log_error_watch

必要なセキュリティ権限

ユーザーがウォッチを作成および操作できるようにするには、watcher_adminセキュリティロールを割り当てます。ウォッチャー管理者は、ウォッチ、ウォッチ履歴、およびトリガーされたウォッチを表示することもできます。

ユーザーがウォッチとウォッチ履歴を表示できるようにするには、watcher_userセキュリティロールを割り当てます。ウォッチャーユーザーはウォッチを作成または操作することはできず、読み取り専用のウォッチ操作を実行することのみが許可されています。

次に行うべきこと

  • ウォッチの構造とウォッチライフサイクルに関する詳細はWatcherの仕組みを参照してください。
  • ウォッチの設定に関する他の例については例のウォッチを参照してください。
  • カスタムウォッチを構築するための出発点として使用できる追加のサンプルウォッチについては、Elastic Examplesリポジトリの例のウォッチを参照してください。