「入門 監視」を読んだメモ

書籍情報

https://www.oreilly.co.jp/books/9784873118642/

1.1 アンチパターン 1: ツール依存

  • 成功したチームが使っているから、という安直な理由でツールを採用してはいけない
  • 自分や自分のチームにツールが合っている必要がある

1.3 アンチパターン 3: チェックボックス監視

  • 「動いている」とはどういう意味か。「動いている」かどうかを監視しよう
    • 高レベルなチェックが実施できるか検討しよう
    • Web アプリケーションなら / に GET して、200 が返るか、ページに特定の文字列があるか、リクエストのレイテンシが小さいかなど
  • メトリクスは最低でも 60 秒に 1 回すべき

1.4 アンチパターン 4: 監視を支えにする

  • 問題を解決するためにアプリケーションを改修するのではなく、監視項目を追加することは避ける

2.1 デザインパターン 1: 組み合わせ可能な監視

  • モノシリックな監視ツールより、専門化されたツールを組み合わせて、監視プラットフォームを作ったほうがいい
  • モノシリックな監視ツール全体を置き換えるより、特定のツールだけ変更できるほうがよい
  • 監視システムを構成する要素
    • データ収集
    • データストレージ
    • 可視化
    • 分析とレポート
    • アラート

データ収集

  • 収集方法にはプッシュ型とプル型が存在する
  • メトリクスデータとは
    • カウンタ: Web サイトの累計訪問者数など
    • ゲージ: ある時点の値
  • ログデータとは
    • 非構造化ログ

      192.34.63.77 - - [26/Jun/2016:14:06:22 -0400] "GET / HTTP/1.1" 301 184 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/47.0.2526.111 (StatusCake)" "-"

    • 構造化ログ

      { "remote_addr": "192.34.63.77",
      "remote_user": "-",
      "time": "2016-06-26T14:06:22-04:00",
      "request": "GET / HTTP/1.1",
      "status": “301”,
      "body_bytes_sent": “184”,
      "http_referrer": "-",
      "http_user_agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36
      (KHTML, like Gecko) Chrome/47.0.2526.111 (StatusCake)",
      "http_x_forwarded_for": "-" }

分析とレポート

  • SLO などが関連する
  • 監視対象のシステムが依存コンポーネントを持っている場合、システムはそのコンポーネントの可用性を超えることはできない
    • クラウドプラットフォームの可用性が 99.95% なら、システムの可用性は 99.95% を超えることができない

3.1 どうしたらアラートをよくできるか

  • アラート=緊急の対応が求められるもの
    • 例. Web サーバのダウンなど
  • まずは対応を自動化できないか検討する
  • オンコール担当のローテーション間隔は 3 週間以上を推奨する
  • アラートをレポートとして出力できると、システム改善の役に立つ
  • ある値が X(固定のしきい値) を超えた場合のアラート(チェック監視)には意味がないこともある。変化量を監視したほうがいいこともある(メトリクス監視)
    • 空き容量が 10% 以下でアラート よりも 一晩でディスク使用量が 50% 増加でアラート のほうが役に立つかも
  • 不要なアラートは削除・しきい値の変更をする。または対応を自動化できないか検討する
    • 削除前にはアラートに対する過去のアクションを分析してもいい
  • アラートへの対応
    • すぐにアクションが必要なアラートへの対処(アラートの本来の定義)
      • SMS や PagerDuty などを使う
    • 注意が必要だが、すぐにアクションは必要ないアラートへの対処
      • 社内チャットやメール
    • 履歴や診断のために保存しておくアラートへの対処
      • ログファイルに保存する

4. 統計入門

  • 移動平均
    • 平滑化することで極端な値を隠す。ただし重要かも知れないデータも見えなくなる
  • 中央値
    • 一方向に大きな偏りがあるデータセットを扱うときに使うと良い
  • パーセンタイル
    • 50パーセンタイル=中央値

5. ビジネスを監視する

  • ビジネスの KPI を計測するために技術的なメトリクスを利用する(対応付けをする)
  • Reddit のビジネスの KPI と技術的なメトリクスの対応例
    • 現在サイトに滞在しているユーザ: 現在サイトに滞在しているユーザ
    • ユーザのログイン: ユーザのログイン失敗、ログインのレイテンシ
    • コメント投稿: コメント投稿失敗、投稿のレイテンシ
    • スレッド作成: スレッド作成失敗、作成のレイテンシ
    • 投票: 投票失敗、投票のレイテンシ
    • プライベートメッセージの送信: プライベートメッセージ送信失敗、送信のレイテンシ
    • Gold 購入: 購入失敗、購入のレイテンシ
    • 広告購入: 購入失敗、購入のレイテンシ

6.2 フロントエンド監視の 2 つのアプローチ

  • リアルユーザ監視(Real User Monitoring=RUM)
    • メトリクスに実際のユーザトラフィックを使う
    • 各ページに JavaScript を仕込み、ユーザがページをロードすると、監視サービスに対してメトリクスを送信する
  • シンセティック監視(Synthetic Monitoring)

6.3 DOM

  • ページロード時間は 4 秒以下を目指す
  • ページ表示時にロードされる JavaScript が多いと、それだけロード時間が増加する
  • Navigation Timing API を使い、ロード時間を計測する

7. アプリケーション監視

  • Go の構造化ロガー
  • StatsD: メトリクス保存に使われるツール。アプリケーションにコードを追加する
  • ビルドやデプロイなどの情報も監視データとして保存しておくと、他のメトリクスと組み合わせることができる
    • 特定のデプロイから500エラーが増加しているなどが判明するかも
  • マイクロサービスでは監視に分散トレーシングが使われることがある
  • /health エンドポイントを追加する
    • 特定の IP のみアクセスを許可すること。ユーザには公開しないほうがいい
    • 本文は構造化フォーマットがおすすめ
    • 以下はアプリケーションが依存する MySQL と Redis も確認している例
from django.db import connection as sql_connection
from django.http import JsonResponse
import redis


def check_sql():
    try:
        with sql_connection.cursor() as cursor:
            cursor.execute("SELECT 1 FROM table_name")
            cursor.fetchone()
        return {"okay": True}
    except Exception, e:
        return {"okay": False, "error": e}


def check_redis():
    try:
        redis_connection = redis.StrictRedis()
        result = redis_connection.get("test-key")
        if result == "some-value":
            return {"okay": True}
        else:
            return {"okay": False, "error": "Test value not found"}
    except Exception, e:
        return {"okay": False, "error": e}


def health():
    if all(check_sql().get("okay"), check_redis().get("okay")):
        return JsonResponse({"status": 200}, status=200)
    else:
        return JsonResponse(
            {
                "mysql_okay": check_sql().get("okay"),
                "mysql_error": check_sql().get("error", None),
                "redis_okay": check_redis().get("okay"),
                "redis_error": check_redis().get("error", None),
            },
            status=503,
        )

8. サーバ監視

9. ネットワーク監視

  • 帯域幅
    • ある接続から一度に送れる理論上の最大情報量
    • 秒間メガビット(Mbps)などが使われる。秒間メガバイト(MBps)と混同しないように注意する
    • 高速道路で例えるなら車線数
  • スループット
    • ある接続から一度に送れる実際の最大情報量
    • スループット計測の便利ツール: iperf2
    • 高速道路で例えるなら実際に通行している車の数
  • レイテンシ
    • パケットがネットワークリンクを通じてやり取りされるのにかかる時間
    • 高速道路で道路の長さ

10. セキュリティ監視

付録 C 実践 監視 SaaS

  • 監視 SaaS の利点
    • コスト
    • 難易度の高い監視ツールの運用を SaaS 提供者に任せることができる
    • 利用者はプロダクト開発に集中できる
    • 使いやすいデザインが提供されることで、チーム全員が監視システムに積極的にアクセスでき、属人化を避けることができる
    • バージョンアップ作業が不要
  • OS メトリクスの収集の役割を 健康診断 で例える
    • 健康診断で肝機能の γ-GPT が高かったとする
    • 多分お酒の飲みすぎが原因
    • この場合、本来監視すべきは酒量だが、大まかな変化は検出できた
  • ユーザ視点のシンセティック監視(URL 外形監視)から監視を始めるのがおすすめ