利用 Prometheus 监控 NodeJS 应用
@ · Tuesday, Mar 28, 2017 · 2 minute read · Update at Mar 28, 2017

「欢快的搭建好 Prometheus」之后,记录我们 nodejs 应用的指标就是一件更欢快的事了。

脑洞主要是在应用中引入一个外部的 node 模块,这个模块提供了对 Prometheus 指标类型(metric types)的支持。本文中用到的是 CounterGauge 。这个模块通过一个轻量的 express 服务暴露统计数据,以便 Prometheus 来抓取。

记录应用数据

每个应用都可能有许多有意思的指标。比如我要对 Realtime Bitcoin Globe 添加 websocket 服务,它将关于比特币交易消息中继到连接的 web 客户端。通过 Prometheus 我们可以很容易获取下面的指标:

  • 服务发送了多少个 websocket 消息?
  • 服务有多少活跃的 websocket 连接?
  • 新建链接?
  • 内存占用?

这些统计必须通过指标来实现。同时记录的指标包括:中继延迟(从接收发送到Websocket客户端的事务需要多长时间?)、交易细节(记录经过系统的交易)或者数据库查询(执行时长、查询类型、缓存命中)等。记录的内容无尽可能。

通过 Prometheus 类似的稳固的监控系统,可以更直观地了解应用当前的状态。这些(收集来的)数据在出状况、衡量某项优化效果(或想找出可优化点)时帮你大忙。

这里采用的是一个很轻量的 NPM 包 prometheus-client ,刚好能满足我们的需求。

monitor.js

var Prometheus = require('prometheus-client');
client = new Prometheus();

module.exports = {
  connections: client.newCounter({
    namespace: 'blocks_wizbit',
    name: 'new_connections',
    help: 'The number of new connections.'
  }),

  messages: client.newCounter({
    namespace: 'blocks_wizbit',
    name: 'send_ws_messages',
    help: 'The number of send websocket messages.'
  }),

  connectedUsers: client.newGauge({
    namespace: 'blocks_wizbit',
    name: 'active_connections',
    help: 'The number of active connections.'
  }),

  memoryUsage: client.newGauge({
    namespace: 'blocks_wizbit',
    name: 'memory',
    help: 'The current used memory.'
  })
}

client.listen(9095);

最后一行通过模块自带的 express 服务监听在 9095 端口。

现在可以在任何想要监控的地方引入 monitor.js,比如在处理所有 websocket 服务逻辑的地方:

const monitor = require('path/to/monitor.js');

server.on('connection', e => {
  monitor.connections.increment();

  // 其它逻辑
});

再比如监控活跃用户:

setInterval(() => {
  monitor.connectedUsers.set({
    period: '10sec'
  }, server.connections());
}, 10000);

创建图表

前面用了 promdash (看如何安装博客),留意其中查询的部分:

服务发送了多少个 websocket 消息(每秒)?

rate(blocks_wizbit_send_ws_messages[1m])

有多少个活跃 websocket 连接?

blocks_wizbit_active_connections

新建了多少连接(每分钟)?

rate(blocks_wizbit_new_connections[1m]) * 60 

内存占用(单位 mb)

blocks_wizbit_memory / 1024 / 1024

最终图表长这样:

本文根据 askmike 的《Monitoring nodejs apps with Prometheus》所译,整个译文带有我们自己的理解与思想,如果译得不好或有不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:https://askmike.org/articles/monitoring-node-apps-with-prometheus/ 。

Social Links