しばやん雑記

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

Application Insights で IP が取れない件と ASP.NET Core で Telemetry Initializer を追加する方法

ASP.NET Core アプリケーションに Application Insights を追加して使ってましたが、いつからかクライアントの IP アドレスが 0.0.0.0 になってしまってました。

元々最後のオクテットは 0 になってたのは知ってましたが、なんか不具合化と思ってました。

軽く検索してみると GDPR の関係で IP アドレスを保持するのを止めたみたいです。*1

https://social.msdn.microsoft.com/Forums/en-US/d7587623-25d0-4982-bb5e-2cb167ea59a0/client-ip-logged-as-0000-but-geolocation-is-logged-correctly?forum=ApplicationInsights

Azure Monitor Status Archive | Microsoft Community Hub

なので、Application Insights が自動的に取っているデータからは IP アドレスを取ることは出来ません。もし IP アドレスが必要な場合は Telemetry Initializer を使ってカスタムデータとして送信しろと書いてます。

適当に IP アドレスを送信する Telemetry Initializer を書きました。IP アドレスは既に Application Insights が Location.Ip に設定してくれているので、これをそのまま送信することにします。

public class CustomIpTelemetryInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        if (!(telemetry is RequestTelemetry requestTelemetry))
        {
            return;
        }

        requestTelemetry.Context.Properties["client-ip"] = requestTelemetry.Context.Location.Ip;
    }
}

テストなので特にマスクなどの処理を入れてないですが、GDPR が関係する場面だともうちょっと考える必要があるのかも知れません。知らんけど。

作成した Telemetry Initializer ですが、ASP.NET の場合は ApplicationInsights.config に追加すれば有効になってましたが、ASP.NET Core の場合は DI に追加すると有効になります。これ知りませんでした。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ITelemetryInitializer, CustomIpTelemetryInitializer>();

    services.AddMvc();
}

ITelemetryInitializer としてシングルトンで追加します。XML を書くより簡単になった気がします。

デプロイすれば、それ以降のテレメトリに IP アドレスが含まれるようになります。

ASP.NET Core での Telemetry Initializer の追加方法を知らなかったので良い勉強になりました。それにしても GDPR 絡みは地獄感しかないですね。

*1:GDPR では IP アドレスは個人情報に該当するか微妙そうだけど、安全側に倒したということのようだ