Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Laravel Nightwatchの裏側 - Laravel公式Observabilityツ...

Laravel Nightwatchの裏側 - Laravel公式Observabilityツールを支える設計と実装

PHPerKaigi 2026で発表したスライドです。実際のトークではプロダクトのデモや実際のコードを交えて話したので、このスライドだけだと伝わらない部分も多くあると思います。

Laravel Nightwatchは、Laravelアプリケーションに特化した公式のObservabilityツールです。
https://nightwatch.laravel.com

このセッションでは、その「裏側」で実際に動いている仕組みを、アーキテクチャからコードレベルまで紹介します。

Nightwatchは、ユーザーのLaravelアプリケーションにインストールするパッケージ、ローカルエージェント、クラウド上のデータパイプラインといった複数のコンポーネントの連携によって成り立っています。

OSSの laravel/nightwatch パッケージが各種イベントをフックしてメトリクスを収集し、レスポンス後にローカルエージェントへTCPで送信、エージェントから Ingest API → Kafka → ClickHouse とデータが流れ、最終的にダッシュボードで可視化されます。

リリース初日から世界中から大量のアプリケーションがメトリクスを送り続ける前提で、数十億レコード規模のデータを、マルチリージョン構成で、かつPHP中心のスタックで処理し続ける必要がありました。

このセッションでは、

- Laravel内部のライフサイクルをどうフックしてメトリクス情報を取得しているのか
- どうやってアプリ本体のパフォーマンスを落とさずにデータを収集しているのか
- ReactPHPを使ったイベントドリブンな常駐プロセス
- エージェント〜Ingest〜Kafka〜ClickHouseまでのデータフロー設計
- 大量データ・高トラフィックを前提にしたボトルネックとその対策

といったトピックを、実際のOSSコードやアーキテクチャ図とともにお話しします。

Avatar for Ryuta Hamasaki

Ryuta Hamasaki

March 23, 2026
Tweet

More Decks by Ryuta Hamasaki

Other Decks in Programming

Transcript

  1. Laravel App Nightwatch Agent Ingest API Kafka ClickHouse Dashboard →

    → ← → Nightwatch Package Your App Nightwatch TCP ClickPipes → Write Read HTTP
  2. Nightwatch Agent Ingest API Kafka ClickHouse Dashboard → → ←

    → Your App Nightwatch TCP ClickPipes → Write Read HTTP Laravel App Nightwatch Package
  3. データ収集〜Agentに送信 01 - Nigtwatch パッケージ Boot → ϝτϦΫεऩू Ϩεϙϯε Agentʹૹ৴

    → → → ϦΫΤετ 各イベントでメトリクスを収集し、メモリ上にバッファ
  4. enum ExecutionStage: string { case Bootstrap = 'bootstrap'; case BeforeMiddleware

    = 'before_middleware'; case Action = 'action'; case Render = 'render'; case AfterMiddleware = 'after_middleware'; case Sending = 'sending'; case Terminating = 'terminating'; case End = 'end'; }
  5. Laravel App Nightwatch Agent Ingest API Kafka ClickHouse Dashboard →

    → ← → Nightwatch Package Your App Nightwatch TCP ClickPipes → Write Read HTTP
  6. use React\EventLoop\Loop; use React\Socket\ConnectionInterface; use React\Socket\TcpServer; $server = new TcpServer('127.0.0.1:2407');

    $server->on('connection', function (ConnectionInterface $connection) { $payload = new Payload; $connection->on('data', function (string $chunk) use ($payload) { $payload->append($chunk); }); $connection->on('close', function () use ($payload) { $this->ingest->write($payload); }); }); Loop::run()
  7. Laravel App Nightwatch Agent Ingest API Kafka ClickHouse Dashboard →

    → ← → Nightwatch Package Your App Nightwatch TCP ClickPipes → Write Read HTTP
  8. Overview 03 - σʔλύΠϓϥΠϯ • マルチリージョン構成:US / EU / AU

    • リリース初日から世界中のLaravelアプリがデータを送信 • 数十億レコード規模のデータを継続的に処理 • データロスがあってはならない
  9. Ingest API 03 - σʔλύΠϓϥΠϯ • 世界中のエージェントからのデータの受け口 • 認証・バリデーション・利用量の上限チェック •

    受け取ったデータを即座にKafkaへ送信 • レスポンスは高速に返す:データベースへの保存処理は 後段に任せる
  10. Kafka ( MSK ) 03 - σʔλύΠϓϥΠϯ • 高スループット:数十万〜数百万メッセージ/秒を処理 •

    高い耐久性:データロスを防ぐ • Ingest APIとDBの間のバッファとして機能 Ingest API Kafka ClickHouse Dashboard → ← → ClickPipes → Write Read
  11. Ingest API Kafka ClickHouse Dashboard → → ← → ↓

    Your App Nightwatch TCP HTTP ClickPipes → Write Read Laravel App Nightwatch Package Nightwatch Agent
  12. Laravel App Nightwatch Agent Ingest API Kafka ClickHouse Dashboard →

    → ← → Nightwatch Package Your App Nightwatch TCP ClickPipes → Write Read HTTP
  13. timestamp path method status duration (ms) 2026 - 03 -

    19 14 : 32 : 01.483 /users GET 200 142.5 2026 - 03 - 19 14 : 32 : 01.891 /dashboard GET 200 38.2 2026 - 03 - 19 14 : 32 : 02.104 /orders POST 201 512.8 2026 - 03 - 19 14 : 32 : 02.337 /users/{id} GET 200 95.1 2026 - 03 - 19 14 : 32 : 03.002 /reports GET 200 1284.3 requests テーブル
  14. SELECT toStartOfMinute(timestamp) AS minute, count() AS count, countIf(status >= 500)

    AS errors, avg(duration) AS avg, quantile(0.95)(duration) AS p95, FROM requests WHERE timestamp >= now() - INTERVAL 1 HOUR GROUP BY minute ORDER BY minute
  15. minute count errors avg p95 2026 - 03 - 19

    14 : 28 : 00 1,204 3 84.2 245.2 2026 - 03 - 19 14 : 29 : 00 1,387 12 97.5 312.8 2026 - 03 - 19 14 : 30 : 00 1,156 1 72.1 198.4 2026 - 03 - 19 14 : 31 : 00 1,293 5 88.9 267.1 2026 - 03 - 19 14 : 32 : 00 1,342 8 91.3 289.5 数十億行のテーブルでも1秒以内に集計
  16. Laravel だけじゃないよ! Laravel Live Japan 2026 Laravel PHP AI Testing

    Database UI / UX Community Career JavaScript Native App