CNode

利用 new relic 监控 express 项目

精华
分享
DDoubleSpout发布于12 年前最后回复11 年前34 回复27714 浏览0 收藏

最近一个偶然的机会了解到代码剖析分析,何为剖析,我也解释不好就介绍下它的作用,通过作用来理解吧。

比如一个新项目上线,有许多功能,作为开发者和运维人员是不是很想知道各个功能点运行的怎么样,是否有内存泄露,响应是否迅速,各个功能点用户使用的频率等等信息呢?另外如果发现了某一个功能使用起来特别慢,那我们能快速定位到,到底是数据库执行慢,还是代码性能问题,又或者是服务器内存不足频繁交换引起的呢?

想要全方位了解自己的应用在服务器上的运行情况就需要代码剖析,如果交给我来设计,恐怕就是在各个可能出问题的地方做钩子,记录运行时间,存入数据库或者写入日志服务器。现在这一切都不用我们自己来操心了.

只需要几行代码就可以把这些工作交给 new relic 来做掉。

new relic 就是这样一个应用管理和监控软件,他目前支持很多主流语言,我用的是python和node.js的支持,他支持node.js的express框架,而且用起来非常简单,只需要4步: 1、创建一个 new relic 帐号,免费的哦,不过只能记录24小时的数据 2、安装newrelic包,

npm install newrelic

或者在package.json的写入:(写本文时最高版本是1.10.2)

 "dependencies": {
       ...
       "newrelic":"1.10.2"
   },

3、把node_modules/newrelic/newrelic.js 拷贝到项目根目录,然后修改其中的几个值如下:

/**
 * New Relic 客户配置文件.
 *
 * 参考 lib/config.defaults.js 获得更多的配置.
 */
exports.config = {
  /**
   * 应用名称数组,取一个喜欢的名字
   */
  app_name : ['My Application'],
  /**
   * 你的 New Relic 授权 key,在个人中心里把key拷贝进去
   */
  license_key : 'license key here',
  logging : {
    /**
     * 日志等级. 'trace' 对于 New Relic 诊断问题时是最有用的
     * 'info' 级别以及更高的应该应用于生产应用
     */
    level : 'info'
  }
};

4、在根目录的app.js中的第一行拷贝加载模块代码:

require('newrelic');

执行完以上4步,等待5分钟就可以在new relic后台看到应用的数据了。

1、后台统计总图,最大的图表示事务的平均响应时间,右上角是应用性能指数(apdex score)蓝色表示优异(0.94分以上),绿色表示好,红色表示一般,又下角是系统吞吐率,rpm表示每分钟处理请求数。

1

2、系统用到的各个应用图,这里我就用到了recmember应用和database数据库,时间表示平均响应时间

2

3、表示应用花费大部分处理的请求url地址,优化这部分功能可以最有效的提高系统吞吐率

3

4、下面用户请求 /view/user/regist 获得注册页面功能的所有耗时和调用次数以及耗时百分比,简单分析一下下图, 因为如果用户是已经注册,则会响应 user_modify.ejs 所以我们看到了会渲染2个view,我们看到这个功能耗时最多的是渲染 user_regist.ejs 这个模版,占据了功能点的43%的时间消耗,所以应该特别优化这部分最有效果。

1

5、下图是所有数据库操作中平均响应时间最长的

1

6、点击 insert 操作,我们看到这个操作被调用的时间以及控制器调用此操作的执行时间百分比。

1

通过new relic的后台提供的数据,我们可以清楚的监控整个应用是否健康的运行,哪里值得优化,对什么地方优化能够得到最大的系统吞吐率提升。

对于使用 new relic browser也很简单,步骤如下:

1、在app.js增加如下代码,如果已经加载可忽略:

var newrelic = require('newrelic');

2、在加载完express模块后增加如下代码:

var express = require('express');
var app = express();
...
app.locals.newrelic = newrelic; //写入locals

3、在ejs模版中的head部分增加监控js即可

<%- newrelic.getBrowserTimingHeader() %>

jade模版如下:

!= newrelic.getBrowserTimingHeader()

4、确保在 new relic 的后台设置中是打开enable browser 选项的

一张图说明下browser各个性能参数

http://wzhfile.qiniudn.com/relic/7.png

另外再分享一个小技巧,默认的时区是美国时间,我们需要在 User preferences 个人设置中将时区设为北京时间,这样就可以了

最后不得不说new relic包的安全问题,可能有朋友会说,这个包会不会留后门,我的服务器会不会成为肉鸡,代码会不会泄露,这个我也无法保证,但是至少要保证运行nodejs程序的权限不要用root。

论坛发图我现在都用七牛空间了,速度挺快,另外 nodeclub 早已经用new relic了哦~

查看回复

回复 (31)

H
HuarenYu#1·11 年前

好贴。

G
gynmi#2·11 年前

请教一个问题, 在哪个页面可以看到监控数据, 怎么我没找到的~

Q
qianjiahao#3·11 年前

好棒。。。

R
russj#4·11 年前

如果只有限制 IP 地址才能访问的网站,比如企业内部网站,这个应该不能监控吧?

4
42thcoder#5·11 年前
引用 russj如果只有限制 IP 地址才能访问的网站,比如企业内部网站,这个应该不能监控吧?

@russj 应该是可以的, new relic 是在你的服务器记录数据, 然后上传到它自己的

H
hades#6·12 年前

这个不错。顶了。

C
chemdemo#7·12 年前

看了下文档 通过埋点 ms还可以监控浏览器的渲染时间 这个很赞啊~

S
showen#8·12 年前

赞!

J
jiangli373#9·12 年前

好文,赞一个

A
alsotang#10·12 年前

Cnode确实早就在用了。:)

D
DoubleSpout#11·12 年前
引用 alsotangCnode确实早就在用了。:)

@alsotang 嗯,我搜索关键字的时候搜到的~

D
DoubleSpout#12·12 年前

@fantasyni 这个监控函数的性能是专供给pomelo用的吧?new relic用起来方便,能帮助我们初步的定位到问题,还有后台分析这些数据,可以和函数性能监控可以结合起来解决问题。

C
coolicer#14·12 年前

原来是这样用的

D
DoubleSpout#15·12 年前
S
sumory#16·12 年前

攒了个。

B
backsapce#18·12 年前

学习了

Q
qinyang912#19·12 年前

统计数据的时间有哦时差啊

L
leizongmin#20·12 年前

吴老师好厉害 Sketch8112274.png

D
DoubleSpout#21·12 年前
引用 qinyang912统计数据的时间有哦时差啊

@qinyang912 可以在设置里面设置时区的

D
DoubleSpout#22·12 年前
引用 leizongmin吴老师好厉害

@leizongmin 好大的月饼~

F
fengmk2#23·12 年前

看来还不支持 koa

K
klamtlne#24·12 年前

下午把应用架起来了,之前一直pm2

J
jobn123#26·11 年前

nice 自豪地采用 CNodeJS ionic

C
CommanderXL#27·11 年前

nice~

X
XadillaX#29·11 年前

国内有个 OneAPM,就是包有点蛋疼,不能通过 NPM。

部署时候要把 .tar.gz 文件放在项目目录里面,然后 package.json 里面依赖里面填压缩包路径才能安装。

(别问我为什么不直接拷过去到 node_modules 下面,我有强迫症。

R
russj#30·11 年前

我试了,内网有防火墙的不行 New Relic agents (including New Relic Browser) require your firewall to allow outgoing connections to the following networks and ports 向网管申请太麻烦了

T
thomas0836#31·11 年前

楼主 关于 new relic 的使用 有些东西想请教 ,我在Linux 内 使用 PM2的运行我的项目 但是 就出现了 www-0 Error: Cannot find module './config.js' at Function.Module._resolveFilename (module.js:336:15) at Function.Module._load (module.js:278:25) at Function. (/nodejs/lib/node_modules/pm2/node_modules/pmx/lib/transaction.js:62:21) at Module.require (module.js:365:17) at require (module.js:384:17) at Object. (/home/ec2-user/login/node_modules/newrelic/lib/logger.js:18:14) at Module._compile (module.js:460:26) at Object.Module._extensions..js (module.js:478:10) at Module.load (module.js:355:32) at Function.Module._load (module.js:310:12)

这样的问题,无法解决 详细请看这里 大神请点 可以指导一下吗?!谢谢

参与回复
登录后即可参与回复。登录