Redmineのチケット量をグラフ化したい(第四回)

前回までのところで、Elasticsearchにデータぶちこんで、Kibanaで表示できる所まで行けた。今回は、Redmineから終わってないチケットを取ってきて、それをElasticsearchにぶちこむ、という流れをスクリプトで作ってみたい。手段はなんでもいいとは思うのだが、俺が大好きなPython3でやってみようと思う。

Redmineのチケット数を取得

まず、WEBブラウザでRedmineに対して http://localhost:3000/issues.json ってな感じで愚直にアクセス。

{"issues": (中略) "total_count":50,"offset":0,"limit":25}

そうすると、こんな感じでjson形式のレスポンスが返ってくる。この、total_count の部分が未消化チケットにあたるものだろう。なので、PythonからRedmineにHTTPアクセスして、レスポンスとして返ってきたjsonをパースしてやればなんとなくうまく行きそうだ。

# coding: UTF-8 

import urllib.request
import json

tickets_url = "http://localhost:3000/issues.json"
res = urllib.request.urlopen(tickets_url)	# HTTPアクセス
j = json.loads(res.read().decode("utf-8"))	# jsonパース
tickets = j["total_count"]			# total_countが未消化チケット数

# チケット数を表示してみる
print(tickets)

サクッと組んでみたところ、ちゃんと取得できた模様。楽勝やね。

Elasticsearchへの登録

subprocessで外部プロセスのcurl呼び出してPOST処理…というのも考えたのだが、それだとなんか力技感が否めない。きっと、偉い人達がpython3向けのライブラリ作ってくれてるんじゃね?と思って調べてみたら、案の定用意されている模様なので、pip なり easy_install なりでインストールしとく。

import datetime
from elasticsearch import Elasticsearch

host_name = "localhost"
host_port = 9200
es = Elasticsearch(host_name, port=host_port)

# 現在の日付を取得
now_date = datetime.datetime.now()
now_date_str = now_date.strftime("%Y-%m-%d")

# POST用のデータを作る
body = {
	"tickets" : tickets,
	"date" : now_date_str
}

# tasks/task にデータをぶっこむ
es.index(index="tasks", doc_type="task", body=body)

ここで死ぬほど試行錯誤するかと覚悟してたんだが、意外や意外、これでうまくデータが取り込めたようだ。さっきのスクリプトと組み合わせれば、チケット数と今日の日付をデータベースに登録する事ができた。こいつをJenkinsのジョブに登録して、週一ぐらいで呼び出すことでうまい具合にグラフが描画されるように。長い道のりだったが、ようやく俺の願いが叶ったぞ!

まあ、今回のアレだけだとなんかElasticsearchの真髄を全然把握してないし、使いこなせてない感がパないので、もうちょっと勉強して色々な事に使ってみたいところぞね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)