首页 文章

Azure Functions Application Insights Context

提问于
浏览
0

我们似乎能够使用OOTB TraceWriterILogger (至少在我所看到的情况下)这样做,因为没有相当于我认为将被命名为 log.LogEvent() 的东西 .

所以..这个url(https://docs.microsoft.com/en-us/azure/azure-functions/functions-monitoring#custom-telemetry-in-c-functions)显示了一个模式,用于利用Azure函数内部的 TelemetryClient() 来做同样的事情,例如为 EventTelemetry() 等滚动你自己的例子,但是为了确保相关性工作你需要为每件事设置上下文日志:

var evt = new EventTelemetry("Function called");
evt.Context.Operation.Id = executionContext.InvocationId.ToString();
telemetryClient.TrackEvent(evt);

这一切似乎都是合乎逻辑的,除了我有一个共享类( TelemetryManager ),它有助于创建 TelemetryClient() - 所以我们不必在每个单一的函数中重复代码,只需用一系列附加设置来通知客户端 . 这也实现了一个日志接口 ITelemetry ,以便我们稍后有一个接口进行单元测试,并让你做..(这里使用trace来简化):

static CustomTelemetryManager logger = new CustomTelemetryManager();
logger.Trace($"thing i want to trace: {x.value}");

logger.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

Question 1 :是否有一种"better"方式来替换单元测试的Application Insights代码,因为这是我们完全拥有这个 ITelemetry 接口的唯一原因...为单元测试提供了一个虚拟 Logger .

最终,我需要做的是给出正在执行的调用的上下文,而我现在发现的唯一方法是,类似于上面的跟踪事件代码 .

var trace = new TraceTelemetry($"i am a trace.");
trace.Context.Operation.Id = context.InvocationId.ToString();
logger.Trace(trace);

因为 TelemetryClient 是在所有函数上共享的,所以我需要在将指标发送到日志之前将其直接应用于指标 .

Question 2 :这是我能做到这一点的唯一方法..类似于:

public void TrackTrace(string msg, ExecutionContext ctx)
{
    var trace = new TraceTelemetry(msg);
    trace.Context.Operation.Id = ctx.InvocationId.ToString();
    client.TrackTrace(trace);
}

因为这意味着修改接口,然后也意味着进行单元测试,我还需要为调试 Logger 提供某种虚拟上下文,感觉有点笨重 .

在这里的某个地方,我认为有一个简单的调整来简化这个不必要的混乱问题..但我不能完全看到树木!

1 回答

  • 1

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

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

相关问题