Table of Contents
はじめに
HerokuのアドオンはHerokuプラットフォームにおける最大の強みの1つで、データベース、キャッシュ、ロギング、モニタリングなどを数秒で追加することができます。しかし、本番システムではアドオンを追加するだけでは十分ではありません。
Postgres、Redis、またはサードパーティのサービスのような重要なインフラストラクチャをHerokuアドオンで管理している場合、それらのパフォーマンスと信頼性を監視することは不可欠となります。
このガイドでは、Hosted Graphite by MetricFireを使用してHerokuアドオンのカスタムなリアルタイム監視を設定する方法についてご説明します。このブログでは一例として、Heroku Dynosと選択したアドオンからHosted Graphiteバックエンドにパフォーマンスメトリクスを転送する方法を詳しく説明します。
アプリだけでなくアドオンを監視すべき理由
Herokuはインフラストラクチャの多くを処理してくれますが、アドオンで何か問題が発生すると、アプリのパフォーマンスや信頼性がいつの間にか低下する可能性があります。
ログだけでは把握できない一般的なリスクは以下になります。
- Redisの接続数が限界に近づいている
- Postgresデータベースのサイズがクォータに近づいている
- TTLの設定ミスにより、キャッシュレイヤーが古いデータを提供している
- 外部ウェブフックサービスが500sを返し、再試行を引き起こしている
これらのエラーは、必ずしもアプリのログで確認できるものではありませんが、メトリクスで確認することができます。
Hosted GraphiteがHerokuとうまく機能する理由
MetricFireのHosted Graphiteは、Herokuと統合されたクラウドネイティブなモニタリングプラットフォームです。以下のようなエンジニアリングチームに最適です:
- 1つの場所ですべてのHerokuダイノとアドオンを監視する
- Grafanaを自分で管理せずにGrafanaダッシュボードを使用する
- アプリやスクリプトからカスタムメトリクスを送信する
- Datadogのようなプラットフォームの複雑さと高コストを回避する
MetricFireを使用すると、システムレベルのメトリクス(CPU、メモリ)、カスタムメトリクス(キューの深さ、エラー)、サードパーティ製アドオンの使用状況を、すべて最小限のオーバーヘッドで追跡できます。
Step-by-Step:Hosted Graphiteでアドオンを監視する方法
Step 1: HerokuアドオンとしてHosted Graphiteを追加する
MetricFireのHosted Graphiteは、データを使用してカスタムダッシュボードやアラートを作成できる堅牢なデータストレージバックエンドです。Hosted Graphiteは、Herokuのログドレイン出力を解析し、データをGraphite形式に変換し、Hosted Graphiteアカウントに転送するサービスを管理します。その後、カスタムダッシュボードやアラートを構築するためにこれらのGraphiteメトリックを使用することができます。さらに、Herokuのメトリクス以外も保存することができ、インフラストラクチャの複数のレイヤーを1つのガラスペインで可視化することができます。
HerokuにはHosted Graphiteのアドオンがあり、Heroku UIから、またはHeroku CLI内の同様のコマンドから簡単に有効にすることができます:
Herokuプロジェクトで以下を実行します:
heroku addons:create hostedgraphite
これは、Hosted Graphiteアカウントを規定し、組み込みのHerokuメトリクス(例:ダイノメモリ、応答時間)をHosted Graphiteダッシュボードに送信し始めます。
以下で、ダッシュボードにアクセスできます:
heroku addons:open hostedgraphite
Hosted Graphiteアドオンがプロビジョニングされると(デフォルトプランはIntro)、Heroku UI内からアカウントに移動することができます:
HerokuダイノメトリクスがHosted Graphiteアカウントに流れ込むと、デフォルトのHerokuダッシュボードが自動的にインストールされます。このダッシュボードは、モニタリングのための素晴らしいスタート地点を提供してくれ、さらにカスタマイズすることもできます:
ウェブメトリクスを受信していない場合は、おそらくHeroku CLIからログランタイムメトリクスを有効にする必要があります:
heroku labs:enable log-runtime-metrics -a <app-name>
heroku restart -a <app-name>
Step 2: Heroku Postgresアドオンの監視
HerokuのPostgresアドオンをスタンダードまたはプレミアムティアで使用すると、DBインスタンスごとに30のパフォーマンスメトリクスがHosted Graphiteアカウントに転送されます。これらはheroku.<app-name>.heroku-postgres.<instance-name>.<type>というプレフィックスが付き、Graphite(ドット-ノテーション)形式で表示されるメトリクスです:
heroku.<app-name>.heroku-postgres.<instance-name>.database.active-connections
heroku.<app-name>.heroku-postgres.<instance-name>.database.current_transaction
heroku.<app-name>.heroku-postgres.<instance-name>.database.db_size
heroku.<app-name>.heroku-postgres.<instance-name>.database.index-cache-hit-rate
heroku.<app-name>.heroku-postgres.<instance-name>.database.table-cache-hit-rate
heroku.<app-name>.heroku-postgres.<instance-name>.database.tables
heroku.<app-name>.heroku-postgres.<instance-name>.database.waiting-connections
heroku.<app-name>.heroku-postgres.<instance-name>.server.load-avg-15m
heroku.<app-name>.heroku-postgres.<instance-name>.server.load-avg-1m
heroku.<app-name>.heroku-postgres.<instance-name>.server.load-avg-5m
heroku.<app-name>.heroku-postgres.<instance-name>.server.memory-cached
heroku.<app-name>.heroku-postgres.<instance-name>.server.memory-free
heroku.<app-name>.heroku-postgres.<instance-name>.server.memory-postgres
heroku.<app-name>.heroku-postgres.<instance-name>.server.memory-total
heroku.<app-name>.heroku-postgres.<instance-name>.server.read-iops
heroku.<app-name>.heroku-postgres.<instance-name>.server.tmp-disk-available
heroku.<app-name>.heroku-postgres.<instance-name>.server.tmp-disk-used
heroku.<app-name>.heroku-postgres.<instance-name>.server.wal-percentage-used
heroku.<app-name>.heroku-postgres.<instance-name>.server.write-iops
また、Hosted Graphiteは、ダッシュボード・ライブラリからインストールできる、これらのメトリクス用の事前設定済みダッシュボードも提供しています:
Step 3: Heroku Redisアドオンの監視
どの階層でもHeroku Redisアドオンを使用すると、12個のメトリクスが自動的にHosted Graphiteアカウントに転送されます。これらのメトリクスのプレフィックスは: heroku.<アプリ名>.heroku-redis.<インスタンス名>.<タイプ>で、これらはGraphiteフォーマットで表示されるメトリクスのものとなります:
heroku.<app-name>.heroku-redis.<instance-name>.database.active-connections
heroku.<app-name>.heroku-redis.<instance-name>.redis.evicted-keys
heroku.<app-name>.heroku-redis.<instance-name>.redis.hit-rate
heroku.<app-name>.heroku-redis.<instance-name>.redis.memory-redis
heroku.<app-name>.heroku-redis.<instance-name>.server.load-avg-15m
heroku.<app-name>.heroku-redis.<instance-name>.server.load-avg-1m
heroku.<app-name>.heroku-redis.<instance-name>.server.load-avg-5m
heroku.<app-name>.heroku-redis.<instance-name>.server.memory-cached
heroku.<app-name>.heroku-redis.<instance-name>.server.memory-free
heroku.<app-name>.heroku-redis.<instance-name>.server.memory-total
heroku.<app-name>.heroku-redis.<instance-name>.server.read-iops
heroku.<app-name>.heroku-redis.<instance-name>.server.write-iops
Hosted Graphiteはまた、ダッシュボードライブラリで利用可能なHeroku Redisダッシュボードを事前に設定しています:
Step 4: Heroku Kafkaアドオンのモニタリング
Heroku KafkaアドオンをStandard階層以上で使用すると、クラスタノードごとに10個のメトリクスが自動的にHosted Graphiteアカウントに転送されます。これらはheroku.<app-name>.heroku-kafka.<node>.<instance-name>.<type>というプレフィックスが付き、Graphiteフォーマットではこのようになります:
heroku.<app-name>.heroku-kafka.<node>.<instance-name>.kafka.bytes-in-per-second
heroku.<app-name>.heroku-kafka.<node>.<instance-name>.kafka.bytes-out-per-second
heroku.<app-name>.heroku-kafka.<node>.<instance-name>.server.load-avg-15m
heroku.<app-name>.heroku-kafka.<node>.<instance-name>.server.load-avg-1m
heroku.<app-name>.heroku-kafka.<node>.<instance-name>.server.load-avg-5m
heroku.<app-name>.heroku-kafka.<node>.<instance-name>.server.memory-cached
heroku.<app-name>.heroku-kafka.<node>.<instance-name>.server.memory-free
heroku.<app-name>.heroku-kafka.<node>.<instance-name>.server.memory-total
heroku.<app-name>.heroku-kafka.<node>.<instance-name>.server.read-iops
heroku.<app-name>.heroku-kafka.<node>.<instance-name>.server.write-iops
Hosted Graphiteには、ダッシュボード・ライブラリから生成できるHeroku Kafkaダッシュボードも設定済みです:
Step 5: アドオンのカスタムメトリクスの送信
Herokuはアドオン固有のメトリクスをGraphiteにネイティブに送信しません。しかし、APIクエリやサービス統合を使って手動で送信することができます。以下にその方法を示します:
- 例: Heroku Postgresのメトリクスを監視
Herokuはデータベースメトリクスを取得するためのCLIプラグインを提供しています:
heroku pg:info --app your-app-name
これは以下のようなメトリクスを返す:
- 接続数
- データベース・サイズ
- トランザクション・スループット
- テーブル・キャッシュ・ヒット率
BashまたはPythonを使用してこれをスクリプト化し、StatsDまたは直接TCPを使用してHosted Graphiteにメトリクスを送信できます。
Pythonの例:
import statsd
import subprocess
statsd_client = statsd.StatsClient('carbon.hostedgraphite.com', 2003, prefix='YOUR_API_KEY')
# Example: Send connection count
output = subprocess.check_output(['heroku', 'pg:info', '--app', 'your-app-name']).decode()
if "Connections" in output:
connections = int(output.split("Connections")[1].split()[0])
statsd_client.gauge("heroku.postgres.connections", connections)
cronジョブまたは軽量のHeroku worker dynoでスケジュールします。
Step 6: Graphite データを使用してカスタムアラートを作成する
Hosted Graphite UI で、Alerts => Graphite Alerts に移動して新しいアラートを作成します。アラートに名前を付け、アラートのメトリックフィールドにクエリを追加し、このアラートが何であるかの説明を追加します(注:ワイルドカード(*)検索を使用して、指定したインデックスからすべてのメトリックを取得することができます):
次にAlert Criteriaタブを選択して閾値を設定し、通知チャネルを選択します。デフォルトの通知チャネルは、Hosted Graphiteアカウントにサインアップする際に使用したメールになりますが、Slack、PagerDuty、Microsoft Teams、OpsGenie、カスタムWebhookなどのチャネルを簡単に設定することができます。通知チャンネルの詳細については、Hosted Graphiteのドキュメントを参照してください:
MetricFireでは、任意の時系列メトリックのアラートしきい値を定義することができます。
例:
- 🚨 Redisのメモリ使用率が85%を超えた場合にアラート
- 📉 Postgresキャッシュのヒット率が90%未満の場合にアラート
- 🛑 ウェブフック5xxレートが5分間1%を超えた場合にアラート
アラートの送信先
- Slack
- PagerDuty
- Webhooks
これは、サードパーティのサービスに依存している場合に特に便利です。サードパーティのサービスのパフォーマンスが変化したときに、あなたのサービスが壊れる前にアラートを出すことができます。
Herokuでアドオンを監視するためのベストプラクティス
- アドオンを本番環境のインフラストラクチャのように扱う - アドオンはしばしば、あなた自身のコードよりも重要です。
- 使用量とクォータを追跡する - 不意なスロットリングや超過請求を避ける。
- モニタリングで予算を設定する - 特にRedisや外部APIのような従量制サービスの場合。
- タグを使用して環境を分ける - ステージング、プロダクション、QAなどのメトリクスにタグを付け、混乱を避ける。
- 失敗と沈黙の両方にアラートを出す - メトリクスのない状態は、エラーの急増と同じくらい危険です。
実際の使用例:RedisとPostgresを使用したSaaSチーム
MetricFireの多くの顧客は、キャッシュとジョブキューにHeroku Redis、プライマリデータにHeroku Postgresを使用してPythonまたはRailsベースのアプリを実行しています。
彼らはMetricFireを以下のように使用しています:
- Redisのメモリ使用量を可視化し、キーの立ち消えを防止
- Postgres接続の飽和を警告
- SidekiqまたはCeleryキューの待ち時間を監視
- StripeまたはSendGridからのWebhookリトライ動作を追跡
これにより、チームは顧客が気付く前に低速な劣化をキャッチし、インシデント時間を削減し、ダイノとプランを適切なサイズに設定することができます。
結論 :アドオンの観測可能性はオプションではない
Herokuアドオンはインストールするのは簡単ですが、可視性がないとうまく運用するのが難しくなります。データベース、キャッシング、ロギング、バックグラウンドジョブなど、これらのアドオンのパフォーマンスはアプリケーションに直接影響します。
MetricFireのHosted Graphiteを使用すると、次のことが可能になります:
- ダイノとアドオンを一箇所で監視
- お客様のビジネスに合わせたカスタムメトリクスを送信
- パフォーマンスの傾向とボトルネックを可視化
- 事態が壊れる前にアラートを設定
アドオンをコントロールする準備はできていますか?
- 🚀 14日間の無料トライアル
- 🔌 Hosted Graphite をHerokuアプリに追加
- 💬 ヘルプが必要ですか?セットアップやベストプラクティスについてご説明いたします。
Herokuインフラストラクチャとアドオンを監視することは、パフォーマンスを最適化し、リソース効率を確保し、問題にプロアクティブに対処するために非常に重要です。ボトルネック、異常、セキュリティインシデントをリアルタイムで検出し解決することができ、より良いユーザーエクスペリエンスに貢献します。さらに、効果的な監視により、使用されていないリソースを特定し、業界標準や規制へのコンプライアンスを確保することで、コストの最適化を支援します。Hosted GraphiteはHerokuとシームレスに統合され、Datadogのような他のプラットフォームよりもはるかに安価に監視環境を提供します。
ダッシュボードやアラートのようなツールは、堅牢で効率的なインフラストラクチャを維持するために不可欠な、リアルタイムの可視化、問題のプロアクティブな特定、過去の傾向分析、情報に基づいた意思決定の促進を提供することで、データを補完します。
無料トライアルにサインアップして、今すぐHerokuスタックのモニタリングをお試しください。また、デモを予約し、モニタリングのニーズについてMetricFireチームと直接話すこともできます。