应用洞察 - 如何在 TelemetryInitializer 中使用 ISupportProperties

问题描述 投票:0回答:3

我有一个自定义的 AI 遥测初始化程序。最近,我开始收到编译器警告,说

Context.Properties
已过时: “TelemetryContext.Properties 已过时。使用 GlobalProperties 设置全局级别属性。对于项目级别的属性,请使用 ISupportProperties.Properties。”

  1. 我该怎么做?使用
    ISupportProperties.Properties
  2. 我正在根据请求记录主体中声明的租户 ID 和设备 ID。这被认为是应用程序全局还是支持属性?

    public class JsonTelemetryInitializer : ITelemetryInitializer
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly SystemOptions _systemOptions;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="accessor">For accessing the http context</param>
        /// <param name="systemOptions">System options</param>
        public JsonTelemetryInitializer(IHttpContextAccessor accessor, IOptions<SystemOptions> systemOptions)
        {
            _httpContextAccessor = accessor;
            _systemOptions = systemOptions.Value;
        }

        /// <summary>
        /// Initialize the custom telemetry initializer
        /// </summary>
        /// <param name="telemetry">Telemetry</param>
        public void Initialize(ITelemetry telemetry)
        {
            if (_httpContextAccessor.HttpContext == null)
            {
                return;
            }

            if (_httpContextAccessor.HttpContext.User.Identity.IsAuthenticated)
            {
                const string tenantId = "northstar_tenantid";
                if (!telemetry.Context.Properties.ContainsKey(tenantId))
                {
                    var user = _httpContextAccessor.HttpContext.User;
                    telemetry.Context.Properties[tenantId] =
                        ClaimsHelper.GetClaim<int>(user, TokenNames.TenantId).ToString();

                    var userId = ClaimsHelper.GetClaim<int>(user, TokenNames.UserId).ToString();

                    telemetry.Context.Properties["northstar_userid"] = userId;
                    var deviceId = ClaimsHelper.GetClaim<string>(user, TokenNames.DeviceId);
                    if (deviceId != null)
                    {
                        telemetry.Context.Properties["northstar_deviceid"] = deviceId;
                    }

                    telemetry.Context.User.Id = userId;

                    var sessionId = ClaimsHelper.GetClaim<string>(user, TokenNames.SessionId);
                    if (!string.IsNullOrEmpty(sessionId))
                    {
                        telemetry.Context.Session.Id = sessionId;
                    }
                }
            }
        }
    }

azure azure-application-insights
3个回答
16
投票

1.我该怎么做?使用 ISupportProperties.Properties?

只需将

ITelemetry
投射到
ISupportProperties

我的示例代码如下:

  using Microsoft.ApplicationInsights.Channel;
  using Microsoft.ApplicationInsights.DataContracts;
  using Microsoft.ApplicationInsights.Extensibility;

  public class MyTelemetryInitializer:ITelemetryInitializer
  {

     public void Initialize(ITelemetry telemetry)
     {
          //cast ITelemetry to ISupportProperties
          ISupportProperties propTelemetry = (ISupportProperties)telemetry;

          if (!propTelemetry.Properties.ContainsKey("isuport_key"))
          {
              propTelemetry.Properties.Add("isuport_key", "isupport_value");
          }

      }
  }

执行后,属性显示在azure门户中,截图如下:

2.我正在根据请求记录主体中声明的租户 ID 和设备 ID。这被认为是应用程序全局还是支持属性?

根据我的理解,您可以使用支持属性(项目级别),因为它与您之前使用的类似

telemetry.Context.Properties["northstar_deviceid"] = deviceId;


6
投票

我遇到了类似的问题并找到了这篇文章。 他们添加了向 TelemetryContext 添加属性的文档。 只需将 ITelemetry 转换为 RequestTelemetry。

public void Initialize(ITelemetry telemetry)
{
    var requestTelemetry = telemetry as RequestTelemetry;
    
    if (requestTelemetry == null) return;

    requestTelemetry.Properties["customProp"] = "test";
}

https://learn.microsoft.com/en-us/azure/azure-monitor/app/api-filtering-sampling#addmodify-properties-itelemetryinitializer


0
投票

我认为没有必要进行强制转换,您可以进行类型测试

例如,在 C# 7+ 中:

public class MyTelemetryInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        if (telemetry is ISupportProperties telemetryWithProperties)
        {
            telemetryWithProperties.Properties["mykey"] = "test";
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.