ウォッチャーアクション

ウォッチの条件が満たされると、そのアクションが実行されますが、スロットリングされている場合は実行されません。ウォッチは複数のアクションを実行できます。アクションは一度に一つずつ実行され、各アクションは独立して実行されます。アクションを実行中に発生した失敗は、アクションの結果とウォッチの履歴に記録されます。

ウォッチにアクションが定義されていない場合、アクションは実行されません。ただし、watch_recordはウォッチの履歴に書き込まれます。

アクションは実行コンテキスト内のペイロードにアクセスできます。これを使用して、必要に応じて実行をサポートできます。たとえば、ペイロードはテンプレート化されたメール本文のモデルとして機能する場合があります。

ウォッチャーは以下のアクションをサポートしています:

確認とスロットリング

ウォッチの実行中、条件が満たされると、構成されたアクションごとにスロットリングするかどうかの決定が行われます。アクションのスロットリングの主な目的は、同じウォッチに対して同じアクションの実行が多すぎるのを防ぐことです。

たとえば、アプリケーションのログエントリでエラーを検出するウォッチがあるとします。このウォッチは5分ごとにトリガーされ、過去1時間のエラーを検索します。この場合、エラーがあると、ウォッチがチェックされ、そのアクションが同じエラーに基づいて複数回実行される期間があります。その結果、システム管理者は同じ問題について複数の通知を受け取ることになり、煩わしいことがあります。

この問題に対処するために、ウォッチャーは時間ベースのスロットリングをサポートしています。アクションの構成の一部としてスロットリング期間を定義して、アクションがどのくらいの頻度で実行されるかを制限できます。スロットリング期間を設定すると、ウォッチャーはスロットリング期間内にすでに実行された場合、アクションの再実行を防ぎます(now - throttling period)。

以下のスニペットは、上記のシナリオに対するウォッチを示しています - email_administratorアクションにスロットル期間を関連付けています:

Python

  1. resp = client.watcher.put_watch(
  2. id="error_logs_alert",
  3. metadata={
  4. "color": "red"
  5. },
  6. trigger={
  7. "schedule": {
  8. "interval": "5m"
  9. }
  10. },
  11. input={
  12. "search": {
  13. "request": {
  14. "indices": "log-events",
  15. "body": {
  16. "size": 0,
  17. "query": {
  18. "match": {
  19. "status": "error"
  20. }
  21. }
  22. }
  23. }
  24. }
  25. },
  26. condition={
  27. "compare": {
  28. "ctx.payload.hits.total": {
  29. "gt": 5
  30. }
  31. }
  32. },
  33. actions={
  34. "email_administrator": {
  35. "throttle_period": "15m",
  36. "email": {
  37. "to": "[email protected]",
  38. "subject": "Encountered {{ctx.payload.hits.total}} errors",
  39. "body": "Too many error in the system, see attached data",
  40. "attachments": {
  41. "attached_data": {
  42. "data": {
  43. "format": "json"
  44. }
  45. }
  46. },
  47. "priority": "high"
  48. }
  49. }
  50. },
  51. )
  52. print(resp)

Js

  1. const response = await client.watcher.putWatch({
  2. id: "error_logs_alert",
  3. metadata: {
  4. color: "red",
  5. },
  6. trigger: {
  7. schedule: {
  8. interval: "5m",
  9. },
  10. },
  11. input: {
  12. search: {
  13. request: {
  14. indices: "log-events",
  15. body: {
  16. size: 0,
  17. query: {
  18. match: {
  19. status: "error",
  20. },
  21. },
  22. },
  23. },
  24. },
  25. },
  26. condition: {
  27. compare: {
  28. "ctx.payload.hits.total": {
  29. gt: 5,
  30. },
  31. },
  32. },
  33. actions: {
  34. email_administrator: {
  35. throttle_period: "15m",
  36. email: {
  37. to: "[email protected]",
  38. subject: "Encountered {{ctx.payload.hits.total}} errors",
  39. body: "Too many error in the system, see attached data",
  40. attachments: {
  41. attached_data: {
  42. data: {
  43. format: "json",
  44. },
  45. },
  46. },
  47. priority: "high",
  48. },
  49. },
  50. },
  51. });
  52. console.log(response);

コンソール

  1. PUT _watcher/watch/error_logs_alert
  2. {
  3. "metadata" : {
  4. "color" : "red"
  5. },
  6. "trigger" : {
  7. "schedule" : {
  8. "interval" : "5m"
  9. }
  10. },
  11. "input" : {
  12. "search" : {
  13. "request" : {
  14. "indices" : "log-events",
  15. "body" : {
  16. "size" : 0,
  17. "query" : { "match" : { "status" : "error" } }
  18. }
  19. }
  20. }
  21. },
  22. "condition" : {
  23. "compare" : { "ctx.payload.hits.total" : { "gt" : 5 }}
  24. },
  25. "actions" : {
  26. "email_administrator" : {
  27. "throttle_period": "15m",
  28. "email" : {
  29. "to" : "[email protected]",
  30. "subject" : "Encountered {{ctx.payload.hits.total}} errors",
  31. "body" : "Too many error in the system, see attached data",
  32. "attachments" : {
  33. "attached_data" : {
  34. "data" : {
  35. "format" : "json"
  36. }
  37. }
  38. },
  39. "priority" : "high"
  40. }
  41. }
  42. }
  43. }
次のemail_administratorアクションの実行の間には少なくとも15分の間隔があります。
詳細については、メールアクションを参照してください。

ウォッチレベルでスロットリング期間を定義することもできます。ウォッチレベルのスロットリング期間は、ウォッチで定義されたすべてのアクションのデフォルトのスロットリング期間として機能します:

Python

  1. resp = client.watcher.put_watch(
  2. id="log_event_watch",
  3. trigger={
  4. "schedule": {
  5. "interval": "5m"
  6. }
  7. },
  8. input={
  9. "search": {
  10. "request": {
  11. "indices": "log-events",
  12. "body": {
  13. "size": 0,
  14. "query": {
  15. "match": {
  16. "status": "error"
  17. }
  18. }
  19. }
  20. }
  21. }
  22. },
  23. condition={
  24. "compare": {
  25. "ctx.payload.hits.total": {
  26. "gt": 5
  27. }
  28. }
  29. },
  30. throttle_period="15m",
  31. actions={
  32. "email_administrator": {
  33. "email": {
  34. "to": "[email protected]",
  35. "subject": "Encountered {{ctx.payload.hits.total}} errors",
  36. "body": "Too many error in the system, see attached data",
  37. "attachments": {
  38. "attached_data": {
  39. "data": {
  40. "format": "json"
  41. }
  42. }
  43. },
  44. "priority": "high"
  45. }
  46. },
  47. "notify_pager": {
  48. "webhook": {
  49. "method": "POST",
  50. "host": "pager.service.domain",
  51. "port": 1234,
  52. "path": "/{{watch_id}}",
  53. "body": "Encountered {{ctx.payload.hits.total}} errors"
  54. }
  55. }
  56. },
  57. )
  58. print(resp)

Js

  1. const response = await client.watcher.putWatch({
  2. id: "log_event_watch",
  3. trigger: {
  4. schedule: {
  5. interval: "5m",
  6. },
  7. },
  8. input: {
  9. search: {
  10. request: {
  11. indices: "log-events",
  12. body: {
  13. size: 0,
  14. query: {
  15. match: {
  16. status: "error",
  17. },
  18. },
  19. },
  20. },
  21. },
  22. },
  23. condition: {
  24. compare: {
  25. "ctx.payload.hits.total": {
  26. gt: 5,
  27. },
  28. },
  29. },
  30. throttle_period: "15m",
  31. actions: {
  32. email_administrator: {
  33. email: {
  34. to: "[email protected]",
  35. subject: "Encountered {{ctx.payload.hits.total}} errors",
  36. body: "Too many error in the system, see attached data",
  37. attachments: {
  38. attached_data: {
  39. data: {
  40. format: "json",
  41. },
  42. },
  43. },
  44. priority: "high",
  45. },
  46. },
  47. notify_pager: {
  48. webhook: {
  49. method: "POST",
  50. host: "pager.service.domain",
  51. port: 1234,
  52. path: "/{{watch_id}}",
  53. body: "Encountered {{ctx.payload.hits.total}} errors",
  54. },
  55. },
  56. },
  57. });
  58. console.log(response);

コンソール

  1. PUT _watcher/watch/log_event_watch
  2. {
  3. "trigger" : {
  4. "schedule" : { "interval" : "5m" }
  5. },
  6. "input" : {
  7. "search" : {
  8. "request" : {
  9. "indices" : "log-events",
  10. "body" : {
  11. "size" : 0,
  12. "query" : { "match" : { "status" : "error" } }
  13. }
  14. }
  15. }
  16. },
  17. "condition" : {
  18. "compare" : { "ctx.payload.hits.total" : { "gt" : 5 }}
  19. },
  20. "throttle_period" : "15m",
  21. "actions" : {
  22. "email_administrator" : {
  23. "email" : {
  24. "to" : "[email protected]",
  25. "subject" : "Encountered {{ctx.payload.hits.total}} errors",
  26. "body" : "Too many error in the system, see attached data",
  27. "attachments" : {
  28. "attached_data" : {
  29. "data" : {
  30. "format" : "json"
  31. }
  32. }
  33. },
  34. "priority" : "high"
  35. }
  36. },
  37. "notify_pager" : {
  38. "webhook" : {
  39. "method" : "POST",
  40. "host" : "pager.service.domain",
  41. "port" : 1234,
  42. "path" : "/{{watch_id}}",
  43. "body" : "Encountered {{ctx.payload.hits.total}} errors"
  44. }
  45. }
  46. }
  47. }
次のアクションの実行の間には少なくとも15分の間隔があります。
(email_administratorおよびnotify_pagerアクションの両方に適用されます)

アクションまたはウォッチレベルでスロットリング期間を定義しない場合、グローバルデフォルトのスロットリング期間が適用されます。最初は5秒に設定されています。グローバルデフォルトを変更するには、xpack.watcher.execution.default_throttle_period設定をelasticsearch.ymlで構成します:

Yaml

  1. xpack.watcher.execution.default_throttle_period: 15m

ウォッチャーは確認ベースのスロットリングもサポートしています。ウォッチ条件がtrueの間、ack watch APIを使用してウォッチを確認することで、ウォッチアクションが再度実行されないようにできます。これは本質的にウォッチャーに「通知を受け取り、処理しています。このエラーについて再度通知しないでください」と伝えます。確認されたウォッチアクションは、ウォッチの条件がfalseに評価されるまでacked状態に留まります。その際、アクションの状態はawaits_successful_executionに変更されます。

アクションを確認するには、ack watch APIを使用します:

Python

  1. resp = client.watcher.ack_watch(
  2. watch_id="<id>",
  3. action_id="<action_ids>",
  4. )
  5. print(resp)

Js

  1. const response = await client.watcher.ackWatch({
  2. watch_id: "<id>",
  3. action_id: "<action_ids>",
  4. });
  5. console.log(response);

コンソール

  1. POST _watcher/watch/<id>/_ack/<action_ids>

ウォッチの<id>はウォッチのIDで、<action_ids>は確認したいアクションIDのカンマ区切りリストです。すべてのアクションを確認するには、actionsパラメータを省略します。

以下の図は、ウォッチの実行中に各アクションに対して行われたスロットリングの決定を示しています:

アクションスロットリング

OpenJDKでのSSL/TLSの使用

各ディストリビューターはOpenJDKをパッケージ化する方法を自由に選択できるため、同じバージョンであっても、異なるLinuxディストリビューションの下で異なる部分を含むOpenJDKディストリビューションが存在する可能性があります。

これにより、jirapagerdutyslack、またはwebhookのようなTLSを使用するアクションや入力に問題が発生する可能性があります。CA証明書が不足しているためです。TLSエンドポイントに接続するウォッチを作成する際にTLSエラーが発生した場合は、プラットフォーム用の最新のOpenJDKディストリビューションにアップグレードしてみてください。それでも問題が解決しない場合は、Oracle JDKにアップグレードしてみてください。