c# - 是否可以通过 CosmosDB 在 Azure Function 中完美监控 Change Feed 的工作情况
问题描述
我有一个 Azure 函数,它会从 CosmosDB 触发 Change Feed,然后将其文档 ETL 到 MS SQL。但是,当服务器(CosmosDB 或 Azure Function 主机)有某种压力时,提要会延迟几秒到几分钟甚至丢失。目前我有解决方法来防止数据工厂丢失并每天重新同步它。
现在我想实施测量来监控,例如延迟时间、成功或失败指出并确定我是否应该扩大 DTU 或服务于分析的东西。我无法查询所有 Cosmos 和 SQL 以在它们之间进行比较,尽管这是通过简单查询计数来检测丢失的最后一种方法。
这可能吗?
解决方案
对于运行状况监控,您可以将运行状况监控检查发送到您的 App Insights:https ://docs.microsoft.com/azure/cosmos-db/how-to-configure-cosmos-db-trigger-logs
通过以下方式启用日志记录:
{
"version": "2.0",
"logging": {
"fileLoggingMode": "always",
"logLevel": {
"Host.Triggers.CosmosDB": "Trace"
}
}
}
这将在尝试执行检查点时捕获触发器内部发生的任何严重错误(例如,已删除租约集合)。
至于延迟获取更改,最常见的原因在这里详述:https ://docs.microsoft.com/azure/cosmos-db/troubleshoot-changefeed-functions#my-changes-take-too-long-to-be -已收到
请记住,在大多数情况下,新批次的更改是在您当前执行完成处理当前批次后读取的。通常,如果您遵循Functions 最佳实践并且 Functions 很苗条,它们不会造成问题,但如果您发现您的 Function 需要很长时间来处理更改(不是线性的,例如,它在 1 秒内处理 10 个事件但在 30 秒内发生 50 个事件,这是您在 App Insights 中看到的每个函数执行的指标),它可能指向函数代码的不希望的复杂性。
还有一种方法可以将 Change Feed Estimator 连接到另一个 Function 上,它基本上暴露了您在 Change Feed 中落后多远:https ://medium.com/microsoftazure/azure-cosmos-db-functions-cookbook-monitoring-触发待处理工作 800b24589235
这个想法是您可以使用 TimerTrigger 并将其与当前的 Trigger 配置混合以创建 Estimator 并使用它(有关完整描述,请参阅帖子):
[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);
}
推荐阅读
- typescript - NestJS / Swagger - 无法导入模块
- node.js - 通过 UDP 类返回对象数组
- python - 网页抓取 CNBC 美国财政部页面
- python - 如何从日期和时间创建日期时间对象并处理所需的时区?
- dhall - 如何在 extractError 中获取更多上下文?
- git - 如何使用 Git 将父分支中的错误修复应用到子分支?
- python - 如何在多处理中与另一个脚本共享全局变量?
- python - 数组中每个元素的最小值
- php - 即使在清除缓存和更改 CSS 版本之后,CSS 文件也会被缓存
- python - 函数执行和不执行的区别(返回变量)