Azure functions Azure函数应用程序洞察上下文

Azure functions Azure函数应用程序洞察上下文,azure-functions,azure-application-insights,Azure Functions,Azure Application Insights,我们有一组azure函数记录执行上下文的度量。。。您似乎无法使用OOTB TraceWriter或ILogger实现这一点,至少在我所看到的情况下是这样的,因为没有一个与我假设的log.LogEvent等价的东西 所以。。此url显示了一种利用Azure函数内部的TelemetryClient执行相同操作的模式,并提供了为EventTelemetry等滚动您自己的示例,但是为了确保相关性有效,您必须为您记录的每件事情设置上下文: var evt = new EventTelemetry("Fun

我们有一组azure函数记录执行上下文的度量。。。您似乎无法使用OOTB TraceWriter或ILogger实现这一点,至少在我所看到的情况下是这样的,因为没有一个与我假设的log.LogEvent等价的东西

所以。。此url显示了一种利用Azure函数内部的TelemetryClient执行相同操作的模式,并提供了为EventTelemetry等滚动您自己的示例,但是为了确保相关性有效,您必须为您记录的每件事情设置上下文:

var evt = new EventTelemetry("Function called");
evt.Context.Operation.Id = executionContext.InvocationId.ToString();
telemetryClient.TrackEvent(evt);
这一切似乎都相当合乎逻辑,除了我有一个共享类TelemetryManager,它可以帮助创建TelemetryClient,所以我们不必在每个函数中重复代码,而这些函数只是通过一系列附加设置更新客户端。。这还实现了一个日志接口ITelemetry,这样我们以后就有了一个接口来进行单元测试,并允许您进行测试。。为了简单起见,这里使用跟踪:

static CustomTelemetryManager logger = new CustomTelemetryManager();
logger.Trace($"thing i want to trace: {x.value}");
Trace方法只是调用CustomTelemetryManager类中的telemetryClient.TrackTrace方法-其他一些方法更复杂

无论如何,接口就在那里,因此当进行单元测试时,我们可以:

 // gets all the app insights key, and sets various other properties.        
static DebugLogger logger = new DebugLogger();
logger.Trace($"thing i want to trace: {x.value}");
它只会Debug.WriteLine,而不是试图调用AI

问题1:有没有更好的方法来交换单元测试的应用程序洞察代码,因为这是我们拥有这个ITelemetry接口的唯一原因。。。为便于单元测试使用虚拟记录器

但最终,我需要做的是,为telemetryClient.TrackTrace提供正在执行的调用的上下文,我现在找到的唯一方法是,类似于上面的跟踪事件代码

var trace = new TraceTelemetry($"i am a trace.");
trace.Context.Operation.Id = context.InvocationId.ToString();
logger.Trace(trace);
因为遥测客户端在所有函数上共享,所以我需要在将其发送到日志之前直接将上下文应用于度量

问题2:这是我做这件事的唯一方法。。比如:

public void TrackTrace(string msg, ExecutionContext ctx)
{
    var trace = new TraceTelemetry(msg);
    trace.Context.Operation.Id = ctx.InvocationId.ToString();
    client.TrackTrace(trace);
}
因为这将意味着修改接口,然后也意味着对于单元测试,我还需要向调试记录器提供某种虚拟上下文,这感觉有点笨拙


在这里的某个地方,我认为有一个简单的调整可以简化这个不必要的混乱问题。。但是我看不清树木的树木

假设每次调用都创建一个新的CustomTelemetryManager对象,则可以在CustomTelemetryManager构造函数中获取上下文


在CustomTelemetryManager实现中,您始终可以使用相同的静态TelemetryClient,但由于CustomTelemetryManager已经具有上下文,因此它只会将其添加到您进行的每个TelemetryClient.TrackEvent调用中

我不太清楚你的问题。也许你可以把你想要的代码写得更清楚,并强调确切的问题?我不明白设置trace的属性是如何防止您模仿TelemetryClient.tbh@Mikhail的,我可能没有解释清楚,因为我写得有点匆忙。。。我再看看-有没有办法模仿遥测客户端?@m1nkeh你有没有找到模仿遥测客户端的好方法?@AdamStapleton,我没有。不过现在可能容易多了。。我在Azure Functions v1.0上做了这件事,它甚至不支持DI,当然它现在在v3.0上了,我想是的??!我可能会再看一次,如果我有时间的话,用一个解决方案更新。另外@AdamStapleton我不能完全记得这个问题的实际细节。。。我写Azure函数时对它了解不多,所以现在这可能是一个非常愚蠢的问题!是的,我当然可以。。。哦,现在明白了我为什么没想到。。以木换树又开始罢工了。。。与上述评论中的问题相同,是否有一种“正确”的方式来模拟我实际上没有使用会让我失去ITelemetry接口的模拟框架atm应用程序洞察?