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

时间:2017-09-13 12:08:45

标签: node.js azure azure-cosmosdb

我正在尝试获取有关在集合级别上消耗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消费信息?此数据可在指标 - >中的门户网站中找到。吞吐量刀片,但如何通过API获取它对我来说是一个谜。 Azure Monitor 仅提供整个数据库级别的平均指标,因此使用 Azure Monitor API 也不是一种方法。

2 个答案:

答案 0 :(得分:2)

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

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

取决于您利用Cosmos的重要程度,如果您观察到spikey工作负载,那么进行智能扩展所带来的成本节省将抵消Event Hubs + Stream Analytics的额外支出。

答案 1 :(得分:0)

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