- モニタリングは、事前定義されたメトリクスとアラートを使用して、既知の問題を監視します。
- 可観測性 は、システムの内部状態をその出力からどの程度理解できるかということです。
- ログ、メトリクス、トレースは一般的なシグナルですが、それらを収集しても洞察が保証されるわけではありません。
- これらは連携して機能します。監視することで警報が発せられ、監視することで原因を見つけることができます。
ダッシュボードは緑色ですが、顧客はチェックアウトが壊れていると苦情を言っています。この立場にいたことがある方なら、モニタリングと可観測性の違いをすでに理解しているでしょう。あなたの監視は、あなたがチェックすべきと考えたものをチェックしただけであり、この失敗は新しいものです。
このガイドでは、両方のアイデアをマーケティング用語を使わずに説明し、1 つの架空の事件を警告から根本原因まで追跡します。ログ、トレース、数値はプロセスを説明するために考案されたものです。また、ベンダーと実務者はこの線引きの仕方が異なり、マーケティング上の区別の一部であると考える人もいることを知っておく必要があります。私たちは実践的な部分に重点を置いています。
短い答え
モニタリングはアクティビティです。 CPU、エラー率、ディスク容量など、何を監視するかを事前に決定し、アラートをトリガーするしきい値を設定します。 「私が心配していた事は起こったのでしょうか?」と答えます。
可観測性はシステムの特性です。この用語は制御理論に由来しており、外部出力からシステムの内部状態をどの程度正確に推測できるかを表します。実際には、「何が起こっているのか、またその理由は何ですか? (予想していなかった問題も含めて)」と答えます。
車のことを考えてみましょう。ダッシュボードの警告灯が監視しています。これらは一連の既知の問題をカバーしています。整備士の完全な診断ポートは、エンジンのあらゆる部分について新しい質問をすることができ、可観測性に近づいています。
監視と可観測性を並べて見る
| アスペクト | モニタリング | 可観測性 |
|---|---|---|
| 主な質問 | 何か問題がありますか? | なぜ間違っているのでしょうか? |
| こんな方に最適 | 既知の故障モード | 未知の新しい失敗 |
| アプローチ | 事前定義されたチェックとダッシュボード | 豊富なデータのオープンな探索 |
| 典型的な出力 | アラートとステータスグラフ | 新しい質問への答え |
| データ詳細 | 集約されることが多い | 可能な場合はリクエストごとに詳細を記載 |
| セットアップ | 外部からチェックを設定する | コードをインストルメント化する必要がある |
| 使用者 | オペレーション、オンコールスタッフ | 開発者とオンコールスタッフ |
これは二者択一ではありません。いつ見るべきかを知らせるアラートが依然として必要です。
モニタリングだけでは不十分な理由
1 つのサーバー上に 1 つのアプリケーションがあれば、問題が発生する可能性のあるもののリストはかなり短いため、すべてを監視できます。最新のシステムには、数十のサービス、キュー、サードパーティ API に加えて、行き来する コンテナ が含まれる場合があります。障害は、1 つのリージョン、1 つの顧客タイプ、特定のアプリのバージョン、および 1 つの遅い依存関係など、誰も予測しなかった組み合わせになります。
自分が考えていない質問について、事前にダッシュボードを作成することはできません。後で質問できるデータが必要です。
ログ、メトリクス、トレース
これら 3 種類のテレメトリは、可観測性の柱と呼ばれることがよくあります。それぞれが異なる質問に答えます。
| 信号 | それは何ですか | 答え | 弱点 |
|---|---|---|---|
| メトリクス | 経時的な数値 | いくらですか?悪化していますか? | 単一イベントの詳細 |
| ログ | 個々の出来事の記録 | いったい何が起こったのでしょうか? | 費用がかかり、騒音が発生する可能性があります |
| 痕跡 | サービスを介したリクエストのパス | 時間はどこへ行ったのでしょうか? | 計測器が必要であり、サンプリングされることが多い |
メトリクス
http_requests_total{service="checkout", status="500"} 1832
http_request_duration_seconds{service="checkout", quantile="0.95"} 2.4
メトリクスは保存コストが低く、クエリも迅速に実行できるため、ダッシュボードやアラートに最適です。多くのメトリック システムでは、ユーザー ID などのカーディナリティの高いラベルを使用すると、コストが大幅に増加する可能性があるため、注意してください。
痕跡
トレースは、複数のサービスにわたる 1 つのリクエストに従います。各ステップは開始時刻と期間を持つ スパン です。
POST /checkout 2410 ms
├─ auth-service: verify token 18 ms
├─ cart-service: load cart 42 ms
├─ pricing-service: calculate 2290 ms <-- slow
│ └─ SELECT coupons ... 2265 ms
└─ payment-service: not reached
トレースにより、遅いステップが明らかになりますが、これを別のサービスの別のログで確認するのは非常に困難です。
ログ
ログには、ある瞬間に何が起こったかの詳細が記録されます。これらをすぐに役立つようにする方法を見てみましょう。
事件のウォークスルー
架空の例で、ピースがどのように組み合わされるかを次に示します。
| ステップ | 信号 | 私たちが学ぶこと |
|---|---|---|
| 1. 警報火災 | メトリック | チェックアウト p95 レイテンシが目標の 1 秒を超えました |
| 2. 分解する | メトリック | 影響を受けるのはモバイルアプリのみであり、Web には影響しません |
| 3. リクエストを検査する | トレース | 時間は価格設定サービス、クーポン クエリです |
| 4. 詳細を読む | ログ | スローリクエストはすべて今日のキャンペーンのクーポンを使用します |
| 5.原因を確認する | クエリプラン | クーポン検索に適切なインデックスがありません |
| 6. 修正してください | 導入 | インデックスを追加し、レイテンシーが回復するのを確認します |
モニタリングはステップ 1 を処理しました。その後はすべて可観測性でした。各質問が前の回答からどのように派生したかに注目してください。 「今日のキャンペーンのモバイル アプリ クーポンのクエリ」用のダッシュボードを事前に構築できた人は誰もいませんでした。修正自体については、SQL クエリの最適化 に関するガイドで、その種の計画を読み取る方法が示されています。
より良いログ
プレーン テキスト ログは人間の目のために作成されており、クエリするのは困難です。 構造化ログは、マシンがフィルタリングできる次のフィールドを使用します。
# Hard to search
ERROR Payment failed for user 42 after 3 tries
# Easy to search
{"level":"error","event":"payment_failed","user_id":"42",
"attempts":3,"provider":"acme","trace_id":"a1b2c3","duration_ms":2410}
2 番目の形式を使用すると、「過去 1 時間でプロバイダーごとに何回障害が発生しましたか?」をすぐに尋ねることができます。 trace_id フィールドは、ログ行がアクセスされたすべてのサービスにわたるリクエスト全体にリンクされるため、特に価値があります。
パスワード、トークン、カード番号は決して記録しないでください。個人データには注意してください。私たちのガイドで説明されているように、JWT はログから読み取る誰でも再利用できます。
ヒント: バージョン、リージョン、顧客層、機能フラグの状態など、インシデント中に必要なコンテキストを追加します。 「1 つの地域にはバージョン 2.14 のみ」と言えると、多くの場合、問題は自動的に解決されます。
黄金の信号
何を監視すればよいかわからないですか? Google のサイト信頼性エンジニアリングの本では、ユーザー向けシステムに対する 4 つのシグナルが提案されています。
| 信号 | 質問 | 例 |
|---|---|---|
| レイテンシ | リクエストにはどれくらい時間がかかりますか? | p95 および p99 の応答時間 |
| 交通 | どれくらいの需要があるのでしょうか? | 1秒あたりのリクエスト数 |
| エラー | 失敗したリクエストは何件ありますか? | 5xx 回答 の割合 |
| 彩度 | システムはどのくらい充実していますか? | CPU、メモリ、接続プールの使用量 |
負荷テストとストレス テストで示したように、平均値では遅いリクエストが隠れてしまうため、レイテンシーにはパーセンタイルを使用します。
人々が信頼するアラート
アラートが常に発せられると、人々はアラートを読まなくなります。優れたものはいくつかのルールに従います。
- ユーザーが感じている症状に関する警告。 「2% を超えるチェックアウト エラー」が「CPU 85%」を上回ります。誰も害を及ぼさない高い CPU は、誰も起こしてはなりません。
- すべてのアラートを実行可能にします。 誰も何もする必要がない場合は、ダッシュボード アイテムにするか、削除します。
- ランブックへのリンク。 どこを調べて何を試すべきかを応答者に伝えます。
- 定期的に確認してください。 先月無視されたアラートは削除または修正してください。
サービスレベルの目標
SLO は、「サイトは高速で信頼性が高くなければならない」を、「30 日間でチェックアウト リクエストの 99.9% が成功する」などの測定可能な目標に変えます。これにより、エラー バジェットとして知られる約 0.1% の失敗が許容されます。十分に残っている場合はより早く発送できますし、使い切ってしまう場合は信頼性を優先できます。これは、配信速度と安定性の間の議論を解決するのに役立つ方法です。
OpenTelemetry とツール
OpenTelemetry は、テレメトリを生成およびエクスポートするためのオープンソースでベンダー中立の標準です。これは、Cloud Native Computing Foundation のプロジェクトです。これをインストルメント化すると、コードを書き直すことなく、後でバックエンドを変更できるようになります。それ自体はストレージまたはダッシュボード製品ではないため、次のいずれかと組み合わせます。
| 目的 | オープンソースの例 | 商用例 |
|---|---|---|
| メトリクス | プロメテウス | Datadog、New Relic |
| ダッシュボード | グラファナ | データドッグ、ダイナトレース |
| ログ | ロキ、オープンサーチ | スプランク、エラスティック |
| 痕跡 | イェーガー、テンポ | ハニカム、データドッグ |
これらの製品は頻繁に変更されるため、現在の機能と価格をご自身で確認してください。データ量が増えるとコストが急速に増大する可能性があるため、サンプリングを使用し、保持制限を設定します。
始め方
- 最も重要なサービスについては、ゴールデン シグナルから始めます。
- ユーザーが気づいた症状について 1 つまたは 2 つのアラートを追加。
- 構造化ログに切り替えます。各行にリクエスト ID が含まれます。
- 自動インストルメンテーションは多くの一般的なフレームワークをカバーできるため、OpenTelemetry を使用してメインのユーザー ジャーニーにトレースを追加します。
- デプロイメントをグラフにリンクすると、CI/CD パイプラインからのリリースによって変更が生じたかどうかを確認できます。
- それぞれのインシデントから学びます。 それぞれのインシデントの後に、どのようなデータがあればより早く解決できたかを尋ね、それを追加します。
1 つのサービスを扱う小規模なチームには、巨大なプラットフォームは必要ありません。基本的なメトリクス、適切なログ、およびいくつかのアラートがあれば十分かもしれません。サービスの数が増えるにつれて、トレースはその価値を維持していきます。
よくある間違い
- ツールを購入し、それを可観測性と呼びます。価値は、優れたインストルメンテーションとデータの使用方法から生まれます。
- 3 つの柱をチェックリストとして扱う。 個別のデータをリンクする方法がなく、タブを探し回る必要があります。共有IDは重要です。
- すべてを収集する。 フィルタリングされていないテレメトリは高価になり、ノイズも増えます。
- ダッシュボードが多すぎます。 少数の信頼できるビューは、誰も開かない 100 のビューよりも優れています。
- テストの代わりになると考えています。 リリース前にはまだテストが必要です。ただし、カナリア リリースはこれらのシグナルとよく合います。
まとめ
監視することで何か問題が発生したことがわかり、可観測性によってその理由を見つける手段が得られます。実践的なテストは簡単です。見慣れない問題が発生したときに、新しいコードを出荷せずに原因を見つけることができますか?次回、事件に遭遇したときは、答えられなかった質問をすべて書き留めてください。そのリストがロードマップです。
よくある質問
モニタリングとオブザーバビリティの違いは何ですか?
モニタリングでは、事前定義されたメトリクスを追跡し、既知の問題に関するアラートを生成します。可観測性とは、予期しない問題を含め、システムの出力からシステムの状態を理解する能力です。
可観測性の 3 つの柱とは何ですか?
それらはログ、メトリック、トレースです。ログはイベントを記録し、メトリクスは経時的な値を測定し、トレースはサービス全体にわたる単一のリクエストを追跡します。
モニタリングがある場合、可観測性は必要ですか?
小規模で単純なシステムの場合は、適切な監視とログで十分な場合があります。システムが分散化され、障害の予測が困難になるにつれて、可観測性の価値が高まります。
オープンテレメトリーとは何ですか?
これはオープンソースの標準であり、ログ、メトリクス、トレースを作成およびエクスポートするためのツールのセットであるため、単一ベンダーのエージェントに縛られません。
4つの黄金の信号とは何ですか?
それらは、遅延、トラフィック、エラー、飽和です。 Google の SRE ガイダンスでは、これらをユーザー向けシステムの監視の開始点として推奨しています。
学び続ける
テスト、WordPress、または SEO についてサポートが必要ですか?
私たちは、チームがより優れたソフトウェアを出荷し、サイトを成長させるのを支援します。あなたが取り組んでいることを教えてください。明確な次のステップを提案します。
詳しいガイドはこちら テスト、AI、最新の開発
この記事は気に入りましたか?トピックを選択して、最新のチュートリアルに直接アクセスしてください。
AI 幻覚の説明: 言語モデルが物事をでっち上げる理由とそれを軽減する方法
AI 幻覚について説明しました。幻覚とは何か、言語モデルが幻覚を生成する理由、一般的な種類、グラウンディングとプロンプトで幻覚を軽減する方法、そして私たちが実行した簡単なチェックです。
記事を読む →DevOps環境変数の説明: .env ファイル、シークレット、および設定が正しく行われている
実行した Python の例を使用して環境変数について説明します。環境変数の読み取りと設定、すべての値が文字列である理由、.env ファイル、プロセスの継承、シークレット、検証について説明します。
記事を読む →ソフトウェア開発API レート制限の説明: アルゴリズム、ヘッダー、および 429 エラーの処理
API レート制限については、実行したシミュレーションで説明します。トークン バケット、固定ウィンドウ、スライディング ウィンドウ、429 応答、レート制限ヘッダー、バックオフによる再試行、およびテスト制限です。
記事を読む →テスト自動化Python でのモッキング:unittest.mock、patch、およびテストを嘘にする間違い
Python でのunittest.mockによるモック、テスト済み: モックとreturn_value、side_effect、名前が使用されている場所のパッチ、仕様と自動仕様、日付のモック、およびよくある間違い。
記事を読む →ソフトウェアテストコードカバレッジの説明: 回線カバレッジとブランチカバレッジ、および 100% の実際の意味
実際のcoverage.pyの実行でコードカバレッジを説明: 行、分岐、条件のカバレッジ、レポートの読み取り、100%のカバレッジでもバグを見逃す可能性がある理由、および賢明なターゲット。
記事を読む →データベースとSQLSQL における DELETE、TRUNCATE、DROP: 違い、ロールバック、およびそれぞれをいつ使用するか
DELETE、TRUNCATE、DROP について、テスト済み SQL を使用して説明します。それぞれの削除内容、ロールバック、トリガー、ID リセット、速度、PostgreSQL、MySQL、SQL Server、SQLite の違いについて説明します。
記事を読む →データベースとSQLSQL ビューの説明: 作成、使用、落とし穴の回避、例を示します
SQL ビューについて、実行したクエリとともに説明しました。ビューの作成、ライブ結果、列の非表示、パフォーマンス、更新可能なビューと具体化されたビュー、壊れた依存関係、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発TypeScript インターフェイスと型: 実際の違い、コンパイラでテスト
TypeScript インターフェイスと型、実際のコンパイラでチェック: 両方でできること、片方だけでできること、宣言のマージ、拡張と交差、および従うべき簡単なルール。
記事を読む →ソフトウェア開発Python *args と **kwargs の説明: 柔軟な関数と明確な例
Python の *args と **kwargs について、実行したコードで説明しました。パッキングとアンパッキング、パラメーターの順序、キーワードのみの引数と位置のみの引数、デコレーター、一般的なエラーです。
記事を読む →ソフトウェア開発Python Lambda 関数: 構文、実際の用途、および使用すべきでない場合
Python のラムダ関数について、実行したコードとともに説明します。構文、キーによるソート、マップとフィルター、クロージャー、遅延バインディング トラップ、通常の def がより適切な選択である場合。
記事を読む →人工知能AIエージェントとは何ですか?シンプルなエージェント ループを実行できる仕組み
AIエージェントとは何ですか?エージェント ループ、ツール、メモリ、ガードレール、実行した小さな Python ループ、実際のリスク、およびシンプルなチャットボットがより良い選択である場合についてのわかりやすいガイドです。
記事を読む →DevOpsモニタリングと可観測性: ログ、メトリクス、トレースによる本当の違い
モニタリングと可観測性について説明: 既知および未知の障害、ログ、メトリクスとトレース、チェックアウト インシデントのウォークスルー、ゴールデン シグナル、OpenTelemetry、および便利なアラート。
記事を読む →DevOpsDocker ボリュームとバインド マウント: コンテナ データを正しい方法で保持する
Docker ボリュームとバインド マウントについて説明します。コンテナ データが消える理由、名前付きボリューム、バインド マウント、tmpfs、Compose の例、バックアップ、アクセス許可、およびそれぞれをいつ使用するかについて説明します。
記事を読む →テスト自動化TDD と BDD: 主な違い、1 つの機能が両方の方法で構築され、それぞれをいつ使用するか
TDD と BDD は、両方の方法で構築された 1 つの割引機能で説明されています。実行したコードによるレッド-グリーン-リファクタリング、Given-When-Then シナリオ、ツール、トレードオフ、およびそれぞれをいつ使用するかです。
記事を読む →ソフトウェア開発Git mergeとrebaseの違い:例と使い分け
Git mergeとrebaseの違いを、実際のログ出力、比較表、rebaseの黄金律、安全なチームワークフローで解説します。
記事を読む →ソフトウェア開発Pythonのリスト内包表記:構文・例・使うべきでない場面
Pythonのリスト内包表記を解説:構文、フィルタ、if-else、ネストしたループ、実測した処理時間、そして通常のforループの方が良い場面。
記事を読む →データベースとSQLSQL JOINを例で解説(Inner・Left・Right・Full)
サンプルのテーブルとクエリでSQL JOINを順に解説。INNER、LEFT、RIGHT、FULL、CROSS、SELFに加え、よくある間違いとパフォーマンスのコツも紹介します。
記事を読む →