Azure functions Azure函数中毒队列警报

Azure functions Azure函数中毒队列警报,azure-functions,poison-queue,Azure Functions,Poison Queue,是否可以在posion队列之外创建警报?我有一个blob触发器函数,但当它失败x次时,它会将此消息抛出到中毒队列。我试图做的是在有毒队列的计数为x时创建一个警报 我可以通过sidecart方法来实现这一点,我有一个独立的服务来监控有毒队列 我们看到了这种方法 希望使用blobproperty覆盖来存储一些元数据,这样我就可以跟踪故障,但似乎没有办法做到这一点?在最后一次尝试跟踪事件状态时,我正在考虑将消息移动到中毒队列 有更好的方法吗 [FunctionName("My

是否可以在posion队列之外创建警报?我有一个blob触发器函数,但当它失败
x
次时,它会将此消息抛出到中毒队列。我试图做的是在有毒队列的计数为
x
时创建一个警报

  • 我可以通过sidecart方法来实现这一点,我有一个独立的服务来监控有毒队列
  • 我们看到了这种方法
  • 希望使用
    blobproperty
    覆盖来存储一些
    元数据
    ,这样我就可以跟踪故障,但似乎没有办法做到这一点?在最后一次尝试跟踪事件状态时,我正在考虑将消息移动到中毒队列
  • 有更好的方法吗

            [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)
    
    [FunctionName(“MyFunction”)]
    公共异步任务运行(
    [BlobTrigger(“输入队列”,Connection=“ConnectionString”)]流blobContent,
    字符串名,
    System.Uri,
    词典元数据,
    BlobProperty属性,
    ILogger日志)
    
    编辑 注意到函数的过载:

            [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"));
            }
    
    [FunctionName(“MyFunction”)]
    公共异步任务运行(
    [BlobTrigger(“输入队列”,Connection=“ConnectionString”)]ICloudBlob blobContent,
    字符串名,
    System.Uri,
    词典元数据,
    BlobProperty属性,
    ILogger日志)
    {
    if(!blobContent.Metadata.ContainsKey(“mycount”))
    {
    元数据[“mycount”]=“1”;
    等待blobContent.SetMetadataAsync();
    }
    其他的
    {
    var value=int.Parse(blobContent.Metadata[“mycount”]);
    值++;
    blobContent.Metadata[“mycount”]=value.ToString();
    等待blobContent.SetMetadataAsync();
    }
    抛出新异常((“测试函数”);
    }
    

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

    我更喜欢的方法是使用Azure函数定期统计中毒队列中的项目数,并将其作为应用程序洞察指标发布。然后,您可以在那里设置查询/仪表板/警报

    此方法的基本概述如下。请注意,现代Azure函数允许您使用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);
    }
    
    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;
    }
    
    public async Task<int> GetApproximateMessagesCountAsync(string queueName)
    {
      var properties = await _queueServiceClient.GetQueueClient(queueName).GetPropertiesAsync();
      return properties.Value.ApproximateMessagesCount;
    }
    
    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);
    }
    
    TrackFatalErrorsCount
    基本上是:

    public async Task<IReadOnlyList<string>> GetAllQueuesAsync()
    {
      var result = new List<string>();
      await foreach (var item in _queueServiceClient.GetQueuesAsync())
          result.Add(item.Name);
      return result;
    }
    
    public async Task<int> GetApproximateMessagesCountAsync(string queueName)
    {
      var properties = await _queueServiceClient.GetQueueClient(queueName).GetPropertiesAsync();
      return properties.Value.ApproximateMessagesCount;
    }
    
    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);
    }
    
    一旦您将其作为一个指标,那么您就可以查询它,为Azure仪表板构建一个图表,和/或设置应用程序洞察警报