Веб-задания Azure (3.x) Непрерывное задание не отображает функции на панели мониторинга

У нас есть веб-задание Azure (3.x), работающее под приложением API в Azure, все версии 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, хотя конструктор приложений явно отличался.


person Matt Styles    schedule 17.10.2018    source источник


Ответы (4)


Ответ на это двоякий.

Вы можете написать на панель управления 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

person Matt Styles    schedule 18.10.2018
comment
Да, в 3.x функциональность устарела, но поведение осталось прежним. Функции должны быть обнаружены и отображены, поэтому, если вы этого не видите, откройте проблему на странице github.com/azure/azure-webjobs-sdk. Application Insights - это действительно продвинутая рекомендация и причина, по которой она устарела. - person Fabio Cavalcante; 18.10.2018
comment
Кроме того, расширение и конфигурация отличались до 3.x, поэтому этот метод не применяется в этих случаях. - person Fabio Cavalcante; 18.10.2018
comment
Означает ли это, что панель инструментов Kudu для веб-вакансий устарела? - person Métoule; 16.01.2019
comment
Где я могу найти функции в Application Insights? - person Pablo; 13.12.2019

Поэтому я просто «обновился» до Microsoft.Azure.WebJobs v3.0.14, чтобы наши пакеты NuGet оставались актуальными, и я столкнулся с той же проблемой.

Я использовал более раннюю версию, в которой был гораздо более простой процесс создания запуска веб-задания с использованием метода Call объекта JobHOst, который в основном настраивал для вас все журналы вашей панели инструментов.

Процесс, который я использовал, состоял буквально из двух строк кода для инициализации и запуска веб-задания, которое волшебным образом также настраивало для вас ведение журнала Dashboard.

После «Обновления» и определения нового процесса для запуска веб-заданий с помощью метода «CallAsync» я обнаружил, что все журналы панели «Верхний уровень» исчезли. Данные «Функция» больше не передавались, и я больше не мог точно проверить, что выполняла моя веб-работа для отладки. Все, что я мог видеть, было сообщение «Успех» или «Неудача».

Я потратил несколько часов, пытаясь понять, как использовать методы AddDashboardLogging в разделах HostBuilder ConfigwebJobs и ConfigureLogging, но эти настройки, похоже, не влияют.

После долгих проб и ошибок я наконец обнаружил, как вернуть свои отладочные данные.

По сути, они изменили принцип работы журнала Dashboard. Вы вообще не используете метод AddDashboardLogging. Вместо этого вы просто используете метод AddConsole. При этом не возвращаются ссылки «Функции», к которым вы, возможно, привыкли, но обеспечивается публикация всех ваших общих выходных данных «Ведение журнала» в журнале «Верхний уровень» панели управления. Поэтому вместо перехода к «Функции» и выбора «Переключить вывод» вы просто выбираете «Переключить вывод» на панели инструментов верхнего уровня, которая раньше содержала минимальный объем данных.

Вот что у меня сработало:

Сначала убедитесь, что у вас есть все 3 этих оператора using, если вы не можете добавить их все, возможно, вам не хватает NuGet.

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

Затем создайте свой Host Builder и используйте метод ConfigureLogging (Logger) (НЕ ТОЛЬКО С 2 ВХОДАМИ) и вызовите метод AddConsole для объекта Logger.

Вот мой минимальный пример кода:

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

Опять же, это не возвращает ссылки «Функция», но все же мое сообщение журнала отладки было распечатано в журнале веб-заданий «Верхний уровень». (Также обратите внимание, что для этого не требуется вызывать устаревший метод AddDashboardLogging)

person woeful    schedule 26.11.2019
comment
Работает. Мы должны добавить пакет nuget Microsoft.Extensions.Logging.Console - person Rodrigo Perez Burgues; 13.07.2020

По умолчанию ведение журнала панели управления не включено.

Чтобы включить эту функцию, вызовите метод расширения AddDashboardLogging в экземпляре конструктора веб-заданий, который вы настраиваете.

person Fabio Cavalcante    schedule 17.10.2018
comment
См. Также эту связанную проблему - person David Ebbo; 17.10.2018

Вы пропустили код ниже

Функции - это имя класса функции.

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

Я думаю, это должно сработать.

person Ashwinee Vaishampayan    schedule 03.01.2019
comment
Нет. Я зарегистрировал класс Functions как службу Singleton в опубликованном мной коде. - person Matt Styles; 03.01.2019
comment
Я создал триггер таймера и работал на меня. Можете ли вы создать триггер таймера и проверить, срабатывает ли он. - person Ashwinee Vaishampayan; 04.01.2019
comment
Нет. Это было опубликовано несколько месяцев назад, и сейчас я просто использую App Insights. - person Matt Styles; 05.01.2019