Nodejs 事件循环延迟的 StackDriver 自定义指标
StackDriver Custom Metric for Nodejs event loop latency
我正在尝试为 Google StackDriver 构建一个自定义指标,我可以用它来跟踪 nodejs 事件循环延迟。 Google AppEngine 中的所有应用程序都是 运行,因此我只能使用受监控的资源 global
(至少据我所知)。
通过 nodejs @google/monitoring
客户端,我创建了一个如下所示的指标描述符:
{
name: client.projectPath(projectId),
metricDescriptor: {
description: 'Nodejs event loop latency',
displayName: 'Event Loop Latency',
type: 'custom.googleapis.com/nodejs/eventloop/latency',
metricKind: 'GAUGE',
valueType: 'DOUBLE',
unit: '{ms}',
labels: [
{
key: 'instance_id',
valueType: 'STRING',
description: 'The ID of the instance reporting latency (containerId, vmId, etc.)',
},
],
},
并将数据写入此自定义指标,例如:
metric: {
type: 'custom.googleapis.com/nodejs/eventloop/latency',
labels: {
instance_id: instanceId,
},
},
resource: {
type: 'global',
labels: {
project_id: projectId,
},
},
points: [{
interval: {
endTime: {
seconds: item.at,
},
},
value: {
doubleValue: item.value,
},
}],
};
我在编写测试时认为一切都很好,直到我尝试更改 instance_id
以写入时间跨度重叠的数据,因为另一个假实例已经写入了。现在监控客户端抛出错误
Error: One or more TimeSeries could not be written:
Points must be written in order. One or more of the points specified was older than the most recent stored point.
这使得我的自定义指标非常无用,只有一个 nodejs 进程可以写入此自定义指标。
现在我的问题是,我该如何避免呢?我希望能够从我所有的 nodejs 实例 运行(x
AppEngine 服务和 y
个实例 运行)写入。
我在想 type
在 nodejs/eventloop/latency/{serviceName}/{serviceVersion}/{instanceId}
上建立索引,但它似乎有点极端,很快就会使我达到 StackDriver 帐户的配额。
非常感谢任何建议!
Stackdriver 中自定义指标的时间序列数据必须按时间顺序写入 https://cloud.google.com/monitoring/custom-metrics/creating-metrics#which-resource。
解决此问题的方法是通过为 instance_id
添加用户定义的标签,为每个写入指标的实例创建一个单独的时间序列。如果需要,您还可以为 service_name
或 service_version
添加单独的标签。但是,请注意标签值的基数。在单个指标上创建太多时间序列会降低查询性能。
有关什么是时间序列的更多详细信息:请参阅 https://cloud.google.com/monitoring/api/v3/metrics-details#intro-time-series。
我正在尝试为 Google StackDriver 构建一个自定义指标,我可以用它来跟踪 nodejs 事件循环延迟。 Google AppEngine 中的所有应用程序都是 运行,因此我只能使用受监控的资源 global
(至少据我所知)。
通过 nodejs @google/monitoring
客户端,我创建了一个如下所示的指标描述符:
{
name: client.projectPath(projectId),
metricDescriptor: {
description: 'Nodejs event loop latency',
displayName: 'Event Loop Latency',
type: 'custom.googleapis.com/nodejs/eventloop/latency',
metricKind: 'GAUGE',
valueType: 'DOUBLE',
unit: '{ms}',
labels: [
{
key: 'instance_id',
valueType: 'STRING',
description: 'The ID of the instance reporting latency (containerId, vmId, etc.)',
},
],
},
并将数据写入此自定义指标,例如:
metric: {
type: 'custom.googleapis.com/nodejs/eventloop/latency',
labels: {
instance_id: instanceId,
},
},
resource: {
type: 'global',
labels: {
project_id: projectId,
},
},
points: [{
interval: {
endTime: {
seconds: item.at,
},
},
value: {
doubleValue: item.value,
},
}],
};
我在编写测试时认为一切都很好,直到我尝试更改 instance_id
以写入时间跨度重叠的数据,因为另一个假实例已经写入了。现在监控客户端抛出错误
Error: One or more TimeSeries could not be written:
Points must be written in order. One or more of the points specified was older than the most recent stored point.
这使得我的自定义指标非常无用,只有一个 nodejs 进程可以写入此自定义指标。
现在我的问题是,我该如何避免呢?我希望能够从我所有的 nodejs 实例 运行(x
AppEngine 服务和 y
个实例 运行)写入。
我在想 type
在 nodejs/eventloop/latency/{serviceName}/{serviceVersion}/{instanceId}
上建立索引,但它似乎有点极端,很快就会使我达到 StackDriver 帐户的配额。
非常感谢任何建议!
Stackdriver 中自定义指标的时间序列数据必须按时间顺序写入 https://cloud.google.com/monitoring/custom-metrics/creating-metrics#which-resource。
解决此问题的方法是通过为 instance_id
添加用户定义的标签,为每个写入指标的实例创建一个单独的时间序列。如果需要,您还可以为 service_name
或 service_version
添加单独的标签。但是,请注意标签值的基数。在单个指标上创建太多时间序列会降低查询性能。
有关什么是时间序列的更多详细信息:请参阅 https://cloud.google.com/monitoring/api/v3/metrics-details#intro-time-series。