我的应用由服务总线触发的Azure函数和经典API组成。我想在App Insights中为API和Azure函数添加2个可选参数。我已经为API完成了此操作(我使用遥测初始化程序),API是一个简单的接口,因为我可以在其中注入HttpContext(可选参数的值可以通过header访问),但是现在在azure函数中不能简单的使用HttpContext来访问这些参数(并使用ITELEMETRY),但是它们可以通过函数中使用的Helper方法访问。我想知道是否有办法只在使用此Helper方法时才向App Insight添加可选参数。
我第一次尝试添加这些参数时使用的助手函数(不起作用,不会向应用洞察添加任何内容)
public class FunctionHelper
{
private readonly IServiceProvider serviceProvider;
private static readonly TelemetryConfiguration telemetryConfiguration = TelemetryConfiguration.CreateDefault();
private readonly TelemetryClient telemetryClient = new(telemetryConfiguration);
public FunctionScopeHelper(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
public IServiceScope BuildServiceScopeWithContext(string parameter1, string parameter2)
{
var requestTelemetry = new RequestTelemetry
{
Name = "Function Telemetry"
};
var operation = this.telemetryClient.StartOperation(requestTelemetry);
requestTelemetry.Properties.Add(Parameter1, parameter1);
requestTelemetry.Properties.Add(Parameter2, parameter2);
this.telemetryClient.StopOperation(operation);
// rest of the helper method
return scope;
}
}
第二次尝试添加这些参数(仍然没有添加任何内容)
public class FunctionHelper
{
private readonly IServiceProvider serviceProvider;
private static readonly TelemetryConfiguration telemetryConfiguration = TelemetryConfiguration.CreateDefault();
private readonly TelemetryClient telemetryClient = new(telemetryConfiguration);
public FunctionScopeHelper(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
public IServiceScope BuildServiceScopeWithContext(string parameter1, string parameter2)
{
var requestTelemetry = new RequestTelemetry
{
Name = "Function Telemetry"
};
var operation = this.telemetryClient.StartOperation(requestTelemetry);
if (this.telemetryClient.Context.GlobalProperties is ISupportProperties)
{
this.telemetryClient.Context.GlobalProperties.Add(Parameter1, parameter1);
this.telemetryClient.Context.GlobalProperties.Add(Parameter2, parameter2);
}
this.telemetryClient.StopOperation(operation);
// rest of the helper method
return scope;
}
}
下面是我如何在API端处理它的(通过ITELEMETRYInitializer)
public class TelemetryInitializer : ITelemetryInitializer
{
private readonly IHttpContextAccessor httpContextAcessor;
public TelemetryInitializer(IHttpContextAccessor httpContextAcessor)
{
this.httpContextAcessor = httpContextAcessor;
}
public void Initialize(ITelemetry telemetry)
{
if (telemetry is not ISupportProperties supportPropertiesTelemetry)
{
return;
}
var httpContext = this.httpContextAcessor.HttpContext;
if (httpContext != null)
{
var (parameter1, parameter2) = HelperClass.GetParameters(httpContext);
var properties = supportPropertiesTelemetry.Properties;
if (properties.ContainsKey("Parameter1") || parameter1 == null || parameter2 == null )
{
return;
}
properties["Parameter1"] = parameter1;
properties["Parameter2"] = parameter2;
}
}
}
希望我解释得很好。谢谢帮助:)
我尝试用以下三种方法添加可选参数:
1.项目元素初始化程序(失败:功能应用程序中缺少httpContext)
1.使用RequestTelemetry.Add()通过helper方法添加(不向应用洞察添加任何内容)
1.使用TelemetryClient.Context.GlobalProperties.Add()通过helper方法添加(也不会向应用洞察添加任何内容)
1条答案
按热度按时间tf7tbtn21#
若要向Service Bus触发的Azure函数中的App Insights添加可选参数,可以使用
TelemetryClient.Context.GlobalProperties
属性。GlobalProperties
属性是一个字典,可用于存储与TelemetryClient
发送的所有遥测项关联的自定义属性。感谢
Peter Bons
的评论。可以将可选参数添加到
GlobalProperties
字典中。然后,您可以在Azure函数中调用
AddOptionalParameters
方法并传入可选参数的值。这些值将被添加到
GlobalProperties
字典中,并将与TelemetryClient
发送的所有遥测项目相关联。如果无法使用
ITelemetryInitializer
或RequestTelemetry.Add()
方法添加可选参数,则可以尝试使用TelemetryClient.TrackEvent()
方法将自定义事件发送到App Insights。然后,您可以修改
FunctionHelper
类,以使用可选参数发送定制事件。使用
optional parameters
将自定义事件发送到App Insights欲知更多信息,请参考MSDoc1和MSDoc2.