监测是一个从根本上的困难问题,这很烦人,因为它听起来很容易。我们建立了这项服务或应用程序,现在我们想要做的就是跟踪其性能;容易,对吗?与大多数事情一样,魔鬼在细节。我们想要监控什么?当我们说表现时,我们甚至是什么意思?在第一次通过,似乎扔掉我们可以进入的每一块可能的数据真的很诱人普罗米修斯,毕竟没有更多的数据总是更好?Then your disk space is full within the hour, all of those fancy metrics you’re crawling are using up all of your bandwidth, and you can’t actually figure any of this out because your dashboards are all so overloaded that they grind to a halt - not to mention that you have so many different metrics and alerts that you can’t keep track of what anything is. Today, I’m not going to try and answer all that because I don’t have the answer to most of it (and if I did, I’d have written some brilliant book that I’d tell you all to buy). What I will do is explain how we at OkCupid have tried to regain some of our sanity by extracting our latency directly fromhaproxy.使用Fluentd.

为什么延迟?延迟被广泛识别为监测的相当良好的信号;例如它包括在谷歌的金色信号。延迟,如监控通常,感觉就像它很容易收集 - 在服务器上的代码路径开始时启动计时器,然后在最后停止它。然而,大多数工程师可能在最后一句话中畏缩,因为很少是一个如此简单的系统。例如,188bet金宝搏官网在OkCupid处,平均用户请求通过负载均衡器和SSL终端层,多个不同的服务(通常在不同的服务器上),有时数据库在返回给用户之前。一个可能的解决方案是实现分布式跟踪系统。除了捕获端到端延迟之外,这些具有一些非常有益的好处,而且具有很多复杂性(以及运行非常热的服务的潜在性能),使得实现提供准备的分布式追踪系统的一系列更长的项目。我们选择利用我们基础设施,Haproxy和Fluentd中已经存在的两块软件(特别是TD-Agent.版本),这让我们有一个非常好的潜伏期衡量,风险和努力越来越小。

haproxy是一个良好的候选人,因为它提供了一个延迟的地方,因为它提供了一个相当的强大的指标集。如图所示这篇关于媒介的文章,延迟,TA.特别有用,因为这项措施:“HTTP请求的总活动时间,代理接收到请求标题的第一个字节和响应主体的最后一个字节的发射之间的瞬间。”上述文章实际上是我们的巨大第一步,我们通过遵循来自那里的Haproxy配置以及来自那里的初始Fluentd配置开始;你肯定应该看看!我们很快就跑到了两条障碍。第一个问题是打开时httplognormal.我们的Logfiles与请求淹没并在十分​​钟内填写。这发生了,因为之前,我们以前正在将错误记录到可以运送到Scalyr或其他源的logfiles。如果我们希望通过Fluentd从Haproxy获取我们的指标,我们还需要通过FluentD开始将错误记录到文件中,这意味着我们需要在FluentD中添加额外的步骤,从而过滤掉错误并记录它们或接受我们我们将失去一些我们不愿意妥协的可观察性。我们的下一个问题是,我们希望能够在格拉纳纳的每个端点进行图表延迟。我们的haproxy后端处理了数百到数千个不同的端点,因此在不可能通过端点拆分,我们会有一个延迟度量,这对我们来说太模糊了。这意味着我们将需要解析实际请求,以便我们不得不修改汤姆Fawcett提供的正则表达式。
通过fluentd处理错误解析,我们添加了一个Record_Modifier.块拔出状态代码:
status_code.
然后,在构建直方图之后,我们添加了一个rewrite_tag_filter.块过滤掉我们的错误并记录它们:
log_errors.
第二个问题有点复杂。我们回到绘图板并决定将我们的请求捕获组分为三组:HTTP动词(直到空间为一个单词),HTTP请求(直到空格直到空格),然后是HTTP请求版本(这将是http \ d。\ d)。这是一个相当天真的第一次通过,迅速失败了我们;我相信一些普罗米修斯AFICIONADOS看到这个人在哪里。我们没有拆分请求和参数,因此请求/ ratecard?country_code =我们会与一个请求不同/速率?country_code =英国这将导致我们抓住的延迟度量数量的爆炸,最终导致文章顶部讨论的场景。所以我们将HTTP请求组拆分为两组:Request_uri.Request_Parameter.(被一个分开)。这似乎很好,但我们遇到另一个问题:使用一些端点(如我们的个人资料端点),用户的个人资料uuid是导致更多碎片的路径的一部分。所以我们为我们的过滤器添加了一个过滤器Request_uri.捕获组以筛选完全由此组成的路径/ [0-9] /
正则表达式
这似乎工作了一段时间。在我们遇到我们的下一个问题之前,我们正在生成太多的时间,导致普罗米修斯需要很长时间才能刮掉我们的终点,导致我们需要决定增加我们的刮削时间并推迟我们的监督(可能无限期)现在,需要重新启动FluentD,然后(我们在容器中运行Fluentd,所以这可能是一个合理的Aaproach,但我们认为感觉也有点太乱了)。We discovered that this was caused by a few requests that still embedded a user’s username (which was deprecated by us and likely caused by users using bookmarked links) or contained other information that we weren’t particularly interested in. This led us to try and devise a way to edit theRequest_uri.Request_Parameters.。我们不想编写自己的过滤器,所以我们使用嵌入在Record_Modifier中的小型Ruby函数:
list_of_filters.
此列表需要一些监控,并逐步扩展,但我们到达了我们对我们感到满意的东西。然后,我们将指标导入Grafana并创建了一些漂亮的图表,以可视化我们的端点,可以通过端点,状态代码或服务器进行过滤:
格拉纳纳

这是一个非常有趣的项目,让我们了解我们的端到端延迟以及我们得到的一些有趣请求。其中一些只是看起来很有趣;例如:有一天,我们有一个〜100对Okcupid.com/casino的请求的不同变化(而爱情可能有时会觉得赌博,我们绝对不会运行赌场)。188bet金宝搏官网其他时间,这可能会照亮对漏洞模糊的实际尝试;例如:我们经常查看清楚地寻找Sqldumps或开放管理员端点的请求。我们还可以有一些关于返回500s和警报的请求数量的洞察。如果您正在利用任何其他有用的监控,或者您只想打个招呼,我很乐意听到您如何监视延迟。