我通过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
答案 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函数调用。
还有其他方法可以对痕迹进行排序吗?
正如您所提到的,您不相信时间戳字段,因此您可以将日期时间存储到自定义跟踪中。然后你就可以知道记录的顺序了。例如article。
// Track a Metric
var metric = new MetricTelemetry("Test Metric", DateTime.Now.Millisecond);
UpdateTelemetryContext(metric.Context, context, name);
telemetryClient.TrackMetric(metric);