こんにちは!!こんにちは!! moriyamaです。
みなさん、APMってご存知でしょうか?
Application Performance Managementの略で、直訳すると「アプリケーション性能管理」ですね。
広く知られているサービスとして、Amazon CloudWatchやNew Relicなどが挙げられます。
こういったサービスを使って、各リソースの使用状況や監視を行うわけですね。
ローカルで動かしたい!
上記のような各リソース監視は、本番運用しているサービスを対象にして、導入する場合がほとんどだと思います。
リリース前後でレスポンス悪化を検知したり、アプリケーションを構成する要素のパフォーマンス調査したりしますね。
そこでふと思ったのです。
「ローカルでもAPMが見たい!」と。
もっと言えば、
「リクエストに対するどの処理が遅い/重いのかを特定して、リファクタリングしたい!」
と考えていました。
本番運用中のサービスで、
- 『改善すべき箇所を特定したが、具体的にどう修正するかの目処が立っていない』
- 『リファクタリングしたが、高負荷な処理になっていないか確認したい』
といった場合に改修前後で比較できると色々楽だと思ったため、
Elastic APMで構築してみました。
Railsへ組み込み
今回は下記構成で実装しています。
. ├ app/ ├ elastic/ | └ apm-server.yml ├ docker-compose.yml └ Gemfile
■Gemfile
Elastic APMのgemを導入します。
gem 'elastic-apm'
■ docker-compose.yml
実装当時はElastic系を7.7.1で実装しました。
elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.7.1 environment: # シングルノード設定 - discovery.type=single-node - bootstrap.memory_lock=true - cluster.name=docker-cluster - cluster.routing.allocation.disk.threshold_enabled=false - ES_JAVA_OPTS=-Xms1g -Xmx1g volumes: - es_data:/usr/share/elasticsearch ports: - 9200:9200 ulimits: memlock: soft: -1 hard: -1 apm: image: docker.elastic.co/apm/apm-server:7.7.1 volumes: # APM用の設定ファイル - ./elastic/apm-server.yml:/usr/share/apm-server/apm-server.yml depends_on: - elasticsearch - kibana ports: - 8200:8200 kibana: image: docker.elastic.co/kibana/kibana:7.7.1 depends_on: - elasticsearch environment: ELASTICSEARCH_URL: http://elasticsearch:9200 ELASTICSEARCH_HOSTS: http://elasticsearch:9200 ports: - 5601:5601 # railsアプリケーションに設定追加 rails: # APM接続用URIを環境変数で設定 environment: ELASTIC_APM_SERVER_URL: http://apm:8200 # APMコンテナへの接続設定 depends_on: - apm
■ elastic/apm-server.yml
apm-server: host: "0.0.0.0:8200" kibana: enabled: true host: kibana:5601 rum: enabled: true output: elasticsearch: hosts: ["elasticsearch:9200"] setup: kibana: host: kibana:5601 template: settings: index: number_of_replicas: 0
確認方法
起動したローカルのKibana(
http://localhost:5601/
)にブラウザからアクセスして、赤枠の方の「APM」をクリックして遷移します。
Kibanaの細かい操作は省きますが、下記のようにリクエストに伴う処理の詳細が確認できます。
SQLの項目をクリックすると、実際に発行されたSQLの中身を確認できます。
やったね!
最後に
Elasticsearchにかなりメモリを食われるのでローカルで構築せずに
ステージングとか試験的環境下でやった方がいいと思います。