【问题标题】:Azure webjob logs - looking for logs that detail the SDK's handling of queue triggered itemsAzure webjob 日志 - 查找详细说明 SDK 处理队列触发项的日志
【发布时间】:2017-02-22 01:59:15
【问题描述】:

正如我的 Stack Overflow 问题 Azure webjob not appearing to respect MaxDequeueCount property 中所示,我正在解决一个问题,尽管我将 MaxDequeueCount 属性设置为 1,但某些项目在中毒之前已多次出列(实际上有些项目可能永远不会完全中毒,只是出队,失败,重试并无休止地失败)。

Webjobs SDK 自动处理队列触发消息的重试和中毒,我正在寻找包含该处理详细信息的日志。

例如,我可以通过https://myappengine.scm.azurewebsites.net/vfs/data/jobs/continuous/StuffProcessor/job_log.txt 的 SCM 查看 webjob 的日志,看到我的函数检测到了一个新的队列项目(顺便说一下,如果我在 web 应用程序上启用了到 Azure 存储的详细日志记录,我可以在 Blob 中获取相同的信息?)。

[02/22/2017 01:47:22 > ec8d0f: INFO] Executing: 'StuffProcessor.ProcessQueueMessage' - Reason: 'New queue message detected on 'stuff-processor'.'
[02/22/2017 01:47:26 > ec8d0f: INFO] Executed: 'StuffProcessor.ProcessQueueMessage' (Succeeded)
[02/22/2017 01:47:26 > ec8d0f: INFO] Executing: 'StuffProcessor.ProcessQueueMessage' - Reason: 'New queue message detected on 'stuff-processor'.'

我还可以通过查看 azure-jobs-host-archive 容器中的日志来获取有关项目出队计数的一些信息,一旦我在 Web 应用上启用了到 Azure 存储的详细日志记录:

{
      "Type": "FunctionCompleted",
      "EndTime": "2017-02-22T00:07:40.8133081+00:00",
      "Failure": {
        "ExceptionType": "Microsoft.Azure.WebJobs.Host.FunctionInvocationException",
        "ExceptionDetails": "Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception while executing function: ItemProcessor.ProcessQueueMessage ---> MyApp.Exceptions.MySpecialAppExceptionType: Exception of type 'MyApp.Exceptions.MySpecialAppExceptionType' was thrown.
      },
      "ParameterLogs": {},
      "FunctionInstanceId": "1ffac7b0-1290-4343-8ee1-2af0d39ae2c9",
      "Function": {
        "Id": "MyApp.Processors.ItemProcessor.ProcessQueueMessage",
        "FullName": "MyApp.Processors.ItemProcessor.ProcessQueueMessage",
        "ShortName": "ItemProcessor.ProcessQueueMessage",
        "Parameters": [
          {
            "Type": "QueueTrigger",
            "AccountName": "MyStorageAccount",
            "QueueName": "stuff-processor",
            "Name": "sourceFeedItemQueueItem"
          },
          {
            "Type": "BindingData",
            "Name": "dequeueCount"
          },
          {
            "Type": "ParameterDescriptor",
            "Name": "logger"
          }
        ]
      },
      "Arguments": {
        "sourceFeedItemQueueItem": "{\"SourceFeedUpdateID\":437530,\"PodcastFeedID\":\"2d48D2sf2\"}",
        "dequeueCount": "96",
        "logger": null
      },
      "Reason": "AutomaticTrigger",
      "ReasonDetails": "New queue message detected on 'stuff-processor'.",
      "StartTime": "2017-02-22T00:07:40.6017341+00:00",
      "OutputBlob": {
        "ContainerName": "azure-webjobs-hosts",
        "BlobName": "output-logs/1ffd3c7b012c043438ed12af0d39ae2c9.txt"
      },
      "ParameterLogBlob": {
        "ContainerName": "azure-webjobs-hosts",
        "BlobName": "output-logs/1cf2c1b012sa0d3438ee12daf0d39ae2c9.params.txt"
      },
      "LogLevel": "Info",
      "HostInstanceId": "d1825bdb-d92a-4657-81a4-36253e01ea5e",
      "HostDisplayName": "ItemProcessor",
      "SharedQueueName": "azure-webjobs-host-490daea03c70316f8aa2509438afe8ef",
      "InstanceQueueName": "azure-webjobs-host-d18252sdbd92a4657d1a436253e01ea5e",
      "Heartbeat": {
        "SharedContainerName": "azure-webjobs-hosts",
        "SharedDirectoryName": "heartbeats/490baea03cfdfd0416f8aa25aqr438afe8ef",
        "InstanceBlobName": "zd1825bdbdsdgga465781a436q53e01ea5e",
        "ExpirationInSeconds": 45
      },
      "WebJobRunIdentifier": {
        "WebSiteName": "myappengine",
        "JobType": "Continuous",
        "JobName": "ItemProcessor",
        "RunId": ""
      }
    }

但我找不到的是显示特定队列项目详细信息的日志,其中由于异常而处理失败并被放置在毒队列中。我正在寻找这些以进一步解决对 MaxDequeueCount 属性的明显忽略问题。有记录吗?

更新:我找到了Azure WebJobs with Storage Queue and Exceptions 的帖子,其中包含以下屏幕截图:

该屏幕截图显示了标准的“检测到新队列消息...”消息(我在 Azure 上看到并在模拟器中本地运行),它还显示“消息已达到 X 的 MaxDequeueCount ...将消息移动到队列'xyz-poison'",我在模拟器中本地看到。基于 Azure 的运行时是否出于某种原因不显示此信息? 在控制台窗口本地运行或通过 webjobs 仪表板或在 Azure 上运行时,我从来没有看到过这样的中毒相关消息。

【问题讨论】:

    标签: azure azure-web-app-service azure-webjobs azure-webjobssdk


    【解决方案1】:

    您使用的是 Azure 存储版本 8.* 吗?它包含一个重大更改。

    当队列消息对象插入 Azure Storage 8 中的消息队列时,原始队列消息对象的消息 ID 将被新插入消息的唯一消息 ID 覆盖。

    这意味着它失去了对有害消息的引用并且不能再删除它。

    https://github.com/Azure/azure-webjobs-sdk/issues/985

    至于记录,2个选项:

    1. 创建您自己的 QueueProcessorFactory 和 QueueProcessor - 您可以重写处理有害消息的方法以产生更多调试输出。如果您想继续使用 Azure Storage 8,您也可以在此处完全解决问题。*。

    2. 注册跟踪监视器。 https://github.com/Azure/azure-webjobs-sdk-extensions/wiki/Error-Monitoring#tracemonitor

      var traceMonitor = new TraceMonitor()
      .Filter(p => true, "Trace Handler")
      .Subscribe(TraceHandler.Process);
      
      config.Tracing.Tracers.Add(traceMonitor);
      

    【讨论】:

    • 宾果游戏!你搞定了——这正是我的问题。与此同时,我将回到 7.x。不要吹毛求疵,但我不认为这是一个突破性的变化;我认为这是一个错误。重大更改是指行为更改与以前的代码不向后兼容。也许这也是真的,但这对我来说绝对像是“错误”类别......?
    • 关于日志记录,您能否澄清一下,在 Azure 中运行时,我是否确实应该在“标准”webjob 仪表板输出中看到 webjob queue 触发的项目中毒消息?正如我所说,我只在本地看到它们。
    • 我不认为这是一个错误。这种变化对存储团队来说是有意义的。它类似于 ORM 实体在使用 db 生成的 Id 字段将其存储到数据库后填充其 Id 字段的方式。不太确定您对日志记录的含义,但在 kudu 仪表板输出(yoursite.scm.azurewebsites.net/azurejobs/#/jobs/continuous/YourWebJob)中,我确实看到了将某些内容移入毒物队列的条目:[03/08/2017 00:39:46 > 730f59: INFO] Message has reached MaxDequeueCount of 2. Moving message to queue 'queue-poison'.
    • 现在我知道为什么我没有看到该消息了;这是因为我在 8.x 上的中毒被破坏了......关于“重大变化”与“错误”问题,我理解这一点:“当队列消息对象插入 Azure 中的消息队列时存储 8,原始队列消息对象的 Message Id 被新插入消息的唯一消息 id 覆盖。”但似乎 8.x 也以某种方式破坏了 MaxDequeueCount 行为。
    • 您在谈论微软的 2 个完全不同的软件包和团队。一个是发布包含功能更改的 8.x 更新的存储团队。但是,他们没有 MaxDequeueCount 的概念,也没有任何会触发它的行为。然后你有 azure-webjobs-sdk 包和团队 - 他们处理 MaxDequeueCount 行为。基本上,azure-webjobs-sdk 在构建时根本没有考虑到 8.x。它们是不同的东西。
    【解决方案2】:

    在您之前的帖子中,您的触发功能如下

    public void ProcessQueueMessage([QueueTrigger("azurewejobtestingqueue")] string item, TextWriter logger)
    {
       if ( item == "exception" )
       {
          throw new Exception();
       }
    }
    

    您写入记录器的任何内容都应显示在 WebJobs 仪表板的日志中。我的建议是:

    1. 将 'if (item == "exception")' 更改为 'if (item.ToLower().StartsWith("exception")'。然后在测试时将数字附加到异常消息中。记录文本将队列消息发送到 TextWriter,这样您就可以确定您正在查看您认为正在检查的同一条消息。

    2. 您可以将消息的出队计数作为函数的参数。见here。查看示例中的 FailAlways 方法。也将其记录到 TextWriter。

    3. 尝试在本地运行它。所有输出都将写入控制台窗口。看看你是否得到相同的行为。

    我真的很想找出导致这种行为的原因,所以如果你破解它,请务必告诉我们!

    【讨论】:

    • 仍在尝试让它在本地运行 - 我认为您的建议很好。我没有问题将所有内容发送到记录器 - 我目前正在这样做。我正在寻找的是查看 SDK 正在做什么 - 解决我希望看到 SDK 试图毒化(或不毒化)消息的行为。我的 if (item=="exception") 只是伪代码,而不是文字代码。它只是为了引用队列中会导致异常的项目。我目前将项目的 dequeueCount 作为参数(我添加了它),我可以在我的日志中看到一些项目的 dequeueCounts 越来越高。
    • 只是为了添加第二条评论 - 我没有遇到异常 - 问题是我无法了解为什么 sdk 在 MaxDequeueCount 次数后没有毒害消息。跨度>
    • 在测试时,是否有一个实例在 Azure 中运行并访问了也在 Azure 中的存储队列?
    • 是的。网络作业/网站的单个实例以及 1 的 BatchSize。使用 Azure 存储队列。 (队列必须在 Azure 中才能使用 sdk 队列触发功能功能。)
    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多