首页 > 解决方案 > 是否可以通过 CosmosDB 在 Azure Function 中完美监控 Change Feed 的工作情况

问题描述

我有一个 Azure 函数,它会从 CosmosDB 触发 Change Feed,然后将其文档 ETL 到 MS SQL。但是,当服务器(CosmosDB 或 Azure Function 主机)有某种压力时,提要会延迟几秒到几分钟甚至丢失。目前我有解决方法来防止数据工厂丢失并每天重新同步它。

现在我想实施测量来监控,例如延迟时间、成功或失败指出并确定我是否应该扩大 DTU 或服务于分析的东西。我无法查询所有 Cosmos 和 SQL 以在它们之间进行比较,尽管这是通过简单查询计数来检测丢失的最后一种方法。

这可能吗?

标签: c#azureazure-cosmosdbazure-cosmosdb-changefeed

解决方案


对于运行状况监控,您可以将运行状况监控检查发送到您的 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);
}

推荐阅读