我正在尝试获取有关在集合级别上消耗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 也不是一种方法。
答案 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
))