アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

ローカル環境でもAPMが見たい!

こんにちは!!こんにちは!! moriyamaです。

みなさん、APMってご存知でしょうか?
Application Performance Managementの略で、直訳すると「アプリケーション性能管理」ですね。
広く知られているサービスとして、Amazon CloudWatchNew 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」をクリックして遷移します。
    f:id:setsuna82001:20210112164832p:plain

  • Kibanaの細かい操作は省きますが、下記のようにリクエストに伴う処理の詳細が確認できます。
    f:id:setsuna82001:20210112164821p:plain

  • SQLの項目をクリックすると、実際に発行されたSQLの中身を確認できます。 f:id:setsuna82001:20210112164827p:plain

やったね!


最後に

Elasticsearchにかなりメモリを食われるのでローカルで構築せずに
ステージングとか試験的環境下でやった方がいいと思います。