我们有一堆针对执行上下文的azure函数日志指标...您似乎无法使用OOTB TraceWriter
或ILogger
执行此操作(至少在我所看到的)因为没有相应的我认为会被命名为log.LogEvent()
..
所以..这个url(https://docs.microsoft.com/en-us/azure/azure-functions/functions-monitoring#custom-telemetry-in-c-functions)显示了一个模式,用于利用Azure Function中的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()
方法只是调用telemetryClient.TrackTrace()
类中的CustomTelemetryManager()
方法 - 其他一些方法更复杂。
无论如何,接口就在那里,以便在进行单元测试时我们可以做到:
// 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 :是否有更好的方式来替换单元测试的Application Insights代码,因为这是我们完全拥有此ITelemetry
接口的唯一原因。为单元测试提供虚拟记录器。
最终,我需要做的是给telemetryClient.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);
}
因为这意味着修改接口,然后也意味着进行单元测试,我还需要为调试记录器提供某种虚拟上下文,感觉有点笨拙..
在这里的某个地方,我认为有一个简单的调整来简化这个不必要的混乱问题..但我不能完全看到木头的树木!
答案 0 :(得分:1)
假设您为每次调用创建一个新的CustomTelemetryManager
对象,则可以在CustomTelemetryManager
构造函数中获取上下文。
在CustomTelemetryManager
实施中,您始终可以使用相同的静态TelemetryClient
,但由于您的CustomTelemetryManager
已经具有上下文,因此只需将其添加到telemetryClient.TrackEvent()
的每次调用中打电话给你。