当前位置: 首页 > 知识库问答 >
问题:

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

陶文林
2023-03-14

我们有一堆azure函数记录执行上下文的度量...您似乎无法使用OOTBTracewriterilogger(至少在我所看到的情况下)来完成此操作,因为没有一个与我假设的名称为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,这样我们以后就有了一个单元测试的接口,并允许您做…(为了简单起见,此处使用跟踪):

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

问题1:是否有“更好的”方法将应用程序洞察代码交换给单元测试,因为这是我们拥有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);
}

因为这将意味着修改接口,然后也意味着对于单元测试,我还需要向调试记录器提供某种虚拟上下文,这感觉有点笨拙。

在这里的某个地方,我认为有一个简单的调整来简化这个不必要的混乱的问题…但我看不见森林了!

共有1个答案

长孙阳嘉
2023-03-14

假设每次调用都创建了一个新的CustomTeleMetryManager对象,则可以在CustomTeleMetryManager构造函数中使用上下文。

CustomTeleMetryManager实现中,您始终可以使用相同的静态TeleMetryClient,但由于您的CustomTeleMetryManager已经具有上下文,因此它只是将上下文添加到您进行的TeleMetryClient.TrackEvent()调用的每个调用中。

 类似资料:
  • 有什么想法会出什么问题吗?

  • 在运行.NET Core3.1控制台应用程序时,我正在尝试获取应用程序的见解,以便在azure批处理作业/任务中工作。 https://docs.microsoft.com/en-us/Azure/Batch/Monitor-Application-Insights https://docs.microsoft.com/en-us/Azure/Azure-monitor/app/worker-se

  • 有没有人有关于如何将Azure应用程序洞察集成到作为控制台应用程序构建的Azure WebJob的示例或文章的链接?

  • 我有一个Azure函数连接到一个App Insights实例。函数app会发出日志消息,我可以在Azure portal的日志流中看到这些消息,并在app Insights跟踪时看到这些消息。 通过在中添加元素(https://github.com/Azure/azure-webjobs-sdk-script/wiki/host.json),我将控制台日志级别增加到了详细,因此详细级别的消息会出现

  • 我们正在设计一个应用程序,它将托管在AKS(Azure kubernetes service)上。应用程序将由一组用asp.NET内核编写的服务组成,这些服务运行在docker容器中。我希望监视服务以及容器/节点,并在整个集群中具有可观察性。Azure monitor for containers似乎是监视容器、节点和整个集群的一个很好的解决方案,但我需要asp.NET核心服务的应用程序insig