LabHub
学习 学习路径 课程

可观测性

三种信号不是互相替代,是调查的顺序

在 LabHub 中继续学习

一句话总结

Trace回答“在哪里”,Metric回答“什么时候多少”,Log回答“为什么”。所以调查顺序是固定的——Metric → Trace → Log。

概念图: 在标签上输入无限大的值 · 没有加工 · 路径 · 转移到其他信号中。

为什么需要这个?

一旦出现故障,人们通常会先查看日志。30分钟后,他们仍然在阅读日志。日志是最详细的,但也是最昂贵的,在不知道要找什么的情况下打开它,就会发现是一片文字海洋。

指标优先的原因有三个。价格便宜,总是打开, Cardinality 低。因为同时满足这三个条件,指标是唯一可以成为通知依据的信号。Trace 是被采样的,因此无法保证“现在这个瞬间正在变差”,而且日志量大,无法承受实时汇总成本。

三个信号并不替代彼此,只有三个桥梁连接彼此。从指标到轨迹,从轨迹到日志,从日志到指标,从指标到事件,这些桥梁使三个工具相互连接。如果没有这些桥梁,即使购买了所有三个工具,调查仍然依赖人的直觉。

怎么行动

在Metric中,真正决定因素是类型选择。类型选择不是品味。如果选择错误,以后想做的计算在原理上就不可能了。

为什么延迟时间时仪表无法显示,可以通过算术来确认。如果刮擦间隔为15秒,每秒请求为500件,那么仪表只会存储7500件中1件的值。其余的则从未存在过。这种时间序列无法求出p99,即使以后再处理也不会恢复。

在现场相遇的样子

在发布后不久,经常会遇到看起来流量减少的仪表板。原因几乎总是相同的。是把rate改成了sum外面挂起来的。计数器重置校正只有在单独的时序单元中才准确。如果一个板重新启动,累计后不会被识别为重置。正确的形式是sum(rate(x[5m])) by (route),rate(sum(x)[5m:])是错误的。

另一个是安静的错误。在histogram_quantile中,删除by (le)后,会返回没有错误的错误数字。没有人看例外,所以那个面板会在仪表板上停留几个月。

Cardinality决定预算

在指标设计中,最难推翻的错误是在标签上输入无限大的值。时间序列的数量是标签值组合的乘积增加。如果标签有三个,每个值有10·5·4种,时间序列是200个,但只要再附加一个用户ID,就会乘以用户数量。如果用户有10万人,就有200万个。

特别是危险的标签是确定的。用户ID、请求ID、会话ID、电子邮件、IP地址,以及没有加工直接输入的路径/orders/8213如果像这样用标签写上嵌入标识器的路径,每个订单都会产生一个时间序列。正确的形式是/orders/:id通过路由模式进行正则化,这种正则化是框架在路由时已经知道的值,所以通常可以免费获得。

这样切出的信息不是丢弃的,而是**转移到其他信号中。**这就是为什么将三个信号分开的原因。

想知道的事情 应该放下的地方 理由
这个路由有多慢 指标 值的种类少,必须一直打开
这个缓慢的请求在哪里花费了时间 Trace 请求单位标识符自然附加
提出那个请求的用户是谁 记录 无数量限制,通过搜索查找

直方图尤其需要小心。因为一个桶就是一个时间序列,所以如果一个20个桶的直方图贴上200个标签组合,那个指标就会产生超过400个时间序列。所以直方图只用在真正需要氛围的指标上,桶的边界要密集地靠近服务水平目标附近,其余的要粗略地把握。如果目标是300ms,但桶在100ms后直接跳到1秒,那么直方图无法判断p99是否超过了300ms。

症状通常不是在仪表板上出现,而是首先在存储器方面出现。 普罗米修斯的内存不断增加,刮痕在时间内无法结束,查询速度变慢。这时topk(10, count by (__name__)({__name__=~".+"}))从序列中出现次数最多的指标开始计数,罪犯几乎总是有一个人或两个人。

下次实习要做的事情

实习环境中,真正的普罗米修斯服务器以包含12小时数据的状态漂浮着。包含两次错误激增的区间、一次只有延迟尾巴的区间,以及不断减少的磁盘。

不仅要把查询写在文件里,而且promq直接扔出去,读取返回的数字。你们写的问题是否能找到那三个事件,会告诉你正确与否——PromQL之所以很难,不是因为语法,而是因为错误的问题也会毫无错误地返回合理的数字。