弱いエンジニアの備忘録

自分的に気になった技術に関するメモや備忘録です。Elasticsearchに関する記事が多くなりそうです。

vimからelasticsearchのAPIを叩く方法メモ

大変長らく放置してしまいましたが、久しぶりに更新。

はじめに

vimで作業をしている時に、
ElasticsearchのAPIを叩きたくなることが良くありますよね。(ないか)

私の場合、「logstashでelasticsearchにデータを投入している傍ら、設定を編集する」といったことがよくあります。もちろんElasticsearchのAPIはKibanaのDevToolsや、curlコマンドなどでも簡単に実行できます。
とはいえ、できることならvimで作業をしながらシームレスに呼び出したい。
作りかけですが、一旦書き残しておきます。

vim scriptをまともに書く機会がないので、お作法とかが全く分からない。 勉強がてらとりあえず書いてみたという感じなので悪しからず。

こんな感じにしたい↓

f:id:shin0higuchi:20200603013443p:plain:w600

目次

1. 前提条件
2. 関数の作成
3. keymap
4. まとめ

1. 前提条件

依存関係
  • jqが利用できること。下記のリンクからインストールが可能。環境変数PATHに追加するのを忘れないように。

stedolan.github.io

  • webapi-vimをインストールしてあること

mattnさんのwebapi-vimがあれば、vimから簡単にWEB APIを叩くことが可能です。
github.com

ディレクトリ構成

構成は下記の通りです。vim-esutilごと、~/.vimrc/plugin/の配下に置いています。

vim-esutil/
├── autoload
│   └── esutil
│       ├── api.vim
│       └── util.vim
└── plugin
    └── esutil.vim

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を短縮名にしたつもり。

4. まとめ

  • 探りながら書いたので、下記の事項は改善策を教えてくれる方がいると喜びます。

- 可変長引数の扱い
- 環境変数の扱い
- レスポンスを別タブに書き込むスマートな方法
- quick fix listの使い方

  • 他のAPIも呼び出せるようにしたいところ

以上です。お読みいただきありがとうございました。