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