在本地开发通常用调试器或者 console.log
进行调试,但对于远端服务器则需要一些工具来进行观测。
运行环境
环境可以区分应用程序、数据库等运行实例。通常至少有这些环境:
- 开发环境 - 用于本地开发,可以直接将日志打印在控制台。
- 预发布环境 - 需与生产环境基本一致,包括服务器的规格,可以定时地将生产环境的数据同步到该环境中。
- 生成环境 - 处理真实流量的数据。
Node.js 通常用 NODE_ENV
环境变量来区分实例的运行环境。
环境变量不一定仅用于配置,可以用环境名作为实例名的一部分。如果日志服务在多个环境之间共享,则可以在日志消息中带入环境值。
日志工具 ELK
ELK 是 Elastic 开发的三个开源工具,用于收集日志:
- Elasticsearch - 一个强大查询语法的数据库,支持自然文本搜索。默认端口为 9200 。
- Logstash - 将从多个源获取的日志进行转换。在应用实例中可以通过 TCP/UDP 向它发送日志。
- Kibana - 将存储在 Elasticsearch 中的数据可视化,默认端口为 5601 。
// `[...]` 代表一个 Docker 容器。
Admin → [Kibana → Elasticsearch ← Logstash] ← App
度量指标工具
度量指标值是指与时间相关的数字数据,包括请求速率、HTTP 响应码、延迟、内存及磁盘使用情况等,也可以包括价格计算、取消付款等业务统计数据。
与日志工具一样,通常需要使用一组工具来进行度量指标。比如(书中使用的工具):
- Graphite - 组合了 Carbon 服务和 Whisper 时间序列数据库。
- StatsD - 用于收集数据,可以通过 TCP/UDP 传输统计信息。
- Grafana - 时间序列数据的可视化服务。
Admin → [Grafana] → [Graphite ← StatsD] ← App
在 Node.js 中,可以通过 v8
模块、process
以及 server
来获取性能指标。
Grafana 面板中应当至少提取三组不同的数据指标:200 请求、500 请求、上游服务的请求时间。