Herokuでのご利用は公式サポートの対象外です。
Herokuはウェブアプリケーションを動かすためのPaaSです。 ここでは、Mackerelを利用してHeroku上のアプリケーションを監視する方法を紹介します。
ただし、公式サポート対象とはなっておりませんので、使用上のご質問等にお答えできかねます。なお、対応環境についてはこちらをご確認ください。
Dynoを監視する
Herokuは自動でホスト(Dyno)が増減しますので、Auto Scaling環境で使うの設定をHerokuに合わせて利用します。
Herokuでアプリケーションを起動するための Procfile
では、シェルスクリプト start.sh
を起動するようにし、start.sh
の中で各種設定を行います。
start.sh
の <API-KEY>
, <SERVICE>
, <ROLE>
は適切に書き換えてください。
<RUN-APP>
はアプリケーションの起動コマンド(例えば、node.jsであれば node index.js
など)に書き換えてください。
- Procfile
web: ./start.sh
- start.sh
#!/bin/sh set -x # install mackerel-agent mackerel_agent=/app/mackerel-agent/mackerel-agent mackerel_agent_conf=/app/mackerel-agent/mackerel-agent.conf cd /app/ && \ curl -O http://file.mackerel.io/agent/tgz/mackerel-agent-latest.tar.gz && \ tar xvfz mackerel-agent-latest.tar.gz sh << SCRIPT cat > $mackerel_agent_conf <<'EOF'; pidfile = "/app/mackerel-agent/mackerel-agent.pid" root = "/app/mackerel-agent" apikey = "<API-KEY>" roles = [ "<SERVICE>:<ROLE>" ] EOF SCRIPT trap "$mackerel_agent retire -conf $mackerel_agent_conf -force" TERM $mackerel_agent -conf $mackerel_agent_conf -v & <RUN-APP>
サービスメトリックを投稿する
HerokuではLog Drainsを使うことでアクセスログを含む各種ログを取得できます。
ここではHeroku上のRailsのログからレスポンスタイムとエラーレートを計算し、Mackerelのサービスメトリックに投稿する方法を紹介します。
HerokuでRailsを動かす方法は公式ガイドを参照してください。
RailsでJSON形式のログを出力する
logrageを利用します。
# Gemfile gem 'lograge'
# config/application.rb module Testapp class Application < Rails::Application ... config.log_level = :info config.lograge.enabled = true config.lograge.formatter = Lograge::Formatters::Json.new ... end end
rsyslogを設定する
rsyslogとfluentdを動かすホストを用意します。まずはrsyslogの設定を行います。5140番ポートでHerokuからのログを受けつけますので、ファイアウォールの設定で5140番ポートを空けるようにしてください。
# /etc/rsyslog.conf $ModLoad imtcp $InputTCPServerRun 5140
Heroku Drainsを設定する
<IPADDR>
はrsyslogとfluentdを動かすホストのIPアドレスに置換してください。
# heroku drains:add syslog://<IPADDR>:5140 Successfully added drain syslog://<IPADDR>:5140
fluentdを設定する
まずはtd-agentをインストールします。公式ガイドに従ってください。
次に必要なプラグインをインストールします。
# /usr/sbin/td-agent-gem install fluent-plugin-mackerel fluent-plugin-numeric-monitor fluent-plugin-datacounter
td-agentの設定ファイルに以下を追記します。 <API-KEY>
はAPIキーを、 <APP>
は投稿先のサービス名に置換してください。
後半のfluent-plugin-mackerelの利用方法の詳細はfluentdでサービスメトリックを投稿するをあわせて参照してください。
# /etc/td-agent/td-agent.conf <source> @type tail path /var/log/heroku pos_file /var/log/td-agent/posfile_heroku.pos format /^(?<time>[^ ]*\s+[^ ]*\s+[^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[a-zA-Z0-9\.]+)\])? *(?<message>.*)$/ time_format %b %d %H:%M:%S tag heroku.syslog </source> <match heroku.syslog> @type rewrite_tag_filter rewriterule1 message ^{" raw.heroku.access_log </match> <match raw.heroku.access_log> @type parser remove_prefix raw key_name message format json reserve_data true </match> <match heroku.access_log> @type copy <store> @type numeric_monitor count_interval 60s monitor_key duration output_per_tag yes percentiles 90,99 tag_prefix aggregated input_tag_remove_prefix heroku </store> <store> @type datacounter count_interval 60s count_key status output_per_tag yes pattern1 2xx ^2\d\d$ pattern2 3xx ^3\d\d$ pattern3 4xx ^4\d\d$ pattern4 5xx ^5\d\d$ outcast_unmatched yes tag_prefix status_aggregated input_tag_remove_prefix heroku </store> </match> <match status_aggregated.access_log> @type copy <store> @type rewrite_tag_filter capitalize_regex_backreference yes rewriterule1 2xx_count .+ status_count.access_log rewriterule2 3xx_count .+ status_count.access_log rewriterule3 4xx_count .+ status_count.access_log rewriterule4 5xx_count .+ status_count.access_log </store> <store> @type rewrite_tag_filter capitalize_regex_backreference yes rewriterule3 4xx_percentage .+ error_status_percentage.access_log rewriterule4 5xx_percentage .+ error_status_percentage.access_log </store> </match> <match status_count.access_log> @type mackerel flush_interval 60s api_key <API-KEY> out_keys 2xx_count,3xx_count,4xx_count,5xx_count remove_prefix service <APP> metrics_name access_num.${out_key} </match> <match aggregated.access_log> @type mackerel flush_interval 60s api_key <API-KEY> out_keys avg,percentile_90,percentile_99 remove_prefix service <APP> metrics_name access_latency.${out_key} </match> <match error_status_percentage.access_log> @type mackerel flush_interval 60s api_key <API-KEY> out_keys 4xx_percentage,5xx_percentage remove_prefix service <APP> metrics_name error_access_rate.${out_key} </match>
サービスメトリックの監視ルールを追加する
最後に設定したレスポンスタイムとエラーレートのサービスメトリックそれぞれに対して、監視ルールを追加しましょう。
具体的な方法は監視・通知を設定するやCLIツール mkr を使うを参照してください。