Nodejs metric监控工具分享

Nodejs metric监控工具分享

刚开始使用Node,很多东西做的都不到家。新做的一个监控metric异常的项目。

数据存储使用ssdb (赞一下,ssdb真的很不错很不错,我需要磁盘存储,有需要数据结构服务器,ssdb是最佳选择)

数据渲染使用的是cubism , 很欣赏它的horizon图。只是不能websocket传数据,只能主动pull

异常判断是基于3-sigma准则的 (正态分布中99.97%的数据分布在偏离平均水平3个标准差的范围内)

还望拍砖。

https://github.com/eleme/node-bell


3 回复

Nodejs Metric 监控工具分享

刚开始使用Node.js时,很多东西做得都不是很到位。最近,我开发了一个用于监控Node.js应用中异常指标的项目。

数据存储

在数据存储方面,我选择了SSDB(一个高性能的键值存储系统)。SSDB非常适合我的需求,因为它不仅支持磁盘存储,还提供了丰富的数据结构支持。这使得SSDB成为存储监控数据的最佳选择。

// 示例代码:连接到SSDB并存储数据
const ssdb = require('node-ssdb');
const client = new ssdb.Client({
    host: '127.0.0.1',
    port: 8888,
});

client.set('metric_key', JSON.stringify({ metric: 'value' }), (err, resp) => {
    if (err) {
        console.error(err);
    } else {
        console.log('Data stored successfully:', resp);
    }
});

数据渲染

为了可视化这些监控数据,我使用了Cubism.js。Cubism.js 提供了一种非常优雅的方式来展示时间序列数据,特别是它的Horizon图非常吸引人。不过,Cubism.js 不支持WebSocket实时推送数据,只能通过轮询的方式获取数据。

<!-- 示例代码:使用Cubism.js渲染数据 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/cubism/1.9.4/cubism.v1.min.js"></script>
<div id="chart" style="width: 100%; height: 200px;"></div>

<script>
    var context = cubism.context()
        .serverDelay(0)
        .clientDelay(0)
        .step(1000 * 60)
        .size(1440);

    var metric = context.metric(function(start, stop, step, callback) {
        // 这里从SSDB拉取数据
        client.get('metric_key', (err, data) => {
            if (!err && data) {
                callback(null, JSON.parse(data));
            }
        });
    }, 'metric');

    d3.select('#chart')
        .call(context.axis().orient("top"))
        .selectAll(".axis")
        .data([""])
        .enter().append("text")
        .attr("class", "axis")
        .attr("x", -6)
        .attr("dy", ".71em")
        .text(String);

    d3.select('#chart')
        .selectAll(".horizon")
        .data([metric])
        .enter().append("div")
        .attr("class", "horizon")
        .call(metric.width(context.size()));
</script>

异常判断

对于异常检测,我采用了3σ准则(即正态分布中的99.97%的数据应该位于平均值的三个标准差范围内)。如果某个指标超出这个范围,就会被认为是异常的。

// 示例代码:基于3σ准则进行异常检测
function isAnomaly(value, mean, stdDev) {
    const threshold = 3;
    return Math.abs(value - mean) > threshold * stdDev;
}

// 假设我们已经有了mean和stdDev
const mean = 100;
const stdDev = 10;

const value = 150; // 示例值
if (isAnomaly(value, mean, stdDev)) {
    console.log('Alert: Anomaly detected!');
} else {
    console.log('Normal: No anomaly.');
}

希望以上内容能对大家有所帮助,如果有更好的建议或意见,欢迎拍砖交流!项目源码可以在这里查看:node-bell


看上去很屌!我常用这个ruby的监控工具,还有api接口,感觉还不错。scout_realtime

在Node.js中进行监控metric的数据采集、存储和渲染,可以结合多种工具来实现。根据你的需求,这里提供一个简单的示例框架,使用prom-client进行metric收集,SSDB作为存储,以及Cubism进行数据可视化。

1. 使用prom-client收集metric

首先,你需要安装prom-client库来创建和管理metric:

npm install prom-client

然后,你可以定义一些metric并暴露给监控系统:

const client = require('prom-client');

// 定义一个计数器
const counter = new client.Counter({
    name: 'my_counter',
    help: 'A counter for my application'
});

// 增加计数器的值
counter.inc();

// 定义一个直方图
const histogram = new client.Histogram({
    name: 'my_histogram',
    help: 'A histogram for my application',
    buckets: [0.1, 0.5, 1, 2.5, 5, 7.5, 10]
});

// 记录一个样本
histogram.observe(4.2);

// 创建一个HTTP端点来暴露这些metrics
client.collectDefaultMetrics();

2. 存储到SSDB

为了将这些metric存储到SSDB,你需要写一个定时任务或者事件处理器,将metric值推送到SSDB。这可能涉及到编写一个简单的脚本或服务来定期抓取这些metrics,并将其存储到SSDB中。

3. 数据渲染与异常检测

对于数据渲染,你可以使用Cubism.js来展示这些metric。但是,由于Cubism不支持WebSocket实时传输数据,你需要定期通过HTTP请求从SSDB拉取数据。

对于异常检测,你可以基于3-sigma准则来实现。以下是一个简单的实现:

function detectAnomalies(metricValues) {
    const avg = metricValues.reduce((sum, value) => sum + value, 0) / metricValues.length;
    const variance = metricValues.reduce((sum, value) => sum + Math.pow(value - avg, 2), 0) / metricValues.length;
    const stdDev = Math.sqrt(variance);

    // 3-sigma准则
    const lowerBound = avg - 3 * stdDev;
    const upperBound = avg + 3 * stdDev;

    return metricValues.filter(value => value < lowerBound || value > upperBound);
}

以上代码只是一个基本框架,具体实现细节可能需要根据你的具体需求进行调整。希望这些信息对你有所帮助!

回到顶部