Оповещение об очереди подозрительных функций Azure

Можно ли создавать оповещения вне очереди позиций? У меня есть функция триггера больших двоичных объектов, но когда она терпит неудачу x раз, она помещает это сообщение в очередь отравлений. Что я пытаюсь сделать, так это создать оповещение, когда в этой ядовитой очереди будет x.

  1. Я могу сделать это с помощью sidecart-подхода, когда у меня есть независимая служба, которая отслеживает отравленные очереди.
  2. Видел этот подход https://stackoverflow.com/a/46334184/1134076
  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)

EDIT Заметил эту перегрузку для функции:

        [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"));
        }

Кажется излишним, но я могу отслеживать количество сбоев здесь и писать логику для отслеживания пользовательских событий.


person Dr Schizo    schedule 06.04.2021    source источник


Ответы (1)


Я предпочитаю использовать функцию Azure, которая периодически подсчитывает количество элементов в подозрительных очередях и публикует результаты в виде метрики Application Insights. Затем вы можете настроить запросы/панели мониторинга/оповещения оттуда.

Общий обзор этого подхода приведен ниже: " rel="nofollow noreferrer">здесь. Обратите внимание, что современные функции 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;
}

GetApproximateMessagesCount() по существу:

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

и 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);
}

Получив метрику, вы можете запросить ее, построить график для панели мониторинга Azure и/или настроить оповещения Application Insights.

person Stephen Cleary    schedule 06.04.2021