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

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

# Diagnose and solve problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/ba0364e3-6c76-dde9-ce50-646f0f624e75.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/031ba099-753f-5577-791a-436f41cb1eb5.png)

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


## Availability and Performance 

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

### 対象の時間

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/fa9c3728-bbad-5011-1800-e9e849cdff23.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/190d5388-0827-84ff-839e-02dd4bda2b4a.png)

### Application Insights Logging Sampling Enabled

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/4f22d166-a491-683e-cb36-0b472e363fd0.png)

### Function App Down or Reporting Errors

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/375aa8f0-7937-f940-bf10-a4ead136a587.png)

### Function Executions and Errors

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/866e2f73-2f35-0784-002d-3c5e179640b1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/67add9b7-1e6a-7453-e803-6bf4e96348a1.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/c1b72c91-b99f-4a3c-ef8a-28634d543a97.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/e2fff02c-3d4c-0f5b-13b0-4225f75f92d3.png)

### Function Cold Start
この診断は、`Cold Start` に関すること。ここで出ている `Always On` の設定は、Portalからは AppService PlanだとデフォルトでOnだが、Terraformとかでデプロイする人はOffになっていることがある。そうすると、折角 AppServicePlan でCold Start がないはずなのに、FunctionsHostが寝てしまうので、Cold Start が起こってしまう。注意が必要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/8a1038dc-7e97-fc67-8196-11dd83fa0fd8.png)

### High CPU Analysis 
High CPUの診断が出来る。これを見るとCPUパツパツやなぁとか一目瞭然。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/516ac579-1188-740f-3d75-8c7904bfb288.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/624bc31d-dd54-00bb-e823-5068d7ea0c50.png)

### TCP Connections
たまに、自分が使っているライブラリが、SNAT を引き起こしていて原因がわからないことがある。そんな時は、ここをみてみて、どこのTCPのアドレスにコネクションを作成しているかが、一撃でわかるので、IPアドレスから、あーあのサービスのクライアントがあかんのかーと判断できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/49797788-4fac-9892-1647-52517236c9a1.png)

# Diagnostic Tools

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/f5282700-9096-a656-450d-d52c50d1c942.png)

## Collect .NET Profiler Trace

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/2ac155e8-5f24-f925-34df-759066c7d36a.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/8e6d9893-2ca3-2d6d-3d1b-25b75a56ed64.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/3790b7ab-4443-1c2c-2738-80384d71cb00.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/856b5245-1c73-6baf-8274-6c0403b4c5f5.png)

しばらく待つと、かなり詳細な診断結果を見ることができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/f033db49-afa7-dc88-94db-f3f54e878b90.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/677248b6-2e58-6513-ef62-a5f1ad296db5.png)


# まとめ

ほんま、マジここにちょっと紹介した機能だけで、相当の問題が解決すると思う。これ以上のレベルになると、本当に細かいところは、Logs で [Kusto クエリ](https://qiita.com/TsuyoshiUshio@github/items/08a1ee8ca3e1c87ee2dc)を書いて診断するのが良い。しかし、これまで紹介した機能でかなりの問題が診断できるはずだ。ボタン押すだけで。Azure Functions 使ってる人はホンマ使うしかないで！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470/f3098816-940b-51dd-f9d8-8ccbcc79485c.png)

# Resource
* [App Service Diagnostics – Profiling an ASP.NET Web App on Azure App Service](https://azure.github.io/AppService/2018/06/06/App-Service-Diagnostics-Profiling-an-ASP.NET-Web-App-on-Azure-App-Service.html)
* [Remote Profiling support in Azure App Service](https://azure.microsoft.com/en-us/blog/remote-profiling-support-in-azure-app-service/)