C# 是否可以从CosmosDB监控Azure函数中的更改提要工作是否完美
我有一个Azure函数,它将触发CosmosDB的变更提要,然后将其文档ETL到MS SQL。但是当服务器(CosmosDB或Azure功能主机)有压力时,提要会延迟几秒钟甚至几分钟。目前我有办法防止数据工厂丢失,并每天重新同步 现在,我想实施测量来监控,例如延迟时间、成功或失败,以指出并确定是否应该放大DTU,或者是服务于分析的东西。我无法查询所有Cosmos和SQL来比较它们,尽管这是通过简单的查询计数来检测丢失的最后一种方法C# 是否可以从CosmosDB监控Azure函数中的更改提要工作是否完美,c#,azure,azure-cosmosdb,azure-cosmosdb-changefeed,C#,Azure,Azure Cosmosdb,Azure Cosmosdb Changefeed,我有一个Azure函数,它将触发CosmosDB的变更提要,然后将其文档ETL到MS SQL。但是当服务器(CosmosDB或Azure功能主机)有压力时,提要会延迟几秒钟甚至几分钟。目前我有办法防止数据工厂丢失,并每天重新同步 现在,我想实施测量来监控,例如延迟时间、成功或失败,以指出并确定是否应该放大DTU,或者是服务于分析的东西。我无法查询所有Cosmos和SQL来比较它们,尽管这是通过简单的查询计数来检测丢失的最后一种方法 这可能吗?对于运行状况监视,您可以启用将运行状况监视检查发送到您
这可能吗?对于运行状况监视,您可以启用将运行状况监视检查发送到您的App Insights: 通过以下方式启用日志记录:
{
"version": "2.0",
"logging": {
"fileLoggingMode": "always",
"logLevel": {
"Host.Triggers.CosmosDB": "Trace"
}
}
}
这将捕获在尝试执行检查点时触发器内部发生的任何关键错误(例如,租约集合已被删除)
关于更改延迟,最常见的原因如下:
请记住,在大多数情况下,在当前执行完成当前批处理后,将读取新的更改批。通常情况下,如果您遵循,并且函数很小,它们不会造成问题,但是如果您看到您的函数需要很长时间来处理更改(例如,不是线性的,它在1秒内处理10个事件,但在30秒内处理50个事件,这是您在应用程序中看到的每个函数执行的洞察指标),它可能指向函数代码中不希望出现的复杂性
还有一种方法可以将变更反馈估计器连接到另一个函数上,该函数基本上揭示了您在变更反馈方面的落后程度:
其思想是,您可以使用TimerTrigger并将其与当前触发器配置混合,以创建估计器并使用它(有关完整描述,请参阅帖子):
对于一个给出了downvote或closevote的人,虽然这不是一种常见的情况,也不是很清楚,因为它可能是由多个情感引起的,因此我想要的是能够通过CosmosDB和Azure功能的低级别接近有效地监控健康状况,以消除数据丢失的所有风险。非常感谢,我将很快为您了解您的技术和反馈。我已经部署了一个集合进行测试,它运行良好。另一个问题是,目前我有10个集合,我应该为所有人实现吗?每秒监听10个函数会使服务器更加滞后?更改提要是每个集合的,因此如果您有10个集合,则估计值是每个集合的。每隔几秒钟检查一次估计值不会增加多少总体使用量。请始终关注门户指标,并查看您是如何使用已配置的吞吐量的。
[FunctionName("Monitor")]
public static async Task Monitor(
[TimerTrigger("*/1 * * * * *", RunOnStartup = true)] TimerInfo timer, // Timer will trigger every 1 second, adjust CRON expression
[CosmosDB("%MonitoredDatabase%", "%MonitoredCollection%", ConnectionStringSetting = "CosmosDB")] DocumentClient monitoredCollectionClient,
[CosmosDB("%MonitoredDatabase%", "leases", ConnectionStringSetting = "CosmosDB")] DocumentClient leaseCollectionClient,
ILogger log)
{
var estimator = GetRemainingWorkEstimator(monitoredCollectionClient, leaseCollectionClient);
var remainingWork = await estimator.GetEstimatedRemainingWork();
// Send custom metric to App Insight
log.LogInformation(remainingWork.ToString());
log.LogMetric("RemainingWork", remainingWork);
}