我正在使用v2.x创建一个新的Function应用程序,并且正在集成Application Insights以自动进行请求记录,因为Azure Function现在已与App Insights集成在一起(如文档link中所述)。我需要做的是在Application Insights Request Telemetry中的自定义维度中记录几个自定义字段。是否可以不使用自定义请求日志记录(使用TrackRequest
方法)
答案 0 :(得分:0)
关于添加自定义属性,您可以参考本教程:Add properties: ITelemetryInitializer。以下是我测试的HTTP触发功能。
public static class Function1
{
private static string key = "Your InstrumentationKey";
private static TelemetryClient telemetry = new TelemetryClient() { InstrumentationKey = key };
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
if (!telemetry.Context.Properties.ContainsKey("Function_appName"))
{
telemetry.Context.Properties.Add("Function_appName", "testfunc");
}
else
{
telemetry.Context.Properties["Function_appName"] = "testfunc";
}
telemetry.TrackEvent("eventtest");
telemetry.TrackTrace("tracetest");
string name = req.Query["name"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
return name != null
? (ActionResult)new OkObjectResult($"Hello, {name}")
: new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}
}
运行此功能后,转到Application Insights搜索可以检查数据或转到Logs(Analytics)。
更新:
答案 1 :(得分:0)
您应该在功能应用程序中使用ITelemetry初始化程序(可以将自定义维度添加到指定遥测中,仅用于请求),请按照以下步骤操作(请注意,请从azure门户而不是本地运行功能应用程序< / strong>):
1。在Visual Studio中,创建一个功能应用程序(在我的测试中,我创建了一个Blob触发功能),并安装以下nuget包:
Microsoft.ApplicationInsights, version 2.10.0
Microsoft.NET.Sdk.Functions, version 1.0.29
2。然后在Function1.cs中,编写如下代码:
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System.IO;
[assembly: WebJobsStartup(typeof(FunctionApp21.MyStartup))]
namespace FunctionApp21
{
public static class Function1
{
[FunctionName("Function1")]
public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, ILogger log)
{
log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}
}
internal class MyTelemetryInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
//use telemetry is RequestTelemetry to make sure only add to request
if (telemetry != null && telemetry is RequestTelemetry && !telemetry.Context.GlobalProperties.ContainsKey("my_custom_dimen22"))
{
telemetry.Context.GlobalProperties.Add("my_custom_dimen22", "Hello, this is custom dimension for request!!!");
}
}
}
public class MyStartup : IWebJobsStartup
{
public void Configure(IWebJobsBuilder builder)
{
builder.Services.AddSingleton<ITelemetryInitializer, MyTelemetryInitializer>();
}
}
}
3。将其发布到azure,然后导航到azure门户->已发布的功能应用程序->监视器->添加应用程序见解。
4。从天蓝色运行该功能。并等待几分钟->导航至应用程序洞察门户,检查遥测数据,您会看到自定义维度仅添加到请求遥测中:
答案 2 :(得分:0)
其他解决方案并没有完全回答这个问题,即如何向请求遥测添加自定义属性。有一个非常简单的解决方案,在您的函数代码中添加以下内容:
Activity.Current?.AddTag("my_prop", "my_value");
您需要:
using System.Diagnostics;
这可以是每个函数调用/请求动态的,而不是固定的全局属性。