大约一个月前,我注意到旧的 Azure Functions 门户界面中的一些监视功能停止工作。我写了有关这些问题的更多详细信息Azure Functions 托管 GitHub https://github.com/Azure/azure-functions-host/issues/6060但我的具体问题尚未得到解答。
现在,Azure Functions 门户界面似乎默认采用新的“管理体验”,看起来与 Azure 的其他部分更加相似,因此,更明显的是我们使用日志记录和跟踪的方式存在问题。
我的问题是:是否有人有关于如何设置 Azure 函数日志记录、实时指标和应用程序洞察跟踪的代码示例,以便:
- 与依赖注入一起使用
- 适用于新的“管理体验”界面
目前,为了查看特定的 Azure Function 正在做什么,我必须转到旧的 Azure 界面并研究日志流。这些功能确实有效,它们在日志流中吐出信息,但仅限于旧界面,在监控方面似乎没有太多其他功能。使用旧界面:
- 调用日志是您按下“函数(只读)> [函数] > 监视器下的“监视器”链接时获得的日志,即使根据日志肯定正在调用函数,也根本不显示任何调用。
- 实时应用程序指标链接会导致默认的“不可用:您的应用程序已离线或使用较旧的 SDK”以及一些动画演示图表。
一个月前这些工作正常。现在,没那么多了。
使用新界面:
- 无论详细程度如何,“监控”>“日志流”除了“已连接!”一词外不显示任何内容。
- 再次监控 > 日志流 > 在实时指标中打开只会产生默认的“不可用:您的应用程序已离线或使用较旧的 SDK”。
使用“功能”>“功能”> [单击某个功能] 转到新界面中的特定功能:
- 开发人员>代码+测试>测试按钮>运行,弹出日志窗口,只显示“已连接!”没有别的,再次不管冗长。
- 监视器 > 调用,这里没有注册任何调用跟踪,即使该函数显然是根据旧接口日志流调用的。
- 监视器 > 日志再次只显示“已连接!”,无论内容有多冗长。
我不明白为什么它在一个月前突然停止工作,以及为什么这么多东西似乎不适用于新界面。我们的 Functions 的 NuGet 包都是最新的。
在日志记录方面,记录器是依赖注入的,因此我们可以在多个类中使用它,而不仅仅是在默认的 Functions.cs 类中:
using Microsoft.Extensions.Logging;
public class EventForwarder
{
private readonly ILogger<EventForwarder> log;
我们通过扩展方法的使用来记录,其实没什么特别的:
using Microsoft.Extensions.Logging;
public static class LoggerExtensions
{
public static void Info(this ILogger log, string msg) => log.LogInformation(msg);
应用程序见解跟踪器也使用建议的解决方法进行依赖项注入here https://github.com/Azure/azure-functions-host/issues/5353#issuecomment-590147499,即我们的 Startup.cs 看起来很简单:
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(EventForwarder.Startup))]
namespace EventForwarder
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
// https://github.com/Azure/azure-functions-host/issues/5353
builder.Services.AddSingleton(sp =>
{
var key = Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY");
return string.IsNullOrWhiteSpace(key) ? new TelemetryConfiguration() : new TelemetryConfiguration(key);
});
我们正在执行 Http 重试的跟踪,除其他外,如下所示:
public class HttpRetryPolicyService
{
private readonly ILogger<HttpRetryPolicyService> log;
private readonly TelemetryClient insights;
public HttpRetryPolicyService(ILogger<HttpRetryPolicyService> log,
TelemetryConfiguration insightsConfig)
{
this.log = log;
insights = new TelemetryClient(insightsConfig);
}
...
private void LogRetry(DelegateResult<HttpResponseMessage> message, TimeSpan delay, int attempt, Context context)
{
if (message.Exception != null)
{
log.Warn($"Exception details: {message.Exception}");
insights.Track(message.Exception);
我们使用扩展方法来跟踪,如下所示:
using Microsoft.ApplicationInsights;
namespace EventForwarder.Static
{
public static class TelemetryExtensions
{
public static void Track(this TelemetryClient insights, string eventName)
{
insights.TrackEvent(eventName);
insights.Flush();
}
我缺少什么?
编辑#1:顺便说一句,不幸的是,在“发布”对话框中将 Application Insights 添加为服务依赖项not解决这些问题。
编辑 #2:此外,我们的 Functions host.json 文件都如下所示:
{
"version": "2.0",
"healthMonitor": {
"enabled": true,
"healthCheckInterval": "00:00:10",
"healthCheckWindow": "00:02:00",
"healthCheckThreshold": 6,
"counterThreshold": 0.80
},
"logging": {
"fileLoggingMode": "always",
"applicationInsights": {
"enableLiveMetrics": true,
"samplingSettings": {
"isEnabled": true
}
},
"logLevel": {
"EventForwarder": "Information"
}
}
}