vimからelasticsearchのAPIを叩く方法メモ
大変長らく放置してしまいましたが、久しぶりに更新。
はじめに
vimで作業をしている時に、
ElasticsearchのAPIを叩きたくなることが良くありますよね。(ないか)
私の場合、「logstashでelasticsearchにデータを投入している傍ら、設定を編集する」といったことがよくあります。もちろんElasticsearchのAPIはKibanaのDevToolsや、curlコマンドなどでも簡単に実行できます。
とはいえ、できることならvimで作業をしながらシームレスに呼び出したい。
作りかけですが、一旦書き残しておきます。
※vim scriptをまともに書く機会がないので、お作法とかが全く分からない。 勉強がてらとりあえず書いてみたという感じなので悪しからず。
こんな感じにしたい↓
目次
1. 前提条件
2. 関数の作成
3. keymap
4. まとめ
1. 前提条件
2. 関数の作成
今回は主に vim-esutil/autoload/esutil/配下の、api.vimとutil.vimにフォーカスします。vim-esutil/plugin配下はキーマップしか書いていないので割愛します。
1. webapi実行部分(ユーティリティー)
ElasticsearchのAPIはplain textで結果が得られる _cat/* 系のものと、jsonで結果が得られるものの2種類に大別できます。
それぞれレスポンスの描画形式を変えたいので、API実行のユーティリティーを2つ用意しています。
※util.vimを一部抜粋
"結果がplain textのもの向け。レスポンスをquick fix windowで開く。 function! esutil#util#get(host, path, params) "ホストやパスを受けとってwebapi-vimの関数を呼ぶだけ let l:res = webapi#http#get(a:host. a:path. a:params) "quick fix windowに追記する for res in split(l:res.content, '\n') caddexpr res endfor copen endfunction "結果がjsonのもの向け。レスポンスをjqで成形し、新規タブで開く。 function! esutil#util#getjson(host, path, params) let l:res = webapi#http#get(a:host. a:path. a:params) tabnew call append(0, l:res.content) :%!jq . endfunction
2. API呼び出し
上記のutil.vimを呼び出すだけです。
それぞれの関数は可変長の引数を受け取って、l:hostなどを決定します。
# ここは、どう考えてももっと良いやり方があるはず。vim scriptわからぬ。
" _cat/nodesの結果を表示する function! esutil#api#catNodes(...) "quick fix listを空にする call setqflist([]) " 環境変数で定義されていればl:hostに設定、引数で指定されればそれを優先 if $ESUTIL_ESHOST != '' let l:host = get(a:, 1, $ESUTIL_ESHOST) " 環境変数・引数のいずれも定義されていなければ、localhost:9200に設定 else let l:host = get(a:, 1, 'localhost:9200') endif call esutil#util#get(l:host, '/_cat/nodes/', '?v') endfunction " _cat/indicesの結果を表示する function! esutil#api#catIndices(...) call setqflist([]) if $ESUTIL_ESHOST != '' let l:host = get(a:, 1, $ESUTIL_ESHOST) else let l:host = get(a:, 1, 'localhost:9200') endif let l:pattern = get(a:, 2, '*') call esutil#util#get(l:host, '/_cat/indices/'. l:pattern, '?v&s=index') endfunction function! esutil#api#search(...) "TODO: implement esutil#api#search() endfunction function! esutil#api#putIndex(...) "TODO: implement esutil#api#putIndex() endfunction
このファイルを保存すれば、vimから呼び出せるようになります。
:call esutil#api#catIndices()
3. keymap
ここまでで、やりたいこと自体は実現できるようになりました。
しかし、毎回 :call esutil#... と入力するのは骨が折れます。
私は.vimrcに下記の設定を入れています。
" Custom Key Mapping let mapleader = "\<Space>" noremap <Leader>escati :call esutil#api#catIndices()<CR> noremap <Leader>escatn :call esutil#api#catNodes()<CR>
この設定により、vimの実行中に" escati"と入力すれば、indexの一覧がquick fix windowで表示されます。めでたしめでたし。
※" escati"はesutilの_cat/indicesを短縮名にしたつもり。