Elasticsearch 6.3.0 リリース記念 APM JavaAgentでintra-martの状態を見てみる

# 概要

Elasticsearch6.3.0がリリースされ、クラスメソッドさんなど多くのブログで新しい機能があらかた紹介されたところです。
今回は、X-Pack(Basic)に含まれるAPM（Application Performance Management）を試してみようと思います。

ただ、その紹介だけなら他のブログで触れられているので、n番煎じで面白味が少ないので、
誰もやってないだろう特殊性を出すために以下の２点を付け加えます。

- **α版**のJava Agentを使う
- 日本国内では、あんまりメジャーでない（と思う) resinをAPサーバとして使う

resinは、intra-martでよく見かけるやつですね。それ以外で見たことはまだありません。
今回はintra-martに仕込んだ例を示します。
NewRelicやDatadogでやればよろしい、というのはもっともなご意見ですが、Elastic Stackの勉強がてらにやっておりますので、そこはご容赦ください。

resinがメジャーでないとした理由は、「[Elastic APM Java survey](https://docs.google.com/forms/d/e/1FAIpQLScd0RYiwZGrEuxykYkv9z8Hl3exx_LKCtjsqEo1OWx8BkLrOQ/viewform)」にresinの選択肢がなかったためです。

# 環境

|product| version |
|----|----|
| Elasticsearch | 6.3.0 (Windows版) |
| kibana | 6.3.0 (Windows版) |
| Elastic APM | 6.3.0 (Windows版） |
| resin | 4.0.56 |

# Elastic APMとは

簡単におさらいですが、何ができるの？というのは、公式サイトの記述やクラスメソッドさんのブログを参考にすると、イメージが掴めると思います。まずは公式を見るのが一番ですな。

- [オープンソースのアプリケーションパフォーマンスモニタリング（APM）](https://www.elastic.co/jp/solutions/apm) 
- [OSS の APM！Elastic APM を使い倒す](https://dev.classmethod.jp/server-side/elasticsearch/elastic-apm-detailed/)

APMサーバとAgentを用意すればいいんだな？となりますね。
APMサーバは、今回Windows版を使用します。

# JavaAgentを用意しよう

kibanaにログイン後、APMのメニューを最初に開くと、Setup手順を紹介した画面が表示されます。
ここのAPM Agentsを見ていただくと、Node.js、Djanco・・・JSとタブがありますが、Javaは**まだ**ありません。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/111676/e218db25-d13f-81bc-b557-3b917db51be9.png)

しかし、公式にマニュアルはあるので、ここを参考にしてAgentを取得します。
https://www.elastic.co/guide/en/apm/agent/java/current/index.html

![3.png](https://qiita-image-store.s3.amazonaws.com/0/111676/7ec8e036-91de-4e44-4d63-7917406ba1bb.png)

これを書いている時点では「elastic-apm-agent-0.5.1.jar」が取得できました。
http://repo1.maven.org/maven2/co/elastic/apm/elastic-apm-agent/0.5.1/



# いざ実践！

## resinのJVM引数を変更する

公式のConfigurationの記述を確認します。
https://www.elastic.co/guide/en/apm/agent/java/current/configuration.html

> In order to get started with Elastic APM, the most important configuration options are service_name (required), server_url and application_packages.

そして例として、このように書かれています。

```ini
-Delastic.apm.service_name=my-cool-service
-Delastic.apm.application_packages=org.example
-Delastic.apm.server_url=http://localhost:8300
```

これをresinのJVM引数に設定しましょう。

resinのインストール場所/conf/resin.propertiesを開いて、javaagentの設定と、上のapmの設定の記述を追加します。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/111676/8a324d3a-766f-7104-3937-b2cf151d71d7.png)

Windows版のAPMサーバを立ち上げて待ち受けポートを見たところ、8200番だったため、今回はserver_urlを8200として指定しました。

この記述が終ったらファイルを保存し、resinを起動しなおします。

## アプリケーションにアクセスする

いつものようにアプリケーションにアクセスし、いろんなGETやPOSTリクエストを送ります。

## APM UIの確認

kibanaのAPMメニューを押すと、さきほど-Delastic.apm.service_nameで指定したものが現れました。
Agent列を確認すると、「java」とあり、JavaAgnetで送られたもの、と識別できます。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/111676/59167780-ceed-3523-df94-86c3e228f024.png)

Nameのところがリンクとなっているので、クリックすると、次の画面に遷移します。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/111676/2a99bacf-32b5-ff8f-56dd-be882e36b48b.png)

POSTのリクエストに注目することにして、POSTの文字列のリンクをクリックします。
Response time distributionに注目すると、濃い青色になっている（2,000ms付近の）ものが現在選択されているもので、
Transaction sampleに詳細が表示されています。

6秒を越えているリクエストが１つあるのが気になりますね。
ここを選択してみます。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/111676/88625e5b-ade1-f4a9-e713-3d5f2d63d46d.png)

Timeline（not Timelion)を見ると、処理が開始されてから終了するまで、どんな処理をやっていたのか、を時系列で可視化してくれます。
いっぱいSELECT文を投げていることが分かります。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/111676/e1fefb23-01f4-82c6-dec0-7a7e0fcd2eb4.png)

INSERTの処理に時間がかかってるな！ということが見えたり。
![9.png](https://qiita-image-store.s3.amazonaws.com/0/111676/bc23a249-9b44-de5d-b32e-3a84c7053c05.png)

その部分をクリックすると、どんなINSERT文だったのか、全体に占める処理時間の割合などを教えてくれます。

![10.png](https://qiita-image-store.s3.amazonaws.com/0/111676/9b9f6f78-f0ea-afeb-7475-2d151f34eca9.png)

ずーっと下にスクロールしていくと、3秒ぐらい空白期間があることが分かりました。
![11.png](https://qiita-image-store.s3.amazonaws.com/0/111676/54a551e5-b7f5-fb54-9396-a26c1f6be510.png)

帳票サーバでPDFをしこたま作っている時間、というのがこの空白期間にあたるのですが、
可視化した結果、6秒ぐらいの処理のうち、半分ぐらいの時間が帳票の出力にあてられていた、と考えることができました。


# まとめに代えての雑感

もう処理数が多すぎて、遅いって言われてもどこが遅いのかワケワカメ！　汚いソースを追うのは嫌だ！
という方にとって、遅いSQLがあるのか、サーバのどこかの処理で遅いのか、外部のサービス呼び出しで遅いのかなどなど、
目星をつけるのに良いツールだと思います。

既にElastic製品をお使いの方であれば、あとはJavaAgentを仕込むだけで簡単に始められるという点も良いですね。