准确的性能监控对于Wayfair的店面工程团队至关重要。每天我们都会在面向客户的网站的web应用程序中部署数百个代码更改,每个更改都有可能对性能产生或好或坏的影响。由于这个原因,我们仔细地监控kpi,比如页面加载时间,以捕获回归,识别加速的机会,并验证改进在现实世界中是否有效。

在浏览器中对页面加载时间的客户端监视称为真实用户监控或朗姆酒。2018年,我们在Wayfair对RUM进行了一次重大升级,从传统的石墨后端迁移到了下一代的InfluxDB。这篇文章将带你走过我们的旅程,以及一路上我们所克服的挑战。

朗姆酒是什么?

Web性能指标可以分为三大类:服务器端测试、综合测试和RUM。我们从服务器端计时器开始,它很容易构建,但对客户机上发生的所有类型的问题都视而不见。综合测试可以洞察客户端性能,但是它们受到一组预定义的url和一个人工测试环境的限制。

RUM系统使用JavaScript和标准的浏览器api,比如PerformanceTiming记录真实客户体验的加载时间。通过跟踪真实世界条件下的性能,我们可以识别那些不可见的问题。随着页面变得越来越复杂,包括来自第三方服务器和网络的资源、图像、字体和脚本,这一点变得越来越重要。公司HubSpot的巴基是开源RUM实现的一个很好的示例。188金博宝备用

监视服务器端加载时间通常很简单。在想要跟踪的代码周围放置一个计时器,将值发送到数据库,然后用一个简单的移动平均值绘制它的图形。

RUM跟踪的客户端负载时间会受到服务器端负载时间的影响,但是它们也会受到客户机和网络条件的严重影响,比如延迟和带宽。

在Wayfair朗姆酒

Wayfair的RUM系统最早创建于2013年,使用石墨时间序列数据库进行实时图表和警报。从那时起,我们对系统进行了调整,增加了改进的验证,a速度指数启发式但直到今年,核心功能基本没有变化。

挑战

多年来,我们的RUM仪表盘在识别问题方面非常有用,但有些古怪之处使得解释数据变得非常困难。

由于朗姆酒的值和异常值范围很大,因此它的测量和可视化非常具有挑战性。例如,一个页面加载时间中值为5秒的页面加载时间通常会超过200秒。只有少数的异常值可以大大偏离平均值,而遗留的石墨后端特别容易受到这个问题的影响。在数据摄入过程中,石墨在几个地方进行了估算和取样。在一些常见的情况下,这些错误混合在一起,导致浪费时间的误导性图表。新的流感数据库后端没有这个问题,因为它使用了真正的中值计算,许多可用的操作符、聚合器和选择器之一

日常模式:RUM度量标准呈现出一种每日模式,在这种模式中,该值将根据自然流量周期周期性地上升和下降。当清晨的客流量较低时(美国和加拿大的商店在美国东部时间凌晨2-6点),异常值的影响更大,因此图表显得更“spikey”。交通构成也会在一天中发生变化。例如,mweb客户在深夜更有可能使用快速WiFi,而在“通勤时间”,较慢的3G/4G网络更常见。

高聚合度:我们目前记录了495个不同的值script_name标记,指示被测量的页面。结合标签client_type(桌面/mweb/平板电脑)、存储、浏览器和数据中心,以及你会得到大量的唯一级数,或者说高基数。查询性能随级数的数量而变化,因此在我们最初的实现中,仪表板的速度很慢。我们与InfluxData的工程师一起寻找解决方案:删除不必要的内容宿主标记将基数降低了600x

规模:在一个典型的日子里,我们将看到8个商店中超过2000万的RUM测量值、数百种页面类型以及从手机、平板电脑到笔记本电脑和pc的数千种设备类型。

我们使用了一些策略来解决这些挑战和限制石墨后端。特别是:

  • 使用石墨的movingMedian具有大窗口(100个数据点)的函数有助于控制异常值。这有一些缺点:较慢的石墨查询,难以做实时警报,仪表盘响应延迟约15分钟,对低流量页面的非直观的度量行为。
  • 手动丢弃异常值removeAboveValue。这里的缺点是,我们可能会错过合法的减速,手动设置每个页面的离群值也很乏味。

引入InfluxDB

我们最近引入了InfluxDB作为我们的一流时间序列数据库系统,在那里我们有机会直接与InfluxData工作,以确保我们的道路是可扩展的,健壮的,并符合其平台的未来发展方向。作为日志和时间序列团队的Jim Hagan之前说过,流感数据库的架构允许我们平衡计算和存储的水平和垂直扩展方法。我们的内部时间序列技术审查确定了一些关键属性,提供了实质性优势的现状。你可以在我们的网站上阅读更深入的文章这里的科技博客

RUM的流感数据库架构

对于熟悉石墨的应用程序开发人员来说,模式是最大的变化。影响xdb支持为每个度量定义字段和索引标记,而石墨使用普通的、非结构化的点分隔字符串来标识每个度量。

模板石墨公制的一个例子:

rum.client_timers device_type美元。商店。页面。美元指标。dc.timer.mean美元

一个示例查询:

rum.client_timers.desktop.wayfair_com.index.speed_index.bo1.timer.mean

石墨使用的简单结构使其易于入门,但随着您添加facet,复杂性会迅速增加。例如,为了让浏览器爆发,相同的度量被多次存储,但它被限制在某些页面,以保持在石墨主机上合理的磁盘使用。在创建仪表板时必须考虑到这些限制,而新的视图通常需要部署新的度量来复制度量。

用浏览器模板化石墨度量的一个例子:

rum.client_timers device_type。美元商店。浏览器页面。美元。指标。dc.timer.mean美元

相比之下,设计您的流感数据库模式需要更多的时间,但是它为您提供了更多的功能和灵活性。仪表板是通用的,易于定制。内省查询允许您以一种自然的方式浏览数据,以发现有趣的交叉和相关性。

与SQL数据库中的表类似,该模式具有对于我们在加载页面时测量的每个值:

标签(类似于SQL中的索引列)用于过滤和切片:

优化模式

当我们最初部署流感数据库模式并开始构建仪表板时,我们遇到了一个问题:查询速度慢和超时。这使得搜索数据变得困难,并且不可能查看超过几个小时的时间范围。由于每天的模式,不能绘制过去24小时的图表是一个交易破坏者,所以我们必须找到一个解决方案。

5月,来自InfluxData的工程师访问了位于波士顿的Wayfair办公室,为我们的应用程序开发人员举办了一次研讨会。这帮助我们的团队快速掌握了流行性数据库数据模型和最佳实践。我们了解到查询性能随序列基数的变化而变化,并且能够诊断我们的RUM模式的问题。

我们无意中增加了a宿主标记到记录从浏览器接收到RUM指标的web服务器的模式。该标记上没有需要过滤的值,正如前面提到的,删除它会使基数减少600倍。通过将RUM度量移动到一个新的集群来重新设置模式之后,查询性能得到了极大的提高!

指示板

在Wayfair,我们用Grafana构建仪表板和可视化数据从各种来源,包括石墨和Elasticsearch。Grafana广泛的影响数据库支持帮助实现了平稳过渡。

通用的朗姆酒仪表板,以查看单个页面和存储。

朗姆酒概述仪表板,以查看重要页面的可配置选择。

朗姆酒浏览器比较仪表板。

用于此Grafana仪表板的模板化查询:

选择PERCENTILE(/^$metric$/, $ PERCENTILE)作为“rawdata”中的p$ PERCENTILE。其中"dc" = '$dc'和"script_name" = '$page'和"store" = '$store'和"client_type" = '$client_type'和"browser" <> 'other'和$timeFilter GROUP BY time($摔打间隔),"browser" fill(null)

带有登录状态仪表板的RUM。

带有存储仪表板的RUM,可以跨所有存储和数据中心比较单个页面。

带客户Shard的RUM:这显示了数据库维护工作期间的负载时间,在这些工作中,某些客户组的流量在数据中心之间转移。

使用石墨朗姆酒,它是混乱和不直观的解释每个图表没有一定的背景知识。InfluxDB使我们组织内的工程师和产品经理更容易获得这些图表,这对我们整体来说是非常重要和有影响的。同样,石墨中的一些过滤器(例如,break out by browser)被限制在某些页面上。使用流感数据库,默认情况下,我们可以在每个页面上看到完整的标签。

我们如何利用它来改善客户体验?例如,使用登录状态仪表板,当页面对于登录的客户来说较慢时,它会显示出来,因此我们可以调查原因并修复瓶颈。

由于使用了不同的存储架构,使用InfluxDB,我们能够表示这些指标的完整粒度;使用石墨,我们遇到了预先分配存储的问题(它消耗的空间与系列的数量成正比)。我们必须降低原始指标的粒度,否则将耗尽石墨集群中的所有存储空间!我们也能够在特定领域的考虑使用在哪里条款。

结论

衡量高流量电子商务网站的性能是一项挑战。在Wayfair上为RUM迁移到InfluxDB,这极大地提高了我们对真实客户体验的可见性,并创建了一个可扩展的平台,我们将在未来几年继续构建该平台。

我们添加的第一件事是一个实验性的度量“交互时间”(TTI)。使用新的长任务浏览器API我们测量浏览器达到空闲状态的时间,以便它能够快速响应用户输入。通过监控和优化TTI,我们希望通过减少“烦人的”滚动和无响应的点击来改善客户体验。在未来,我们计划评估其他指标,如菲利普·沃尔顿最近宣布的第一次输入延迟,这是衡量网站交互性的另一种方法。

在你的工程部面对类似的挑战?请在评论中告诉我们!