我们有一堆针对执行上下文的Azure函数日志度量…你好像不能用OOTB来做这个
TraceWriter
,或
ILogger
(至少在我所看到的情况下)因为没有一个等价于我假定的名字
log.LogEvent()
我是说…
所以……此URL(
https://docs.microsoft.com/en-us/azure/azure-functions/functions-monitoring#custom-telemetry-in-c-functions
)显示了利用
TelemetryClient()
在Azure函数内部做同样的事情,用滚动您自己的
EventTelemetry()
然而,为了确保相关性工作,您必须为您记录的每件事情设置上下文:
var evt = new EventTelemetry("Function called");
evt.Context.Operation.Id = executionContext.InvocationId.ToString();
telemetryClient.TrackEvent(evt);
这一切似乎都很合理,除了我有一个共享类(
TelemetryManager
)有助于创造
遥测客户端()
-因此,我们不必在每个函数中重复代码,只需通过一系列附加设置向客户机发送消息。这还实现了日志记录接口
ITelemetry
这样我们就有了一个稍后进行单元测试的接口,并允许您这样做。(为了简单起见,这里使用trace):
static CustomTelemetryManager logger = new CustomTelemetryManager();
logger.Trace($"thing i want to trace: {x.value}");
logger.Trace()
方法只是调用
telemetryClient.TrackTrace()
中的方法
CustomTelemetryManager()
类-其他一些方法更复杂。
不管怎样,接口是存在的,因此当单元测试时,我们可以只做:
static DebugLogger logger = new DebugLogger();
logger.Trace($"thing i want to trace: {x.value}");
它只会
Debug.WriteLine()
而不是试图呼叫人工智能
问题1
:是否有一种“更好”的方法来交换单元测试的应用程序洞察代码,因为这是我们有这种方法的唯一原因
ITelemetry公司
接口…为单元测试提供虚拟记录器。
但最终,我需要做的是
遥测客户端.tracktrace()
正在执行的调用的上下文,以及我现在找到的唯一方法是,类似于上面的跟踪事件代码。
var trace = new TraceTelemetry($"i am a trace.");
trace.Context.Operation.Id = context.InvocationId.ToString();
logger.Trace(trace);
因为
TelemetryClient
在所有函数上都是共享的,在发送到日志之前,我需要将上下文直接应用于度量。
问题2
:这是我唯一能做到的方法。比如:
public void TrackTrace(string msg, ExecutionContext ctx)
{
var trace = new TraceTelemetry(msg);
trace.Context.Operation.Id = ctx.InvocationId.ToString();
client.TrackTrace(trace);
}
因为这意味着修改接口,然后也意味着进行单元测试,所以我还需要为调试日志程序提供某种虚拟上下文,这感觉有点笨拙。
在这里的某个地方,我认为有一个简单的调整来简化这个不必要的混淆问题。但是我看不到树木的树木!