在本系列的上一篇文章中——DevSecOps 中数据收集的一切指南——我们讨论了数据收集的重要性。在本文中,我们将探讨监控在可观察性中的作用,尤其是当它与安全性、性能和可靠性相关时。
监控对于检测生产中发生的问题和异常值至关重要,并允许 DevSecOps 团队在问题造成严重损害之前识别和解决问题。监控性能下降或可疑活动可能会产生警报和自动响应,以隔离潜在的问题或攻击。
在本文中,我们将详细介绍监控,提供几个用例和最佳实践,并讨论监控如何通过可观察性具体提高安全性、性能和可靠性。
在可观察系统中,我们从日志、指标和分布式跟踪中收集数据。虽然对于非常小的系统,您可以手动浏览和搜索日志,将指标可视化为图表,并通过显示流量如何流经系统的图表进行跟踪,以便识别问题——在规模上,这还不够。您需要监控,这是一个自动化过程,可以密切关注这些数据并适当地提醒您。 (有关监控和可观察性之间差异的更详细处理,您可以查看此资源。)
在企业中,您需要自动化的方式来过滤、聚合、丰富和分析所有这些数据。企业还需要自动化的方法来在检测到异常情况时采取行动。自动响应可以通知负责团队甚至直接采取补救措施。
在医学等其他领域,监测患者的生命体征是一项关键活动,可以挽救生命。监控软件系统非常相似,我们甚至在执行健康检查和讨论不同组件的健康时使用相同的方法。
理论够多了,让我们看一些具体的监控示例。
以下是一些利用监控的典型用例:
4xx
或5xx
)可以帮助团队在性能和可靠性问题成为重大问题之前解决它们。
请注意,监控比设置一个简单的条件(例如“两分钟内超过五个INSERT
查询到orders
数据库”)并在满足该条件时触发警报要复杂得多。季节性可能在起作用,使用模式会在一天、一周或一年的特定时间导致峰值。检测意外行为的有效监控会考虑上下文,并可以根据过去的数据识别趋势。
这种类型的监控,尤其是在使用大规模结合可观察性、监控和安全性的工具实施时,可能会非常有效,例如在 Sumo Logic 和 Infor 的案例研究中,Infor 能够节省 5,000 小时的时间事件。
监视通过及早发现问题以避免降级来提高系统的性能和可靠性。性能问题通常会变成可用性和可靠性问题。在存在超时的情况下尤其如此。例如,假设应用程序在 60 秒后超时。由于最近的性能问题,许多请求的处理时间突然超过 60 秒。所有这些请求现在都将失败,并且应用程序现在不可靠。
解决此问题的常见最佳做法是监控高优先级服务和应用程序关键路径中任何组件的四个黄金信号:延迟、流量、错误和饱和度。
处理请求需要多长时间?请注意,成功请求的延迟可能与失败请求的延迟不同。延迟的任何显着增加都可能表明系统性能下降。另一方面,任何显着的减少都可能表明某些处理被跳过。无论哪种方式,监控都会引起对可能问题的关注。
监控流量可以让您了解每个组件的总体负载。可以针对不同的组件以不同的方式测量流量。例如:
流量的增加可能是由于业务的有机增长,这是一件好事。但是,它也可能表明上游系统中产生的流量比以前异常多的问题。
任何组件错误率的增加都会直接影响系统的可靠性和实用性。此外,如果失败的选项自动退役,这会导致流量增加,进而可能导致性能问题。
在可用资源中,服务或应用程序使用了多少资源?这就是饱和度监测告诉你的。例如,如果磁盘已满,则将日志写入该磁盘的服务将在每个后续请求中失败。在更高的层次上,如果 Kubernetes 集群的节点上没有可用空间,那么新的 pod 将处于待处理状态并且不会被调度,这可能会导致延迟问题。
正如您所注意到的,这四个黄金信号是相互关联的。问题通常出现在多个信号中。
虽然任何系统健康问题都会直接或间接影响安全性,但监控可以帮助检测和缓解一些直接威胁。
一个系统由多个组件组成,但它不仅仅是各个部分的总和。在基本层面上,您应该监控系统的每个组件(至少在关键路径上)以获取四个黄金信号。这在实践中意味着什么?
您还应该密切注意外部依赖性。例如,如果您在云端运行或与第三方服务提供商集成,那么您应该监控您所依赖的公共端点并设置警报以检测问题。如果第三方出现故障或其性能下降,这可能会导致您的系统发生级联故障。
不可能拥有 100% 可靠的组件。但是,监视可以通过检测组件(内部和外部)的问题并更换它们或优雅地降低服务质量,帮助您从不可靠的组件创建可靠的系统。例如,如果您在多区域配置中运行系统并且一个区域出现问题,则监控可以检测到这一点并触发将所有流量重新路由(手动或自动)到其他区域。
出于安全考虑,这四个信号也可能是妥协的辅助指标。尤其是这种情况,例如,如果您发现端点设备或云工作负载 CPU 出现峰值,或者登录尝试失败的次数增加。但是,由于您要与恶意对手打交道,因此安全监控必须非常慎重。您必须定义每个组件和整个系统的攻击服务,并确保您收集的信息足以检测问题。例如,要检测数据泄露,您可以监控不同应用程序和服务向内部网络之外发送的 IP 地址和数据量。如果您没有这些数据,您将对这种攻击方法视而不见。
设置数据收集后,您可以按照以下步骤实施稳健有效的监控策略。
作为数据收集的一部分,您已经对所有资产进行了全面盘点。现在,您的任务是确定必须密切监控以预防和减轻灾难的关键资产。说起来容易,“只需监控一切”,但监控需要考虑成本。为您的暂存和开发环境或实验服务监控和发出警报会给您的工程师带来很多不必要的压力。凌晨 3 点频繁针对无关紧要的问题发出警报会导致警报疲劳,从而削弱您的团队在问题真正重要时解决问题的动力。
一旦确定了关键资产,您就需要为每一项资产指定一个明确的所有者。所有者可以是个人或团队。对于一个人,一定要确定后备方案。当人们加入和离开组织或转移到其他角色和团队时,保持资产所有权也很重要。
最终,您的监控策略将取决于您如何为不健康或可能受损的资产定义警报。您需要了解每项资产的正常情况。
如果您正在监控指标,那么定义“正常”意味着将一个属性(例如 CPU 利用率)与一个值范围(例如“50%-80%”)相关联。正常频带可以随着业务而动态变化并且可以在不同时间和不同位置发生变化。在某些情况下,您可能只有天花板或地板。通过定义正常范围,您可以创建警报以在资产所有者的资产运行超出正常范围时通知他们。
如果您正在监控日志,那么通常会根据某些日志查询的结果(例如“过去五分钟内所有 API 服务中记录的 404 错误的数量”)满足或不满足条件(例如“是”少于 10”)。日志管理和分析工具可以提供帮助。
当出现严重警报时,您会怎么做?你不想做的是试图当场弄清楚你的战略,而客户正在推特上谈论你公司不可靠的产品,而管理层正在恐慌。
运行手册是您提前准备和测试的易于跟进步骤的秘诀,可帮助您收集更多信息(例如,要查看哪些仪表板以及要运行哪些命令行脚本来诊断根本原因)并缓解操作(例如,部署应用程序的先前版本)。您的运行手册应该可以帮助您快速将问题确定为特定问题,并确定处理该问题的最佳人选。
您有所有者、警报和操作手册。通常,警报不够具体,无法直接映射到所有者。最佳做法是将随叫随到的工程师分配到不同的业务领域。这位值班工程师将收到警报,遵循运行手册,查看仪表板,并尝试了解根本原因。如果他们无法理解或解决问题,他们会将问题上报给所有者。请记住,这个过程可能很复杂;通常,问题是由于一连串的故障而发生的,需要多个利益相关者协作才能解决问题。
运行手册很棒,但维护复杂的运行手册和培训值班工程师遵循它们需要付出很多努力。最后,您的补救过程仍然取决于缓慢且容易出错的人。如果您的 runbook 不是最新的,遵循它可能会加剧危机。
理论上,可以通过编程方式执行 Runbook。如果 runbook 说,“当警报 X 触发时,进程 Y 应该重新启动”,那么脚本或程序可以收到警报 X 的通知并重新启动进程 Y。同一程序可以在重启后监视进程 Y,确保一切正常,并最终生成事件报告——所有这一切都无需唤醒值班工程师。如果自愈操作失败,则可以联系值班工程师。
自我修复很棒,但是,一盎司的预防胜过一磅的治疗,所以最好首先预防问题。每一个事件都是一个学习的机会,并有可能预防一整类问题。例如,如果由于错误代码进入生产环境而发生多起事件,那么事件事后分析的教训可能是改进暂存阶段的测试。如果值班工程师对警报的响应太慢或运行手册已过时,则这可能表明团队应该投资于一些自我修复实践。
监控是一般可观察性的重要组成部分,尤其是安全性的可观察性。大规模地让人类“只是时不时地看看”各种仪表板和图表来检测问题是不切实际的。您需要一整套事件响应实践,包括识别所有者、设置警报、编写操作手册、自动化操作手册以及设置随叫随到流程和事后分析流程。
祝你有美好的一天!