しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

SignalR のメトリクスを Application Insights に直接送信する

まともに触ったのは数年振りという感じがしますが、前々から SignalR のメトリクスはパフォーマンスカウンターに書き込まれるようになっていて、App Service などから扱いにくいなと思ってました。

最近は ARM 経由で App Service のパフォーマンスカウンターが取れるようになってますが、一部の値だけなので扱いにくいことには変わりないです。

特に SignalR のカウンターはインストールが必要なので、この時点で App Service では無理です。

そもそも Application Insights を使っているなら、パフォーマンスカウンターを経由せずにテレメトリを送信すればよいのではと思ったので、Telemetry Module を書いてみました。

インストールして、ApplicationInsights.config に TelemetryModule を追加すれば良いです。

<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
  <TelemetryModules>
    <Add Type="SignalR.AppInsights.SignalRPerformanceCollectorModule, SignalR.AppInsights" />
  </TelemetryModules>
</ApplicationInsights>

アプリケーションをデプロイすれば、SignalR のメトリクスが Application Insights で確認できるようになります。今は 60 秒間隔でカスタムのパフォーマンスカウンターとして送信しています。

Application Insights で確認できるようになるまで少しかかりますが、しばらくすると選択肢に SignalR のパフォーマンスカウンターが出てくるようになります。

f:id:shiba-yan:20180416134247p:plain

実際に Web App を 3 インスタンス用意して、Backplane として Redis を設定したアプリケーションに対して、トランスポートを切り替えて 200 接続ぐらい行った時の値です。

接続毎にメッセージを 100ms 間隔で送信しているので、秒間のメッセージ数がかなり多いことが把握できます。Backplane のメトリクスはパフォーマンスカウンターがないと把握出来ない値でしたが、Application Insights に送信すれば一目で分かりますね。

f:id:shiba-yan:20180416134235p:plain

今は SignalR のパフォーマンスカウンターの値を全て送信していますが、この辺り設定可能にしておいても良いのかなと少し思っています。

余力があれば config から変更可能にしようかなという気分です。