监测是一个根本的难题,这是烦人,因为它听起来像它应该很容易。我们建立了这个服务或应用程序,现在我们所要做的就是跟踪其业绩;容易,对不对?正如虽然大多数事情一样,魔鬼存在于细节之中。什么是我们想要监控?什么是我们甚至意味着当我们说表现?在第一次通过,它似乎真的很诱人的,就把数据的每一个可能的一块,我们可以进普罗米修斯毕竟不是更多的数据总是更好?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

为什么延迟?延迟被广泛认为是一个很好的信号,监控器;例如,它包含在谷歌的金色信号。延迟,就像一般的监控,感觉像它应该是很容易聚集 - 在服务器上的代码路径的开始启动计时器,然后在年底停止它。然而,大多数工程师都可能在这最后的一句话畏缩,因为很少是一个系统那么简单。在Ok188bet金宝搏官网Cupid例如,平均用户请求通过负载平衡器和SSL终止,几个不同的服务(通常在不同的服务器),有时数据库的层之前得到折回围绕给用户。一个可能的解决方案,这是实现分布式追溯系统。这些都不仅仅是捕捉端至端的反应时间,而且(在运行相当热的服务和潜在的性能命中),大量的复杂性,使实现生产就绪的分布式跟踪系统有点长项目的一些真正伟大的好处。相反,我们选择了利用两个软件已经在我们的基础设施,HAProxy的和Fluentd(存在专门的TD-剂版本),这让我们等待时间的一个很好的措施少得多的风险和精力。

HAProxy的是一个很好的候选人一个地方,以获得从延迟,因为它提供了一个相当强大的指标集。正如指出的这篇文章中,等待时间,是因为这措施是特别有用的:“总的活性时间HTTP请求时,时刻之间的代理接收的请求报头的第一个字节和响应身体的最后一个字节的发射”上述文章实际上是我们的一个伟大的第一步,我们开始按照从那里HAProxy的配置,并从那里初始Fluentd配置;你一定要看看!我们迅速跑进从有两种路障虽然。开启时,第一个问题是httplognormal我们的日志文件用的请求淹没,十分钟之内填满。发生这种情况是因为,以前我们记录错误可能被运到Scalyr或其他来源的日志文件。如果我们希望能够通过fluentd从HAProxy的得到我们的指标,我们也需要开始记录我们的错误,通过Fluentd文件,这意味着我们需要在Fluentd添加过滤掉错误,并记录他们的一个额外的步骤,或者接受我们将失去一些可观察性,我们不愿意妥协。我们的下一个问题是,我们希望能够绘制延迟每个端点的Grafana。我们HAProxy的后端处理成百上千的不同端点,因此没有能够通过请求通过端点来分割我们将有一个延迟的度量,这将是太模糊,实际上是对我们有用。这意味着,我们要需要解析的实际要求,所以我们不得不修改汤姆·福塞特已提供的正则表达式。
为了处理通过Fluentd错误的解析,我们增加了在record_modifier阻止拉出状态代码:
STATUS_CODE
然后,构建直方图后,我们增加了一个rewrite_tag_filter阻断过滤掉我们的错误,并记录他们:
log_errors
第二个问题是一个比较复杂。我们又回到了绘图板,决定了我们的请求捕获组分成三组:HTTP动词(这将是一个字,直到有一个空格),HTTP请求(这将是什么,直到有一个空格),然后HTTP请求的版本(这将是HTTP \ d \ d)。这是很快就失败了我们一个相当幼稚的第一关;我敢肯定,一些普罗米修斯爱好者看到此人去。我们没有分裂的要求和参数等等之类的请求/ ratecard?COUNTRY_CODE = US将是从像的请求不同/速度?COUNTRY_CODE = UK这将导致我们被抓延迟指标的数量爆炸,最终导致在文章顶部讨论的情景。因此,我们的HTTP请求组分成两组:REQUEST_URIrequest_parameter(由分离的)。这似乎运作良好,但我们遇到了另一个问题:一些终点(类似我们的个人资料端点)用户的配置文件UUID是造成更多的碎片路径的一部分。所以我们增加了一个过滤器,我们的REQUEST_URI捕获组筛选出是由纯粹的任何路径/ [0-9] /
正则表达式
这似乎一会儿工作。直到我们遇到了我们的下一个问题,我们产生了太多的时间序列造成普罗米修斯需要很长的时间来凑我们的端点导致我们需要之间的是增加我们的刮时间(无限可能)拖延我们的监测的分辨率来决定或需要重新启动Fluentd飘飞(我们在容器中运行Fluentd,所以这可能实际上是一个似是而非的aapproach,但我们认为这感觉有点太哈克)。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_URIREQUEST_PARAMETERS。我们不想写我们自己的过滤器,所以我们使用嵌入在record_modifier一枚红宝石小功能:
list_of_filters
这个列表需要进行一些监控,并逐步在扩大,但我们到达的东西,我们是快乐着。然后,我们进口的指标来Grafana和创造了一些漂亮的图形可视化我们的终端,可以通过端点状态代码,或服务器进行过滤:
grafana

这是给了我们一些洞察到我们的终端到终端的延迟,以及一些有趣的要求,我们得到一个很有趣的项目。其中有些是看只是好玩;例如:有一天,我们不得不为okcupid.com/casino(而爱情有时感觉就像一场赌博,我们绝对不跑赌场)的请求〜100种不同的变化。188bet金宝搏官网其他时间,这可能会照亮漏洞模糊测试实际的尝试;例如:我们经常看到,显然在寻找sqldumps或开放adminer端点的请求。我们也能获得对上增加了这些返回500S和警报的请求数量的一些见解。我很想听听你是如何监控的延迟,如果你利用HAProxy的指标任何其他有用的监视,或者如果你只是想打个招呼!