Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

障害発生時にも漏れなし! Zabbixの監視アラートでRedmine上にチケットを起票する仕組みをつくろう

タスクが10倍気持ちよくなる 開発環境のリノベーション講座 第2回

  • LINEで送る
  • このエントリーをはてなブックマークに追加

 今回は、システム監視ツール「Zabbix」が発したアラートをきっかけとして、障害の詳細情報などを記述したチケットをRedmine上へ起票する仕組みを作ります。障害発生時はその対応に追われ、Redmineチケットの起票を忘れがちです。障害の詳細情報と、対応完了までの記録をきちんと残すために、こうした仕組みを構築することをお勧めします。

目次

障害発生時でも確実にチケットを起票できますか?

 前回は、RedmineのREST APIを利用して複数のRedmineを参照して情報を集約する方法を紹介しました。

 Redmineのタスク管理機能を利用すると、たとえば、障害発生時にRedmineにチケットを起票(登録)して対応を行い、完了までの記録を管理するというインシデント管理にも利用できたりします。

 もちろん、そもそものインシデントの根本原因を解決することが大事ですね。

 とはいえ、障害発生時には、障害そのものの対応に追われるため、チケットを起票し、詳細情報を記載することを忘れる可能性も否定できません。次に挙げる2つの要件、

  • 障害の速やかな解決に注力するため、チケット起票のような事務作業的な要素を極力、排除する
  • 障害アラートを見逃すようなことのないよう、確実に記録を残す

を満たすには、「ひたすら頑張る」以外に道はないのでしょうか?

 そこで、本記事では、オープンソースのインシデント監視アプリケーション「Zabbix」を例に、監視時のアラートに合わせてRedmine上にチケットを起票する仕組みを紹介します。インシデントの発生頻度や、解決までの履歴を見直し、分析することもできるため、筆者らも大変重宝しています。


curlでのチケット操作

 それでは、さっそくRedmineへのチケット起票をやってみましょう。起票には、前回紹介したREST APIを利用します。まずは curl コマンドから試してみます。

 なお、Redmineサーバのホスト名は前回と同じく redmine-server とします。また、環境変数 API_KEY にRedmine API Keyを保持しているものとします。


チケット作成のサンプル

 チケットの参照には GET メソッドを使用しました。では、チケットの作成はどうするのでしょうか?

 Redmine REST APIでは、POST メソッドを使ってチケットを作成します。チケットに起票する内容、つまりリクエストパラメータを渡すには、curl では、コマンドラインオプションにひたすら書く、もしくは、あらかじめ用意したファイルを指定するという方法があります。

 ここでは、ファイルに記載しておいたリクエストパラメータをPOST する方法を採用します。

 以下のように POST する内容をcurl_post.jsonというファイルに保存しておきます。チケットの所属プロジェクト(project_id)は「biz」(ビジネス)とします。

{
  "issue": {
    "project_id": "biz",
    "subject": "Example",
    "priority_id": 1
  }
}

 登録する内容の準備ができたので、次のコマンドを実行します。--data オプションに @ を付けたファイル名を渡しています。

$ curl -v -H "Content-Type: application/json" -X POST \
-H "X-Redmine-API-Key: $API_KEY" --data "@curl_post.json" \
http://redmine-server/issues.json

 成功すれば、次のような出力が得られると思います。

* About to connect() to redmine-server port 80 (#0)
*   Trying redmine-server...
* Adding handle: conn: 0x21b3278
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x21b3278) send_pipe: 1, recv_pipe: 0
* Connected to redmine-server (xxx.xxx.xxx.xxx) port 80 (#0)
> POST /issues.json HTTP/1.1
> User-Agent: curl/7.30.0
> Host: redmine-server
> Accept: */*
> Content-Type: application/json
> X-Redmine-API-Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
> Content-Length: 82
>
* upload completely sent off: 82 out of 82 bytes
< HTTP/1.1 201 Created
< Date: Mon, 05 Jan 2015 02:11:42 GMT
* Server Apache is not blacklisted
< Server: Apache
< X-UA-Compatible: IE=Edge,chrome=1
< Cache-Control: max-age=0, private, must-revalidate
< X-Request-Id: fad9bfd65163e92d1752e59ce93b8598
< X-Runtime: 0.087294
< X-Rack-Cache: invalidate, pass
< X-Powered-By: Phusion Passenger 4.0.50
< X-Frame-Options: SAMEORIGIN
< Location: http://redmine-server/issues/6
< ETag: "0fe565dd60cfad07f33204593a1cc441"
< Status: 201 Created
< Transfer-Encoding: chunked
< Content-Type: application/json; charset=utf-8
<
{"issue":{"id":6,"project":{"id":1,"name":"\u30d3\u30b8\u30cd\u30b9"},"tracker":{"id":1,"name":"Bug"},"status":{"id":1,"name":"New"},"priority":{"id":1,"name":"Low"},"author":{"id":6,"name":"Takaaki NAKAJIMA"},"subject":"Example","start_date":"2015-01-05","done_ratio":0,"spent_hours":0.0,"created_on":"2015-01-05T02:11:42Z","updated_on":"2015-01-05T02:11:42Z"}}
* Connection #0 to host redmine-server left intact

 レスポンスのStatusが 201 Created で返ってきており、末尾に、作成されたチケットがJSON形式で表現されています。このままだと読みにくいので、整形してみると、このチケットにはID 6番が割り当てられたことが分かります。

{
    "issue": {
        "author": {
            "id": 6,
            "name": "Takaaki NAKAJIMA"
        },
        "created_on": "2015-01-05T02:11:42Z",
        "done_ratio": 0,
        "id": 6,
        "priority": {
            "id": 1,
            "name": "Low"
        },
        "project": {
            "id": 1,
            "name": "\u30d3\u30b8\u30cd\u30b9"
        },
        "spent_hours": 0.0,
        "start_date": "2015-01-05",
        "status": {
            "id": 1,
            "name": "New"
        },
        "subject": "Example",
        "tracker": {
            "id": 1,
            "name": "Bug"
        },
        "updated_on": "2015-01-05T02:11:42Z"
    }
}

 POST したのは project_idsubject(チケットのタイトル)、priority_id(優先度)だけでしたが、トラッカーおよびステータスは省略したのでデフォルトとして 1 が入っています。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

バックナンバー

連載:タスクが10倍気持ちよくなる 開発環境のリノベーション講座
All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5