监视性能的简单方法:HAProxy的救援

监控从根本上来说是一个困难的问题,这很烦人,因为它听起来应该很简单。我们创建了这个服务或应用程序,现在我们想做的就是跟踪它的性能;容易,对吧?然而,就像大多数事情一样,细节决定成败。我们想监控什么?我们说的性能到底是什么意思?在第一次尝试时,我们似乎很想把所有可能的数据都丢进去普罗米修斯毕竟,数据越多不就越好吗?然后你的磁盘空间在一个小时内就满了,你正在浏览的所有那些花哨的指标都在占用你的所有带宽,而你实际上无法解决任何问题,因为你的仪表盘都超载了,它们慢慢地停止了更不用说你有那么多不同的指标和提醒,你无法跟踪任何东西是什么。今天,我不打算尝试回答所有这些问题,因为大部分问题我都不知道答案(如果我知道,我会写一本很棒的书,让你们都去买)。我要做的是解释我们OkCupid是如何通过直接提取延迟来恢复一些理智的188bet金宝搏官网HAProxy使用Fluentd

为什么延迟?延迟被广泛认为是一个很好的监控信号;例如,它包含在谷歌的黄金信号.延迟,就像一般的监控一样,感觉应该很容易收集——在服务器上的代码路径开始时启动一个计时器,然后在结束时停止。然而,大多数工程师可能对最后这句话感到尴尬,因为很少有系统如此简单。例如,188bet金宝搏官网在OkCupid上,一个普通的用户请求在返回给用户之前,要经过负载平衡器层和ssl终止层、几个不同的服务层(通常在不同的服务器上),有时还要经过数据库层。一个可能的解决方案是实现分布式跟踪系统。除了捕获端到端延迟外,它们还有一些真正巨大的好处,但也有很多复杂性(以及运行非常热的服务的潜在性能影响),这使得实现一个生产就绪的分布式跟踪系统需要更长的时间。相反,我们选择利用基础设施中已经存在的两个软件,HAProxy和Fluentd(特别是td-agent版本),这让我们可以用更少的风险和努力来衡量延迟。

HAProxy是一个获得延迟的好地方,因为它提供了一个鲁棒度量集.正如这篇关于媒体的文章为延迟,助教在此度量时特别有用:“从代理接收到请求头的第一个字节到发送响应体的最后一个字节之间的HTTP请求的总活动时间。”前面提到的文章实际上是我们迈出的伟大的第一步,我们从这里开始遵循HAProxy配置和初始flud配置;你一定要去看看!但我们很快就遇到了两个路障。第一个问题是何时开机httplognormal我们的日志文件被请求淹没,十分钟内就被填满了。发生这种情况的原因是,以前我们将错误记录到可以传送到Scalyr或其他来源的日志文件中。如果我们希望能够让我们的指标从HAProxy通过fluentd我们也需要开始登录错误文件通过fluentd这意味着我们需要添加一个额外的步骤fluentd过滤掉错误和日志记录或接受我们会失去一些可观测性,我们不愿意妥协。我们的下一个问题是我们想要能够在Grafana中绘制每个端点的延迟。我们的HAProxy后端处理数百到数千个不同的端点,因此,如果不能按请求和端点进行分割,我们的延迟指标就太模糊了,实际上对我们没有用处。这意味着我们需要解析实际的请求,因此我们必须修改Tom Fawcett提供的正则表达式。
为了通过Fluentd处理错误解析,我们添加了record_modifier块拔出状态码:

然后,在构建了直方图之后,我们添加了arewrite_tag_filter块过滤掉我们的错误并记录它们:

第二个问题稍微复杂一些。我们回到绘图板,决定将请求捕获组分成三个组:HTTP verb(将是一个词,直到有空格)、HTTP请求(将是任何东西,直到有空格)和HTTP请求版本(将是HTTP \d.\d)。这是一个相当幼稚的第一次通过,但很快就失败了;我相信一些普罗米修斯迷们已经看到了它的发展方向。我们没有将请求和参数分开,这样请求就像/ ratecard吗?country_code =我们会和像这样的请求有所不同吗/率?英国country_code =这将导致我们所获取的延迟指标数量的激增,最终导致本文开头所讨论的场景。所以我们将HTTP请求组分成两组:request_urirequest_parameter(由).这似乎工作得很好,但我们遇到了另一个问题:对于一些端点(比如我们的配置文件端点),用户的配置文件uuid是导致更多碎片的路径的一部分。所以我们添加了一个过滤器request_uri捕获组以过滤掉任何只由/ [0 - 9] /

这在一段时间内似乎起了作用。直到我们碰到下一期杂志,我们产生了太多的timeseries导致普罗米修斯需要很长时间才能勉强端点导致我们需要决定要么增加我们之间刮时间和延迟的解决我们的监控(可能无限期)或需要重启Fluentd时不时(我们Fluentd运行在一个容器,所以这实际上可能是一个可行的方法,但我们认为它感觉有点太hacky)。我们发现,这是由于一些请求仍然嵌入用户的用户名(这是我们不赞成的,可能是用户使用书签链接引起的)或包含其他我们不是特别感兴趣的信息。这促使我们尝试设计一种方法来编辑request_urirequest_parameters.我们不想自己编写过滤器,所以我们使用了一个嵌入在record_modifier中的ruby函数:

这个列表需要一些监控,并逐渐扩展,但我们得到了一些我们满意的东西。然后我们将指标导入到Grafana中,并创建了一些漂亮的图表来可视化我们的端点,这些端点可以通过端点、状态代码或服务器进行过滤:

这是一个非常有趣的项目,它让我们了解了端到端延迟以及我们收到的一些有趣的请求。有些只是看起来很有趣;例如:有一天,我们收到了100个不同版本的okcupid.com/casino请求(虽然爱情有时感觉像一场赌博,但我们绝对不是在经营赌场)。188bet金宝搏官网其他时候,这可以说明脆弱性模糊的实际尝试;例如:我们经常看到明显在寻找sqldump或开放管理员端点的请求。我们还可以了解返回500的请求的数量,并在这些请求增加时发出警报。我很想知道您是如何监控延迟的,如果您正在利用HAProxy指标进行其他有用的监控,或者您只是想打个招呼!

最初发表在https://tech.188bet金宝搏官网okcupid.com2020年1月6日。

188bet金宝搏官网OkCupid科技博客

阅读来自OkCupid工程团队的故事,每天连188bet金宝搏官网接着数百万人

188bet金宝搏官网OkCupid科技博客

188bet金宝搏官网OkCupid的工程团队负责每天为数百万人配对。在OkCupid科技博客上阅读他们的故事188bet金宝搏官网

188bet金宝搏官网OkCupid科技博客

188bet金宝搏官网OkCupid的工程团队负责每天为数百万人配对。在OkCupid科技博客上阅读他们的故事188bet金宝搏官网