Laravel Nightwatch: フレームワークを真に理解するファーストパーティAPM
Laravel Nightwatchは、フレームワークレベルのイベントをデフォルトでキャプチャし、リクエスト、クエリ、ジョブなどを一貫したトレースにまとめるファーストパーティAPMです。Laravel専用アプリには堅実なデフォルトですが、ドメインロジックの計装は依然として必要です。

この仕事を半分カバーするツールを、あなたはすでに3つ動かしている。Pulseはローカルルート上にライブウォールを提供する。Datadogはホストと使用量で課金するため、請求額はインフラに比例する。Sentryは誰かが被害を受けた後に例外をキャッチする。どれも、あなたが実際に尋ねたたった一つのことを教えてくれない。14:03に900msかかったチェックアウトリクエストがジョブをディスパッチし、そのジョブがクエリを実行し、そのクエリがタイムアウトした、ということを。
Laravel Nightwatchは2025年にGAに達し、フレームワーク独自のAPMとして、まさにそのギャップを狙っている。何をキャプチャし、何を課金し、アプリに関する知識がどこで止まり、あなたの知識がどこから始まるのかを正確に知っておく価値がある。
Nightwatchの正体
2つの可動部品: アプリ内のComposerパッケージと、データを送信する別個のエージェントプロセス。パッケージはイベントをローカルソケットに書き込む。エージェントは127.0.0.1:2407でリッスンし、受信したものをバッチ処理してNightwatchのクラウドに送信する。エージェントはリクエストサイクルの外部で動作するため、リクエストスレッドはテレメトリバックエンドへのネットワークコールを待つためにブロックされない。Laravelは追加コストをリクエストあたり3ms未満と見積もっている。それを出発点として、信頼する前に自分で測定せよ。
人を悩ませる詳細の一つ: エージェントが動作していなければ何も届かない。ローカル開発では手動で起動する。本番環境では、Horizonを動かすのと同じように、supervisor、Forgeデーモン、またはVaporの下に置く必要がある。
コードを一行も書かずにキャプチャできるもの
NightwatchはLaravel自身のイベントディスパッチャにフックするため、フレームワークの概念を匿名のシステムコールではなく名前で認識する。デフォルトで記録するもの:
- 受信リクエスト(ルート、ステータス、期間を含む)
- 送信HTTPコール
- データベースクエリ
- キューに入ったジョブとバッチ
- メールと通知
- キャッシュの読み取りと書き込み
- Artisanコマンド
- スケジュールされたタスク
- 例外とログ
- リクエストの認証済みユーザー
価値はリストではない。つなぎ合わせることだ。Nightwatchはリクエストを、それが実行したクエリ、キューに入れたジョブ、そのジョブが後で送信したメールと、一つのトレースに結びつける。この相関関係を手作業で配線することは、汎用APMにおける作業の大部分である。ここではそれがデフォルトである。
Nightwatch vs Pulse
PulseとNightwatchはどちらもLaravelチームによるもので、異なる質問に答える。Pulseはアプリ内に存在する集約ダッシュボードで、データベースまたはRedisをバックエンドとする。遅いクエリ、最もビジーなルート、トップ例外をローリングカウントとして表示する。無料でセルフホストされ、「アプリは今健康か」というビューを提供する。提供しないのは、単一リクエストのタイムラインや、保持期間を超えた履歴である。14:03のリクエストを開いてウォークスルーすることはできない。
Nightwatchはイベント単位でホストされ、遡及的な質問のために構築されている: なぜあのリクエストが遅かったのか。両方を維持せよ。Pulseは内部ルート上の無料のライブウォールとして残り、Nightwatchは誰かが昨日の遅いチェックアウトを報告し、トレースが必要なときにあなたが行く場所である。
Nightwatch vs Datadogおよびその他の汎用APM
Datadog、New Relic、および生のOpenTelemetryは、設計上言語に依存しない。彼らはPHP-FPMワーカー、HTTPスパン、SQLステートメントを見る。彼らが見ないのはLaravelである。キューに入ったジョブは単なる長時間実行のCLIプロセスである。Horizonスーパーバイザーは不透明な箱である。EloquentのN+1は、一つのループから来たというヒントのない30の匿名のSELECTステートメントである。そのコンテキストはカスタムインストルメンテーションとdd-traceのチューニングによって購入し、それを永遠に維持する。
Nightwatchはジョブ、バッチ、通知、スケジュールされたコマンドが何かを知っている。なぜなら、それはフレームワーク自身が自分自身を監視しているからだ。それがあなたが行うトレードオフである。NightwatchはLaravel専用で完全管理型であり、データレジデンシーは米国、EU、またはオーストラリアで、セルフホストオプションはない。ポリグロットなインフラを運用し、Goサービス、Laravelアプリ、Nodeワーカーを一つのペインで監視する必要があるなら、Datadogが依然として幅広さで勝る。Laravelがアプリケーション全体であるなら、Nightwatchははるかに少ない設定でより多くのシグナルを提供する。
コストと価格設定の落とし穴
Nightwatchはホスト単位ではなくイベント単位で課金する。2026年半ば時点の公開ティア: Free: $0、30万イベント、14日間のルックバック; Pro: $20/月、750万イベント、30日間のルックバック; Team: $60/月、3000万イベント、60日間のルックバック; Business: $300/月、1億8000万イベント、90日間のルックバック。超過分は有料の下位ティアでは10万イベントあたり$0.35、Businessティアでは$0.20に下がる。
ここで「イベント」を注意深く読め。リクエストはイベントである。同様に、それが実行する各クエリ、ディスパッチする各ジョブ、各キャッシュヒット、各送信コールもイベントである。一つの普通のリクエストで十数個のイベントが発生する可能性がある。計算せよ: 30万イベントをリクエストあたり10イベントとすると3万リクエストであり、これは控えめな本番アプリが一日で消費しうる量である。無料ティアはサイドプロジェクトには寛大だが、実際のトラフィックがあるものには薄い。
レバーはサンプリングであり、Nightwatchは上限に達すると取り込みを停止する支出上限を提供する。不足データへのクローズドフェイルであり、驚きの請求書へのオープンフェイルではない。これはホストベースの価格設定とは異なる障害モードであり、より親切なものである。
依然としてあなたが担当する計装
ゼロコンフィグはフレームワークのビューを提供する。アプリケーションのビューを提供することは決してない。Nightwatchが推測できない3つのことと、それらを提供する方法。
1. Nightwatchがユーザーについて記録するもの。 Nightwatchは認証済みユーザーを自動的に読み取るが、どのフィールドで識別するかはあなたが決める。AppServiceProviderでリゾルバを一度登録する。ここでアカウントを読み取り可能な名前にマッピングするか、テナントでIDにプレフィックスを付けて、idが5の2人の顧客がトレース内で衝突しないようにする。
2. リクエストがビジネスにとって何を意味するか。 NightwatchはPOST /checkoutが900msかかったことを見る。その900msが支払いSLAに違反したことや、このパスが収益を生むものであることを知らない。サンプリングはその優先順位をエンコードする場所である。なぜなら、エントリポイント(リクエスト、コマンド、スケジュールされたタスク)がサンプリングの対象だからである。
3. フレームワークのプリミティブにマッピングされないドメイン操作。 「在庫予約」は3つのサービス、2つのクエリ、1つのディスパッチされたイベントかもしれない。Nightwatchにとっては、一つのリクエストの下に散らばったクエリの集まりであり、それらを結びつける名前はない。フレームワークはクエリをキャプチャできるが、予約をシーケンスするドメインコールを知ることはできない。その概念を表示させたいなら、Nightwatchが収集するシグナル(構造化ログとイベント)を通じて表現し、トレースにチームが認識できる単語を載せる。
最後のポイントは熟考すべきものだ。ファーストパーティAPMは相関関係の配管作業を消去する。ソフトウェアが何をするかの命名作業を消去するわけではない。その命名は常にあなたの仕事だった。
Nightwatchは、フレームワークの境界に存在し、ドメインコードに何も要求しないため、良いデフォルトである。まさにその理由から、ドメインには独自の語彙が依然として必要である。ビジネスにとって重要な概念はフレームワークイベントではなく、ゼロコンフィグツールが「在庫予約」ユースケースに名前を付けることは決してない。フレームワークの可観測性をエッジに保ち、ドメイン操作を明示的かつ独立させることが、重要な分離である。
ディスカッション
0 件のコメント
最初のコメントを投稿しましょう。