SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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

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

 今回は、システム監視ツール「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 が入っています。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
Pythonからのチケット操作

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
タスクが10倍気持ちよくなる 開発環境のリノベーション講座連載記事一覧
この記事の著者

中島 隆明(株式会社ワークスアプリケーションズ)(ナカジマ タカアキ)

株式会社ワークスアプリケーションズ所属。R&D部門であるATE Div.に在籍し、パッケージソフトウェアを支える、インフラやOS、ミドルウェアといったシステムエンジニアリング領域を主に担当。CompTIA Cloud Essentials認定取得。趣味はジャズをはじめとした音楽全般。 ・Web s...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8408 2015/01/22 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング