LoginSignup
1
2

More than 3 years have passed since last update.

Elasticsearchでソースコードを検索 Code App

Last updated at Posted at 2019-05-20

はじめに

最近追加されたKibanaのCode Appでは、GithubやGitlabなどのリポジトリを読み込んで、Language Serverを使ってソースコードを解析、コードや変更履歴、解析結果もインデックスに溜め込んでくれます。
これ使うと、簡易コードビューワーになります。
#簡易っていうわりに、重いんですけどね・・・

今のところ、対応しているLanguage ServerはJavascript(typescript)とJavaのみっぽいです。Language Serverの管理画面にはGoも出てくるんですが、読み込むプラグインが表示されないので、多分使えないんでしょう。

準備

特にありません。
が、プロキシを挟まない環境が必要です(最近のKibana Appはプロキシに対応してないやつが、ちょいちょいありますよね。Mapsもそうだし・・・)。

Code Appの起動

起動すると、以下のような画面が表示されます。
まだ、リポジトリを読み込ませて無いので、なんもありません。

Screenshot_2019-05-20 Kibana.png

リポジトリの読み込み

試しに、nodegitを読み込ませてみます。

Screenshot_2019-05-20 Kibana(1).png

しばらくすると、リポジトリのクローンとインデクシングが終わり、以下のような表示となります。

Screenshot_2019-05-20 Kibana(3).png

リポジトリの表示

では、リポジトリを表示して見ます。

Screenshot_2019-05-20 Kibana(4).png

左側にはディレクトリ構造と、コードを表示してる場合はそのコード内の構造が以下のように表示されます。

Screenshot_2019-05-20 Kibana(9).png

コードの一部にカーソルを持っていくと、その部分の詳細が表示されたりします。

Screenshot_2019-05-20 Kibana(6).png

リポジトリの検索

検索してみます。上部の検索ボックスにキーワードを入れると、リポジトリ内でひっかかったものが出てきます。

Screenshot_2019-05-20 Kibana(7).png

適当に選ぶと、ちゃんと当該箇所にジャンプしてくれます。

Screenshot_2019-05-20 Kibana(8).png

その他

他には、コードの修正がいつ行われたのかや、ヒストリなども見ることができます。

Screenshot_2019-05-20 Kibana(10).png

Screenshot_2019-05-20 Kibana(11).png

問題点

色々あります。

プロキシに対応していない

内部で使っているnodegitに適切なオプションを指定すれば解決しますが、オプションで指定できると良いですね。
てか、これ対応してくれないと、企業では使えない・・・

ローカルリポジトリに対応していない

これは、色々な要因があります。
https://host:port/path/to/repo.git
とある場合、内部で使っている is-sshのせいで、プロトコルがsshであると見なされてしまいます。

さらに、解析結果を格納するインデックス名として「host:port」の部分を使おうとしますが、インデックス名には「:」が使えないのでエラーになります。

さらにさらに、「host」部分がIPアドレスの場合、オプションであるhostWhiteListのチェック方法に問題があってうまくいきません。
例えばIPアドレス部分が「10.0.1.10」だったとすると、ホスト名を「0.1.10」(第一オクテットを除いた部分)として取り出してしまい、hostWhiteListに「10.0.1.10」と入れているとマッチしません。
hostWhiteListに「0.1.10」を指定するのもどうかと思うので・・・

dockerイメージを使うと落ちる

Javascript Language Serverを使った場合だけです。
いつの間にか、Kibanaのコンテナが落ちています。ログを見ると・・・

{"type":"log","@timestamp":"2019-05-21T14:40:34+00:00","tags":["code","ts@127.0.0.1:41273","info"],"pid":1,"message":"Launch Typescript Language Server at port 41273, pid:undefined"}
events.js:174
      throw er; // Unhandled 'error' event
      ^

Error: spawn node ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
    at onErrorNT (internal/child_process.js:415:16)
    at process._tickCallback (internal/process/next_tick.js:63:19)
Emitted 'error' event at:
    at Process.ChildProcess._handle.onexit (internal/child_process.js:246:12)
    at onErrorNT (internal/child_process.js:415:16)
    at process._tickCallback (internal/process/next_tick.js:63:19)

なんだかわかんないけど、Language Serverを起動しようとして落ちています。
コードを見ると、

       const spawnTs = () => { 
         const p = spawn( 
           'node', 
           ['--max_old_space_size=4096', installationPath, '-p', port.toString(), '-c', '1'], 
           { 
             detached: false, 
             stdio: 'pipe', 
             cwd: resolve(installationPath, '../..'), 
           } 
         ); 

んー・・・ node起動しようとしてるけど、パスが通ってない?

diff --git a/x-pack/plugins/code/server/lsp/ts_launcher.ts b/x-pack/plugins/code/server/lsp/ts_launcher.ts
index e8195ce..605621e 100644
--- a/x-pack/plugins/code/server/lsp/ts_launcher.ts
+++ b/x-pack/plugins/code/server/lsp/ts_launcher.ts
@@ -50,7 +50,7 @@ export class TypescriptServerLauncher implements ILanguageServerLauncher {
      } else {
        const spawnTs = () => {
          const p = spawn(
-          'node',
+          resolve('node/bin/node', './'),
            ['--max_old_space_size=4096', installationPath, '-p', port.toString(), '-c', '1'],
            {
              detached: false,

な感じにパッチ当ててdockerイメージ作り直したら動いた!

おわりに

まぁ、まだまだベータなので良いですが、せめてプロキシぐらいは対応してほしい・・・

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2