监控 REST API 的最佳方式是什么?

What's the best way to monitor your REST API?

我基于 RESTful 模式创建了一个 API,我想知道监控它的最佳方法是什么?我能否以某种方式收集每个请求的统计信息以及我可以监控请求的深度?

另外,是否可以使用开源软件(也许构建我自己的监控服务)来完成,还是我需要购买第三方软件?

如果可以通过使用开源软件实现,我应该从哪里开始?

我已经尝试了几种应用程序和方法来做到这一点,最好的(对于我的公司和我们的相关项目)是记录键=值对(原子条目以及与此操作相关的所有信息,如 IP 源、操作结果、经过的时间等...在每个 node/server) 的特定日志文件上,然后用 Splunk 进行监视。使用您的 REST 和 json 数据,您的方法可能会有所不同,但它也得到了很好的支持。

安装和设置非常简单。您可以(几乎)监视实时数据(响应时间、操作结果)、发送事件通知和做一些 DWH(以及许多其他事情,有很多插件)。

它不是开源的,但如果你每天使用少于 50MB 的日志,你可以免费试用它(前段时间它是这样工作的,因为现在我是企业许可证我不是 100% 确定) .

这里有一个小教程,解释了如何实现您正在寻找的东西:http://blogs.splunk.com/2013/06/18/getting-data-from-your-rest-apis-into-splunk/

首先确定您认为监控将解决的核心需求。尝试回答 "What do I want to know?" 和 "How do I want to act on that information?" 这两个问题。

"What do I want to know?"

的例子
  • 随着时间的推移表现
  • 最大的 API 用户
  • 最常用的 API 功能
  • API
  • 中出现错误

"How do I want to act on that information?"

的例子
  • 查看已知测量的仪表板
  • 当某些变化超出预期范围时收到警报
  • 跟踪导致该状态的执行
  • 查看系统整个生命周期的测量结果

如果您能回答这些问题,您可以找到合适的第三方解决方案来捕获您感兴趣的指标,或者将监控探针注入 API 的正确部分,这将告诉您你知道你需要做什么。我注意到您的应用程序主要是一个 Laravel user, so it's likely that many of the metrics you want to know can be captured by adding before ( Registering Before Filters On a Controller ) and after ( Registering an After Application Filter ) 过滤器,用于测量响应时间和响应的成功完成。这是第一组问题的答案最重要的地方 ("What do I want to know?"),因为它将指导您在应用中测量的位置和内容。

一旦您知道可以在哪里捕获数据,选择正确的工具就变成了在(大约)两个 类 监控应用程序之间进行选择的问题:高度专业化的监控应用程序与操作紧密相关您的应用程序,以及更类似于时间序列数据库的通用监控软件。

没有开源的高度专业化案例的流行(据我所知)示例。然而,许多商业解决方案确实存在:NewRelic、Ruxit、DynaTrace 等等。它们的功能可以很容易地描述为类似于远程分析器,此外还有许多其他功能。 (此外,不要忘记更传统的分析器可能有助于收集您需要的一些信息——虽然它绝对不会取代对您的应用程序的监控,但在您开始分析之前,可以从分析中收集到很多有价值的信息投入生产。)

总的来说,我个人知道还有很多开源选项。寿命最长的是 Graphite(这里有一个很好的介绍:Measure Anything, Measure Everything),它在许多人中很常见。然而,Graphite 远非唯一的选择,如果您希望自己托管,您可以找到许多其他选择,例如 Kibana 和 InfluxDB。

这些开源选项中的许多选项还具有来自多个提供商的托管选项。此外,您会发现此阵营中有许多完全商业化的选择(事实上,我是其中之一的创始人 :) - Instrumental)。

这些商业选择中的大多数之所以存在,是因为应用程序所有者发现 运行 在 运行 其实际应用程序之上建立自己的监控基础设施非常繁重;在许多运维人员的愿望清单上,维护另一个分布式系统的可用性并不高。 :)

我用的runscope.com for my company. If you want something free apicombo.com也可以。 基本上,您可以为 API 端点创建一个测试来验证负载、响应时间、状态代码等。然后您可以将测试安排到 运行。他们还提供一些基本统计数据。

(我显然偏向于回答这个问题,因为我与他人共同创立了 Runscope,我认为它是 API 监控领域的领导者,所以你可以对这一切持保留态度,或者相信我多年与 1000 多位客户合作解决这个问题的经验:)

我不知道有任何特定于 REST(ful) API 监控的 OSS 工具。通用 OSS 指标监控工具(如 Graphite)绝对可以帮助密切关注 API 堆栈的各个部分,但没有任何 API 特定的功能。

商业指标监控工具(如 Datadog)或应用程序性能监控 (APM) 工具(如 New Relic 或 AppDynamics)具有更多特定于 API 用例的功能,但 none以它为中心。这些是我们称之为 "layered monitoring approach" 的有用部分:从高级 API 监控开始,并使用这些其他工具(异常跟踪器、APM、原始日志)在问题出现时深入研究。

那么,您应该在 API 监控工具中寻找哪些 API 特定的功能?我们根据您通常监控的三个因素对它们进行分类:uptime/availability、performance/speed 和 correctness/data 验证。

正常运行时间监控

在基本层面上,您会想知道您是否 API 甚至可供需要联系他们的客户使用。对于 "public"(意思是,在 public 互联网上可用,不一定 public 化 ...移动后端 API 是 public 但不一定 publicized) APIs 你会想要模拟尽可能多地调用它们的客户端。如果您有移动应用程序,则 API 可能需要在全球范围内可用。因此,至少,您的 API 监控工具应该允许您从多个位置 运行 进行测试。如果无法从某个位置联系到您的 API,您需要通过电子邮件、Slack 等方式收到通知。

如果您的 API 位于专用网络(公司防火墙、暂存环境、本地计算机等)上,您也希望能够 "see" 它。对此有多种方法(代理、VPN 等),只需确保您使用 IT 部门认可的方法即可。

如果您是自托管、内部构建或使用 OSS 工具,测试代理的全球分布是一项昂贵的设置。您需要确保您设置的每个远程位置(最好是在您的主集群之外)都具有高可用性和完全监控。这会很快变得昂贵且耗时。

性能监控

一旦您确认您的 API 可以访问,那么您将要开始测量它们的执行速度,以确保它们不会减慢使用它们的应用程序。原始响应时间是您应该跟踪的最低限度指标,但并不总是最有用的。考虑以下情况:多个 API 调用被聚合到用户的视图中,或者用户的操作生成动态或很少调用的数据,这些数据可能尚未出现在缓存层中。这些多步骤任务或工作流可能难以使用 APM 或基于指标的工具进行监控,因为它们无法理解 API 调用的内容,只能理解它们的存在。

外部速度监控对于获得最准确的性能表示也很重要。如果监控代理位于您的代码内或位于同一台服务器上,则它不太可能考虑到实际客户端在进行调用时遇到的所有因素。 DNS 解析、SSL 协商、负载平衡、缓存等

正确性和数据有效性

如果返回错误数据,API 启动速度快又有什么用呢?这种情况非常普遍,最终会带来更糟糕的用户体验。人们明白 "down"...他们不明白为什么应用程序会向他们显示错误的数据。一个好的 API 监控工具将允许您深入检查来回的消息有效负载。 JSON 和 XML 需要解析、复杂断言、模式验证、数据提取、动态变量、多步监视器等,才能完全验证来回发送的数据是否正确。

验证客户端如何使用您的 API 进行身份验证也很重要。良好的 API-特定监控工具将了解 OAuth、与客户端证书的相互身份验证、令牌身份验证等


希望这能让您了解为什么 API 监控与 "traditional" 指标、APM 和日志记录工具不同,以及它们如何协同工作以全面了解您的应用程序表演。