节点测量-采集器
以简单的语法来收集并曝光 propetheus 度量衡
图表
基本用途:
写入指标
基本用法包括增加一进一行.
import { metrics } from '@balena/node-metrics-gatherer';
...
// inside some loop which checks sensors...
metrics.gauge('temperature', 28);
导出指标(简单)
然后,你需要确保 当一个请求到达时, 测量标准可以被满足. 这个库不依赖于运行时的快件 - 而是提供一个 请求您在您的快速应用程序上挂载的处理器( 或您的专用应用程序) 仅为度量衡创建 :
// create a request handler to respond to prometheus pulls, and mount it on
// your express app
app.use('/metrics', metrics.requestHandler());
// OR, create a dedicated app just for metrics (using port 9337, arbitrarily)
import express from 'express';
express().use('/metrics', metrics.requestHandler()).listen(9337);
可以选择,您可以提供一种功能,以验证请求是否应当 通过返回布林(一种"AuthFunc"):
const authFunc = (req) => req.get('Authorization') === 'Basic 123456';
app.use('/metrics', metrics.requestHandler(authFunc));
出口指标(组)
如果一个申请叉了几个童工 他们各自听 :80/metrics,每个工人都会有随机的被打的机会,每次只输出自己的指标,造成不稳定和混乱. 谢天谢地, @prometheus-io/client 提供了处理的方法,您在叉后创建一个注册。 在内部,它处理工人与主要过程之间的信息传递,其中的衡量标准是汇总的。 这个 example/ 文件夹在 repo 中有一个实例。 这需要单独创建一个快捷的应用程序,在不参与工人集群集合的端口上监听.
每个工人必须选择通过呼叫进行汇总 metrics.aggregateRequestWorker()否则,初级将无法收集其衡量标准,而总请求将暂停。 在初级进程本身中记录的任何衡量标准也包含在总产出中.
见下文实例:
(任意选择的港口9337)
if (cluster.isPrimary) {
for (let i = 0; i < 4; i++) {
cluster.fork();
}
express()
.use('/cluster_metrics', metrics.aggregateRequestHandler())
.listen(9337);
} else {
metrics.aggregateRequestWorker();
}
一个警告 metrics.describe 和节点 cluster 模块
当你打给 metrics.describe.counter() (或 metrics.describe.histogram()页:1
,则全球登记对象将随该指标的描述而更新。 如果你打电话
metrics.describe.counter() {\fn黑体\fs20\shad2\2ah82\3ah20\4ah33\fscx95\3ch592001\be1}在主的面前,我们开始
工人内部的登记册将没有标准定义,因为你可以写
不首先描述它,这意味着它将 简单的所有默认,而不是
您的自定义描述,标签,桶,百分位等...
为了避免这种情况,应说明衡量标准 在工人将遵循的密码路径内, (中文(简体) ), 以便全球登记对象在工人中将有一个指标性说明.
计量类型
见 波斯文文档
作为方法调用(如:, metrics.summary)对应
至普罗米修斯度量衡类型(如普罗米修斯"概要")
高盖
用来记录一个可以随时间而变化的值,比如温度.
metrics.gauge('greenhouse_temperature', temp [, labelObject ]);
计数器
用来记录单调计数器的增量,就像所送达的请求一样.
metrics.counter('requests_served_total', 1 [, labelObject ]);
内容提要
用于计算(预定义)数据流上的等分数.
metrics.summary('db_query_duration_milliseconds', queryTime, [, labelObject ]);
直方图
用于计算一串数据流上的直方图.
metrics.histogram('db_query_duration_milliseconds', queryTime, [, labelObject ]);
直方图摘要
有一种观察直方图和摘要的方便方法,它将
后缀 _hist 财务报告和审定财务报表 _summary 对度量衡.
metrics.histogramSummary('db_query_duration_milliseconds', queryTime, [, labelObject ]);
标签
标签可用于在计量中添加一些更细颗粒性:
metrics.counter('application_deployments_total', 1, { app: userRequest.appId, method: 'git-push' });
metrics.counter('application_deployments_total', 1, { app: userRequest.appId, method: 'balena-cli-push' });
您必须使用您打算在每次通话中附加的全套标签;
例如,你不能有一行添加标签 { method: 'git-push' } 和另一个
线条添加标签 { result: 'success' }。标签应用于那些
应用到每次引用的度量( 如“ 未知” 等值的精确使用)
或者“默认”可以处理你可能认为不该添加标签的案件.
标签和时间序列
节制使用标签 - 每对标签名称将创建一个时间序列 / 您创建的值 。 创建一个跟踪源IP的标签是不好的,例如, 除非你真的确定 tsdb 能处理它.
比如说 我们有两个标签, A 财务报告和审定财务报表 B,他们可以有价值
[x, y],以及 [q, r, s]分别是: 然后会出现以下时间序列:
A=x, B=q
A=x, B=r
A=x, B=s
A=y, B=q
A=y, B=r
A=y, B=s
说明
描述可以用来向 propetheus / 客户端库告知度量:
帮助文本
量子描述调用至少指定了计量的种类,名称,以及描述:
metrics.describe.histogram(
'api_request_duration_milliseconds',
'histogram of total time taken to service requests to the api including queue wait (all queues and all userAgents together)',
);
定义标签集
此处还将指定标签:
metrics.describe.histogram(
'api_request_duration_milliseconds',
'histogram of total time taken to service requests to the api including queue wait (all queues and all userAgents together)',
{
labelNames: ['requestType']
},
);
直方图桶和简略百分比
也可以声明直方图型计量的桶或汇总型计量的百分位数,如果您希望它们与默认不同:
直方图桶
metrics.describe.histogram(
'api_request_duration_milliseconds',
'histogram of total time taken to service requests to the api including queue wait',
{
buckets: [4, 10, 100, 500, 1000, 5000, 15000, 30000],
labelNames: ['queue', 'userAgent'],
},
);
百分位数
metrics.describe.summary(
'api_request_duration_milliseconds',
'summary of total time taken to service requests to the api including queue wait',
{
percentiles: [0.9, 0.99, 0.999, 0.9999, 0.99999],
labelNames: ['queue', 'userAgent'],
},
);
分组汇总战略
有几个汇总战略: @prometheus-io/client是因为 ClusterRegistry
可以用来合并下列记录的度量衡: cluster 工人们。 它们是:
- 总和
- 第一个
- 分钟
- 最大数
- 平均数
- 删除
(你可以看到他们是如何工作 在源 @prometheus-io/client/lib/metricAggregators.js(中文(简体) )
为了控制聚合策略( 如果未指定则默认为 “ sum” )
对于给定的度量,你可以提供 aggregator 属性改为 describe() 哪个
将确定集合登记册在多个集群时使用的方法
工人给这个指标写信.
这么说吧,我们造了4个工人,每个工人都观察到 一定数量的连接 在一次活动中, 写入一个 Gauge 类型的度量 :
on('connect', () => {
nConnections++;
metrics.gauge('active_connections', nConnections);
});
on('disconnect', () => {
nConnections--;
metrics.gauge('active_connections', nConnections);
});
我们可能会满足于默认汇总行为(即: (a) 与每个工人的个人结果之和) 活动连接.
但是,如果我们想知道有多少人与
最忙的工人正在处理, 以衡量最忙的工人有多远
偏离平均值(即 total / nWorkers我们也可以
记录一个测量仪,该测量仪已被描述与 max 汇总战略:
metrics.describe.gauge(
'active_connections_max',
'the number of connections being handled by the busiest worker',
{
aggregator: 'max'
}
);
...
on('connect', () => {
nConnections++;
metrics.gauge('active_connections', nConnections);
metrics.gauge('active_connections_max', nConnections);
});
on('disconnect', () => {
nConnections--;
metrics.gauge('active_connections', nConnections);
metrics.gauge('active_connections_max', nConnections);
});
内部错误
调用此库时发生错误, 如果 DEBUG env var 被定义,MetricsGatherer对象的公有财产将被递增: internalErrorCount。 。 。 .