【问题标题】:Azure WebJobs (3.x) Continuous job not showing Functions in DashboardAzure WebJobs (3.x) 连续作业未在仪表板中显示函数
【发布时间】:2019-03-22 07:05:46
【问题描述】:

我们有一个 Azure WebJob (3.x) 在 Azure 中的 API 应用程序下运行,都是 Core 2.1。它可以正常发布并运行,但不显示任何函数或在仪表板上列出函数调用。这很奇怪,因为该作业的控制台输出确实显示它检测到一个函数:

[10/17/2018 09:26:19 > fa7c81: SYS INFO] Run script 'run.cmd' with script host - 'WindowsScriptHost'
[10/17/2018 09:26:19 > fa7c81: SYS INFO] Status changed to Running
[10/17/2018 09:26:19 > fa7c81: INFO] 
[10/17/2018 09:26:19 > fa7c81: INFO] D:\local\Temp\jobs\continuous\SubmissionJob\43ucb4rv.ipc>dotnet SubmissionJob.dll  
[10/17/2018 09:26:21 > fa7c81: INFO] dbug: Microsoft.Extensions.Hosting.Internal.Host[1]
[10/17/2018 09:26:21 > fa7c81: INFO]       Hosting starting
[10/17/2018 09:26:21 > fa7c81: INFO] info: Microsoft.Azure.WebJobs.Hosting.JobHostService[0]
[10/17/2018 09:26:21 > fa7c81: INFO]       Starting JobHost
[10/17/2018 09:26:21 > fa7c81: INFO] info: Host.Startup[0]
[10/17/2018 09:26:21 > fa7c81: INFO]       Found the following functions:
[10/17/2018 09:26:21 > fa7c81: INFO]       SubmissionJob.Functions.ProcessQueueMessageAsync
[10/17/2018 09:26:21 > fa7c81: INFO]       
[10/17/2018 09:26:21 > fa7c81: INFO] Application started. Press Ctrl+C to shut down.
[10/17/2018 09:26:21 > fa7c81: INFO] Hosting environment: QA

Program.cs Program 类如下所示:

public static async Task Main(string[] args)
    {
        var builder = new HostBuilder()
            .UseEnvironment(Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"))
            .ConfigureWebJobs(b =>
            {
                b.AddAzureStorageCoreServices()
                    .AddAzureStorage()
                    .AddServiceBus()
                    .AddEventHubs();
            })
            .ConfigureAppConfiguration(b =>
            {
                // Adding command line as a configuration source
                b.AddCommandLine(args);
            })
            .ConfigureLogging((context, b) =>
            {
                b.SetMinimumLevel(LogLevel.Debug);
                b.AddConsole();

                // If this key exists in any config, use it to enable App Insights
                var appInsightsKey = context.Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"];
                if (!string.IsNullOrEmpty(appInsightsKey))
                {
                    b.AddApplicationInsights(o => o.InstrumentationKey = appInsightsKey);
                }
            })
            .ConfigureServices((context, services) =>
            {
                services.AddAutoMapper();

                services.AddMemoryCache();

                services.AddDbContext<SubmissionsDbContext>(opts =>
                    opts.UseSqlServer(context.Configuration.GetConnectionString("DefaultConnection")));

                // cloud services
                services.AddTransient(s =>
                    CloudStorageAccount.Parse(
                        context.Configuration.GetConnectionString("AzureQueueConnectionString")));
                services.AddTransient<IBlobReadService, AzureBlobReadService>();
                services.AddSingleton<IBlobWriteService, AzureBlobWriteService>();
                services.AddSingleton<IQueueWriteService, AzureQueueWriteService>();

                // submission services
                services.AddScoped<ISubmissionStatusService, SubmissionStatusService>();

                services.AddSingleton<Functions, Functions>();

                // job activator, required in webjobs sdk 3+
                services.AddSingleton<IJobActivator>(new WebJobsActivator(services.BuildServiceProvider()));
            })
            .UseConsoleLifetime();;

        var host = builder.Build();
        using (host)
        {
            await host.RunAsync();
        }
    }

Functions.cs 有一个带有以下签名的方法:

public async Task ProcessQueueMessageAsync([QueueTrigger("operations")] CloudQueueMessage incomingMessage, TextWriter log)

...scm.azurewebsites.net/azurejobs/#/jobs/continuous/SubmissionJob 节目

Continuous WebJob Details SubmissionJob
Running
Run command: run.cmd

但它下面没有函数调用列表,并且该作业永久保持在Running 状态。如果我转到 Kudu 中的“函数”链接,它说没有要显示的函数/函数调用。

有什么想法吗?

其中大部分在 Framework 4.7 中运行良好,尽管应用程序构建器明显不同。

【问题讨论】:

    标签: c# azure .net-core azure-webjobs azure-webjobssdk


    【解决方案1】:

    这个问题的答案是双重的。

    您可以使用

    写入 Kudu 仪表板
    var builder = new HostBuilder()
        .ConfigureWebJobs(b =>
        {
            b.AddDashboardLogging();
        });
    

    这将工作并显示 WebJobs 1.x、2.x 的函数调用。但是,从 WebJobs SDK 3.x 开始,这已过时。控制台输出将继续显示在 Kudu Dashboard 中,但不会检测到函数,也不会显示它们,也不会显示它们的调用。建议使用 Application Insights。

    var builder = new HostBuilder()
        .ConfigureLogging((context, b) =>
        {
            b.SetMinimumLevel(LogLevel.Debug);
            b.AddConsole();
    
            // If this key exists in any config, use it to enable App Insights.
            // This may already be configured in Azure Portal if running WebJob udner existing app with App Insights.
            var appInsightsKey = context.Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"];
            if (!string.IsNullOrEmpty(appInsightsKey))
            {
                b.AddApplicationInsights(o => o.InstrumentationKey = appInsightsKey);
            }
        });
    

    确保您已使用存储连接字符串配置了名为 AzureWebJobsStorage 的连接字符串。

    另见:https://github.com/Azure/azure-webjobs-sdk/wiki/Application-Insights-Integration

    还有:https://docs.microsoft.com/en-us/azure/app-service/webjobs-sdk-get-started#add-application-insights-logging

    【讨论】:

    • 是的,该功能在 3.x 中已过时,但行为相同。应该检测并显示函数,所以如果你没有看到,请在github.com/azure/azure-webjobs-sdk 上打开一个问题。 Application Insights 确实是向前发展的建议,也是它被废弃的原因。
    • 另外,扩展和配置在 3.x 之前有所不同,因此该方法不适用于这些情况。
    • 这是否意味着 Webjobs 的 Kudu 仪表板现在已过时?
    • 在哪里可以找到Application Insights中的函数?
    【解决方案2】:

    所以我只是“升级”到 Microsoft.Azure.WebJobs v3.0.14 以使我们的 NuGet 包保持“最新”,我遇到了同样的问题。

    我使用的是早期版本,它使用 JobHOst 对象的“Call”方法创建触发 Web 作业的过程要简单得多,该方法基本上为您设置了所有仪表板日志记录。

    我使用的过程实际上是 2 行代码来初始化和触发 Web 作业,它还神奇地为您设置了仪表板日志记录。

    在“升级”并确定使用“CallAsync”方法触发 Web 作业的新流程后,我发现所有“顶级”仪表板日志都消失了。 “功能”数据不再报告,我无法再准确地验证我的网络工作为调试做了什么。我只能看到“成功”或“失败”消息。

    我花了几个小时试图弄清楚如何在 HostBuilder ConfigwebJobs 和 ConfigureLogging 部分中使用 AddDashboardLogging 方法,但这些设置似乎没有任何影响。

    经过多次尝试和错误,我终于发现了如何取回我的调试数据。

    基本上,他们改变了仪表板日志记录的工作方式。您根本不使用 AddDashboardLogging 方法。相反,您只需使用 AddConsole 方法。这不会带回您可能习惯的“功能”链接,但它确实确保您的所有常规“日志记录”输出都发布到“顶级”仪表板日志。因此,无需导航到“功能”然后选择“切换输出”,您只需从用于包含最少数据的顶级仪表板视图中选择“切换输出”即可。

    这对我有用:

    首先确保您拥有所有这 3 个 using 语句,如果您无法将它们全部添加,则您可能缺少 NuGet。

    using Microsoft.Azure.WebJobs;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    

    接下来创建您的 Host Builder 并使用“ConfigureLogging(Logger)”方法(不是带有 2 个输入的方法)并为 Logger 对象调用 AddConsole 方法。

    这是我的最小示例代码:

        var builder = new HostBuilder();
        builder.ConfigureWebJobs(b =>
        {
            b.AddAzureStorageCoreServices();
        })
        .ConfigureLogging((logger) =>
        {
            logger.AddConsole();
        });
    

    同样,这不会带回“功能”链接,但它确实让我的调试日志消息打印到“顶级”网络作业日志。 (另请注意,它不需要您调用过时的 AddDashboardLogging 方法)

    【讨论】:

    • 有效。我们必须添加 nuget 包 Microsoft.Extensions.Logging.Console
    【解决方案3】:

    默认情况下不启用仪表板日志记录。

    要启用该功能,请在您正在配置的 webjobs builder 实例上调用 AddDashboardLogging 扩展方法

    【讨论】:

    【解决方案4】:

    你是否错过了下面的代码

    Functions 是函数类的名称。

     .ConfigureServices((hostBuilderContext, services) =>
                     {
                         services.AddScoped<Functions, Functions>();
                     })
    

    我认为这应该可行。

    【讨论】:

    • 没有。我已在发布的代码中将 Functions 类注册为 Singleton 服务。
    • 我已经创建了一个计时器触发器并且正在为我工​​作。你能创建一个计时器触发器并检查它是否被触发。
    • 没有。这是几个月前发布的,我现在只是在使用 App Insights。
    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    相关资源
    最近更新 更多