【问题标题】:CosmosDB - query for consumed RU/s programmatically?CosmosDB - 以编程方式查询消耗的 RU/s?
【发布时间】:2020-03-28 04:51:52
【问题描述】:

我正在尝试获取有关收集级别上的 RU/秒消耗量的信息,不幸的是,当我使用 node.js documentdb 模块查询收集信息时,代码类似于

var client = new DocumentDBClient(host, { masterKey: masterKey });
client.readCollection(collection._self, function(err, item) {
   if (err) {
      console.log(err);
    } else {
      console.log(item);
    }
});

我只得到如下基本信息

{ id: 'myCollection',
  indexingPolicy:
   { indexingMode: 'consistent',
     automatic: true,
     includedPaths: [ [Object] ],
     excludedPaths: [] },
  _rid: 'ku8SANRCfwA=',
  _ts: 1505295711,
  _self: 'dbs/ku8SAA==/colls/ku8SANRCfwA=/',
  _etag: '"00008b00-0000-0000-0000-59b8fd5f0000"',
  _docs: 'docs/',
  _sprocs: 'sprocs/',
  _triggers: 'triggers/',
  _udfs: 'udfs/',
  _conflicts: 'conflicts/' }

还有其他方法可以获取每个集合的 RU 消耗信息吗?这些数据在 Metrics -> Throughput 刀片的门户中可用,但如何通过 API 获取它对我来说是个谜。 Azure Monitor 仅提供整个数据库级别的平均指标,因此使用 Azure Monitor API 也不是可行的方法。

【问题讨论】:

    标签: node.js azure azure-cosmosdb


    【解决方案1】:

    这在您的方案中可能不可行,但您绝对可以使用其他一些 Azure 产品推出自己的解决方案。我同意用于拉取 RU 消耗的原生 API 会更理想。

    如果您想推出自己的产品,可以通过使用事件中心和流分析来实现。围绕您的 Cosmos 查询编写一个小型包装器,将其 RU 成本发布到您的事件中心(您执行的每个操作都会从 Cosmos 返回 RU 成本)。从那里开始,流分析内置了用于从您的集线器提取消息的集成。这将是创建一个简单查询的问题,该查询将 RU 成本聚合在一秒钟的存储桶中。从那里你可以做各种很酷的事情,包括在给定的阈值发送警报,甚至触发自动缩放操作以响应你的实时使用以优化你的 Cosmos 成本。

    根据您对 Cosmos 的利用程度以及如果您观察到峰值工作负载,进行智能扩展所节省的成本将超过事件中心 + 流分析的额外支出。

    【讨论】:

    • 有趣的想法,听起来很复杂,但如果这是唯一的选择... :) 有趣的是这些指标在系统中,因为它们是通过门户仪表板呈现的。只是 API 和 Azure Monitor 我看不到它们暴露在外……
    • 在架构上它可能听起来有点复杂,但我认为如果你要实现它,你会惊讶于它组合起来的速度和容易程度。对于这类用例,它们是非常强大的工具,具有相对简单的 API。令人沮丧的是,这些指标在某处明显可用,但这种方法的优势在于更加实时和可操作的洞察力。门户中的指标没有提供最大的粒度,可能会稍有滞后。
    • 似乎您现在可以通过 RESTful API 获取消耗的 RU,降低到每分钟的速率:docs.microsoft.com/en-us/azure/cosmos-db/…docs.microsoft.com/en-us/azure/azure-monitor/platform/… 。请参阅指标 TotalRequestUnits。我的实验表明,可以检索每分钟消耗的 RU,直至前一个完全完成的分钟。
    【解决方案2】:

    您可以使用 @azure/arm-monitor 和 @azure/ms-rest-nodeauth 包查询消耗的 RU/s。你需要为调用者(如果使用 MSI 身份验证或服务主体,则在 Azure 中运行的函数应用)提供对 Azure 门户中资源组的“API 管理服务读取器”和“监控读取器”权限。代码在 TypeScript 中看起来像这样:

    import * as moment from 'moment'
    import {
      loginWithAppServiceMSI
    } from '@azure/ms-rest-nodeauth'
    import {
      MonitorManagementClient, MonitorManagementModels
    } from '@azure/arm-monitor'
    import { MetricsListResponse } from '@azure/arm-monitor/esm/models'
    
    // alternatively, you can use a service principal creds, @azure/ms-rest-nodeauth -> loginWithServicePrincipalSecretWithAuthResponse()
    const credentials = await loginWithAppServiceMSI({
      msiEndpoint: process.env.MSI_ENDPOINT,
      msiSecret: process.env.MSI_SECRET,
      resource: 'https://management.azure.com/'
    })
    const now = moment()
    const end = now.toISOString()
    const start = now.subtract(1, 'minute').toISOString()
    const client = new MonitorManagementClient(credentials, SUBSCRIPTION_ID)
    
    const options: MonitorManagementModels.MetricsListOptionalParams = {
      metricnames: 'TotalRequestUnits',
      metricnamespace: 'Microsoft.DocumentDB/databaseAccounts',
      filter: `CollectionName eq '${CONTAINER_NAME}'`,
      interval: 'PT1M',
      timespan: `${start}/${end}`
    }
    const url = `subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP_NAME}/providers/Microsoft.DocumentDB/databaseAccounts/${DATABASE_NAME}`
    const response: MetricsListResponse = (await client.metrics.list(
      url,
      options
    ))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 2011-08-07
      • 2021-08-14
      相关资源
      最近更新 更多