向请求遥测添加自定义维度-Azure功能

时间:2019-07-17 10:18:17

标签: azure azure-functions azure-application-insights

我正在使用v2.x创建一个新的Function应用程序,并且正在集成Application Insights以自动进行请求记录,因为Azure Function现在已与App Insights集成在一起(如文档link中所述)。我需要做的是在Application Insights Request Telemetry中的自定义维度中记录几个自定义字段。是否可以不使用自定义请求日志记录(使用TrackRequest方法)

3 个答案:

答案 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)。

enter image description here

enter image description here

更新:

enter image description here

enter image description here

答案 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。从天蓝色运行该功能。并等待几分钟->导航至应用程序洞察门户,检查遥测数据,您会看到自定义维度仅添加到请求遥测中:

enter image description here

答案 2 :(得分:0)

其他解决方案并没有完全回答这个问题,即如何向请求遥测添加自定义属性。有一个非常简单的解决方案,在您的函数代码中添加以下内容:

Activity.Current?.AddTag("my_prop", "my_value");

您需要:

using System.Diagnostics;

这可以是每个函数调用/请求动态的,而不是固定的全局属性。