如何在Azure功能中的Application Insights遥测中添加customDimensions中的更多条目

时间:2017-07-14 14:51:26

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

我正在尝试将Azure App Insights与Azure功能应用程序(HttpTriggered)集成。我想在" customDimensions"中添加我自己的键和值。请求表的对象。现在它只显示以下内容:

查询

requests
| where iKey == "449470fb-****" and id == "5e17e23e-****" 

我明白了:

LogLevel: Information
Category: Host.Results
FullName: Functions.FTAID
StartTime: 2017-07-14T14:24:10.9410000Z
param__context: ****
HttpMethod: POST
param__req: Method: POST, Uri: ****
Succeeded: True
TriggerReason: This function was programmatically called via the host APIs.
EndTime: 2017-07-14T14:24:11.6080000Z

我想添加更多关键值,例如:

EnvironmentName: Development
ServiceLine: Business

根据this回答,我实现了ITelemetryInitializer接口,如下所示:

public class CustomTelemetry : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as RequestTelemetry;
        if (requestTelemetry == null) return;
        requestTelemetry.Context.Properties.Add("EnvironmentName", "Development");

    }
}

以下是Azure Function App的run.csx代码如下所示:

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, ExecutionContext context, TraceWriter log)
{
    // Initialize the App Insights Telemetry
    TelemetryConfiguration.Active.InstrumentationKey = System.Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY", EnvironmentVariableTarget.Process);
    TelemetryConfiguration.Active.TelemetryInitializers.Add(new CustomTelemetry());
    TelemetryClient telemetry = new TelemetryClient();

    var jsonBody = await req.Content.ReadAsStringAsync();
    GetIoItemID obj = new GetIoItemID();
    JArray output = obj.GetResponseJson(jsonBody, log, telemetry);

    var response = req.CreateResponse(HttpStatusCode.OK);
    response.Content = new StringContent(output.ToString(), System.Text.Encoding.UTF8, "application/json");
    return response;
}

但这不起作用......

1 个答案:

答案 0 :(得分:0)

我相信,由于您在此示例中自己创建了TelemetryClient,因此您不需要费心去遥测初始化程序,您可以这样做

var telemetry = new TelemetryClient();
telemetry.Context.Properties["EnvironmentName"] = "Development";
直接

,该遥测客户端的该实例发送的所有内容都将设置这些属性。

如果您无法控制谁创建遥测客户端并且想要触摸在何处创建的每个遥测项目,那么您需要遥测初始化器吗?

我不知道TelemetryClient实例如何在azure函数的下游使用,但我并不完全正面。

编辑:来自azure函数的帖子,它说:

  

我们将努力让Application Insights为生产做好准备   工作负载。我们也在聆听您的反馈意见。请提交   它在我们GitHub上。我们将添加一些更好的新功能   采样控制和自动依赖跟踪很快。我们希望   你会试一试,然后开始更深入地了解你的情况   功能正在发挥作用。您可以阅读有关其工作原理的更多信息   https://aka.ms/func-ai

来自该func-ai链接的示例有几点:

1)它在前面静态创建遥测客户端一次(而不是每次调用该函数)

private static TelemetryClient telemetry = new TelemetryClient();
private static string key = TelemetryConfiguration.Active.InstrumentationKey = System.Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY", EnvironmentVariableTarget.Process);

并且在它正在执行的函数内部:

telemetry.Context.Operation.Id = context.InvocationId.ToString();

与您可能使用遥测客户端创建的事件正确关联,以便您也可以这样做。

2)您可以使用创建的遥测客户端,但他们创建了自己的遥测客户端并在那里发送数据,因此您在遥测客户端的上下文中触摸的任何内容都不是&n #az;由天蓝色的功能本身看到。

所以,对我而言,我可以尝试一些事情:

在你的类中添加一个静态构造函数,并在那个静态构造函数中,执行你在上面做的遥测初始化程序。可能这会在天蓝色函数开始创建请求并调用方法之前将遥测初始值设定项添加到上下文中吗?

如果这不起作用,您可能需要在他们的GitHub上发帖或通过电子邮件发送文章中列出的人员以获取有关如何执行此操作的更多详细信息?