前回までのところで、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の真髄を全然把握してないし、使いこなせてない感がパないので、もうちょっと勉強して色々な事に使ってみたいところぞね。