Slide 1

Slide 1 text

#phpcon_nagoya #s 続く障害からの脱却 オブザーバビリティで立て直すサービス開発 in PHPカンファレンス名古屋2025 @yamato_sorariku

Slide 2

Slide 2 text

#phpcon_nagoya #s 自己紹介 @yamato_sorariku / 足利 大和 株式会社カオナビ ● バックエンドエンジニア ○ 軸はPHPer ○ 必要なことはなんでもやります ● 猫とコーヒーと飛行機が好き 2

Slide 3

Slide 3 text

#phpcon_nagoya #s 障害が頻発し苦境に陥り プロダクト自体の機能開発も改善も進まない状況のチーム そんなチームで私がやってきたことをお話します 3

Slide 4

Slide 4 text

#phpcon_nagoya #s 今回のトークで登場するサービスの概要 4 提携しているメディアの記事リスト を取得するcronジョブ 取得リストをもとに 順次実行して記事を取得する cronジョブ 取得した記事を使って ユーザごとにレポート生成 するcronジョブ 調査レポート 提供している価値 取得先は数千件以上 総取得数は数万件以上 ユーザごとに設定された調査条件に合 致したデータを取得しレポート化 レポートに対する追加情報の取得 記事の注目度など

Slide 5

Slide 5 text

#phpcon_nagoya #s プロダクトチームの状況 5

Slide 6

Slide 6 text

#phpcon_nagoya #s 2週に1度は大小さまざまな障害が発生 6

Slide 7

Slide 7 text

#phpcon_nagoya #s 最重要なデータ収集バッチが 数日間実行エラーで稼働せず データ取得遅延・欠損 7

Slide 8

Slide 8 text

#phpcon_nagoya #s 提供するレポート用追加情報の 取得が数日間すべて失敗し続けデータ欠損 8

Slide 9

Slide 9 text

#phpcon_nagoya #s プロダクトチームの状況 2週に1度は大小さまざまな障害が発生 ● 最重要なデータ収集バッチの停止 ● ユーザに提供するレポート用追加情報の取得エラー どちらも数日間気づくことなく、CS部門からの問い合わせで発覚 9

Slide 10

Slide 10 text

#phpcon_nagoya #s プロダクトチームの状況 ほぼCS部門からの問い合わせで発覚 これがつらい。 10

Slide 11

Slide 11 text

#phpcon_nagoya #s 11 この表示って正しいですか?

Slide 12

Slide 12 text

#phpcon_nagoya #s 12 この表示って正しいですか? これデータ壊れてません?

Slide 13

Slide 13 text

#phpcon_nagoya #s これなんか起きてませんか? 13 この表示って正しいですか? これデータ壊れてません?

Slide 14

Slide 14 text

#phpcon_nagoya #s プロダクトチームの状況 ほぼCS部門からの問い合わせで発覚 サービスとしての安定感はゼロ、CS部門からの信頼もやばい CS部門の方が毎日見回りをルーティンタスクとして設定する事態 14

Slide 15

Slide 15 text

#phpcon_nagoya #s プロダクトチームの状況 当然チームには良くない空気が流れる ● 対応に追われてプロダクトへの機能実装はうまく進捗できない ○ レガシーなコードやインフラの改善も進まない 15

Slide 16

Slide 16 text

#phpcon_nagoya #s プロダクトチームの状況 当然チームには良くない空気が流れる ● 対応に追われてプロダクトへの機能実装はうまく進捗できない ○ レガシーなコードやインフラの改善も進まない ● なにかアクションを起こすと問題が起きる 16

Slide 17

Slide 17 text

#phpcon_nagoya #s プロダクトチームの状況 当然チームには良くない空気が流れる ● 対応に追われてプロダクトへの機能実装はうまく進捗できない ○ レガシーなコードやインフラの改善も進まない ● なにかアクションを起こすと問題が起きる ○ 起きる問題に自分たちで気付けない ○ 行動しないことが安全に繋がってしまう 17

Slide 18

Slide 18 text

#phpcon_nagoya #s プロダクトチームの状況 当然チームには良くない空気が流れる ● 対応に追われてプロダクトへの機能実装はうまく進捗できない ○ レガシーなコードやインフラの改善も進まない ● なにかアクションを起こすと問題が起きる ○ 起きる問題に自分たちで気付けない ○ 行動しないことが安全に繋がってしまう 18 自分たちで気付けるようになろう ↓ システム監視から始める立て直しへ

Slide 19

Slide 19 text

#phpcon_nagoya #s システム監視 19

Slide 20

Slide 20 text

#phpcon_nagoya #s シンプルなシステム監視に着手 ● CPUなどのサーバリソースの監視 ● 各種ジョブ処理(cron実行)の実行結果を収集 ● ログの監視とSlack通知 20

Slide 21

Slide 21 text

#phpcon_nagoya #s シンプルなシステム監視に着手 21 CPUの負荷状態

Slide 22

Slide 22 text

#phpcon_nagoya #s シンプルなシステム監視に着手 22 CPUの負荷状態 これはやばい?

Slide 23

Slide 23 text

#phpcon_nagoya #s シンプルなシステム監視に着手 23 CPUの負荷状態

Slide 24

Slide 24 text

#phpcon_nagoya #s シンプルなシステム監視に着手 24 CPUの負荷状態 これは平和?

Slide 25

Slide 25 text

#phpcon_nagoya #s シンプルなシステム監視に着手 ● CPUなどのサーバリソースの監視 ○ 余裕があるからと言って問題なく稼働してるかはわからない ○ 使用率99%でも適切にサービス提供できれいれば問題ない ● 各種ジョブ(cron実行)の実行結果を収集 ● ログの監視とSlack通知 25 目安: 5分

Slide 26

Slide 26 text

#phpcon_nagoya #s シンプルなシステム監視に着手 26 ジョブの終了コードが0ならOK 1ならなにか問題が起きている

Slide 27

Slide 27 text

#phpcon_nagoya #s シンプルなシステム監視に着手 27 おや?

Slide 28

Slide 28 text

#phpcon_nagoya #s シンプルなシステム監視に着手 ● CPUなどのサーバリソースの監視 ○ 余裕があるからと言って問題なく稼働してるかはわからない ○ 使用率99%でも適切にサービス提供できれいれば問題ない ● 各種ジョブ処理(cron実行)の実行結果を収集 ○ 終了コードにが0なら正常終了している判定 ■ エラーなのに0応答しているコードが稀に…… ● ログの監視とSlack通知 28

Slide 29

Slide 29 text

#phpcon_nagoya #s シンプルなシステム監視に着手 ● CPUなどのサーバリソースの監視 ○ 余裕があるからと言って問題なく稼働してるかはわからない ○ 使用率99%でも適切にサービス提供できれいれば問題ない ● 各種ジョブ処理(cron実行)の実行結果を収集 ○ 終了コードにが0なら正常終了している判定 ■ エラーなのに0応答しているコードが稀に…… ● ログの監視とSlack通知 ○ 対応不要なエラーログの山によるノイジーアラート 29

Slide 30

Slide 30 text

#phpcon_nagoya #s シンプルなシステム監視に着手 ● CPUなどのサーバリソースの監視 ○ 余裕があるからと言って問題なく稼働してるかはわからない ○ 使用率99%でも適切にサービス提供できれいれば問題ない ● 各種ジョブ処理(cron実行)の実行結果を収集 ○ 終了コードにが0なら正常終了している判定 ■ エラーなのに0応答しているコードが稀に…… ● ログの監視とSlack通知 ○ 対応不要なエラーログの山によるノイジーアラート 30 ちゃんと稼働してるかわからん

Slide 31

Slide 31 text

#phpcon_nagoya #s ※ インフラなどの監視はもちろん重要 ● インフラレイヤで起きる問題も当然あるのでリソース監視なども必要 ● 我々はWebアプリケーションエンジニアなので 「アプリケーション(サービス)」の監視が重要 ● アプリケーションが正しく動作できていなければ価値は提供できていない 31

Slide 32

Slide 32 text

#phpcon_nagoya #s ※ インフラなどの監視はもちろん重要 ● インフラレイヤで起きる問題も当然あるのでリソース監視なども必要 ● 我々はWebアプリケーションエンジニアなので 「アプリケーション(サービス)」の監視が重要 ● アプリケーションが正しく動作できていなければ価値は提供できていない 32 システムが価値が提供できていることを見えるようにしたい ↓ オブザーバビリティから始める立て直しへ

Slide 33

Slide 33 text

#phpcon_nagoya #s オブザーバビリティとは? 33

Slide 34

Slide 34 text

#phpcon_nagoya #s オブザーバビリティとは? オブザーバビリティとは、システムの外部出力の知識から 内部状態をどれだけ正確に推測できるかの尺度 引用: https://github.com/cncf/tag-observability/blob/whitepaper-v1.0.0/whitepaper.md 34

Slide 35

Slide 35 text

#phpcon_nagoya #s オブザーバビリティの3本柱 引用: https://github.com/cncf/tag-observability/blob/whitepaper-v1.0.0/whitepaper.md 35 メトリクス ログ トレース

Slide 36

Slide 36 text

#phpcon_nagoya #s オブザーバビリティの3本柱: メトリクス ● システムの状態を数値で表現したもの ○ 例:CPU使用率、メモリ使用量、リクエスト数/秒 ● リアルタイムで収集され、時系列データとして保存、グラフ化しやすい ○ システム全体の状態把握、異常の早期発見 36

Slide 37

Slide 37 text

#phpcon_nagoya #s オブザーバビリティの3本柱: ログ ● システム内で発生したイベントの詳細な記録 ○ アプリケーションログ、システムログ ● テキスト形式で記録され、詳細な情報を含める(個人情報などには注意が必要) ○ 1行のテキスト形式からJSONL形式など形は様々 37

Slide 38

Slide 38 text

#phpcon_nagoya #s オブザーバビリティの3本柱: トレース ● リクエスト単位でイベントを記録する ○ PHP、DB、外部APIなどごとの処理時間などを追うことができる ● 全リクエストを対象にすると膨大なデータになるためサンプリングが必要 38

Slide 39

Slide 39 text

#phpcon_nagoya #s 内部状態をどれだけ正確に推測できるか 39

Slide 40

Slide 40 text

#phpcon_nagoya #s 内部状態をどれだけ正確に推測できるか ↓ システムが価値を提供できているか推測できるか 40

Slide 41

Slide 41 text

#phpcon_nagoya #s データの取得状況をすべて構造化ログとして出力 41

Slide 42

Slide 42 text

#phpcon_nagoya #s データの取得状況をすべて構造化ログとして出力 42 提携しているメディアの記事リスト を取得するcronジョブ 取得リストをもとに 順次実行して記事を取得する cronジョブ 取得した記事を使って ユーザごとにレポート生成 するcronジョブ レポートに対する追加情報の取得

Slide 43

Slide 43 text

#phpcon_nagoya #s データの取得状況をすべて構造化ログとして出力 43 提携しているメディアの記事リスト を取得するcronジョブ 取得リストをもとに 順次実行して記事を取得する cronジョブ 取得した記事を使って ユーザごとにレポート生成 するcronジョブ レポートに対する追加情報の取得

Slide 44

Slide 44 text

#phpcon_nagoya #s 価値が提供できていることを推測する 44 構造化ログをPHPで出力 構造化ログをNew Relicへ転送 構造化ログを集計して メトリクスへ変換

Slide 45

Slide 45 text

#phpcon_nagoya #s 価値が提供できていることを推測する 45 構造化ログを集計してメトリクスに -> 時系列のデータとして見える 目安: 10分

Slide 46

Slide 46 text

#phpcon_nagoya #s 価値が提供できていることを推測する 46 構造化ログを集計してメトリクスに -> 時系列のデータとして見える 安定して取得できてそう!

Slide 47

Slide 47 text

#phpcon_nagoya #s 価値が提供できていることを推測する 47 構造化ログを集計してメトリクスに -> 時系列のデータとして見える

Slide 48

Slide 48 text

#phpcon_nagoya #s 価値が提供できていることを推測する 48 構造化ログを集計してメトリクスに -> 時系列のデータとして見える 取得できてない時間が一定時間を超えた -> アラート発報 取得できなくなったメディアの確認 -> 全部? 一部?

Slide 49

Slide 49 text

#phpcon_nagoya #s 価値が提供できていることを推測する 49 構造化ログを集計してメトリクスに -> 時系列のデータとして見える 取得できてない時間が一定時間を超えた -> アラート発報 取得できなくなったメディアの確認 -> 全部? 一部? ログとメトリクスを組み合わせてサービスが 価値を正しく提供できているか推測可能に

Slide 50

Slide 50 text

#phpcon_nagoya #s どのようなリードをしてきたか 50

Slide 51

Slide 51 text

#phpcon_nagoya #s どのようなリードをしてきたか ● 自分がチームに来たときは完全な「サバイバルモード」 ○ 起きる問題に振り回されて改善の時間がない ○ 「改善していこう!」と言うだけでは前に進めない状況 ○ なんとかして「ゆとり時間」を作らないといけない 51 参考: https://www.oreilly.co.jp/books/9784873118024/

Slide 52

Slide 52 text

#phpcon_nagoya #s どのようなリードをしてきたか ● 自分がチームに来たときは完全な「サバイバルモード」 ○ 起きる問題に振り回されて改善の時間がない ○ 「改善していこう!」と言うだけでは前に進めない状況 ○ なんとかして「ゆとり時間」を作らないといけない 52 参考: https://www.oreilly.co.jp/books/9784873118024/ ↓ 一人でたたき台を作ってしまおう!

Slide 53

Slide 53 text

#phpcon_nagoya #s どのようなリードをしてきたか ● ダッシュボードのたたき台を作成 ● チームイベントなどで共有し、サービスの状態が把握できることをアピール ● 気づきを得てチームで改善を繰り返すことで「チームの共通認識」に 53

Slide 54

Slide 54 text

#phpcon_nagoya #s 共通認識となったことで ● チームのメンバーが主体的に ○ オブザーバビリティ向上のためのログ・メトリクスの追加 ○ ダッシュボードへ新しい視点での監視の追加 ○ オブザーバビリティに関する研修への参加 54

Slide 55

Slide 55 text

#phpcon_nagoya #s 共通認識となったことで ● チームのメンバーが主体的に ○ オブザーバビリティ向上のためのログ・メトリクスの追加 ○ ダッシュボードへ新しい視点での監視の追加 ○ オブザーバビリティに関する研修への参加 55 ↓ チームでオブザーバビリティ向上アクションに取り組めるように

Slide 56

Slide 56 text

#phpcon_nagoya #s チームでオブザーバビリティに取り組めるようになる 56 早期問題の検知と対処 改善や機能開発に 使える時間が増える プロダクトの安定性向上 価値を高める機能の追加

Slide 57

Slide 57 text

#phpcon_nagoya #s チームでオブザーバビリティに取り組めるようになる 57 早期問題の検知と対処 改善や機能開発に 使える時間が増える プロダクトの安定性向上 価値を高める機能の追加 改善のループが回り始めた

Slide 58

Slide 58 text

#phpcon_nagoya #s まとめ 58

Slide 59

Slide 59 text

#phpcon_nagoya #s まとめ ● 小さく少しずつ始めよう ○ シンプルな監視や構造化ログの出力から着手し、少しずつ改善を積み重 ねる。 ● 価値を可視化しよう ○ ログやメトリクスを活用し、サービスが正しく価値を提供できているか わかるようにする。 ● チームで育てよう ○ ダッシュボードの共有や継続的な改善を通じて、オブザーバビリティを 文化として根付かせよう。 59

Slide 60

Slide 60 text

#phpcon_nagoya #s サービスのオブザーバビリティを高め ガードレールを作り安心安全な プロダクト開発につなげて価値を高めていこう 60

Slide 61

Slide 61 text

#phpcon_nagoya #s 参考資料 ● Re:Define 可用性を支える モニタリング、パフォーマンス最適化、そしてセキュリティ ○ https://speakerdeck.com/pyama86/re-define-ke-yong-xing-wozhi-eru-monitaringu-pahuomansuzui-shi-hua-sositesekiyuritei ● メトリクス、ログ、トレースをうまく使い分けて可観測性を高めよう! ○ https://speakerdeck.com/masayoshi/metorikusu-rogu-toresuwoumakushi-ifen-keteke-guan-ce-xing-wogao-meyou ● Observability Whitepaper ○ https://github.com/cncf/tag-observability/blob/whitepaper-v1.0.0/whitepaper.md#what-is-observability ● O'Reilly オブザーバビリティ・エンジニアリング ○ https://www.oreilly.co.jp/books/9784814400126/ ● O'Reilly エラスティックリーダーシップ ○ https://www.oreilly.co.jp/books/9784873118024/ 61

Slide 62

Slide 62 text

#phpcon_nagoya #s We are hiring!! - 株式会社カオナビ https://corp.kaonavi.jp/recruit /list/ 62 https://hrmos.co/pages/kaonavi/jobs/casual21 選考を希望する⽅ まずは話を聞いてみたいという⽅