Edited at

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.リポジトリ定義

以下を新規作成


/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の導入

rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

yum install kibana-oss

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


3.kibanaの設定

以下を修正


/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の起動

firewall-cmd --permanent --add-port=5601/tcp

firewall-cmd --reload
systemctl enable kibana
systemctl start kibana


5.APM Serverの導入

yum install apm-server


6.APM Serverの設定

以下を修正


  • APM ServerのListenポート



    • host を修正




/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 をコメントイン




/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"


apm-server setup

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

Loaded index template

Loading dashboards (Kibana must be running and reachable)
Loaded dashboards

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


7.APM Serverの起動

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の設定

以下を新規作成


%REDMINE_DIR%/config/elastic_apm.yml

server_url: 'http://XXX.XXX.XXX.XXX:8200'

secret_token: <%= ENV["VERY_SECRET_TOKEN"] %>

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

以下を追加


%REDMINE_DIR%/config/application.rb

config.elastic_apm.service_name = 'Redmine'


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

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


ダッシュボードで確認


[APM] Services



まずは全体俯瞰


[APM] Transactions



1リクエスト単位での平均時間などでしょうか。



ViewSpansをクリックするとSpan Detailsに飛びました。


[APM] Span Details



アクションやクエリ単位での実行時間のようです。



実際のクエリも確認できました。

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

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