我正在 .NET 7 上的隔离进程中运行 Azure Function (V4)。 所有异常在 Azure Application Insights 中都显示为 RpcExceptions。看起来我的函数被包装在这个“Invoke”中,并且它只能返回 RpcException 而不是我显式抛出的 AppUserException。
这会导致数据非常不清楚。我能做什么?
我刚刚做了一个新功能来测试它:
<PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.21.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.18.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.0.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.0.13" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Storage" Version="6.0.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Timer" Version="4.2.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.13.0" />
namespace FunctionApp1
{
public class Function1
{
private readonly ILogger _logger;
public Function1(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<Function1>();
}
[Function("Function1")]
public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
{
_logger.LogInformation("C# HTTP trigger function processed a request.");
throw new AppUserException("usererror");
}
}
}
program.cs
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureAppConfiguration(builder =>
{
// KeyVault
var keyVaultEndpoint = GetKeyVaultEndpoint();
if (string.IsNullOrWhiteSpace(keyVaultEndpoint))
{
throw new Exception("keyVaultEndpoint wasn't provided.");
}
var credentials = new DefaultAzureCredential();
builder.AddAzureKeyVault(new Uri(keyVaultEndpoint), credentials, new KeyVaultSecretManager());
// Azure App Config
var azureAppConfigEndpoint = GetAzureAppConfigEndpoint();
if (string.IsNullOrWhiteSpace(azureAppConfigEndpoint))
{
throw new Exception("azureAppConfigEndpoint wasn't provided.");
}
builder.AddAzureAppConfiguration(options =>
{
options.Connect(azureAppConfigEndpoint)
.UseFeatureFlags(options =>
{
options.CacheExpirationInterval = TimeSpan.FromSeconds(60);
});
});
builder.AddJsonFile("appsettings.json", optional: true);
})
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
services.Configure<LoggerFilterOptions>(options =>
{
var toRemove = options.Rules.FirstOrDefault(rule => rule.ProviderName
== "Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider");
if (toRemove is not null)
{
options.Rules.Remove(toRemove);
}
});
services.AddSolutionServices();
})
.ConfigureLogging((hostingContext, logging) =>
{
// Make sure the configuration of the appsettings.json file is picked up.
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
})
.Build();
static string? GetKeyVaultEndpoint() => Environment.GetEnvironmentVariable("ASPNETCORE_HOSTINGSTARTUP__KEYVAULT__CONFIGURATIONVAULT");
static string? GetAzureAppConfigEndpoint() => Environment.GetEnvironmentVariable("AZURE_APPCONFIG_ENDPOINT");
host.Run();
看起来 RpcException 是预料之中的。 Github 上有多个与此相关的问题,这似乎是 Application Insights 团队的一个悬而未决的项目。您可以通过以下方式获取有关他们的更多信息:
https://github.com/Azure/azure-functions-dotnet-worker/issues/370
https://github.com/Azure/azure-functions-host/issues/6284
https://github.com/Azure/azure-functions-host/issues/4192#issuecomment-481813144