監視@可観測性¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. 監視の要素¶
監視とは¶
既知のメトリクスとログを基に、システムにおける想定内の不具合の発生を未然に防ぐこと。
想定内という点で、可観測性と区別できる。
監視¶
▼ データの作成¶
監視対象が、データ (ログ、メトリクス) を作成する。
ここでは、ログ (アプリケーションログ、ブラウザのコンソールログ、ユーザーエンゲージメント、検索クローラーのサイト評価など) とメトリクス (メトリクスのデータポイント、、ユーザートラフィックなど) のみを取り上げる。
ただし、可観測性を実現するためには、スパンの作成も必要である。
▼ データの収集¶
監視バックエンドが、対象からデータを収集する。
プル型の場合、監視バックエンド自体がデータを収集する。
一方でプル型の場合、監視バックエンドがエージェントを提供しており、これがデータを監視バックエンドに送信する。
メトリクスはプル型またはプッシュ型の収集ツールからなり、ログと分散トレースはプッシュ型の収集ツールのみからなる。
▼ データの保管¶
収集したデータ (ログ、メトリクス) をストレージに保管する。
保管期間は、90
日が個人的には推奨である。
要件 | 説明 |
---|---|
ストレージ容量 | ログファイルのメトリクスのストレージのサイズを決める。メトリクスの場合、データポイント数を抑えて (例:収集間隔の拡大、ダウンサンプリング、重複排除) 、データサイズを小さくすると良い。 |
バックアップしないログ | 全てのログを保管するとストレージ容量を圧迫してしまうため、一部のログ (例:ヘルスチェックのアクセスログ) は捨てるように決めておくと良い。 |
バックアップの保管期間 (リテンション) | ログファイルのメトリクスのバックアップを実施し、また保管期間ポリシー (例:3 ヶ月) を決めておくと良い。 |
ローテーション | ログローテーションによって、ファイルを小さく分割して保管しておく。ログファイルやメトリクスのローテーション期間 (例:7 日) をポリシーとして決めておくと良い。ローテションされた過去のログやメトリクスのファイルでは、ファイル名の末尾に最終日付 (例:-20220101 ) をつけておく。 |
世代数 | ローテションの結果作成されるファイルの世代数 (例:5 ) をポリシーとして決めておくと良い。ただ、これは設定できないツールがある。 |
▼ データの分析¶
保管したデータ (ログ、メトリクス) を再集計し、新しいデータ (例:意味付けされた新しいメトリクス、ビジネス指標) として扱う。
注意点として、アラートのための再集計は、これに含まれない。
▼ データの可視化¶
分析したデータを監視バックエンドとして収集し、目視できるように可視化する。
▼ レポートの作成¶
算出値をグラフ化として、レポートを作成する。
▼ アラートの発火と通知¶
分析による集計値に異常がある場合、これをエラーイベントとして一次オンコール担当の開発者にアラートを通知する。
全ての異常値をアラートする必要はなく、異常値とみなすための重要度レベルを決めておく。
また、エラーイベントの場所を特定できるようにすると良い。
▼ オンコール¶
通知したアラートに基づいて、責任者 (インシデントコマンダー) にオンコールする。
責任者は、エラーイベントがインシデントか否かを判断する。
▼ インシデント管理¶
責任者 (インシデントコマンダー) は、オンコールの対応を担当者に割り振る。
オンコール担当者は、エラーを解決するためのタスクを作成し、完了させる。
エラーがインシデントの場合、担当者はこれを迅速に解決する必要がある。
▼ サービスレベルとの照合¶
インシデントによって、サービス利用者に提供できたサービスがサービスレベルに満たなかった場合、サービス利用者に利用料を返金する。
02. フロントエンドの監視¶
フロントエンドの監視とは¶
アプリケーションのフロントエンド領域 (特にブラウザ) を対象として、監視を実施する。
メトリクスの場合¶
▼ メトリクスの種類¶
メトリクスの種類 | 説明 |
---|---|
パーセンテージ系 | 割合を単位とするアプリケーションのフロントエンド領域のメトリクス |
時分秒系 | 時間を単位とするアプリケーションのフロントエンド領域のメトリクス |
カウント系 | 数を単位とするアプリケーションのフロントエンド領域のメトリクス |
▼ リアルユーザー監視 (RUM)¶
特にページ性能に関するメトリクスのデータポイントを収集し、監視する。
Webページのローディング時に、Navigation-timing-APIに対してリクエストを送信すると、Webページ性能に関するメトリクスのデータポイントを収集できる。
JavaScriptにNavigation-timing-APIにリクエストを送信する処理を組み込むと、ページ性能に関するメトリクスのデータポイントを収集できる。
*技術ツール例*
- Datadog RUM
- Grafana Faro
ページローディング時間は特に重要である。
Amazonの自社調査では、ローディング時間が100ms短くなるごとに、売り上げが1
%増加することが明らかになった。
4
秒以下を目指すと良い。
▼ Googleアナリティクスによる監視¶
特にサイト訪問後のユーザーエンゲージメントのデータポイントを収集し、監視する。
リアルユーザー監視の一種ともみなせるが、性能の監視が主目的ではなく、リアルユーザー監視と補完し合う監視方法である。
▼ Googleサーチコンソールによる監視¶
検索エンジン上 (サイト訪問前) のユーザーエンゲージメントのデータポイントを収集し、監視する。
▼ 合成監視 (外部監視、外形監視)¶
『外部監視、外形監視』ともいう。
実際のユーザーを模した一連の操作 (フロントエンドへのリクエスト) を実施し、またレスポンスに関するメトリクスのデータポイントを収集し、監視する。
ユーザーを模したリクエストを作成するという意味合いで、『合成』という。
ユーザー視点で監視できる。
特に、クリティカルユーザージャーニーの一連の操作を監視すると良い。
*技術ツール例*
- Datadogブラウザテスト
- Grafana Cloud Synthetic
ログの場合¶
ブラウザのコンソールログを収集し、監視する。
ログの種類 | 説明 |
---|---|
コンソールログ (Chromeの場合はconsole.log ファイル) |
ブラウザのコンソールログを出力する。 |
03. バックエンドの監視¶
バックエンドの監視とは¶
アプリケーションのバックエンド領域を対象として、監視を実施する。
メトリクスの場合¶
▼ メトリクスの種類¶
アプリケーションのメトリクスのデータポイントを収集し、監視する。
メトリクスの種類 | データポイントの内容 | 説明 |
---|---|---|
カウント系 | データポイントのタイムスタンプ、数 | 数を単位とするアプリケーションのバックエンド領域のメトリクス (例:リクエストの受信数、ログイン数) |
パーセンテージ系 | データポイントのタイムスタンプ、パーセンテージ | 割合を単位とするアプリケーションのバックエンド領域のメトリクス |
時分秒系 | データポイントのタイムスタンプ、処理時間 | 時間を単位とするアプリケーションのバックエンド領域のメトリクス (例:SQLにかかる時間、ビルドまたはデプロイの開始/完了時間、外部APIコールにかかる時間) |
▼ 性能 (APM)¶
『APM (アプリケーション性能監視) 』ともいう。
特に性能に関わるメトリクス (例:CPU使用率、レスポンスタイム、分散トレースにおけるマイクロサービス間のスループット、エラー率、リクエスト数、連続稼働時間) のデータポイントを収集し、監視する。
▼ カスタムメトリクス¶
サーバー内にStatsDエージェントをデーモンとして常駐させ、アプリケーションでstatsd
パッケージを使用すると、ユーザーの定義したカスタムメトリクスのデータポイントを収集できる。
AWS CloudWatchでは、StatsDからのメトリクスの送信をサポートしている。
ログの場合¶
▼ ログの種類¶
アプリケーションのログを収集し、監視する。
ログの種類 | 説明 |
---|---|
システムログ (/var/log/message ファイル) |
基本的にはOSやミドルウェアの処理のログの出力先ではあるが、場合よってはアプリケーション処理のログも出力する。 ・https://thinkit.co.jp/article/724/1 |
アプリケーションログ (ログファイルはフレームワークによる) | アプリケーションの任意の重要な処理 (アクセスログ、ログイン、ログアウトなど) のログを出力する。 |
クエリログ (/var/log/<ベンダー名>/general-query.log ファイル) |
アプリケーションからDBへのクエリ処理の内容をログとして出力する。 |
分散トレースの場合¶
記入中...
セキュリティの場合¶
記入中...
04. サーバー/コンテナの監視¶
サーバー/コンテナの監視とは¶
インフラ領域のうちで、サーバー/コンテナを対象として、監視を実施する。
メトリクスの場合¶
メトリクスの種類 | 説明 |
---|---|
パーセンテージ系 | 割合を単位とするサーバー/コンテナのメトリクス (例:CPU使用率、メモリ使用率、ディスク使用率) |
時分秒系 | 時間を単位とするサーバー/コンテナのメトリクス |
カウント系 | 数を単位とするサーバー/コンテナのメトリクス |
ログの場合¶
▼ ログの種類¶
ログの種類 | 説明 |
---|---|
システムログ (/var/log/message ファイル) |
OSやミドルウェアの処理ログを出力する。 ・https://thinkit.co.jp/article/724/1 |
セキュリティログ (/var/log/secure ファイル) |
OSのセキュリティ処理のログを出力する。 |
cronログ (/var/log/cron ファイル) |
OSのジョブ処理 (例:Unixであればcron) のログを出力する。 |
メールログ (/var/log/maillog ファイル) |
OSのメール処理のログを出力する。 |
印刷ログ (/var/log/spooler ファイル) |
OSの印刷処理のログを出力する。 |
OSブートログ (/var/log/boot.log ファイル) |
OSの起動処理のログを出力する。 |
セキュリティの場合¶
記入中...
05. ネットワークの監視¶
ネットワークの監視とは¶
インフラ領域のうちで、ネットワークを対象として、監視を実施する。
メトリクスの場合¶
記入中...
セキュリティの場合¶
記入中...
06. アクティブ型ヘルスチェック¶
アクティブ型ヘルスチェックとは¶
ヘルスチェックで監視したい対象に対して、定期的にリクエストを送信する。
アプリケーション、サーバー/コンテナ、ネットワークの場合¶
▼ ヘルスチェックの方法¶
ロードバランサーからヘルスチェックエンドポイントに専用のリクエストを送信し、ターゲットが正しく動作しているか否かを確認する。
OSI参照モデルのいずれのレイヤーまでの動作を確認するかによって、ヘルスチェックに種類がある。
ヘルスチェックの種類 | ヘルスチェックの範囲 | 方法 |
---|---|---|
L3 チェック |
L1 からL3 (ネットワーク層) まで |
サーバー/コンテナのIPアドレスにPing (ICMPエコーリクエスト) を送信し、レスポンスを検証する。Pingのレスポンスが正しく返信されれば、サーバー/コンテナまでのネットワークが正しく動作していると判断できる。 ・https://milestone-of-se.nesuke.com/nw-basic/ip/icmp/ |
L4 チェック |
L1 からL4 (トランスポート層) まで |
サーバー/コンテナのポートにTCPスリーウェイハンドシェイクを実行し、TCPコネクションを確立できるかを検証する。TCPコネクションの確立が成功すれば、サーバー/コンテナの開放ポートまでのネットワークが正しく動作していると判断できる。 |
L7 チェック |
L1 からL7 (アプリケーション層) まで |
サーバー/コンテナ上のアプリケーションのエンドポイントにHTTPリクエストを送信し、HTTPレスポンスを検証する。正しいHTTPレスポンスが返信されれば、アプリケーション自体とその開放ポートが正しく動作していると判断できる。 |
ジョブの場合¶
▼ ヘルスチェックの方法¶
ジョブ (定期的なバッチ処理) が正常に動作しているか否かを監視する。
ジョブの実装方法としては、例えばUnixのCronがある。
▼ Healthchecks.io¶
Cronの処理結果を監視する。
ジョブの最後に、ジョブの標準出力/標準エラー出力の内容をHealthchecks.ioに送信する。
これにより、ジョブの開始から最後のリクエストまでが、一定の時間内に完了するか否かを確認する。
# Cronの実行結果をHealthchecks.ioに直接的に送信する場合
8 6 * * * /foo-cron.sh && curl -fsS --retry 5 -o /dev/null https://hc-ping.com/ping/<healthchecksのID>
▼ Healthchecks.io と Runitor¶
curl
コマンドの代わりとしてRunitorを使用すると、標準出力/標準エラー出力の内容を人間がわかりやすいように整形してくれる。
Runitorを使用しない場合、Cronの標準出力/標準エラー出力の内容をそのままhealthchecks.ioに送信することになる。
# Runitorを介して、Cronの実行結果をHealthchecks.
# -api-url:healthchecks.ioのエンドポイント
# -uuid:healthchecks.ioのID
# --:ジョブの実行
8 6 * * * /usr/local/bin/runitor -api-url https://hc-ping.com/ping -uuid <healthchecksのID> -- /foo-cron.sh
クラウドプロバイダーの場合¶
▼ ヘルスチェックの方法¶
クラウドプロバイダーが正常に動作しているか否かを監視する。
クラウドプロバイダーの多くがステータスページを公開しているため、これを監視する。
06-02. パッシブ型ヘルスチェック¶
パッシブ型ヘルスチェックとは¶
実際のユーザーのリクエストを借りて、ターゲットが正しく動作しているか否かを確認する。
アクティブ型とは異なり、ユーザーを犠牲することになるため、Webサイトの信頼性が低下する可能性がある。
07. ビジネス成果の監視¶
ビジネス成果の監視とは¶
ビジネス成果の指標を対象として、監視を実施する。
ビジネス成果の指標 (例:KPI、業務プロセスに関する現在のステータス) の監視に特化したメトリクス監視バックエンドを、特に『BIツール (例:Redash、Metabase、Google Cloud Lookerなど) 』ともいう。
なお、BIツールはDBからビジネスに関するデータを収集し、監視できるようにする。