代码之家  ›  专栏  ›  技术社区  ›  m1nkeh

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

  •  0
  • m1nkeh  · 技术社区  · 6 年前

    我们有一堆针对执行上下文的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() 类-其他一些方法更复杂。

    不管怎样,接口是存在的,因此当单元测试时,我们可以只做:

     // 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() 而不是试图呼叫人工智能

    问题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);
    }
    

    因为这意味着修改接口,然后也意味着进行单元测试,所以我还需要为调试日志程序提供某种虚拟上下文,这感觉有点笨拙。

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   ahmelsayed    6 年前

    你可以在你的 CustomTelemetryManager 构造函数假定您创建了一个新的 自定义遥测管理器 每次调用的对象。

    TelemetryClient telemetryClient.TrackEvent()