繁体   English   中英

CosmosDB - 以编程方式查询消耗的 RU/s?

[英]CosmosDB - query for consumed RU/s programmatically?

我正在尝试获取有关收集级别上 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也不是一种可行的方法。

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

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

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

您可以使用 @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 ))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM