快速搭建一个监控服务

快速搭建一个监控服务

业务需要,要监控服务每个接口的访问速度和每个接口所花费的时间。同事推荐 statsd + graphite + docker 组合,花了点时间收集一下相关的信息,尝试在阿里云上把这个服务搭建起来。

整个服务的三个关键步骤:

运行服务(阿里云+docker)
发送数据(node)
收集展示数据(statsd + graphite)

一 安装运行服务:

需要的文档

在服务都安装好之后,需要在 sails 里安装 express 的中间件 node-statsd-client 用于发送数据。
怎么安装? sails 有文档 http://sailsjs.org/documentation/concepts/middleware

这里给个示例,修改 sails 项目下的 config/http.js 文件。
初始化:

1.var SDC = new require('statsd-client');
2.var statsdClient = new SDC({ host: '112.74.207.91', port: 8125, debug: false }).getChildClient('koala');

添加一个中间件,中间件过滤每个请求,这里做了个比较巧妙的事情,在中间件里替换了 res.end 方法,就可以在响应的时候发送数据了。

1.statsd_client: function (req, res, next) {
2. var startTime = new Date();
3. // Shadow end request
4. var end = res.end;
5. res.end = function () {
6. end.apply(res, arguments);
7. // Statistics the status code, especailly for 500, 404
8. statsdClient.increment('status_codes.' + res.statusCode);
9. var timeElapse = new Date() - startTime;
10. if (req.route && req.route.path) {
11. var path = req.route.path;
12. if (Object.prototype.toString.call(path) === '[object RegExp]') {
13. path = path.source;
14. }
15. if (path === "/") {
16. path = "root";
17. }
18. // Statistics the page hit count and time to render the page
19. var key = 'pages.' + req.method.toLowerCase() + '_' + path.replace(/:/g, "").replace(///, "").replace(///g, "_");
20. statsdClient.timing(key, timeElapse);
21. if (res.statusCode === 404) {
22. var key404 = '404.' + req.method.toLowerCase() + '_' + path.replace(/:/g, "").replace(///, "").replace(///g, "_");
23. statsdClient.increment(key404);
24. }
25. }
26. };
27. next();
28.},

上面的代码中一个发送了三个计数器

  • pages.*
  • statusCode.*
  • users.*

比较重要的方法是

1.statsdClient.timing(key, timeElapse);
2.
3.statsdClient.increment(key404);

发送数据是直接调用 statsd-client 包提供的方法。
这个两个方法是记录请求的响应时长和记录 404 状态的次数。

数据发送就搞定了。
接下来在 Graphite 的 dashboard 做几个统计,这里提供接口 api
查看过去一段时间内平均访问次数最高的10个接口:highestAverage(stats.timers.koala.pages.*.count,10)
查看过去一段时间内平均耗时最多的5个接口:highestAverage(stats.timers.koala.pages.*.mean,5)
一天内所有接口的访问次数:sumSeries(summarize(stats.timers.koala.pages.*.count,”1d”))

发表评论

电子邮件地址不会被公开。 必填项已用*标注