我们似乎能够使用OOTB TraceWriter
或 ILogger
(至少在我所看到的情况下)这样做,因为没有相当于我认为将被命名为 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 回答
假设您为每次调用创建一个新的
CustomTelemetryManager
对象,则可以在CustomTelemetryManager
构造函数中获取上下文 .在
CustomTelemetryManager
实现中,您始终可以使用相同的静态TelemetryClient
,但由于您的CustomTelemetryManager
已经具有上下文,因此它只会将其添加到您调用的每个telemetryClient.TrackEvent()
调用中 .