Azure WebJobs(3.x)连续作业未在仪表板中显示功能

时间:2018-10-17 14:44:34

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

我们有一个Azure WebJob(3.x)在Azure的API App(所有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中都可以正常工作。

4 个答案:

答案 0 :(得分:1)

答案是双重的。

您可以使用

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

这将起作用并显示WebJobs 1.x,2.x的功能调用。但是,从WebJobs SDK 3.x开始,这已经已过时。控制台输出将继续在Kudu仪表板中显示,但将不会检测到功能,也不会显示其调用。建议改用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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

我正在使用的过程实际上是两行代码来初始化和触发Web作业,这神奇地还为您设置了Dashboard日志记录。

在“升级”并使用“ CallAsync”方法确定触发Web作业的新过程之后,我发现“顶级”仪表板日志全部消失了。 “功能”数据不再报告,并且我无法再确切验证我的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)”方法(“ NOT THE ONE WITH 2 INPUTS”),并为Logger对象调用AddConsole方法。

这是我的最小示例代码:

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

同样,这不会恢复“功能”链接,但确实将我的调试日志消息打印到“顶级” Web作业日志中。 (还请注意,它不需要您调用过时的AddDashboardLogging方法)

答案 3 :(得分:-1)

您是否错过了下面的代码

Functions是函数类的名称。

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

我认为这应该可行。