如何监视Python应用程序性能
#python #monitoring #observability

阅读New Relic的完整博客文章:Monitoring Python application performance

Python是一种流行的开源语言,易于学习,非常适合开发人员的生产力。它在许多行业中广泛使用,包括网络开发,科学计算,数据分析和人工智能。尽管Python具有许多优势,并且在生产中广泛使用,但它也有一些缺点。因为这是一种脚本语言,因此开发更容易,但不如Java这样的语言那么高效。为了确保您的Python应用程序的性能尽可能的性能,使用应用程序性能监视工具,可以帮助您优化代码并在影响客户之前解决问题。

在本文中,您将了解Python监视的基础知识,包括:

  • 为什么Python应用程序监视很重要
  • 监视Python应用程序的好处
  • 您应该在应用程序中监视的指标
  • 测量应用程序性能的工具
  • 为什么Python应用程序监视很重要

监视Python应用程序有很多好处,这些好处往往适用于其他语言编写的应用程序。由于较大的应用程序通常使用许多工具和编程语言,因此重要的是全面考虑这些好处。无论您是使用Django用于MVC应用程序还是Python以及较大的分布式系统中的其他工具,重要的是要了解监视如何对应用程序的每一层有益,以及您的监视工具类型每一层都使用。

演示层

演示层包括用户界面以及用户看到并与之交互的应用程序的所有部分。演示层中可能发生许多问题,例如页面加载缓慢或根本不加载,形成不正确的形式,或者页面上的组件无法正确呈现。如果您使用Django或其他框架,则可能包括您的视图中的编码错误。

要监视演示层,您通常会使用real user monitoring (RUM),该real user monitoring (RUM)在您的网站上监视真实的用户行为,并使用使用无头浏览器来穿越网站的合成监视。

业务层

业务层是应用程序逻辑寿命的地方。在单片应用中,该逻辑可能包含在一个代码库中,但是越来越普遍的业务层由松散耦合的微服务组成,如果出现问题,这些微服务仍然会对彼此产生深远影响。由于许多Python应用程序都使用JavaScript或JavaScript单页应用程序(SPA),例如用于演示层的React,因此Python业务层是API,无论是使用DJANGO REST框架还是其他工具。业务层中可能发生的问题包括失败或缓慢的API呼叫,客户银行交易问题(例如在电子商务网站中)以及可以防止客户访问网站或更糟糕的身份验证和授权服务的问题,导致应用程序漏洞。

对于业务层,您通常会使用APM(应用程序性能监视)工具,该工具为您提供有关应用程序性能的重要指标,例如错误率,吞吐量和交易时间。您可以使用New Relic quickstart for Python在短短几分钟内开始监视Python应用程序的业务层。它带有一个仪表板,可为您提供有关事务时间,错误和CPU使用等指标的数据。

持久性/数据库层

持久性层包括与数据库(例如SQL查询,RAW SQL或通过Django Orm之类的工具)的交互,而数据库层是数据库本身。持续层的问题范围从效率低下的查询到损害数据库安全性的查询。数据库层本身的问题可能包括正常运行时间,内存使用以及存储和查询速度的问题。新遗物包括许多数据库的Quickstarts,包括MySQLPostgreSQL,它们均与Django一起使用。

Python应用程序监控的好处

监视Python应用程序也具有许多一般好处,从平均时间到检测(MTTD)和平均分辨率(MTTR)到提高开发人员生产率。让我们看看其中一些好处:

迅速识别和诊断瓶颈和其他性能问题。绩效监控工具包括诸如吞吐量,平均交易时间和错误率之类的指标。您可以轻松地查看何时受影响的Topline指标,然后进一步钻探以查找问题的发生位置,例如查看最慢的五个交易。这些指标可帮助您减少平均检测时间(MTTD)和平均解决问题的时间(MTTR)。
优化应用程序性能。性能监控工具在出现时仅查找和解决问题。通过识别性能次优的领域,您可以将资源集中在改善最需要优化的应用程序的各个部分上。无论是仅仅试图确保最终用户快速加载的页面还是对应用程序可扩展性做出更大的架构决策,详细的指标可以使您对团队应为工作的重要见解。
警报关键指标和性能指标。没有警报,很难知道您的应用程序中出现了什么问题。通常,这意味着您会从客户那里找到问题,而不是最大程度地减少客户受影响之前的问题的影响。
进一步提高开发人员的生产率。 Python已经被称为一种非常适合开发人员生产力的语言,但是每一刻,您都需要花费时间来寻找虫子和生产问题,从而消失了花费的时间编码和开发新功能。
可以在包括Devops在内的团队中进行合作。虽然许多团队具有跨职能,但应用程序更大,但可能会孤立不同的团队。一个良好的应用程序监控工具包括协作的机会,从可以发送给多个团队的警报到出现的问题的申请调试和分类。

指标您应该在Python应用程序中监视

让我们仔细研究一下您在Python应用程序中应该监视的一些指标,它们是什么以及为什么很重要。

一个好的应用程序监视工具将在您的应用程序中自动收集这些指标。另外,您可以创建一个自定义解决方案,但这是更多的工作。

响应时间:响应时间有时称为延迟,是用户满意度的极为重要的指标。延迟是满足用户请求所需的时间,并且被认为是four golden signals之一。一个少于一秒钟的响应时间被认为是可以接受的(理想的200毫秒或更少)。当平均响应时间高出一秒钟时,您的最终用户更有可能对应用程序的性能不满意。这可能会导致他们停止使用该应用程序,而有些则不会回来。

您还应该设置一个警报,以通知您的平均响应时间太高。最终,确切的阈值取决于您的特定用例。潜在的起点是警报中间的页面加载时间是否超过10秒,持续5分钟。这表明您的网站存在主要问题,需要立即解决。如果您的警报阈值太雄心勃勃(例如,设置为1秒),您可能会收到太多警报,从而导致团队的警报疲劳。

这是一个新的Relic仪表板的一个示例,该仪表板可以测量Python应用程序中的交易,包括平均持续时间和交易的成功率。它还突出了最受欢迎和最慢的交易,使您深入了解特定交易的性能以及最终用户如何体验应用程序。

New Relic dashboard shows transaction metrics such as total count, fastest and slowest, average duration, and success rate.

新的Relic仪表板显示了交易指标,例如总数,最快和最慢,平均持续时间和成功率。

吞吐量:吞吐量是对用户流量的测量。吞吐量的一个示例是每分钟请求数。吞吐量是优化应用程序性能并确定提供最佳性能所需资源的重要指标。如果您遇到较高延迟的问题,那么在解决问题方面,有关应用程序吞吐量的信息是一个重要的数据点。异常高的吞吐量也可能是拒绝服务攻击的迹象。

错误率:错误率百分比使您对应用程序中发生的未手动异常数量有所了解。在一个完美的世界中,您的应用程序不会有任何错误,但不幸的是,一些未经治疗的例外是不可避免的。高错误率表明您的应用程序具有需要立即解决的问题。

CPU用法: CPU使用是您的应用程序所使用的处理功率的量。如果您使用过多的CPU,则您的应用程序不会表现出色。相反,如果您使用的CPU比随着时间的推移预期的要少,则您可能会过度交配,并且应将应用程序资源权利以节省成本。

内存使用情况:高内存使用情况将导致应用程序减慢并可能崩溃。就像使用CPU使用一样,您可以使用应用程序监控来权利和优化内存使用量。

APDEX分数: APDEX分数是一种开放标准解决方案,用于衡量用户对应用程序的满意程度。它测量了令人满意的响应时间与不满意的响应时间的比率,并且是您的应用程序如何执行的有用的一般指标。

除了以前的指标外,您可能还需要在应用程序中测量自己的目标和服务级别的目标。诸如New Relic之类的性能监视工具使您可以根据您选择的查询来构建自定义指标和仪表板。

与Python的分布式跟踪

指标可以使您对应用程序的性能有一个高级的视野,但是当您的指标揭示缓慢的请求或其他问题时会发生什么?如果是对API端点的简单请求,则可以通过动手调查找到问题的来源。但是,如果请求流过许多不同的服务怎么办?在这种情况下,您需要通过系统遵循请求的更多详细跟踪信息。这就是分布式跟踪所在的位置。分布式跟踪使您可以通过应用程序跟踪请求,从而使您对服务的工作方式有很大的见解。

虽然分布式跟踪为您提供有关系统中请求的详细信息,但它可能涉及处理和存储大量数据。这就是为什么要采样痕迹的原因,这意味着仅跟踪一些流过您应用程序的请求。您可以跟踪一定比例的请求(例如25%),或者,如果使用tail-based sampling,甚至可以选择跟踪某些类型的请求,例如所有包含错误消息的请求。

您可以在Python应用程序中使用许多工具用于分布式跟踪请求,从OpenTelemetry之类的开源工具到New Relic等多合一平台。

opentelemetry是惊人的,但是您需要更深入地研究其文档以充分整合跟踪。如果您想更快地提高速度,New Relic Infinite Tracing是一种基于云的完全管理的解决方案,它使用基于尾部的采样来帮助您精确调整您要在应用程序中追踪的请求。

监视Python应用程序的工具

让我们看一些可以用来监视应用程序的开源工具。

OpenTelemetry是云本机计算基础(CNCF)的一部分,是用于使用遥测数据的开源工具,API和SDK的集合。您可以使用它来创建,收集和导出数据,包括指标,日志和跟踪。因为它是供应商中立的,因此您可以将其与任何语言或框架(包括Python和Python框架)一起使用。您可以轻松地使用PIP安装API和SDK软件包,然后使用OpenTelemetry的示踪剂从应用程序收集数据。由于OpentElemetry是CNCF的一部分,因此它将始终是开源的,并且受益于强大的开发人员社区。但是,虽然您可以使用OpenTelemetry进行Python应用程序的自动仪器,但是在整个应用程序中进行设置将进行一些手动工作。

Prometheus,它也是CNCF开源项目collects metrics data by scraping HTTP endpoints,然后将该数据存储在使用多维模型的时间序列数据库中。它是收集有关您应用程序的指标的强大工具,还包括警报功能,您可以在问题出现时使用该功能来通知团队。 Prometheus包括一个client library for Python

Jaeger是一种开源分布式跟踪工具。它可以将跟踪数据存储在Cassandra和Elasticsearch中。

由Twitter开发的

Zipkin是一种开源工具,用于分布式跟踪,也可用于解决应用程序中的延迟问题。 Zipkin是基于Java的,而py_zipkin是Python的实现。

logging是一个内置的python库,可提供灵活的事件记录。您可以通过将import logging添加到需要的文件顶部来轻松导入Python应用程序。

structlog是用于为日志消息添加结构的开源Python工具。您可以使用Python的内置记录工具来更好地组织日志。

使用新遗物等解决方案

虽然您可以通过开源有效地监视应用程序,但您可能需要使用并了解多个工具。这意味着自定义实现以完全监视应用程序的每个部分,包括服务器端,客户端,基于云的服务等。随着应用程序的规模,创建和维护自定义的完整堆栈可观察性解决方案变得越来越具有挑战性。

New Relic这样的多合一平台通过包括自动仪器,内置可视化,用于真实用户监控和合成监控的工具,简化监视,分布式跟踪等等。免费层包括一个完整的用户和每月100GB/摄入的数据。