飞的Prometheus指标

2021-05-14 05:42:01

Fly.io将集装箱图像转换为在我们的硬件上运行的Micro-VM车队。这是香蕉易于尝试的;如果您有一个Docker容器,它可以在单位数分钟内运行。

我们应该谈论指标和测量和东西,因为他们是如何知道发生了什么的。

我们写了这篇文章有两个原因。第一个只是我们认为这些东西很有趣,而世界总是可以使用另一个详细的案例研究。但是,第二个是我们将描述的工作现在是我们公共API的一部分,您可以在我们的顶部搭载您自己的应用指标。我们的希望是,我们更越是描述这种东西,你就越有可能得到它的价值。

这是我们开始的地方:HTTP请求到达在飞行上运行的应用程序。它在我们的Rust Request Router中占据了我们的“边缘节点”之一。代理的作业是将请求提供给最接近的卸载“工作节点”,该卸载的“Worker节点”将托管运行用户应用程序的FireCracker VM。

在Fly-Proxy的内存中的某个地方有一个计数器,对于代理已经处理的传入字节数。在路由传入请求时,代理撞击计数器。

碰到柜台便宜。所以有柜台,以及所有在边缘节点上行动的东西。操作系统计算已处理的数据包,每个接口处理的TCP SYN段,字节处理。 CPU负载。免费内存。当然,代理计算一堆事物:时间拍摄的直方图,以完成TLS握手,飞行次数的数量等。有些计数是全球性的,其他人的用户。

该代理将该请求指向Wireguard接口(更多计数器)到工人节点,也运行Fly-Proxy(仍然更多)。 Worker的代理查找与应用程序关联的TAP接口,并将请求路由到其地址(您猜测)。在VM内部,在用户的应用程序运行的情况下,客户操作系统计算一系列到达以太网帧,新打开的TCP连接,使用内存,CPU循环刻录。您的应用程序在该VM中运行可能会计算新的HTTP连接。

我们计算我们可以考虑的一切,因为电脑喜欢计数的东西,所以它很便宜。即使您在拍摄的MSP430微控制器上建造了同样的事情。

为我们需要收集的信息做任何事情。我们的行业有一次热烈的辩论关于如何完成这一点,但谷歌确定了它。服务公开转储统计数据的HTTP端点;如果您的服务无法做到,它会安排为他们提供别的东西。

Google称为这些网页/ varz,并以逐行的人类可读格式(apocryphally:适用于人类读者)填充它们,该工具学会了解析。在现实世界中,我们保留了文本格式,并调用页面/指标。这是它的样子:

fly_proxy_service_egress_http_responses_count {status =“200”,app_id =“3146”,app_name =“debug”,alloc =“f3e39e04”,service =“app-3146-tcp-8080”,org_id =“17”} 1586

如果你是一个人的代码种类,并且你尚未为这种格式写一个解析器,那么你可能开始感受到左眼睑的抽搐。继续写解析器;它会带你15分钟,世界不能有太多的这种博览会的实现。在这里埋藏的程序员之间的课程有一个教训。

要收集指标,您将在与带有某种索引存储的收集器的收集器中刮擦您了解的所有/指标页面。为该系统提供查询界面,现在它是它是时序数据库(TSDB)。我们现在可以生成图形和警报。

我们描述的是,显然是ProMetheus,这是谷歌的群集监控系统的逃脱实施。谷歌SRE与Borgmon有复杂的关系,曾经说过在“行业禁用文件”中披露。很多人都讨厌它。

我们曾经曾经为谷歌工作过,而是独自一人作为SRES。所以我们走出肢体:这是一个很好的设计;它很有效,因此可以轻松实现每个严肃的编程环境支持它,并且整齐地分开了担忧:生成指标的事情只需要将计数器和将其放在HTTP响应中,这使得很容易产生大量指标。

在这种设计中的组件之间的劳动分工也在数据库方面非常有帮助。难以优化的通用数据库服务器是什么,它们是通用目的:很难预测工作负载。 TSDB没有这个问题。每个普罗米修斯商店都有一堆可利用的特征:

提前了解这个东西意味着你可以优化。您将使用类似LSM树的内容来解决写入的偏见,请将更新更新到注册日志中,将它们索引在内存中,逐渐将它们刷新到不可变磁盘块。你可以压缩;记录在相对一致的间隔上的时间戳尤其适用于压缩。您可以缩小旧数据。您可以使用列存储而不是行存储。

而且,当然,您可以以一堆不同的方式扩展出这个东西;您可以让ProMetheus服务器刮擦并汇总其他Prometheus服务器,或将旧块的数据泄漏到S3,或碎片和哈布和散列传入数据进入服务器池。

要点,保留可用于查询的无限数量的时间序列度量是一个易解问题。即使是单个服务器也可能会比您想象的更长。当您需要时,您可以扩展到跟上。

这是我们在飞行中所做的事情。而且,由于我们已经建立了这一点,因此对自己保持了没有意义;如果您正在飞行上运行应用程序,您也可以向我们提供指标。让我们描述一下工作原理。

典型的fly.io pop将运行一些少量的轻量级边缘节点,更多的牛群工作者节点,以及在某些情况下,一个红外主机或两个。所有这些节点 - 弹出窗口内部和之间的所有节点都与Wioguard网格连接。

我们的指标堆栈 - 围绕Prometheus风格指标构建 - 具有以下特征的字符:

维多利亚指标(“Vicky”,在此帖子的其余部分),在群集配置中,是我们的指标数据库。我们经营一群相当大的Vicky主机。

TeleGraf是指算法的标志来标记为日志:一个瑞士军刀工具,适应任意输出格式的任意输入。我们在节点上运行TeleGraf Agents来刮掉本地Prometheus来源,而Vicky Scrapes Telegraf。 TeleGraf简化了我们的指标的网络;它意味着Vicky(和我们的iptables规则)只需要了解每个节点的一个prometheus端点。

向量,这就像铁路飞行的锈版 - 我们为我们的日志管道(整个其他博客文章)广泛使用矢量,也是一些Prometheus指标的遥控器。我们的载体可能会在今年吃我们的Telegraf。

Prometheus出口商,即可将Telegraf连接到刮刮,揭露我们的服务指标(以及在某些情况下,将统计数据直接推向Vicky与Prometheus Remote_Write API)。

领域,管理所有这些事情的配置,所以每个主机的Telegraf代理都可以找到当地的指标来源,而Vicky可以找到新的主机,& c。

史蒂夫在这里为指标书呆子,这个堆栈的唯一有趣的事情是vicky。故事可能很无聊。像其他人一样,我们开始使用一个简单的Prometheus服务器。这效果并没有。我们花了一些时间用thans缩放它,而且,就Ops Hassle来了,Thanos很多。我们只是作为Vanilla Prometheus的长期存储引擎删除了Vicky,Promxy设置为重复数据删除指标。

Vicky成长为更雄心勃勃的产品,并添加了自己的普通粉刮刀;我们采用它并缩放了它,据我们合理地在单节点配置中缩放。缩放要求最终将我们推入集群部署;我们运行HA Cluster(由Haproxy前面)。目前的vicky有一个非常简单的多租户API - 这很容易为客户命名空间度量 - 而且它越过我们而不是太多的心灵。

在摘要中假设一个任意缩放的中央vicky集群。以下是边缘节点的简化视图:

到目前为止这么简单。边缘节点从Internet获取流量并将其路由到工作节点。我们的边缘Fly-Proxy导出Prometheus统计数据,也是一个标准的Prometheus Node-Exporter,提供系统统计数据(以及几个其他出口商,您可以在节点出口商中排出精神桶)。

Jerome在这里,代理将内部指标转换为用户相关度量的进一步逻辑。我们构建了自己的指标::录像机,通过默认的Prometheus Recorder发送指标,但也将其中一些用于用户,在过程中重写标签。

Worker节点主持用户应用程序实例。我们使用HashiCorp游牧到编排鞭炮;我们系统的三个最大组成部分之一是我们为管理爆竹的游牧民族写的驱动程序。当然,Nomad将一堆指标导出到Telegraf。

在每个闪光灯实例中,我们运行我们的自定义init,它启动用户的应用程序。我们的NoMad驱动程序,我们的init和firecracker consire建立一个vsock - 一个主机Unix域套接字,它在guest虚拟机中作为一个合成的virtio设备 - 允许init与主机通信;我们在vsock捆绑节点出口型JSON统计游牧收集并传递给玉萍。

FireCracker图片包括我们系统中更重要的细节之一。这些VM都是IP可寻址的。如果您喜欢(而且您应该!),您可以在您的应用中公开一个Prometheus出口商,然后在您的Fly.Toml中告诉我们它;它可能是这样的:

当您部署时,我们的系统将注意到这些指令,并将为您的指标安排在我们的Vicky集群中最终。

谈到自动化监控时,有两个大哲学,“检查”和“指标”。 “检查”是我们中许多人的增长:你编写了一个探测系统的脚本,并确保它响应您期望的方式。简单的。

“指标”是subtler。导出指标而不是运行脚本。指标比检查您最终追踪更多的东西。您将规则写在指标上以检测异常,例如“比预期的502次响应”,或“加工要求的突然下降”,或“刚刚飙升的第95百分位延迟”。因为你有一个历史记录的指标,你甚至不需要提前知道你需要什么规则。你只是在想到他们时写下它们。

这是“白盒监测”。使用指标可以尽可能多地打开系统,然后在顶部构建监控,因此您可以随着时间的推移而增加监控,而无需不断重新部署新版本的应用程序。

更重要的是,你不仅仅是得到警报;相同的数据流为您提供趋势和规划和漂亮的图表,以便在墙壁上放置LCD状态板。

再次,新兴标准如何实现这一点似乎是普罗米修斯。它很容易向您自己的应用程序添加Prometheus出口商,您应该这样做,无论您是否在飞行中运行您的应用程序。最终会收集这些指标并将它们良好使用!

这是我们构建的指标基础设施,以及我们购物的可观察性思想要做。

关于所有这些的整洁的是,Prometheus指标是我们公众API的一部分。你现在可以用自由计划的免费计划旋转;使用GitHub帐户注册,您可以将我们的API添加为Prometheus数据源。 URL将是https://api.fly.io/prometheus/$$(Your-org) - 如果您不知道您的ORG,个人作品 - 以及您将通过客户授权标题持票人进行身份验证(Flyctl Auth令牌)。

添加仪表板(左侧菜单上的加号),添加一个空面板,单击“度量标准”,然后您将获得所有当前可用度量的下拉列表。例如:

您可以将任何度量标准显示为表以查看可用标签;您通常可以计算“app”,“区域”,“主机”(工作者节点的标识符,您的应用程序正在运行)和“实例”。捅他们,看看有什么!

再次记得,如果你'重新出口您自己的Prometheus指标和您'在Fly.Toml中告诉我们,这些指标也将在格拉多纳出现;我们' ll索引和存储并为您处理查询,网络和访问控制器自动处理。