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

第一回目では、ElasticsearchとKibanaについては導入できたつもりだ。まずは可視化うんぬんの前に、どうやってデータベースにデータをぶち込むかってのが今回のテーマ。まだRedmineのレの字も出てこないが、まあなんとかなるでしょ。

Elasticsearchの構造

ネット上で色々調べてみたが、ここの記事が一番分かりやすかったかも。つまるところ、大枠となる要素は「index」「type」「document」で、typeがdocumentの入れ物、documentが1件1件の実データにあたるものだろう。で、documentの構成要素…RDBMSでいうところの列的なモノが「field」にあたるようだ。ってこたぁたぶん、実データをぶちこむ前に、このfieldの型を決めてやる必要があるんだろうなぁ・・・

と思ってたのだが、ぶっちゃけdocumentにテキトーなデータをぶちこんでも、Elasticさんはそれとなく理解してテキトーな型を付けてくれるらしい。えーまじでー?これがMySQLとかだと激おこぷんぷん丸案件だぜオイ。

でもまあ、なんとなく不安なので、fieldの型は予め定義しといてあげたい。そんな時に使えるのが「マッピング」という概念らしい、というところまで分かった。

ちょっと待てよ。その前に、実際どんな手段を使ってElasticさんとやりとりすればいいのさ?

CURLを導入する

色々ググり回った結果、Elasticsearchとの対話はCURL使うと良さげとのこと。あー、なんか聞いたことあるなぁ程度の認識だったのだが、こいつがコマンドラインを使って色々なプロトコルで通信できる凄いやつらしい。で、Elasticsearchは、GETとかPOSTとかのHTTPプロトコルでやり取りできる模様。よっしゃよっしゃ、さっそく使ってみようジャマイカ。

CURLのダウンロードページに行って、「Win64 – Generic」から「Win64 x86_64 zip」あたりをダウンロードしとく。解凍したら、「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"

で、今更ながら「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で可視化できるか試してみよう。

コメントを残す

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

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