# Node-Prometheus-Demo **Repository Path**: songlu-cube/Node-Prometheus-Demo ## Basic Information - **Project Name**: Node-Prometheus-Demo - **Description**: Node.JS版本的Prometheus - **Primary Language**: TypeScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-05 - **Last Updated**: 2022-05-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Prometheus 概述 [官网](https://prometheus.io/download/) Prometheus 架构 ![Prometheus 架构](./static/images/jiagoutu.png) Prometheus 是由 SoundCloud 开源监控告警解决方案。 PushGateway 这个组件是支持 Client 主动推送 metrics 到 PushGateway,而 Prometheus 只是定时去 Gateway 上抓取数据。它的服务过程是这样的 Prometheus Server 负责定时去目标上抓取 metrics(指标) 数据,每个抓取目标需要暴露一个 http 服务的接口给它定时抓取(Pull,拉取)。 Prometheus 支持通过配置文件、kubernetes、zookeeper、Consul、DNS SRV lookup 等方式指定抓取目标。**Prometheus 主要还是靠进程主动去抓取。** ## 采集方式 - pull 方式 Prometheus 采集数据是用的 pull 也就是拉模型,通过 HTTP 协议去采集指标,只要应用系统能够提供 HTTP 接口就可以接入监控系统,相比于私有协议或二进制协议来说开发、简单。 - push 方式 对于`定时任务`这种短周期的指标采集,如果采用 pull 模式,可能造成任务结束了,Prometheus 还没有来得及采集,这个时候可以使用加一个中转层,客户端推数据到 Push Gateway 缓存一下,由 Prometheus 从 push gateway pull 指标过来。(需要额外搭建 Push Gateway,同时需要新增 job 去从 gateway 采数据)。 ## 数据模型 prometheus 存储的是`时序数据`,即按相同时序(相同名称和标签),以时间维度存储连续的数据的集合。 时序(`time series`)是由指标名(`Metric`)以及一组 key/value `标签`定义的,具有相同的名字(`Metric`)以及`标签`属于相同时序。 - Metric 名 表示 Metric 的功能,如 http_request_total。时序的名字由 ASCII 字符,数字,下划线,以及冒号组成,它必须满足正则表达式 `[a-zA-Z*:]a-zA-Z0-9*:]\*`, 其名字应该具有语义化,一般表示一个可以度量的指标,例如 http_requests_total, 可以表示 http 请求的总数。 - 标签: key/value 键值对。就是对一条时间序列不同维度的识别了,例如 一个 http 请求用的是 POST 还是 GET,它的 endpoint 是什么,这时候就要用标签去标记了。 - 样本数据示例 按照某个时序以时间维度`采集的数据`,称之为样本。实际的时间序列,每个序列包括一个 float64 的值和一个毫秒级的 unix 时间戳。Prometheus 时序格式与 OpenTSDB 相似。 样本数据存储在内存中,然后定期存到硬盘上。数据只保留 15 天。 ```shell # 这个样本数据:保存在 http_requests_total 表中,主键是 timestamp,值就是 float64 表示 http_requests_total{method="POST",endpoint="/api/tracks"} ``` ## Metric 数据类型 - Counter 一种累加的 metric,如请求的个数,结束的任务数,出现的错误数等。**如果监控的进程重启后,其结果会被重置** Counter 是一种累加的 metric ,代表一个单调函数,其值只能上升或在重启时重置为 0。可以用 counter 代表处理的请求数、完成的任务数、出现的错误数量等。 不可以用 counter 代表一个可能会下降的值。比如,不能用 counter 表示正在运行的进程数,而应该用下面我们将提到的 gauge。 ```shell # 10秒后抓取 http_response_total 的指标 http_response_total{method="GET",endpoint="/api/tracks"} 10 ``` - Gauge 常规的 metric,如温度,可任意加减。其为瞬时的,与时间没有关系的,可以任意变化的数据。**如果监控的进程重启后,其结果会被重置** Gauge 一般用来测量如温度、当前的内存使用量这样的值,也用来检测会上升或下降的值,比如 Go 的并发 goroutine 的数量。 - Histogram 柱状图,用于观察结果采样,分组及统计,如:请求持续时间,响应大小。其主要用于表示一段时间内对数据的采样,并能够对其指定区间及总数进行统计。它特别之处是可以对记录的内容进行分组,提供 count 和 sum 全部值的功能。**根据统计区间计算(需要计算)。** Histogram 取样观测的结果(一般是请求持续时间或响应大小)并在一个可配置的分布区间(bucket)内计算这些结果。其也提供所有观测结果的总和。 - Summary 类似 Histogram,用于表示一段时间内数据采样结果,其直接存储 quantile 数据,而不是根据统计区间计算出来的。**不需要计算,直接存储结果(不需要计算)。** ## Jobs and Instances - Instances 一个进程就是一个实例,也就是被采集的目标。 - Jobs 若干个功能相同的实例,组成一个 Job ## PromQL 查询 PromQL (Prometheus Query Language) 是 Prometheus 自己开发的数据查询 DSL 语言。 查询结果类型: - 瞬时数据 (Instant vector) 包含一组时序,每个时序只有一个点,例如:http_requests_total - 区间数据 (Range vector) 包含一组时序,每个时序有多个点,例如:http_requests_total[5m] - 纯量数据 (Scalar) 纯量只有一个数字,没有时序,例如:count(http_requests_total) # 安装和启动 ## Go 环境 ```shell # 安装 brew install go # 检查 brew info go go env # 配置(zsh环境) vim ~/.zshrc 添加 GOROOT=/usr/local/Cellar/go/1.14.6/libexec export GOROOT export GOPATH=/Users/pg/go export GOBIN=$GOPATH/bin export PATH=$PATH:$GOBIN:$GOROOT/bin ``` ## 安装 - brew 安装(Mac 适用,需要翻墙,不推荐) ```shell # 搜索 brew search prometheus # 安装 brew install prometheus # 查看 prometheus --version ``` - 二进制文件安装(Mac 和 linux 适用,比较稳定的安装方式) 1. 官网下载监控系统和数据库文件[prometheus](https://prometheus.io/download/) 2. 接下来从 tar 包中将 prometheus 二进制文件解压缩并放在合适的目录下,然后安装 promtool,这是 Prometheus 配置的代码校验工具。 promtool 和 prometheus 都放在 /usr/local/bin/目录中即可。 3. 安装完成后,可以使用--version 参数来检查版本,以验证 Prometheus 是否安装成功。 ```shell # 示例 # 下载 cd /tmp wegt https://github.com/prometheus/prometheus/releases/download/v2.20.0/prometheus-2.20.0.linux-amd64.tar.gz # 解压安装 tar -xzf prometheus-2.20.0.linux-amd64.tar.gz sudo cp prometheus-2.20.0.linux-amd64/prometheus /Applications/prometheus sudo cp prometheus-2.20.0.linux-amd64/promtool /Applications/prometheus # 查看 prometheus --version ``` ## 配置 ```shell # 在 yml 配置文件的scrape_configs中增加如下配置(监测本项目) - job_name: 'node-api' static_configs: - targets: ['localhost:9095'] ``` ## 运行 ```shell # 进入prometheus解压后的文件夹,执行命令 ./prometheus --config.file=prometheus.yml # 打开浏览器,查看监控界面 localhost:9090 ``` # Prometheus Client 端开发(Node.JS) ## 引入 prom-client 包 ```shell yarn add prom-client ``` ## 配置抓取路径 Prometheus 需要定期从 Client 端抓取数据,路由路径默认是`/metrics`,在路由中返回当前 Client 端收集到的数据。(服务重启则数据都会丢失) ```js app.get("/metrics", (req, res) => { res.end(client.register.metrics()); }); ``` ## 定义抓取数据 代码示例请参考`src/index.js`文件。 # 演示效果 1. 启动 Prometheus Server 服务 运行命令,启动 Prometheus Server 服务 ![启动服务](./static/images/start-server.png) 服务启动后,打开浏览器,输入`http://localhost:9090`即可查看。 ![Web](./static/images/server-web.png) 2. 运行 Client 端服务 ![启动服务](./static/images/start-client.png) Client 服务启动后,即开始收集数据。同时,Server 端也会根据配置的抓取时间间隔,定期通过`/metrics`接口来抓取数据,该接口中,只需要将 Client 收集的指标数据返回即可。 ![输出日志](./static/images/client-log.png) 3. Promtool 查看数据 在 Promethues Server 提供了自带的 Web 界面,供我们查看服务配置和数据等。我们打开自带的 Web 界面,在 Graph 菜单栏即可输入想要的 PQL 语句进行查询。效果如下。 ![PQL查询](./static/images/promtool.png) _如果对于 Promethues Server 提供的界面不满意,还可以使用 Grafana Dashboards 框架。_ ` --- # 参考文章 [简书 - Prometheus](https://www.jianshu.com/p/93c840025f01) [简书 - Prometheus 介绍](https://www.jianshu.com/p/0a4acb61ce35) [简书 - Prometheus 的架构及持久化](https://www.jianshu.com/p/36f72490a2a0) [带你读《Prometheus 监控实战》之三:安装和启动 Prometheus](https://developer.aliyun.com/article/726584)