用于Nodejs事件循环延迟的StackDriver自定义度量标准

时间:2018-02-03 17:41:35

标签: node.js google-app-engine stackdriver google-cloud-stackdriver

我正在尝试为Google StackDriver构建一个自定义指标,我可以用它来跟踪nodejs事件循环延迟。所有应用都在Google AppEngine中运行,因此我仅限于使用受监控的资源RewriteCond %{HTTP:Accept} !^$(至少根据我的理解)。

通过nodejs global客户端,我创建了一个如下所示的度量标准描述符:

@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

这使得我的自定义指标非常无用,只有一个nodejs进程可以写入此自定义指标。

现在我的问题是,我该怎样绕过这个?我希望能够从运行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. AppEngine服务且运行x个实例的所有nodejs实例中编写。

我在考虑在y上编入索引的type,但它看起来有点极端,很快就会让我走向StackDriver帐户的配额。

任何建议都非常感谢!

1 个答案:

答案 0 :(得分:0)

Stackdriver中自定义指标的时间序列数据必须按照https://cloud.google.com/monitoring/custom-metrics/creating-metrics#which-resource中记录的顺序编写。

解决方法是通过为instance_id添加用户定义的标签,为每个写入指标的实例创建单独的时间系列。如果需要,您还可以为service_nameservice_version添加单独的标签。但是,请注意标签值的基数。在单个指标上创建过多的时间序列会降低查询性能。

有关时间序列的详细信息:请参阅https://cloud.google.com/monitoring/api/v3/metrics-details#intro-time-series