Azure Function 中毒队列警报

Dr *_*izo 4 poison-queue azure-functions

是否可以从位置队列创建警报?我有一个 blob 触发函数,但是当它失败x多次时,它会将此消息扔到有害队列中。我想做的是当该毒物队列的计数为 时创建警报x

  1. 我可以使用 sidecart 方法来做到这一点,其中我有一个独立的服务来监视毒物队列
  2. 看到了这种方法/sf/answers/3243392911/
  3. 希望使用blobproperties覆盖来存储一些,metadata以便我可以跟踪故障,但似乎没有办法做到这一点?我正在考虑最后一次尝试跟踪一个事件来声明moving message to poison queue

有更好的方法吗?

        [FunctionName("MyFunction")]
        public async Task Run(
            [BlobTrigger("input-queue", Connection = "ConnectionString")] Stream blobContent,
            string name,
            System.Uri uri,
            IDictionary<string, string> metaData,
            BlobProperties properties,
            ILogger log)
Run Code Online (Sandbox Code Playgroud)

编辑 注意到函数的重载:

        [FunctionName("MyFunction")]
        public async Task Run(
            [BlobTrigger("input-queue", Connection = "ConnectionString")] ICloudBlob blobContent,
            string name,
            System.Uri uri,
            IDictionary<string, string> metaData,
            BlobProperties properties,
            ILogger log)
        {
            if (!blobContent.Metadata.ContainsKey("mycount"))
            {
                blobContent.Metadata["mycount"] = "1";
                await blobContent.SetMetadataAsync();
            }
            else
            {
                var value = int.Parse(blobContent.Metadata["mycount"]);
                value++;
                blobContent.Metadata["mycount"] = value.ToString();
                await blobContent.SetMetadataAsync();
            }

            throw new Exception(("Testing Function"));
        }
Run Code Online (Sandbox Code Playgroud)

似乎有点矫枉过正,但我​​可以在这里跟踪失败计数并编写逻辑来跟踪自定义事件。

Ste*_*ary 6

我更喜欢的方法是使用一个 Azure 函数定期计算有害队列中的项目数量并将其作为 Application Insights 指标发布。然后您可以从那里设置查询/仪表板/警报。

此方法的基本概述见此处。请注意,现代 Azure Functions 允许您使用 DI 和其他细节。

每 5 分钟计时器触发一次的函数示例,该函数获取有害队列计数并将其作为指标发布:

[FunctionName(nameof(TrackQueueMetrics))]
public async Task TrackQueueMetrics([TimerTrigger("0 */5 * * * *")] TimerInfo message)
{
  var queues = await _queueService.GetAllQueuesAsync();
  var poisonQueues = queues.Where(x => x.EndsWith("-poison", StringComparison.InvariantCultureIgnoreCase)).ToList();
  var poisonQueueCounts = await Task.WhenAll(poisonQueues.Select(_queueService.GetApproximateMessagesCountAsync));
  var fatalErrors = poisonQueueCounts.Sum();
  _metrics.TrackFatalErrorsCount(fatalErrors);
}
Run Code Online (Sandbox Code Playgroud)

GetAllQueuesAsync()本质上是:

public async Task<IReadOnlyList<string>> GetAllQueuesAsync()
{
  var result = new List<string>();
  await foreach (var item in _queueServiceClient.GetQueuesAsync())
      result.Add(item.Name);
  return result;
}
Run Code Online (Sandbox Code Playgroud)

GetApproximateMessagesCount()本质上是:

public async Task<int> GetApproximateMessagesCountAsync(string queueName)
{
  var properties = await _queueServiceClient.GetQueueClient(queueName).GetPropertiesAsync();
  return properties.Value.ApproximateMessagesCount;
}
Run Code Online (Sandbox Code Playgroud)

本质上TrackFatalErrorsCount是:

public sealed class SingletonMetricsClient
{
  private readonly Metric _fatalErrorsCountMetric;

  public SingletonMetricsClient(TelemetryConfiguration telemetryConfiguration)
  {
    var client = new TelemetryClient(telemetryConfiguration);
    _fatalErrorsCountMetric = client.GetMetric("FatalErrors");
  }

  public void TrackFatalErrorsCount(int count) => _fatalErrorsCountMetric.TrackValue(count);
}
Run Code Online (Sandbox Code Playgroud)

将其作为指标后,您就可以查询它、为 Azure 仪表板构建图表和/或设置 Application Insights 警报。