Redmineのチケット量をグラフ化した話(Part2)
前回、ElasticsearchとKibanaを導入できたつもりだ。まずは可視化うんぬんの前に、どうやってElasticsearchにデータをぶち込むかってのが今回のテーマ。まだRedmineのレの字も出てこないが、まあなんとかなるでしょ。
Elasticsearchの構造
ネット上で色々調べてみたが、ここの記事が一番分かりやすかったかも。つまるところ、大枠となる要素は「index」「type」「document」で、typeがdocumentの入れ物、documentが1件1件の実データにあたるものだろう。で、documentの構成要素…RDBMSでいうところの列的なモノが「field」にあたるようだ。ってこたぁたぶん、実データをぶちこむ前に、このfieldの型を決めてやる必要があるんだろうなぁ・・・
と思ってたのだが、documentにテキトーなデータをぶちこんでも、Elasticさんはそれとなく理解してテキトーな型を付けてくれるらしい。えーまじでー?
でもまあ、なんとなく不安なので、fieldの型は予め定義しといてあげたい。そんな時に使えるのが「マッピング」という概念らしい、というところまで分かった。しかしその前に、実際どんな手段を使ってElasticさんとやりとりすればいいのさ?
CURLを導入する
色々ググり回った結果、Elasticsearchとの対話はCURL使うと良さげとのこと。CURLは、コマンドラインを使って色々なプロトコルで通信できる凄いやつらしい。で、Elasticsearchは、GETとかPOSTとかのHTTPプロトコルでやり取りできる模様。よっしゃよっしゃ、さっそく使ってみようジャマイカ。
CURLのダウンロードページに行って、Win64向け奴をダウンロード。そのあと「curl/src/curl.exe」をなんかテキトーな所に配置してコマンドプロンプトから起動。
curl 'http://localhost:9200/?pretty'
こんな感じで打ち込むと、前回ブラウザで動作確認したようなJSON形式の文字列がバーッと出て来た。どうやらうまく通信できてるっぽいぞ!
いざマッピング
色々と試行錯誤した結果、マッピング用のファイルを作って、それをCURLからHTTP PUTしてやれば良さげな事が分かった。
{
"mappings":{
"task" : {
"properties" : {
"tickets":{
"type" : "short"
},
"date" : {
"type" : "date",
"format": "yyyy-MM-dd"
}
}
}
}
}
こんな感じでマッピング用のjson形式ファイルを「mapping.json」とかテキトーな名前で保存しといてやる。なんとなくフィーリングで理解してるのだが、この”task”の部分が「type」にあたる部分なのだろう。
で、”properties”以下で、パラメータと型の指定を行う。今回は、未消化のタスク数を「tickets」、計測した年月日を「date」にぶちこみたい。”tickets”は6万件もあればオーバーフローすることはなさそうなので、short型にしといた。”date”は日付型なのだが、”format”の部分で「年4桁-月2桁-日2桁」みたいな感じで指定してやってる。
curl -XPUT "localhost:9200/tasks" -d @C:\Users\ore\Desktop\mapping.json
あとは、curlからputすれば、下記のようになんか成功した感のあるメッセージが表示される。
{"acknowledged":true,"shards_acknowledged":true,"index":"tasks"}
下記のような感じでGETすると、さっきマッピングした内容がちゃんと反映されているようだ。
curl -XGET "http://localhost:9200/tasks/?pretty"
そいで今更「このURLにくっついてるprettyってなんなの?なんでいきなりカワイイアピールしちゃってんの?」と思ったんだが、jsonを整形してくれるイカした何かみたいだ。試しに「?pretty」を外して実行すると、改行なしのjsonが出力された。
そういえば、さっきのindexやらtypeやらをURLで表すと、こんな感じになってるみたい。
http://localhost:6200/index/type/id
なので、今回は「tasks」というindexに対して「task」というtypeのfieldsについて型指定やりましたよー、って感じになってんだと思う・・・たぶん。URLケツの「id」は何かというと、documentを判別するための一意な文字列のようだ。typeにデータをぶちこむ時にidを指定することもできるし、idを指定しなければ自動生成する事もできるらしい。なんかよく分からんので、とにかく手を動かして試してみようじゃないの。
データをぶちこもう
Windowsのコマンドラインで試行錯誤した結果、下記のようにやれば「id=128」としてぶちこめる事が分かった。
curl -XPUT "localhost:9200/tasks/task/128?pretty" -d "{\"tickets\" : 256,\"date\" : \"2017-10-06\"}
あーだこーだとやってる間にエスケープシーケンスがよく分からない事になって、何度も何度もElasticさんから「わかんねえよ!」って怒られて困った。Windowsのコマンドプロンプトでこういう事やんのって、あんま一般的じゃねえのかなぁ。調べてもあんまり情報出てこないし・・・
idを指定せずにぶちこむには、単に「id」の部分を空にしてPUTすればいいじゃね?と思ったのだが「そんなハンドラねえよ!」と怒られたので、POSTしてやればいいっぽい。理屈はよく分からんが・・・
curl -XPOST "http://localhost:9200/tasks/task/?pretty" -d "{\"tickets\" : 256,\"date\" : \"2017-10-06\"}"
そうすると、レスポンスがこんな感じで帰ってくる。
{
"_index" : "tasks",
"_type" : "task",
"_id" : "AV9qhWHWL9gQWwCjRp6y",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : true
}
ご覧のとおり、メタクソなidを生成してデータを格納してるようだ。たぶんこのidを指定すればデータ引っ張れそうな気がするので、本当に入ってるかどうか確認してみやう。
curl -XGET "http://localhost:9200/tasks/task/AV9qhWHWL9gQWwCjRp6y?pretty"
すると、下記のような感じでレスポンスが返ってきた。
{
"_index" : "tasks",
"_type" : "task",
"_id" : "AV9qhWHWL9gQWwCjRp6y",
"_version" : 1,
"found" : true,
"_source" : {
"tickets" : 256,
"date" : "2017-10-06"
}
}
ふぁー!なんかデータ入っとるゥ!まあ、たぶん今回の目的だと、次々にデータぶちこむにあたってid指定なんぞは不要だと思うので、ぶちこむ度にidを自動生成してもらったほうがよさそう。
とりあえず今回はここまで。次回は、Elasticsearchにぶちこんだデータを、Kibanaで可視化できるか試してみよう。
この記事が気に入ったらサポートをしてみませんか?