LoginSignup
26
24

More than 3 years have passed since last update.

Azure Functions の一押しツール Diagnose and solve problems

Last updated at Posted at 2020-10-20

自分で Functions を書いたりしていると、なぜかメモリリークしたり、CPU が 100% になったり、よくわからない Exception が沢山出て理由がわからないケースとかあるだろう。そういう時に使える最高なツールがある。みんな使ってるのだろうか?私がプロダクトチームに来て一番感動したのが、障害の診断ツールだ。障害の原因と対策が一発で見つかったりする。ホンマ最高。これはプロダクトチームしか使えないのかと思ったら、実はデベロッパーの皆さんにも使えるようになってるやん!これはシェアしておくしかない!

Diagnose and solve problems

image.png

これをクリックするとこんな画面になる

image.png

さて中の人の自分大興奮の機能の紹介です。マジでサポートにめんどくさいE-mail書いてる暇あったら、まずこれ見るほうがずっと早く解決するんちゃうかな?全AzureFunctionsユーザはこれに慣れとくと絶対いいと思います。 いくつかの機能を紹介したいと思います。

Availability and Performance

これだよ!これ、私がFunctionsチームに来て一番感動した機能が、フル機能じゃないけどここから使えるようになってる!これでマジ8割以上の問題は自分で解けちゃえるはず。使わな損やでマジ。クリック。

対象の時間

左上の箇所に対象の時間が選べるようになっている。すぐに反映されないので、ちょっと前の時間の方がよさげだ。デフォルトは Last 24 Hours

image.png

Change Details

最初はこの Function App に対する変更の記録。こういう診断をしていると、False Positive つまり、原因を勘違いで診断してしまいがち。自分でどうやっていじったかも忘れているはずなので、これで確認すると良い。

image.png

Application Insights Logging Sampling Enabled

host.json の設定の一部だけど、host.json は自分で設定したつもりでもできてないというケースもある。スペルミスとかで。たとえば、ここに、AppSettingsSampling が有効になっていることがわかる。この設定は、一定時間に一定以上のログが来るとログをランダムで送らないようにする設定なので、ログがロストする。「ログが来てないみたいなんだけど」系の問題はこれ起因がとても多いので、見てみるといいかも。

image.png

Function App Down or Reporting Errors

ここではいろいろなものが見れるけど、一般的な情報も見れる。あれ、これってどのプランだっけ?とか、どんな Functions があったっけ?
とかだ。Functions を書いたつもりだけど認識されていない(コーディングミス)とかもあるので、再確認しよう。

image.png

Function Executions and Errors

これはいつもとてもありがたい画面だ。

Functions どれぐらい失敗して、みたいなのが一目で見える。一番よく出るExceptionをこの画面から見れるので、そのExceptionを調べると問題の根本原因にたどり着きやすい。さらに、Functionごとのレイテンシも見れるので、どのFunctionに問題があるか楽に診断できる

image.png
image.png

Function Execution Performance

Functionsごとのパフォーマンスの診断が見れる。どのFunctionsが遅いか、早いかとか一目瞭然だ。

image.png

image.png

Function Cold Start

この診断は、Cold Start に関すること。ここで出ている Always On の設定は、Portalからは AppService PlanだとデフォルトでOnだが、Terraformとかでデプロイする人はOffになっていることがある。そうすると、折角 AppServicePlan でCold Start がないはずなのに、FunctionsHostが寝てしまうので、Cold Start が起こってしまう。注意が必要。
image.png

High CPU Analysis

High CPUの診断が出来る。これを見るとCPUパツパツやなぁとか一目瞭然。
image.png

SNAT Port Exaustion

Application Insights で、Socket Exception を見たらこいつを疑ったらいい。どういう診断をしてくれるかというと、Functions Host は、Stamp というグループの中でデプロイされている。そのスタンプが、持っているソケット数の上限が決まっている。だから、AppService や Azure Functions は、HttpClient を内部で何回も new して毎回インスタンスを作って、コネクションを張るコードにしていると、途中でコネクションがはれなくなって、ネットワーク系が全死ぬという恐ろしい現象が起こる。重大障害は大抵これが原因。未だによくある。対策は、コードを書くときに HttpClient とかほかのSDKのライブラリが確実に DI か、static で持つなどして、コネクションが毎回張られないようにすること。つまりコードをちゃんと書くしかない。と、このややこしい診断がここで一発でできる。ここでエラーが出たら、間違いなくあなたのコードに問題があるので気を付けよう。

image.png

TCP Connections

たまに、自分が使っているライブラリが、SNAT を引き起こしていて原因がわからないことがある。そんな時は、ここをみてみて、どこのTCPのアドレスにコネクションを作成しているかが、一撃でわかるので、IPアドレスから、あーあのサービスのクライアントがあかんのかーと判断できる。
image.png

Diagnostic Tools

これまたくそあついツールだ。CPUやメモリの問題が起きたらやっぱりプロファイルしたいだろう。ボタン一つでここからいける!

image.png

Collect .NET Profiler Trace

C# を使っている人だったら、ここから、ボタンを押すだけで、プロファイリングが出来る。このページから、Collect Profiler Trace を押すだけ。

image.png

ここでは無理やりCPUが高い状態を作り出してみた。この Live Metrics も自分のお気に入りの診断ツール。リアルタイムに状況を見ることができる。

image.png

こんな感じでスレッドダンプが見れる。多分ここでは、Libkafka のネイティブライブラリが高負荷なのだと思うが、.NET 分のみのプロファイルだが、自分が書いた部分のどの部分がCPUを消費しているとか一撃でわかる。最高や!

image.png

Collect Memory Dump

これまたメモリダンプをとって分析してくれるおしゃれ機能が存在する。最高!一旦診断を開始したら、終わるまで何もしないのが吉。一辺途中でデプロイしたら、メモリダンプできたのに、レポートが見れなかった。

image.png

しばらく待つと、かなり詳細な診断結果を見ることができる。
image.png
image.png

まとめ

ほんま、マジここにちょっと紹介した機能だけで、相当の問題が解決すると思う。これ以上のレベルになると、本当に細かいところは、Logs で Kusto クエリを書いて診断するのが良い。しかし、これまで紹介した機能でかなりの問題が診断できるはずだ。ボタン押すだけで。Azure Functions 使ってる人はホンマ使うしかないで!

image.png

Resource

26
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
24