「入門 監視」を読んだメモ
書籍情報
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. 統計入門
5. ビジネスを監視する
- ビジネスの KPI を計測するために技術的なメトリクスを利用する(対応付けをする)
- Reddit のビジネスの KPI と技術的なメトリクスの対応例
- 現在サイトに滞在しているユーザ: 現在サイトに滞在しているユーザ
- ユーザのログイン: ユーザのログイン失敗、ログインのレイテンシ
- コメント投稿: コメント投稿失敗、投稿のレイテンシ
- スレッド作成: スレッド作成失敗、作成のレイテンシ
- 投票: 投票失敗、投票のレイテンシ
- プライベートメッセージの送信: プライベートメッセージ送信失敗、送信のレイテンシ
- Gold 購入: 購入失敗、購入のレイテンシ
- 広告購入: 購入失敗、購入のレイテンシ
6.2 フロントエンド監視の 2 つのアプローチ
- リアルユーザ監視(Real User Monitoring=RUM)
- メトリクスに実際のユーザトラフィックを使う
- 各ページに JavaScript を仕込み、ユーザがページをロードすると、監視サービスに対してメトリクスを送信する
- シンセティック監視(Synthetic Monitoring)
- 外部から動作確認する: Pingdom, Mackerel の URL 外形監視
- 自動テストにも組み込めると良い
- https://en.wikipedia.org/wiki/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. サーバ監視
- サーバ監視に SNMP を使うのは避けたほうがよい。他の優れた方法を使うべき
- collectd, Telegraf, python-diamond など
- Web サーバでの重要なメトリクス
- データベースでの重要なメトリクス
9. ネットワーク監視
- 帯域幅
- ある接続から一度に送れる理論上の最大情報量
- 秒間メガビット(Mbps)などが使われる。秒間メガバイト(MBps)と混同しないように注意する
- 高速道路で例えるなら車線数
- スループット
- ある接続から一度に送れる実際の最大情報量
- スループット計測の便利ツール: iperf2
- 高速道路で例えるなら実際に通行している車の数
- レイテンシ
- パケットがネットワークリンクを通じてやり取りされるのにかかる時間
- 高速道路で道路の長さ