Table of Contents
Great systems are not just built. They are monitored.
MetricFire is a managed observability platform that helps teams monitor production systems with clean dashboards and actionable alerts. Delivering signal, not noise. Without the operational burden of self-hosting.
はじめに
現代のアプリケーションは、CPUやメモリのメトリクスだけでは得られないはるかに深い洞察を生み出します。リクエスト数、リクエスト遅延、エラー率、ユーザー主導のイベントといったアプリケーションレベルのシグナルは、本番環境でソフトウェアが実際にどのように動作しているかを理解する最も迅速かつ信頼性の高い方法です。
本記事では、カスタムアプリケーションメトリクスをMetricFireのパブリックカーボンエンドポイントに直接送信する簡単な方法を紹介します。小規模なFlaskアプリケーションを構築し、実用的なメトリクスを数種類出力させ、ローカルトラフィックを生成することで、コードからダッシュボードへ意味のあるデータがどれほど迅速に流れるかを実際にお見せします。
カスタムメトリクスをMetricFireが受け取る仕組み
MetricFireのHosted Graphiteは、TCP/UDP/Pickle/StatsD 経由の Graphite プレーンテキストプロトコルをサポートしています。つまり、ソケットを開いて1行のテキストを書き込むだけで、メトリクスを送信できます。各メトリクスは次の形式に従います。
<API_KEY>.<metric.path> <numeric_value>
このシンプルさにより、エージェントやSDKを必要とせず、ほぼあらゆるアプリケーションや言語に簡単に統合できます。主要なプログラミング言語でのコード例については、HG Language Guideをご参照ください。本例では、HGの Python 3 コード例を使用し、carbon.hostedgraphite.com:2003 に対してTCPのソケット接続を開き、カスタムメトリクスを送信します。
import socket
conn = socket.create_connection(("YOUR-UID.carbon.hostedgraphite.com", 2003))
conn.send("<API_KEY>.<metric.path> <numeric_value>\n".encode('utf-8'))
conn.close()
前提条件
この例を進めるには、以下が必要です。
- Python 3:最近のバージョンであれば問題ありません
- Pip:Python のパッケージ管理ツール
- Flask:小規模なアプリやタスクに使われる軽量なPython Webフレームワーク
macOS または Linux を使用していて、python3 と pip が実行できる場合は、すでに準備は整っている可能性が高いです。
3つの主要アプリケーションメトリクスを選ぶ
実用性を重視し、ほとんどのアプリケーションで有用な以下のメトリクスに焦点を当てます。
- リクエスト数(Request count):アプリがどれだけのトラフィックを処理しているか
- リクエストレイテンシ(Request latency):リクエストの処理にどれくらい時間がかかっているか
- エラー数(Error count):リクエストがどの程度失敗しているか
- ボタンクリック数(Button clicks):よくあるアプリ内イベントのトラッキング例
これらを組み合わせることで、負荷・パフォーマンス・信頼性を即座に把握できます。
カスタムメトリクスを送信する最小構成のFlaskアプリ
以下は、Hosted Graphiteに直接メトリクスを送信する、単一ファイル構成のFlaskアプリケーションです。環境変数やバックグラウンドワーカー、追加の依存関係は不要で、必要なのはFlaskとPython標準ライブラリのみです(※HGのAPIキーを必ず追加してください)。
from flask import Flask, request
import time
import socket
app = Flask(__name__)
HG_API_KEY = "YOUR-API-KEY"
HG_HOST = "carbon.hostedgraphite.com"
HG_PORT = 2003
PREFIX = "demo.flask"
def hg_send(metric_path, value):
line = f"{HG_API_KEY}.{PREFIX}.{metric_path} {value}\n"
s = socket.create_connection((HG_HOST, HG_PORT), timeout=2)
try:
s.sendall(line.encode("utf-8"))
finally:
s.close()
@app.before_request
def start_timer():
request._start = time.perf_counter()
@app.after_request
def emit_metrics(response):
try:
latency_ms = (time.perf_counter() - request._start) * 1000
hg_send("http.requests", 1)
hg_send("http.request_latency_ms", latency_ms)
if response.status_code >= 500:
hg_send("http.errors", 1)
except Exception:
pass
return response
@app.get("/")
def home():
return {"ok": True}
@app.get("/sleep")
def sleep():
s = float(request.args.get("s", "0.2"))
time.sleep(s)
return {"ok": True, "slept": s}
@app.get("/error")
def error():
return {"ok": False, "error": "intentional demo error"}, 500
@app.get("/click")
def click():
try:
hg_send("events.button_clicks", 1)
except Exception:
pass
return {"ok": True}
if __name__ == "__main__":
app.run(debug=True)
次に、Flaskアプリをローカルで実行するだけです。
python app.py
Hosted GraphiteのAPIキーをまだお持ちでない場合は、MetricFireの14日間無料トライアルを開始すると取得できます。
このアプリが送信するメトリクス
アプリの実行中、以下のメトリクスが生成・送信されます。
- demo.flask.http.requests - リクエストが発生するたびにインクリメント
- demo.flask.http.request_latency_ms - 各リクエストのレイテンシ(処理時間)を記録
- demo.flask.http.errors - HTTP 500 エラーが発生した際にインクリメント
- demo.flask.events.button_clicks - アプリケーション内イベント
これらのメトリクスは、MetricFire上ですぐに検索・グラフ化できます。
ローカル環境でのサンプルトラフィック生成
ユーザーの挙動をシミュレーションするために、別のターミナルウィンドウから複数のエンドポイントに対して、リクエスト間に短い待ち時間を挟みながらアクセスするシンプルなループを実行できます。
while true; do
curl -sS http://127.0.0.1:5000/ >/dev/null 2>&1
sleep 1
curl -sS "http://127.0.0.1:5000/sleep?s=0.2" >/dev/null 2>&1
sleep 2
curl -sS http://127.0.0.1:5000/click >/dev/null 2>&1
sleep 3
curl -sS http://127.0.0.1:5000/error >/dev/null 2>&1
sleep 5
done
このループは継続的に実行され、ターミナル出力は生成せず、Ctrl + Cで停止できます。段階的なタイミング設定により生成されるメトリクスは、ユーザートラフィックに似たグラフで可視化可能です。
Hosted Grafanaでメトリクスを閲覧する
トラフィックが流れ始めたら、MetricFireのHosted Grafanaでメトリクスプレフィックス(demo.flask.*)を検索できます。リクエストレート、レイテンシの傾向、エラー件数、カスタムイベントのアクティビティがリアルタイムで更新されるのを確認可能です。メトリクスはHGメトリクス検索UIで確認できます。
次に、HGアプリ内でダッシュボードに移動し、Hosted Grafanaにアクセスして、いくつかのパネルを含む新しいダッシュボードを作成します。
メトリクスは単純なGraphiteパスであるため、標準的なGraphite/Grafana機能を使用して集計、アラート設定、可視化が可能です。
カスタムダッシュボードとアラートの作成に関する詳細は、HGドキュメントをご参照ください。
これらの概念を実践で活用する
本番環境では、SREやDevOpsチームが、時間の経過とともにサービスの挙動を表す少数かつ明確に定義されたメトリクスを用いてアプリケーションを計測します。これらのメトリクスは通常、リクエストの境界、重要なコードパスの前後、下流依存(外部サービスやDBなど)との連携ポイントで発行されます。メトリクスを場当たり的なログとして扱うのではなく、一貫したメトリクス名と単位に基づいて、リクエストレート、レイテンシ分布、エラーレートといった 明確なサービスレベル指標(SLI)を確立します。
収集・保存されたメトリクスは、ダッシュボード、アラート、自動対応を支える基盤となります。SREチームは、メトリクスを用いて リグレッションの検知、デプロイの検証、アプリケーション挙動とインフラ変更の相関分析 を行います。時間の経過とともに、アプリケーションメトリクスは信頼性向上のための主要なシグナル となり、キャパシティプランニングの指針やパフォーマンス調整に活用されます。同時に、継続的に発行しても本番システムへ影響を与えないほど軽量である点も重要です。
まとめ
MetricFire へカスタムアプリケーションメトリクスを送信するのに、複雑なツール、エージェント、重いインストゥルメンテーションは不要です。数行の意図的なコードを追加するだけで、レイテンシ、エラー、ユーザー起点のイベントといった意味のあるシグナルを、アプリケーションからHosted Graphiteへ直接送信できます。
このアプローチにより、小規模から始め、本質的な課題に集中することが容易になります。アプリケーションが成長・変化するにつれ、同じパターンが自然に拡張され、時間の経過とともに可視性が深まります。これにより、問題の迅速な診断、動作の明確な理解、パフォーマンスと信頼性に関するより良い意思決定が可能になります。