AmazonES、オンプレKibanaでRedmineのパフォーマンス監視を行う

production.log監視の次はリアルタイムのパフォーマンス監視を求めてAmazonES＋オンプレElasticAPM/kibanaで可視化してみました。


# 構成

* Amazon Elasticsearch Service 6.4
 * 構築済み
* Kibanaサーバ（オンプレ：CentOS7）
 * kibana-oss-6.3.0
 * APM Server
* Redmineサーバ（オンプレ：CentOS7）
 * APM Ruby Agent

# 前提
* Redmineのディレクトリを %REDMINE_DIR% と記述します
* Redmineの実行ユーザを %REDMINE_USER% と記述します
* Amazon ESのアクセスポリシーは以下
 * 「特定のIPからのドメインへのアクセスを許可」として会社のゲートウェイIPを指定


# Kibanaサーバ
## 1.リポジトリ定義

以下を新規作成

```file:/etc/yum.repos.d/elastic.repo
[elastic-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
```

## 2.kibana-ossの導入
```shell:
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
yum install kibana-oss
```

AmazonESに接続できるのはOSS版のみです。

## 3.kibanaの設定

以下を修正

```file:/etc/kibana/kibana.yml
server.host: "0.0.0.0"
elasticsearch.url: "http://search-XXXXXXXXXXXX.ap-northeast-1.es.amazonaws.com:80/"
kibana.index: ".kibana-6"
```

https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/es-kibana.html#es-kibana-local

を参考に

* `elasticsearch.url`は、http＆ポート80で設定
* `kibana.index`はAmazonESのkibanaが`.kibana`で使用しているため別名で定義

としています。

## 4.kibanaの起動

```shell:
firewall-cmd --permanent --add-port=5601/tcp
firewall-cmd --reload
systemctl enable kibana
systemctl start kibana
```

## 5.APM Serverの導入

```shell:
yum install apm-server
```

## 6.APM Serverの設定

以下を修正

* APM ServerのListenポート
 * `host` を修正

```file:/etc/apm-server/apm-server.yml
apm-server:
  # Defines the host and port the server is listening on.  use "unix:/path/to.sock" to listen on a unix domain socket.
  host: "0.0.0.0:8200"
```

* 送信先Elasticsearchのエンドポイント
 * `hosts`を修正
 * `protocol` をコメントイン

```file:/etc/apm-server/apm-server.yml
output.elasticsearch:
  # Array of hosts to connect to.
  # Scheme and port can be left out and will be set to the default (http and 9200)
  # In case you specify and additional path, the scheme is required: http://localhost:9200/path
  # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200
  hosts: ["search-XXXXXXXXXXXX.ap-northeast-1.es.amazonaws.com:443"]

  # Boolean flag to enable or disable the output module.
  #enabled: true

  # Set gzip compression level.
  #compression_level: 0

  # Optional protocol and basic auth credentials.
  protocol: "https"
```

```shell:
apm-server setup
```

うまくいくと以下のように表示されます。

```
Loaded index template
Loading dashboards (Kibana must be running and reachable)
Loaded dashboards
```

この段階でkibanaにAPMのDashboardが５つできあがっていました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/63464/2d336b02-d094-191f-a3a2-e0451595c4dc.png)





## 7.APM Serverの起動

```shell:
firewall-cmd --permanent --add-port=8200/tcp
firewall-cmd --reload
systemctl enable apm-server
systemctl start apm-server
```

# Redmineサーバ
## 1.APM Ruby Agentの導入

```
sudo su - %REDMINE_USER% -s /bin/bash
cd %REDMINE_DIR%
echo 'gem "elastic-apm"' >> Gemfile.local
bundle install
```

## 2.APM Ruby Agentの設定

以下を新規作成

```file:%REDMINE_DIR%/config/elastic_apm.yml
server_url: 'http://XXX.XXX.XXX.XXX:8200'
secret_token: <%= ENV["VERY_SECRET_TOKEN"] %>
```

`server_url`にはKibanaサーバのホスト名／IPを設定します。

以下を追加

```file:%REDMINE_DIR%/config/application.rb
config.elastic_apm.service_name = 'Redmine'
```

その他の`config.XXX`と同じネストになるように追加します。

この後、Redmine自体を再起動すると、Redmineサーバ→Kibanaサーバ(APM Server)→AmazonESとデータが飛び始めます。

# ダッシュボードで確認

##  [APM] Services
![image.png](https://qiita-image-store.s3.amazonaws.com/0/63464/0cda4aa6-c503-d030-3835-56ddb9b777e3.png)
まずは全体俯瞰

## [APM] Transactions
![image.png](https://qiita-image-store.s3.amazonaws.com/0/63464/e8ebd3cc-6411-7812-0327-f69e24e497f9.png)
１リクエスト単位での平均時間などでしょうか。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/63464/4c486fd6-f1b1-4ec5-6993-ea7e1a604b7f.png)
ViewSpansをクリックするとSpan Detailsに飛びました。

## [APM] Span Details
![image.png](https://qiita-image-store.s3.amazonaws.com/0/63464/9fdea267-1b59-03af-1a92-0411ede71c77.png)
アクションやクエリ単位での実行時間のようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/63464/08564ef5-9c8a-9a28-5617-1bc470af5cf5.png)
実際のクエリも確認できました。

`[APM] Errors`,`[APM] Error Details`はデータが無かったので割愛。

分散トレーシングにも興味があったので、しばらく使い込んでみようと思います。