如果你在使用非ARC项目,只需要在iRate.m上添加“-fobjc-arc”编译标志(Build Phases->Compile Sources->双击iRate.m->添加-fobjc-arc) 安装 集成iRate时,只需要添加iRate.h,.m,.bundle三个文件到项目中,如果不在乎本地化也可以忽略.bundle文件。 "iRate.h" + (void)initialize { //configure iRate [iRate sharedInstance].daysUntilPrompt = 5; [iRate sharedInstance].usesUntilPrompt = 15; } 配置项 可以通过配置iRate中的相关属性,来影响提醒弹出的行为,主要是 @property (nonatomic 这些方法跟上面的iRate方法有些关联,使用时注意。具体含义参考命名就可以了。
对官网文档的解读 irate和rate都会用于计算某个指标在一定时间间隔内的变化速率。 但是它们的计算方法有所不同:irate取的是在指定时间范围内的最近两个数据点来算速率,而rate会取指定时间范围内所有数据点,算出一组速率,然后取平均值作为结果。 所以官网文档说:irate适合快速变化的计数器(counter),而rate适合缓慢变化的计数器(counter)。 10m])) * 100 下图是间隔10分钟的结果,可以看到,irate的曲线比较曲折,而rate的曲线相对平缓: ? 附:官网文档 irate() irate(v range-vector) calculates the per-second instant rate of increase of the time series
0x00 概述 在统计CPU指标的时候,需要用到rate或者irate函数,这两个函数本质是导数。 0x01 rate或者irate函数 由于: ''' irate和rate都会用于计算某个指标在一定时间间隔内的变化速率。 但是它们的计算方法有所不同: irate取的是在指定时间范围内的最近两个数据点来算速率, 而rate会取指定时间范围内所有数据点,算出一组速率,然后取平均值作为结果。 ''' irate函数绘制的曲线比rate的更为尖锐,Prometheus监控:rate与irate的区别 这两个函数的逻辑类似已知里程数和时间,求速度的概念; 在油管上找到了Grafana大神此函数的讲解
PromQL有一个名为irate的函数,用于计算距离向量中时间序列的每秒瞬时增长率。让我们在node_cpu_seconds_total度量上使用irate函数。 job的标签是我们在prometheus.yml文件中配置的刮擦名称可以在target里看到 irate(node_cpu_seconds_total{job="node"}[5m]) imagqe.png 现在将irate函数封装在avg聚合中,并添加了一个by子句,该子句通过实例标签聚合。 avg(irate(node_cpu_seconds_total{job="node"}[5m])) by (instance) avg (irate(node_cpu_seconds_total{job 我们可以把这个变成百分数用这个值减去100,就像这样: 100 - avg (irate(node_cpu_seconds_total{job="node",mode="idle"}[5m])) by
zUI.panel.sOptsName); var iScrollBoxHeight = jqThis.innerHeight()-2*opts.iTop; var iRate jqThis.innerHeight()/jqChild.outerHeight(); var iScrollBarHeight = iScrollBarHeight = Math.round(iRate *iScrollBoxHeight); //如果比率大于等于1,不需要滚动条,自然也不需要添加拖拽事件 if(iRate >= 1){ var oBoundary = {iMinTop:opts.iTop}; oBoundary.iMaxTop = iScrollBoxHeight - Math.round(iRate
node:node_disk_saturation:avg_irate{cluster="$cluster"} / scalar(:kube_pod_info_node_count:{cluster=" $cluster"}) 取了node_disk_staturation,同时计算了avg_irate。 node:node_net_saturation:sum_irate{cluster="$cluster"} 这里调用了node_net_saturation的值,而这个值不够直观的知道是什么内容。 再来看看它的来源: - expr: | sum by (node) ( (irate(node_network_receive_drop_total ~"veth.+"}[1m]) + irate(node_network_transmit_drop_total{job="node-exporter",device!
irate 求平均值 为了解决上述问题,PromQL提供了另外一个灵敏度更高的函数irate(v range-vector)。irate同样用于计算区间向量的计算率,但是其反应出的是瞬时增长率。 irate函数是通过区间向量中最后两个两本数据来计算区间向量的增长速率。 这种方式可以避免在时间窗口范围内的“长尾问题”,并且体现出更好的灵敏度,通过irate函数绘制的图标能够更好的反应样本数据的瞬时变化状态。 ? irate函数相比于rate函数提供了更高的灵敏度,不过当需要分析长期趋势或者在告警规则中,irate的这种灵敏度反而容易造成干扰。因此在长期趋势分析或者告警中更推荐使用rate函数。
irate 由于使用 rate 或者 increase 函数去计算样本的平均增长速率,容易陷入长尾问题当中,其无法反应在时间窗口内样本数据的突发变化。 为了解决该问题,PromQL 提供了另外一个灵敏度更高的函数irate(v range-vector)。irate 同样用于计算区间向量的计算率,但是其反应出的是瞬时增长率。 irate 函数是通过区间向量中最后两个样本数据来计算区间向量的增长速率。 这种方式可以避免在时间窗口范围内的长尾问题,并且体现出更好的灵敏度,通过 irate 函数绘制的图标能够更好的反应样本数据的瞬时变化状态。 这个 [1m] 不是用来计算的,irate 在计算的时候会最多向前在 [1m] 范围内找点,如果超过 [1m] 没有找到数据点,这个点的计算就放弃了。
例如 rate、irate 函数,计算变化率,既需要知道 value 的变化,也需要知道 时间的变化。 区别是 rate 会取一个 range 的首和尾来计算,irate 会取一个 range 的最新的两个点来计算。这也是为什么 irate 要比 rate 的图像变化波动更大。 在某一项指标的具体一小段时间,尤其是 irate 这样的函数结果并不能精确的反应真实情况。不要用 Prometheus 做时间灵敏度、精确度高的监控手段。 例如 irate 函数,可以计算一个 counter 指标的变化率 irate(counter{a="b", c="d"}[5m]) 如果我想计算近5分钟变化率的最大值,该怎么办? 这里就用到了 SubQuery max_over_time(irate(counter{a="b", c="d"}[5m])[5m:1m]) irate 返回的结果是一个 instant vector
The More node exporter的一些指标计算语句 CPU使用率(单位为percent) (avg by (instance) (irate(node_cpu_seconds_total{ server1的uptime时间(单位为seconds) time() - node_boot_time_seconds{instance="server1"} 网络流出量(单位为bytes/sec) irate ~"lo|bond[0-9]|cbr[0-9]|veth.*"}[5m]) > 0 网络流入量(单位为bytes/sec) irate(node_network_receive_bytes_total ~"lo|bond[0-9]|cbr[0-9]|veth.*"}[5m]) > 0 server1的网络流入量(单位为bytes/sec) irate(node_network_receive_bytes_total ~"lo|bond[0-9]|cbr[0-9]|veth.*"}[5m]) > 0 磁盘读取速度(单位为bytes/sec) irate(node_disk_read_bytes_total{device
rate(http_requests_total{job="api-server"}[5m]) irate irate 适用于变化频率高的 counter 类型数据,计算范围向量中时间序列的每秒平均增长率 当 counter 出现单调性中断会自动进行调整,与 rate 不同的是,irate 只会选取时间范围内最近的两个点计算,当选定的时间范围内仅包含两个数据点时,不考虑外推情况,rate 和 irate 可直接安全的作用与 counter 的操作符有 rate,irate,increase,resets 其它都需要慎重考虑引起的其它问题。 {job="api-server"}[1m]) 对于 irate 指定一个大的时间范围没有意义的,通常指定为四倍数据拉取时间间隔 对于 rate 没有明确的建议,需要考虑的是时间范围越大,会拉平出现的数据峰值 irate 适合快速变化的计数器, 当查询步长大于 irate 时间范围时,由于其只取最后两个数据点,可能会导致在时间范围外的数据峰值点未能被捕获,查询步长与其时间范围越接近, 会捕获更多的数据峰值,曲线变化也更灵敏精确
CPU监控 (1 - avg(irate(node_cpu{mode="idle"}[10m])) by (instance)) * 100 < 90 内存监控 ((node_memory_MemTotal - node_memory_MemFree) / node_memory_MemTotal) * 100 < 90 磁盘IO监控 (max(avg(irate(node_disk_io_time_ms
irate() irate(v range-vector) 函数用于计算区间向量的增长率,但是其反应出的是瞬时增长率。 irate 只能用于绘制快速变化的计数器,在长期趋势分析或者告警中更推荐使用 rate 函数。 因为使用 irate 函数时,速率的简短变化会重置 FOR 语句,形成的图形有很多波峰,难以阅读。 [info] 注意 当将 irate() 函数与聚合运算符(例如 sum())或随时间聚合的函数(任何以 _over_time 结尾的函数)一起使用时,必须先执行 irate 函数,然后再进行聚合操作 ,否则当采样目标重新启动时 irate() 无法检测到计数器是否被重置。
prometheus: address: http://prometheus.example.com:9090 query: | sum(irate prometheus: address: http://prometheus.example.com:9090 query: | sum(irate prometheus: address: http://prometheus.example.com:9090 query: | sum(irate destination_service=~"{{args.service-name}}",response_code=~"5.*"}[5m] )) / sum(irate prometheus: address: http://prometheus.example.com:9090 query: | sum(irate
2.2.2 irate 1. irate(v range-vector):计算范围向量中时间序列的每秒瞬时增长率(基于最后两个数据点)。单调性中断(例如由于目标重启导致的计数器重置)会自动调整。 示例:以下示例表达式通过查找 5 分钟前两个最近的数据点得出 HTTP 请求的每秒速率: irate(http_requests_total{job="api-server"}[5m]) 3. 注意:当将 irate() 与聚合运算符(例如 sum())或随时间聚合的函数(任何以 _over_time 结尾的函数)结合使用时,始终首先采用 irate(),然后进行聚合。 否则,irate() 无法在您的目标重新启动时检测到计数器重置。
rate, irate 和 increase 很多人都会纠结 irate 和 rate 有什么区别。看到这里,其实就很好解释了。 以下来自官方的文档: irate() irate(v range-vector) calculates the per-second instant rate of increase of the time 即,irate 是计算的最后两个点之间的差值。 在现实中的例子,可以将上面查询的 rate 改成 irate。 那么,是不是我们总是使用 irate 比较好呢?
求Nginx的QPS: sum(irate(nginx_server_requests{code="total",host=~"$DomainName"}[5m])) sum(irate(nginx_server_requests 求4xx万分率(5xx类似,code=“5xx”): (sum(irate(nginx_server_requests{code="4xx",host=~"$DomainName"}[5m])) / sum (irate(nginx_server_requests{code="total",host=~"$DomainName"}[5m]))) * 10000 # 3. 求upstream的QPS(示例求group1的qps): sum(irate(nginx_upstream_requests{code="total",upstream="group1"}[5m]))
为了解决该问题,PromQL 提供了另外一个灵敏度更高的函数 irate(v range-vector)。irate 同样用于计算区间向量的计算率,但是其反应出的是瞬时增长率。 irate 函数是通过区间向量中最后两个样本数据来计算区间向量的增长速率。 这种方式可以避免在时间窗口范围内的 “长尾问题”,并且体现出更好的灵敏度,通过 irate 函数绘制的图标能够更好的反应样本数据的瞬时变化状态。 irate(node_cpu_seconds_total[2m]) irate 函数相比于 rate 函数提供了更高的灵敏度,不过当需要分析长期趋势或者在告警规则中,irate 的这种灵敏度反而容易造成干扰
redis_memory_used_bytes / redis_memory_max_bytes ) 命令执行QPS rate(redis_commands_processed_total[1m]) cache命中QPS irate key数量 sum(redis_db_keys) by (db) db中的过期key数量 sum(redis_db_keys_expiring) by (db) 每一种命令的QPS topk(5, irate (使用irate可以得到每秒写入大小) node_disk_read_bytes_total 向给定设备写入的总字节数 node_disk_written_bytes_total 磁盘IOPS相关核心指标 (使用irate可以得到每秒读操作的平均数) node_disk_reads_completed_total 磁盘设备完成的写操作总数。 (使用irate可以得到每秒读操作的平均数) node_disk_writes_completed_total 网络核心指标 网络接口接收到的总字节数。
labels.instance }}CPU 平均负载(5 分钟) 已超过 4 ,当前值: {{ $value }}" - alert: "磁盘读 I/O 超过 30MB/s" expr: irate $labels.instance }}I/O 每分钟读已超过 30MB/s,当前值: {{ $value }}" - alert: "磁盘写 I/O 超过 30MB/s" expr: irate $labels.instance }}I/O 每分钟写已超过 30MB/s,当前值: {{ $value }}" - alert: "网卡流出速率大于 10MB/s" expr: (irate 10MB/s, 当前值: {{ $value }}" - alert: "CPU 使用率大于 90%" expr: 100 - ((avg by (instance,job,env)(irate