Skip to content
This repository has been archived by the owner on Sep 12, 2022. It is now read-only.

johtani/monitoring-ruby-app

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

48 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

monitoring-ruby-app

Monitoring Rails app with the Elastic Stack. Elastic Stackを利用して、Ruby on Railsのアプリで構成されるシステムを監視するデモの目的のために作成したリポジトリ。

説明用スライドはこちら

Features

アプリケーション、システムの監視の目的のために、Elastic Stackの以下のプロダクトを使用しています。

  • Heartbeat : 死活監視、外形監視を行うためのBeats。詳細はこちら
  • Metricbeat : 各種メトリック(サーバーのメトリック)を収集するためのBeats。詳細はこちら
  • Filebeat : ファイルのテイル、ログ収集のためのBeats.詳細はこちら
  • Packetbeat : ネットワークパケットからDNSのリクエストなどを収集するためのBeats。詳細はこちら
  • Elastic APM : Elasticsearch,Kibanaを使用したアプリケーションパフォーマンスモニタリングのツール。今回はRubyエージェントを使用。詳細はこちら
  • Elasticsearch : 上記BeatsおよびElastic APMが収集したデータを保存するサーバー。詳細はこちら
  • Kibana : 上記収集したデータを元に、監視のためのデータを可視化するためのサーバー。詳細はこちら

System Architecture

デモアプリとして、質問投稿アプリをRuby on Railsで構築しました。 以下のような2台のサーバー構成です。

シナリオイメージ

アプリケーションは以下の3つのソフトウェアで構成されます。

  • NGINX : Webサーバー。クライアントとHTTPS通信を行う。Ruby on Railsへのロードバランス。
  • Ruby on Rails : 質問投稿アプリ本体。簡単な投稿+投票機能を実装。その他に、APM説明用のControllerあり。
  • PostgreSQL : データ永続化層。投稿された質問と、投票データを保持。

NGINX+Ruby on Railsをフロントエンドサーバーに、PostgreSQLをバックエンドサーバーにデプロイします。 (ローカル環境では、NGINXはRailsとは別のVMとして切り出してあります)。

なお、Beats、APMのデータ保存先にはElastic Cloud Elasticsearch Serviceを使用しています。 Elastic Cloudを利用することで、APM Serverより先の部分をElastic Cloudにまかせてしまうことができ、簡単に導入ができるという利点があります。

Structure of repository

  • gcp : GCPにデプロイするためのTerraform、Ansibleのファイルおよびデプロイ用の設定ファイル
  • local : Docker on macOSで起動するためのdocker-compose.ymlおよび、各種設定ファイル
  • nginx : localの環境で利用するためのNGINXのDockerfileと設定。
  • ruby-app : Ruby on Railsのアプリ。

Setup

セッションで利用するデモ環境はGCP上に2つのGCEインスタンスを起動して、Beats、Elastic APM、アプリケーションをデプロイしています。

ローカルで動作させる方法としては、Dockerを利用できます。

GCP

必要なツール : gcloudterraformansible 必要なサービス : Elastic Cloud Elasticsearch Service 必要な情報 : ドメイン(デモサイトをユーザーにも公開するため)

  1. Elastic Cloudにvariables.ymlelastic_versionと同じバージョンのElasticsearchおよびKibanaを起動する。
  2. 次の環境変数を設定する。(gcp/setenv.sh.sampleにそれぞれ値を設定し、source ./setenv.shを実行する。)
    • ELASTICSEARCH_CLOUD_ID - Cloud ID を設定(詳細はドキュメントを参照
    • ELASTICSEARCH_CLOUD_AUTH - Cloud Auth を設定(詳細はドキュメントを参照
    • ELASTIC_APM_SERVER_URL - Elastic Cloud 上のElastic APM ServerのURL(詳細はこちら
    • ELASTIC_APM_SECRET_TOKEN - Elastic Cloud 上のElastic APM Serverの管理コンソール上にあるAPM Server secret tokenの文字列
    • ELASTICSEARCH_USER - インデックスへの書き込み権限Kibanaの設定権限があるElasticsearchのユーザー
    • ELASTICSEARCH_PASSWORD - インデックスへの書き込み権限Kibanaの設定権限があるElasticsearchのユーザーのパスワード
    • ELASTICSEARCH_HOST - Elastic Cloud上のElasticsearchへのアクセスURL
  3. 必要に応じてvalicables.tfの設定(ドメインやインスタンスタイプなど)を変更
  4. gcpディレクトリに移動
  5. TF_VAR_project_idを設定(GCPに関する設定)
  6. terraform init で初期化(GCPに関するプラグインを入れる前)。その後terraform planを実行して、設定ファイルの記述ミスなどがないかを確認。
  7. terraform applyを実行して、インスタンスやDNSの設定をGCP上に反映(ここまでがGCP上の環境の設定)。
  8. ansible-playbook configure_all.ymlで2台のインスタンスにBeatsなどのセットアップ(ここからはAnsibleでアプリなどのデプロイ)
  9. ansible-playbook configure_backend.ymlでDBサーバー、Heartbeatをセットアップ
  10. ansible-playbook configure_frontend.ymlでNGINX、Railsをセットアップ

環境が必要なくなったら、terraform destroyを実行すればGCPのインスタンスやDNSの設定などが削除されます。

※ TODO google_dns_managed_zoneの設定でゾーンを指定する方法が不明のため、手動で、Google Domainsのネームサーバーの設定をTerraformでApplyした時に割り当てられたゾーンに合わせる必要がある _

Local

TODO : まだ途中 GCP対応以前にローカルで動作確認のために利用してたましたが、

Start

  1. Run Docker
  2. Change directory into local
  3. docker-compose up -f docker-compose-elastic-cloud.yml if using Elastic Cloud
  4. docker-compose up if all system in local

Shutdown

References

About

Monitoring Rails app with the Elastic Stack

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published