Webエンジニアのブログ

「入門 監視」を読んでの感想とメモ

2ヶ月前の発売日に買って積んでいた「O'Reilly Japan - 入門 監視」を読んだ。

監視に関して今まで「もっと改善できる点があるんだろうな」と色々課題に感じていたが、この本を読んで疑問が晴れていったように思う。監視は「質問を投げかける行為」という考えや、監視すべきメトリクス、そしてアラートやオンコールについても述べられている。

特に自分はOSの標準メトリクス(CPU使用率など)を適当に監視してきた質なので、色々反省するべき点が見つけられた。よりユーザに近い点、特にフロントエンドに関する監視はほとんどできていないので、WebpageTestのCIも本格的に考えていきたい。

以下は要点のメモ。

1章:監視のアンチパターン

  • 何もかもがひと目で分かるような万能なツールは存在しない
  • 自分でツールを作る場合は、小さく何かに特化したものだけにする
  • 監視は専門の人でなくチーム全員がやるべき仕事である
  • OSのメトリクスはあまり意味がない(正常に動いていれば高いCPU使用率も問題ない)
  • メトリクスは最低でも60秒に1回は取得しなければ、監視していないのも同然
  • 監視するだけでは壊れたシステムは直らない

2章:監視のデザインパターン

  • 専門家されたツールを複数使い監視する。
  • 監視を構成する要素は「データ収集」「データストレージ」「可視化」「分析とレポート」「アラート」
  • 監視は、質問を投げかけるためにある
  • ユーザに近いところから監視を始める(ロードバランサやCDNなど)
  • これは「何が問題なのか」は教えてくれないが「何かが問題である」ことは教えてくれる
  • 成熟した企業でない限り、自分で監視ツールを作るべきではない。SaaSの方が安くつき、そして優れていることがほとんどである

3章:アラート、オンコール、インシデント管理

  • 監視とは、あるシステムやそのシステムのコンポーネントの振る舞いや出力をチェックし続ける行為
  • アラートは緊急の対応が求められ、システムがダウンしてしまう時に送るもの
  • すぐに対応する必要のないものはチャットやチケットの自動生成などの形式にする
  • 起こったオンコールを元にシステムの安定性を上げる計画を立てる
  • 対応手順を書く(何のサービスか、どんな依存性があるか、インフラの構成、メトリクスの意味など)
  • インシデント後は、何が起きたのか、なぜ起きたのか、どうやって修正したのかの議論の場を常に設けるべき
  • その場で誰かを避難することは絶対にあってはいけない。

4章:統計入門

  • 平均は多くの種類のデータセットに広く適用できる
  • 中央値もデータセットによってはかなり便利
  • 周期性は、時系列のデータのパターンについて表現する良い方法
  • パーセンタイルはデータの大部分を理解できるものだが、極端なデータは無視している

5章:ビジネスを監視する

  • ビジネスKPIを技術指標に結びつける(記事投稿がKPIなら、記事投稿の失敗率とレイテンシ)
  • ビジネスKPIが分からないならプロダクトマネージャに聞く

6章:フロントエンド監視

  • ページロード時間が1秒遅くなると、PVが11%、CVが7%、顧客満足度が16%下がると言われている
  • Amazonではロード時間を100ms改善するごとに売上が1%増えることを実証した
  • フロントエンド監視にはリアルユーザ監視(RUM)とシンセティック監視がある
  • Google AnalyticsなどはRUM、WebpageTest.orgなどはシンセティック監視を行う
  • ブラウザはNavigation Timing APIという仕様に基づいたAPIでパフォーマンスメトリクスを公開している
  • 他にも視覚的なロード時間を計測するSpeed Indexがある
  • WebpageTestのAPIを使って定期的にパフォーマンスを計測し監視する

7章:アプリケーション監視

  • StatsDはコード中にメトリクスを追加するためのツール
  • ビルドやデプロイのメトリクスを他のメトリクスと組み合わせることで新しい視点を得られる
  • /healthエンドポイントを用意し、そこでDBや依存サービスの正常性をまとめて監視する
  • なんでもログを取るのではなく、トラブルシューティング時にあったら便利な情報を質問するように取る

8章:サーバ監視

  • ユーザに近いメトリクスを監視しろとは言ったが、OSのメトリクスも役に立つ
  • SNMPは機能追加が大変でセキュアではないため、サーバ監視に使わない
  • Webサーバにおいてパフォーマンスレベルを測るのに最適なのが秒間リクエスト数
  • データベースでは秒間クエリ数やスロークエリを監視する
  • キャッシュではキャッシュのヒット・ミス比率を監視する
  • バックアップなどのスケジュールジョブの監視として、バックアップデータが存在しない場合にアラートを送ると良い

{ "name": "hareku", "job": "Software Engineer" }