App Insights跟踪是无序的(Azure Functions应用程序)

时间:2018-03-05 02:01:56

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

我通过App Insights integration将Azure Functions [{1}}输出发送到Application Insights。当我寻找痕迹时,它们不会按顺序出现。例如,我可以运行像

这样的查询
TraceWriter

并从此调用中获取19条跟踪记录。但是在他们之间他们只有5个独特的traces | where operation_Id == "<guid>" | order by timestamp asc s,因此记录不会以完美的顺序返回。

还有其他方法可以对痕迹进行排序吗?

此查询确认发送到App Insights的时间是毫秒分辨率 - 如果是这样。 (微观和纳米总是= 0)。

timestamp

2 个答案:

答案 0 :(得分:2)

我正在等待App Insights团队的官方回答,看看我们是否可以提供更高的精确度,但我们可能会受DateTime.Now

的支配

[更新]:看起来App Insights会改进这一点。他们提出了两个问题:

在解决这些问题之前,解决方法仍然适用。

但是,您可以使用Stopwatch添加自己的测量值,甚至可以在App Insights中对其进行排序。您可以使用structured logging capabilities in ILogger

执行此操作

一个简单的例子:

using System.Net;
using System.Diagnostics;

public static HttpResponseMessage Run(HttpRequestMessage req, ILogger logger)
{
    // offset the Stopwatch with the current ticks so multiple runs don't overlap.
    var startTicks = DateTime.UtcNow.Ticks;
    Stopwatch sw = Stopwatch.StartNew();
    logger.LogInformation("[{PreciseTimeStamp}] Log 1", (startTicks + sw.ElapsedTicks).ToString());
    logger.LogInformation("[{PreciseTimeStamp}] Log 2", (startTicks + sw.ElapsedTicks).ToString());
    logger.LogInformation("[{PreciseTimeStamp}] Log 3", (startTicks + sw.ElapsedTicks).ToString());
    logger.LogInformation("[{PreciseTimeStamp}] Log 4", (startTicks + sw.ElapsedTicks).ToString()); 
    logger.LogInformation("[{PreciseTimeStamp}] Log 5", (startTicks + sw.ElapsedTicks).ToString());
    sw.Stop();

    return req.CreateResponse(HttpStatusCode.OK);
}

这将输出如下内容:

2018-03-06T19:46:32.278 [Info] [636559623922781779] Log 1
2018-03-06T19:46:32.278 [Info] [636559623922783356] Log 2
2018-03-06T19:46:32.278 [Info] [636559623922784381] Log 3
2018-03-06T19:46:32.278 [Info] [636559623922785325] Log 4
2018-03-06T19:46:32.278 [Info] [636559623922786254] Log 5

在App Insights中,您可以使用order by tolong(customDimensions.prop__PreciseTimeStamp) asc进行排序。但由于时间戳在消息中,您也可以按此排序。

如果您想获得更好的功能,可以将新列添加到跟踪中,而不会在消息中显示如下的日志助手:

public static void LogWithPrecision(ILogger logger, string message, long ticks)
{
    var state = new Dictionary<string, object>
    {
        ["PreciseTimeStamp"] = ticks.ToString()
    };

    logger.Log(LogLevel.Information, 0, state, null, (s, e) => message);
}

您可以按照与上述相同的方式进行排序,但不会在消息中显示勾号。

答案 1 :(得分:1)

  

我正在寻找特定Azure函数调用的跟踪,它们不按顺序出现

实际上,同一操作总是有三种消息状态。如您所知,他们的时间戳是相同的。您可以过滤 operation_Id 消息状态以获取特定的Azure函数调用。

enter image description here

  

还有其他方法可以对痕迹进行排序吗?

正如您所提到的,您不相信时间戳字段,因此您可以将日期时间存储到自定义跟踪中。然后你就可以知道记录的顺序了。例如article

// Track a Metric
var metric = new MetricTelemetry("Test Metric", DateTime.Now.Millisecond);
UpdateTelemetryContext(metric.Context, context, name);
telemetryClient.TrackMetric(metric);