クラウド技術DevOpsアプリケーション開発こんにちは。@mosuke5です。みなさん普段の監視はどのように行っていますか?Datadog使っていますか?最近Datadogを触る機会が多いのですが、Datadogはobservabilityの3本柱ということで、メトリックとトレース(APM)とログ、この3つを統合した監視サービスであることを強くおしだしています。3つの分野のそれぞれに対応したOSSやサービスは多いですが、統合されてシームレスに連携できる点はDatadogの非常に強いポイントと感じます。強力だったので紹介したいのと、その仕組みを探っていきましょう。APMとはなにか、なぜ必要か従来的な監視との違い今回に至るまで、APMは名前は聞いたことがありましたが、実際に利用したことはありませんでした。Monigoringの略で、名前から想像ができる通りアプリケーションに関するモニタリングです。アプリケーションのモニタリングというと、通常の監視となにも変わらないように思えるのですが下記の点で異なります。APM専用のライブラリをアプリケーションに組み込んで、「実際のユーザからのリクエスト」に対するパフォーマンスやエラーを計測、監視する。(※1)アプリケーションのプロセスが動いているか確認する。外形監視として定期的に、アプリケーションにリクエストを発行して正常か確認する。実際のユーザのリクエストではなく、監視のためのリクエスト。アプリケーションが出力したログからエラーが出ていないか監視する。「従来的なアプリケーションの監視」とは、私のAPMに出会う前のアプリケーションの監視の認識をもとに書いています。必要か?なぜAPMが必要なのでしょうか?一番の理由はアプリケーションのパフォーマンスがビジネスにおいてより重要な役割を果たすようになってきたからでしょう。アプリケーションがどんどん複雑化していて、パフォーマンスの改善やエラーの特定が難しくなってきているからです。このような状況にもかかわらず、APMを利用してみて感じたことなのですが、いかに今まで自らのアプリケーションの監視ができていなかったか痛感します。それは、やはり今までは外側からしかアプリケーションを監視していなかったからです。アプリケーションのことはアプリケーションが一番よく知っているわけで、内側から計測していかないといけません。どのようなものか具体的にどのようなメトリックを収集できるのか例をあげてみます。各リクエストごとの処理時間、ボトルネックとくに各リクエストごとの処理時間やボトルネックが追えるのが魅力的です。下記は、あるリクエストでエラーが発生したときのAPMの画面です。どこの処理でなんのエラーがでているか簡単に追うことができます。そのときのホストのリソース状況も同時に確認できます。動画もありましたので、イメージをわいてもらうために掲載しておきます。APMの場合、導入も非常に簡単です。このブログではあまり手順的な話にしたくないので、こちらも1分の動画がありましたので参考にしてください。してできるのかドキュメントのインストールの手順の通りで言えば、ライブラリを入れて、アプリケーションの設定ファイルに数行書くだけ。それだけで、上のようなことができてしまうわけです。APMですが、どんな情報を取得しているのか気になります。分散システムやマイクロサービスのでなくてもトレースは実現できるし役に立ちます。ひとつのモノリシックなアプリケーションの中での各処理もトレーシングを使ってみていくことができます。(分散トレーシングに対してシングルトレーシングなんていったりするらしいです)まずは、トレーシングの簡単な概要について説明します。下記のような簡単な処理を行うWebアプリケーションの1つのリクエスト例に考えてみましょう。下図のように3つのIDが振られて管理されていきます。各処理に3つのIDをふることで親子関係を認識し、またここには書いてませんが、それぞれの処理の開始時間と終了時間がわかれば下記のような図が書けます。APMではこのようなことを実際のアプリケーションに対して行ってくれます。一連のトレースを管理するID。この例でいうとすべて同じ。IDが0のものは一番親でありはじめの処理。それぞれの処理のID実際のトレースのログ上で簡単な例として見ていきましたが、実際のアプリケーションでどのようになっているのでしょうか。デフォルトの設定だとトレースのログの出力がされませんが、設定を変更してログファイルを出力させてみると理解ができますのでやってみます。APMを導入したものです。設定の変更Datadogの設定において、下記のようにmy-custom.logにログを出力するようにしておきます。Logger.new(f)endトレースログこちらが実際に、Redmineのトップページにアクセスしたときに出力されたログのはじめの部分です。サンプルの例でみたものよりももっとたくさんの情報で構成されています。データベースからの情報取得についてみてみると、実際に発行されたSQLもデータとして扱われています。ゆえに、どのSQLの処理がボトルネックになっているか判断したりできるわけです。分散トレーシングまでは実施していないのですが、考え方は基本的に同じです。他の異なるサービスにたとえばHTTP経由でアクセスする場合には、HTTPヘッダーにx-datadog-trace-idやx-datadog-parent-idを追加することで、他のシステムの処理であっても紐づけすることができます。Mapと呼ばれる分散システム間でのマッピングがかけるわけです。まとめAPMの魅力や仕組みについて理解できましたでしょうか。APMを体験すれば、アプリケーションをいかに理解していないか痛感することもあると思います。トレーシングときくと最近は分散トレーシングの文脈で聞くことが多いですが、普段身近に扱っているもっと小規模なシステムでも十分にトレーシングの考え方を応用できます。自分自身が動かしているアプリケーションの運用状態を本当に理解できているか、監視・計測できているか、あらためて問いかけてみましょう。Shopを使ったマイクロサービス体験のハンズオン「捉」2019年振り返り「LeanとDevOpsの科学」を読んで。