ようへいの日々精進XP

よかろうもん

Rundeck の通知を Datadog Event に飛ばす Rundeck Notification Plugin を作ってみた

Rundeck プラグインシリーズ第二弾。

tl;dr

前回、ジョブのログを fluentd に流すプラグインを作ってみたが、ジョブの結果を通知するプラグインも幾つか提供されている。今回は以下の PagerDuty に通知するプラグインがあったので...

github.com

これをを真似て Datadog Event に通知するプラグインを作ってみた。

github.com


Notification Plugin について

ドキュメント

サンプル

github.com

通知のトリガ

通知のトリガについては以下の三つ。

  • onstart - ジョブ開始時
  • onsuccess - ジョブが正常に終了した時
  • onfailure - ジョブが失敗、又は abort した時

プラグインの実行にあたって

以下の二つのデータが必要になる。

データ 内容
Configuration data ユーザーが定義する設定データ
Execution data ジョブやジョブの実行結果が含まれるデータ

Configuration data

詳細はこちらを。

Configuration data にはコンテキスト変数を利用してジョブの実行結果の情報を埋め込むことが出来る。例えば、以下のように定義することで...

Rundeck JOB: ${job.status} [${job.project}] \"${job.name}\" run by ${job.user} (#${job.execid})

以下のように展開される。

Rundeck JOB: FAILED [hello-world] "hello-world" run by admin (#2277)

Execution data

詳細はこちらを。

Execution data には以下のような execution マップデータが含まれている。(以下、ドキュメントより抜粋)

  • execution.id: ID of the execution
  • execution.href: URL to the execution output view
  • execution.status: Execution state ('running','failed','aborted','succeeded')
  • execution.user: User who started the job
  • execution.dateStarted: Start time (java.util.Date)
  • execution.dateStartedUnixtime: Start time as milliseconds since epoch (long)
  • execution.dateStartedW3c: Start time as a W3C formatted String
  • execution.description: Summary string for the execution
  • execution.argstring: Argument string for any job options
  • execution.project: Project name
  • execution.loglevel: Loglevel string ('ERROR','WARN','INFO','VERBOSE','DEBUG')

又、以下はジョブが終了した時点で含まれる。(onstart トリガには含まれない)

  • execution.failedNodeListString: Comma-separated list of any nodes that failed, if present
  • execution.failedNodeList: Java List of any node names that failed, if present
  • execution.succeededNodeListString: Comma-separated list of any nodes that succeeded, if present
  • execution.succeededNodeList: Java List of any node names that succeeded, if present
  • execution.nodestatus: Java Map containing summary counts of node success/failure/total, in the form: [succeeded: int, failed: int, total: int]
  • execution.dateEnded: End time (java.util.Date)
  • execution.dateEndedUnixtime: End time as milliseconds since epoch (long)
  • execution.dateEndedW3c: End time as W3C formatted string
  • execution.abortedby: User who aborted the execution
  • job.id: Job ID
  • job.href: URL to Job view page
  • job.name: Job name
  • job.group: Job group
  • job.project: Project name
  • job.description: Job Description
  • job.averageDuration: Average job duration in Milliseconds, if available
  • execution.context.option: a Map containing the Job Option keys/values.
  • job: a Map containing the Job context data, as provided to executions. This map will contain some duplicate information as the execution.job map previously described.

通知ハンドラ

Notification Plugin では onstartonsuccess 及び onfailure 毎に任意のハンドラを呼び出すことが出来る。以下はハンドラの定義例。

onstart{ Map execution, Map configuration ->
    //perform an action using the execution and configuration
    println "Job ${execution.job.name} has been started by ${execution.user}..."
    return true
}
onsuccess{ Map execution, Map configuration ->
    //perform an action using the execution and configuration
    println "Success! Job ${execution.job.name} worked fine."
    return true
}
onfailure{ Map execution, Map configuration ->
    //perform an action using the execution and configuration
    println "Oh No! Job ${execution.job.name} didn't work out."
    return true
}

それぞれのトリガ(onstartonsuccess 及び onfailure)毎にシンプルに println を呼んでいる。(${execution.job.name} を出力している)


rundeck-datadog_event-notification-plugin の使い方

インストール

インストールは DatadogEventNotification.groovy を $RDECK_BASE/libext/ にコピーする。

$ sudo cp DatadogEventNotification.groovy /var/lib/rundec/libext/

設定

project.properties と framework.properties に Datadog の API キーを指定する。

$ cat project.properties framework.properties | grep Datadog
project.plugin.Notification.DatadogEventNotification.api_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
framework.plugin.Notification.DatadogEventNotification.api_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

設定したら rundeckd を再起動しておく。

通知の設定

ジョブ設定から下図のように設定する。

f:id:inokara:20151024074728p:plain

とりあえず、ジョブが失敗した時に飛ばすようにするには On Failure にある Datadog_Event にチェックを入れる。Subject は任意の値に指定することが可能だが、プラグインスクリプトにデフォルト値が定義されている場合には既に定義された状態となる。尚、今回はプラグインには以下のようにデフォルト値が設定されている。

Rundeck JOB: ${job.status} [${job.project}] \"${job.name}\" run by ${job.user} (#${job.execid})

${job.status}${job.project} のコンテキスト変数がそれぞれジョブの状態、ジョブのプロジェクト名等に展開される。(後述)

通知

設定を保存後、ジョブを走らせておくと以下のように通知がバンバン(意図的にジョブを失敗させるようにしておいた為)飛んできているのが確認出来る。

f:id:inokara:20151024075303p:plain


ということで...

次は...

  • Groovy をも少し勉強する
  • AWS の各サービス(Cloudwatch Logs と SNS)と連携させてみたい

Enjoy Rundeck

まだまだ続くよ Rundeck 道。