什么是可观察性?深度指南
或者在 AWS、Azure 或 Google Cloud 订阅
什么是可观察性?为什么你需要它?
在分布式系统中,可观察性是衡量系统内部状态可以从其外部输出中推断得多好的指标。软件可观察性是指监控你的软件以了解其行为和识别问题的实践。
现代分布式系统复杂,故障可能发生在任何层次。为了确保可靠性和可用性,你需要能够尽可能快地识别和修复问题。可观察性通过为你提供系统的所有方面的可见性来实现这一点。
在设计可观察性系统时需要考虑许多因素。你需要考虑要收集哪些数据,如何收集,以及如何以对你有意义的方式呈现。你还需考虑如何在可见性需求与隐私和安全需求之间取得平衡。你还需要考虑存储和分析数据量与数据为业务带来的价值之间的权衡,以确保你从可观察性实施中获得适当的投资回报。
可观察性为什么很重要?
简而言之,可观察性很重要,因为它不仅可以使你的用户因为更好的性能和可靠性而感到更满意,还可以帮助你优化软件,从而节省硬件成本。在竞争激烈的市场中,这将使你比那些不利用现代可观察性实践来改进其软件开发流程的其他公司更具优势。
可观察性是如何工作的?
在最基本层面上,可观察性通过为应用程序添加生成数据的工具来实现,存储这些数据,然后分析数据以生成见解。
实施可观察性系统的第一步是使用必要的工具对你的软件进行仪表化以生成数据。这可能包括日志记录、指标和分布式跟踪库或框架等工具。这些工具协同工作,生成系统行为的详细画面,包括有关请求、错误、性能指标等方面的信息。
系统进行仪器化之后,那些工具生成数据需要发送到某个地方进行存储。这通常将是一些数据仓库或针对分析工作负载优化的列式数据库。在某些情况下,出于性能考虑,不同类型的可观察数据可能存储在不同的专用数据库中。
存储系统的选择将取决于组织的具体需求,但关键要求是它必须能够处理大量数据,并使工程师易于访问这些数据以进行分析。
存储之后,最后一步是分析您的数据,以了解系统行为并识别问题。这可能涉及使用可视化工具生成图表和图形,帮助工程师识别趋势和模式,使用机器学习算法自动检测异常,以及根据可观察数据创建自动化操作。
可观察性的三个支柱
用于可观察性的数据类型被称为“可观察性的三个支柱”,即指标、日志和跟踪。近年来,有人开始认为这三个支柱不足以满足需求。在本节中,您将了解这三个支柱以及一些超越传统三个支柱以改善可观察性的想法。
指标
指标是描述系统在某一时间点的性能和行为的数值数据点。一些例子包括CPU利用率、内存使用、网络流量、响应时间和延迟。
指标以固定间隔存储,用于监控应用程序的性能和建立基线性能。然后可以使用指标来识别性能中的趋势或异常。
日志
日志基本上是应用程序中发生的事件的记录,可能包括警告、错误或一般信息。日志提供了应用程序发生历史记录,并在出现问题时是诊断问题的重要组成部分。
跟踪
跟踪是一种创建和收集的数据类型,用于跟踪请求如何在应用程序中移动。跟踪对于分布式系统或微服务尤为重要,因为单个外部用户请求可能使用多个内部微服务。
跟踪允许开发人员识别性能瓶颈并跟踪分布式系统中请求的端到端行为。
超越可观察性的三个支柱
可观察性专家中越来越多的人认为,可观察性的三个支柱过于复杂。最终,思考可观察性的方式是我们需要跟踪应用程序中发生的事件,并为其提供适当的环境以使这些事件具有连贯性和可用性。
这是基于可观察性的核心目的,即帮助开发人员使他们的软件表现更好、更可靠。这意味着开发人员需要能够查看他们系统中的情况,而最佳方式是通过附加到跟踪的原始事件来提供额外的环境。
可观察性对软件工程的好处
提高开发速度
可观察性可以通过提供对系统内不同组件如何交互的可见性,显着缩短软件产品的上市时间。通过了解整个系统及其依赖关系,开发人员可以快速识别错误和瓶颈,这些错误和瓶颈可能需要几天或几周的时间才能调试。这种对应用程序行为的实时洞察允许开发人员做出更明智的决策,并更快地采取纠正措施。
分析实时业务影响
可观察性可以帮助通过提供系统行为的全面视图以及用户如何与新部署的功能交互,进行业务影响实时分析。通过结合这些数据与数据分析,工程师和项目经理可以了解用户喜欢的功能,并根据这些信息相应地调整他们的开发路线图。
成本节约
对应用程序内部发生的事情有更大的可见性,工程师更容易看到资源的使用情况,并专注于可以产生最大影响的工作。可观察性数据可用于找到应用程序在技术上正在工作的地方,但可以优化以使其更高效并降低成本。
可观察性用例
调试
可观察性最常见用例之一是调试。当分布式系统出现错误时,往往难以追踪根本原因。通过使用可观察性平台对代码进行编码并收集系统行为数据,可以获取有助于识别错误原因的见解,而不是无望地四处寻找。
监控
监控软件性能是利用经过适当编码的软件生成数据的另一种有效方法。监控通常是高级别的,跟踪软件性能的一些关键方面。一旦通过监控检测到问题,可以进行更深入的分析。
容量规划
可观察性数据对容量规划很有用。为了确保系统有足够的资源来满足未来的需求,需要收集和存储系统当前利用情况的数据。然后,可以使用这些数据生成预测,以帮助识别趋势,从而进行适当的资源规划。此类规划有助于在成本方面防止潜在的意外情况。
网络安全
可观察性使得保持软件安全变得更加容易。可观察性数据可用于监控可能表明对系统进行攻击尝试的可疑活动。可以设置异常检测来实时检测潜在问题,在问题被利用之前检测到漏洞,由于有仪表化设置,调查事件将变得更加容易,总体事件响应时间将缩短。
性能优化
通过监控关键指标,如响应时间、错误率和用户参与度,可观察性可以帮助确定软件可能表现不佳的区域或存在优化机会的区域。可观察性对于分布式系统特别有用,因为系统中的所有交互组件使得识别瓶颈更加困难。
可观察性工具
InfluxDB
InfluxDB是一个开源的列式时间序列数据库,可以用来存储所有类型的可观察性数据,只需一个工具即可。InfluxDB支持SQL查询,并与多种不同的可视化工具集成。它还提供了各种客户端库,因此您可以使用您喜欢的语言及其库生态系统来查询和处理您的可观察性数据。
Prometheus
Prometheus是一个开源监控工具,允许开发人员轻松监控他们的应用程序和基础设施。Prometheus具有高度可扩展性,可以提供有关应用程序和系统性能的详细见解。它还提供警报功能,允许开发人员快速识别和解决问题。
Grafana
Grafana 是一款开源的可视化工具,用于创建时间序列和其他可观测数据的精美可视化。它允许开发者快速轻松地从他们的数据中创建交互式仪表板和图表。Grafana 还提供警报功能,使开发者能够了解任何性能问题。
Kibana
Kibana 是一款开源的数据探索和可视化平台。它允许用户轻松地探索和可视化他们的数据,并创建强大的可视化。Kibana 还与其他开源工具,如 Elasticsearch 和 Logstash 集成,以提供对其数据的额外洞察。
Jaeger
Jaeger 是一款开源的分布式追踪平台。Jaeger 提供了对应用程序和系统性能的详细洞察,并具有查看和分析跨度及追踪的功能。
OpenTelemetry
OpenTelemetry 是一个开源项目,提供了一套用于从应用程序和服务中生成、收集和导出遥测数据的 API、库、代理和收集器。
OpenTelemetry 为应用程序的仪表化提供了一套标准 API,这使得通过消除潜在的供应商锁定来更容易采用和集成其他可观测工具。该项目背后有一个庞大、活跃的开发者和公司社区,这确保了该项目的长期支持。
常见问题解答
传统监控与可观测性之间的区别是什么?
可观测性是软件监控领域的一个新概念,它比传统监控工具提供更全面的解决方案。可观测性工具专注于提供对系统各个方面的可见性,以便识别问题并快速解决。这在微服务架构中尤为重要,因为存在许多动态部分,难以确定问题的源头。可观测性工具通过收集系统各个部分的数据并提供一个统一的视图,使问题更容易被发现。
相比之下,传统监控工具往往关注系统的特定区域,如网络或数据库。这可能会使问题难以识别,因为它们可能在一个区域不明显,但在另一个区域却可能明显。可观测性提供对系统的整体视角,有助于更快地识别问题并更有效地解决它们。
可观测性与 DevOps 之间的关系是什么?
可观测性和 DevOps 是密切相关的概念,它们有助于实现相同的目标。DevOps 专注于确保软件的快速开发和部署,而可观测性有助于实现这一目标。
以下是一些可观测性如何帮助 DevOps 的具体示例
-
可观测性数据有助于通过提供对新部署如何影响关键指标的了解来实现持续反馈
-
DevOps 部署管道可以在预览或生产环境中使用可观测性来确定潜在问题,并根据接收到的数据自动回滚部署(如果需要)。可观测性数据提供的额外上下文还可以允许构建更可靠的自动化。
-
由于可观测性数据专注于整个应用程序的工作方式,因此它使团队之间的协作更加容易,因为他们可以看到他们的部署如何影响应用程序中其他团队和服务的部署。
可观测性与云原生之间的关系是什么?
由于云原生应用程序的架构特性,可观测性对于云原生应用程序尤其重要。由于云原生软件通常使用微服务,因此使用可观测性数据查看它们如何交互的能力至关重要。
云原生应用程序通常利用容器来部署软件,并使用Kubernetes等工具来管理这些容器。可观察性数据可以用于监控这些容器的健康状况,并跟踪整个系统资源的使用情况。这些数据可以确保应用程序在短期内正常工作,并在长期内帮助优化应用程序以降低成本并提高最终用户的整体性能。
可观察性的起源是什么?
在软件工程中,可观察性是一个起源于控制理论的概念,控制理论是处理动态系统行为的工程领域。在控制理论中,可观察性指的是根据系统的外部输出推断系统内部状态的能力,即使内部状态不能直接测量。这个概念后来被应用于软件工程,它指的是通过分析系统的外部输出,如日志、指标、遥测数据和跟踪,来理解复杂系统行为和状态的能力。
通过收集和分析这些外部输出的数据,软件工程师可以深入了解系统的行为和健康状况,并快速有效地诊断和解决问题。随着系统复杂性的增加,将可观察性原理应用于软件工程变得越来越重要,没有高级工具和技术,很难诊断问题并保持可靠性。