Dtrace

Restify 最酷的功能之一是无论何时添加新的路由/处理程序,它都会自动为您创建 DTrace 探针。 要使用 DTrace,您需要将 dtrace 选项传递给服务器 restify.createServer({ dtrace: true })。 理解它的最佳方式就是通过查看例:

  1. var restify = require('restify');
  2. var server = restify.createServer({
  3. name: 'helloworld',
  4. dtrace: true
  5. });
  6. server.use(restify.plugins.acceptParser(server.acceptable));
  7. server.use(restify.plugins.authorizationParser());
  8. server.use(restify.plugins.dateParser());
  9. server.use(restify.plugins.queryParser());
  10. server.use(restify.plugins.urlEncodedBodyParser());
  11. server.use(function slowHandler(req, res, next) {
  12. setTimeout(function() {
  13. return next();
  14. }, 250);
  15. });
  16. server.get({path: '/hello/:name', name: 'GetFoo'}, function respond(req, res, next) {
  17. res.send({
  18. hello: req.params.name
  19. });
  20. return next();
  21. });
  22. server.listen(8080, function() {
  23. console.log('listening: %s', server.url);
  24. });

因此我们现在已经有了我们典型的 “hello world” 服务器,略有不同的是,我们引入了一个人为的 250ms 延迟。另外,请注意我们命名了我们的服务器,我们的路由以及我们所有的处理程序(函数)。尽管这是可选的,但它确实使 DTrace 更加可用。因此,如果您启动了该服务器,然后查找 DTrace 探针,则会看到如下所示的内容:

  1. $ dtrace -l -P restify*
  2. ID PROVIDER MODULE FUNCTION NAME
  3. 24 restify38789 mod-88f3f88 route-start route-start
  4. 25 restify38789 mod-88f3f88 handler-start handler-start
  5. 26 restify38789 mod-88f3f88 handler-done handler-done
  6. 27 restify38789 mod-88f3f88 route-done route-done

route-start

字段 类型 描述
server name char * 触发的 restify 服务器的名称
route name char * 触发的路由名称
id int 此请求的唯一 ID
method char * HTTP 请求方法
url char * (完整)HTTP URL
headers char * JSON 编码的所有请求头映射表

handler-start

字段 类型 描述
server name char * 触发的 restify 服务器的名称
route name char * 触发的路由名称
handler name char * 刚刚输入的函数名称
id int 此请求的唯一 ID

route-done

字段 类型 描述
server name char * 触发的 restify 服务器的名称
route name char * 触发的路由名称
id int 此请求的唯一 ID
statusCode int HTTP 响应码
headers char * JSON 编码的响应头映射表

handler-done

字段 类型 描述
server name char * 触发的 restify 服务器的名称
route name char * 触发的路由名称
handler name char * 刚刚输入的函数名称
id int 此请求的唯一 ID

D 脚本示例

现在,如果您想要通过处理程序获得延迟细分,则可以执行如下操作:

  1. #!/usr/sbin/dtrace -s
  2. #pragma D option quiet
  3. restify*:::route-start
  4. {
  5. track[arg2] = timestamp;
  6. }
  7. restify*:::handler-start
  8. /track[arg3]/
  9. {
  10. h[arg3, copyinstr(arg2)] = timestamp;
  11. }
  12. restify*:::handler-done
  13. /track[arg3] && h[arg3, copyinstr(arg2)]/
  14. {
  15. @[copyinstr(arg2)] = quantize((timestamp - h[arg3, copyinstr(arg2)]) / 1000000);
  16. h[arg3, copyinstr(arg2)] = 0;
  17. }
  18. restify*:::route-done
  19. /track[arg2]/
  20. {
  21. @[copyinstr(arg1)] = quantize((timestamp - track[arg2]) / 1000000);
  22. track[arg2] = 0;
  23. }

在同一个终端上运行服务器:

  1. $ node helloworld.js

另一个 D 脚本:

  1. $ ./helloworld.d

用 curl 连接几次服务器:

  1. $ for i in {1..10} ; do curl -is http://127.0.0.1:8080/hello/mark ; done

然后对 D 脚本按下 Ctrl-C,您会看到堆栈底部的“slowHandler”,表明它是这个管道中的绝大数的延迟。

  1. handler-6
  2. value ------------- Distribution ------------- count
  3. -1 | 0
  4. 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
  5. 1 | 0
  6. parseAccept
  7. value ------------- Distribution ------------- count
  8. -1 | 0
  9. 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
  10. 1 | 0
  11. parseAuthorization
  12. value ------------- Distribution ------------- count
  13. -1 | 0
  14. 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
  15. 1 | 0
  16. parseDate
  17. value ------------- Distribution ------------- count
  18. -1 | 0
  19. 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
  20. 1 | 0
  21. parseQueryString
  22. value ------------- Distribution ------------- count
  23. -1 | 0
  24. 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
  25. 1 | 0
  26. parseUrlEncodedBody
  27. value ------------- Distribution ------------- count
  28. -1 | 0
  29. 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 10
  30. 1 | 0
  31. respond
  32. value ------------- Distribution ------------- count
  33. 1 | 0
  34. 2 |@@@@ 1
  35. 4 | 0
  36. 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9
  37. 16 | 0
  38. slowHandler
  39. value ------------- Distribution ------------- count
  40. 64 | 0
  41. 128 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9
  42. 256 |@@@@ 1
  43. 512 | 0
  44. getfoo
  45. value ------------- Distribution ------------- count
  46. 64 | 0
  47. 128 |@@@@ 1
  48. 256 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9
  49. 512 |