ApplicationInsights - 如何跟踪WebAPI使用情况

时间:2017-05-04 14:00:42

标签: c# asp.net-mvc asp.net-web-api azure-application-insights

我已经使用ApplicationInsights几个月了。 虽然它通常适用于MVC和Web应用程序,但我有一些WebAPI服务应用程序,我想跟踪其使用情况。

例如,我的应用程序中有不同的RESTful API,我想看看每天(或在一段时间内)进行多少次调用以比较使用情况。

ApplicationInsights中的用法选项卡似乎是为HTML Web应用程序量身定制的。

有没有办法将它用于服务?

1 个答案:

答案 0 :(得分:2)

如果我正确地提出了您的问题,您希望根据用户确定每个API的使用情况。您已经拥有可用于每个API的请求数据,但无法根据用户进行过滤,因为我们无法跟踪每个遥测事件的用户。

如果您想根据用户或任何属性过滤遥测数据(请求,例外等),您需要在遥测事件的属性中使用它,以便您可以直接过滤它并生成图表。指标资源管理器。为此,您可以创建TelemetryInitializer

遥测初始化器允许您添加全局属性以及所有遥测数据,这意味着它将针对从您的应用发送的所有遥测事件执行。以下是跟踪UserID以及每个遥测事件的示例。我假设您将使用Windows身份验证为您设置User.Identity。只要在Http请求中设置了IPrinicipal,这也适用于任何其他身份验证(Azure AD,基于证书的身份验证等)。

public class UserTelemetryIntitializer : ITelemetryInitializer
{
    public void Initialize(Microsoft.ApplicationInsights.Channel.ITelemetry telemetry)
    {
        var context = HttpContext.Current;

        if (context == null)
            return;

        // If user has authenticated, add a property UserID to telemetry which will have
        //  * domain\\username for Windows Authentication
        //  * username@domain.com for Azure AD Authentication
        if (context.User.Identity.IsAuthenticated)
            telemetry.Context.Properties["UserID"] = context.User.Identity.Name;
        else
            telemetry.Context.Properties["UserID"] = "Null";
    }
}

请勿忘记使用ApplicationInsights.config加载遥测初始值设定项:

<ApplicationInsights>
  <TelemetryInitializers>
    <!-- Fully qualified type name, assembly name: -->
    <Add Type="MvcWebApp.Telemetry.UserTelemetryIntitializer, MvcWebApp"/>
    ...
  </TelemetryInitializers>
</ApplicationInsights>

或者,您也可以使用代码代替加载初始值设定项。在global.asax.csWebApiConfig.cs

protected void Application_Start()
{
    TelemetryConfiguration.Active.TelemetryInitializers
        .Add(new UserTelemetryIntitializer());
}

您可以阅读有关遥测初始化器here的更多信息。