4つのテレメトリーデータを活用し、アプリの問題原因を特定する
ここまで、メトリクス、ログ、トレース、プロファイルについて見てきました。それぞれに得意・苦手とする部分があることをご理解いただけたと思います。
さて、これらのテレメトリーデータを上手に活用して、オブザーバビリティを高めていきましょう(画像はSplunk Observability Cloudのスクリーンショット)。
システム概況把握から問題調査・原因特定まで
まずは典型的な活用例を見てみましょう。
(1):あるアプリケーションにおいて、あるタイミングからエラー率が高まっていることに気づきます。「なんらかの問題が起きているのでは」と考え、調査を始めます。
(2):このアプリケーションが動いているノードのメトリクスを確認してみますが、リソースが逼迫している様子はなさそうです。
(3):エラー率が高まった時間帯の処理にフォーカスしてみると、いくつかエラーが含まれているトレースが確認できます。
(4):エラーが含まれているトレースを開いてみます。どうやら paymentservice でエラーが発生(赤い「!」マーク)し、それに影響を受けてcheckoutservice でもエラーが出ている(薄いピンクの「!」マーク)ようです。
(5):エラーとなっている paymentservice のスパンをクリックすると、トレースに付与されているタグ情報を確認できます。gRPC Status Code = 401が返っていることが分かります(401は認証エラーを示しますが、このことを知らなくても問題ありません。さらに調査を続けていきましょう)。
(6):このトレースに関連したログだけを抽出して確認してみます。該当のトレースIDを持ち、Severity = Error のログだけを表示すると、Invalid API Token というエラーメッセージや、”test”から始まるトークンの情報が確認できます。開発段階で利用していたトークンを誤って本番環境でも使ってしまっていることがエラー率上昇の原因だったと理解できそうです。
いかがでしょうか。この流れを見てみると、以下のように調査を進めていっていることが分かるはずです。
- メトリクスから全体概況を理解……(1)(2)
- メトリクスから問題に関連するトレースを発見して調査……(3)
- トレースから問題発生箇所を特定し、その内容を確認……(4)(5)
- トレースに関連するログを抽出し、ログから問題原因を特定……(6)
別の例に派生しますが、トレースに含まれるスパンの処理時間が非常に長くなっている箇所が見受けられた場合、そのスパンが表す時間帯・処理のスタックトレースを確認するというようなこともできます。
さらにその時間帯や、対応するスパンに関連するプロファイルにフォーカスして分析することもできます。フレームグラフだけでなく、関数やメソッドの実行時間や実行回数を統計処理して理解できるようになっています。
このように、「メトリクスで状況把握、トレースで問題箇所を特定、ログで問題原因を特定、プロファイルでコード上のボトルネックを見つける」という、テレメトリーデータの長所を踏まえた活用によって、システム内部状態の理解を高めることができるようになっていくのです。
もちろん、(1)(2)でメトリクスを参照するそのきっかけとして、メトリクスに基づく監視を設定することも可能です。一般的な監視と同様、メトリクスに対して、アラートを発生させる条件(静的・動的な閾値や監視間隔、アラートの重大度など)を指定しておくだけです。
上の例で、メトリクスからトレース、トレースからログやプロファイルへと関連するデータに移動していきましたが、こういったデータの相関付けと調査の動線は、オブザーバビリティバックエンドがその機能を提供しています。そのため、基本的には、テレメトリーデータを同一のオブザーバビリティバックエンドに集約しておくことが推奨されます。
仮にテレメトリーデータの送信先が別のバックエンドに分かれている場合だと、運用者が複数のコンソールやWebページを開いて、目視でデータを相関付けていくことになってしまいます。従来からの運用において、例えばCSV出力した統計情報をExcelでグラフ化し、一方でログファイルを別のコンソールで開いて目で追いかけて……といった問題調査をした経験をお持ちの方もいらっしゃるかと思いますが、目を皿にしてデータを読み解くのは効率的ではないですし、見逃してしまったり、熟練者でないとその関係性を理解できなかったりします。理解したい事象や状態が置かれているコンテキストを維持しながら、関連するデータを参照し理解を深めていくためには、同一のオブザーバビリティバックエンドにデータを集め、バックエンド側でデータを相関させユーザに提示してくれる機能を活用していくのがベストプラクティスと言えます。