草庐IT

在传统运维监控系统中加入新的预警能力

白鳝 2023-03-28 原文
​传统的运维监控系统是以基线为核心判断系统是否存在某个问题并进行告警的。这种模式最大的问题就是基线如何设置十分困难,如果我们自己日常运维的系统,我们对基线十分了解,那么我们可以给出相对合理的基线,实现较为精准的告警。

不管如何设置,单指标告警总是不准确的,因为我们无法知道系统什么时候存在问题。我们以每秒逻辑读这个指标来做些分析吧。每秒逻辑读这个指标在二十年前监控Oracle数据库是否存在把系统撑爆的风险是十分有效的,那时候的服务器的CPU资源总是最紧张的。当逻辑读变得很高的时候,我们就需要告警让DBA介入运维了。这时候杀掉几个大查询往往就能挽救系统。实际上现在很多国产、开源数据库运维领域,这个指标异常的监测依然十分有效。

传统的基线模式只能设置一个阈值来判断逻辑读是否异常,这个值往往会设置的不准。因此我们会考虑采取一种新的方式来设置这个告警规则。

[metric,2189030]/[metric hour avg,2189030]>[num,$1] &&
[metric,2189030]>[bsl upper,2189030]*[num,$2]
上面的表达式的含义是当逻辑读是该指标最近一小时平均值的N倍,并超过基线预警高值的M倍的时候产生该指标的故障预警。这主要是为了避免设置不合理的阈值的时候产生阈值设置过高则有问题不报警,设置过低,则经常误报的问题。我们不需要再给系统设置一个预警的实际阈值了,而是根据系统中计算的当前一小时平均值来做判断。加上右面的这个条件是为了防止系统从闲时突然变忙碌时的一个临界状态。这个状态往往是正常的。

通过这样的改造之后,逻辑读预警的误报问题得到了很好的缓解,不过问题又来了。N值得设置依然十分具有挑战性,设置的不合理依然会产生大量的误报。如果DBA运维的系统十分有限,而且对系统的这些指标的波动情况十分了解,那么设置合理的N还是不难做到的,不过在我们的用户中并不总是这样,很多运维人员根本不知道该如何去设置这个参数。另外一方面,随着运维压力日益增大,一个DBA可能要监控上百个甚至数百个数据库,每个数据库都去这么玩,工作量太大了。

我们也一直想把异常检测算法引入到故障模型中来,不过一直因为算力过大的问题,没法大规模应用。自从考虑采用异常检测指标化的策略后,这个问题才得到很好的解决。

对于指标通过计算趋势将各种状态转化为数字,比如3代表某个指标急剧上升。那么我们就可以利用这个新的指标来完成对上面的哪个表达式的改造了。

新的故障模型倍定义为当每秒逻辑读指标超过一个绝对大的值(比如1000万、2000万等),或者每秒逻辑读指标急剧上升,并且每秒逻辑读大于一个门槛值(比如50万),则说明系统的应用可能存在一定的异常。这种异常很可能是应用负载过大,也可能是应用出现了BUG,或者某条关键SQL的执行计划出现了问题。

可能有些朋友还是有些不解,这里不也存在两个参数吗,似乎这个表达式的设置和以前并没啥不同,不同的系统这些参数如何设置呢。实际上这两个参数是补充型的,第一个设置为一个绝对高值,是为了避免指标出现缓慢增长,累计达到了一个较高的值,这个值对于当前的硬件是致命的,因此比较容易设置,比如设置2路服务器为1000万,4路服务器为2000万,大体是能够发挥作用的,而参数2是为了避免小负载波动的门槛值,比如从1000增长到20000,很可能被监测为急剧增长,不过这种增长对系统来说是没有太大影响的,为了避免此类现象误报,需要设置一个门槛,一般来说10万,20万就可以避免了,设置起来也相当容易。

经过改造后,一旦出现异常负载,系统就能够很好的告警了,而那些容易误报的情况也不会再出现了。而且这个故障模型可以适应于不同的应用系统,不同类型的负载,不需要做个性化的调整。对于我们目前运维大量的系统的DBA来说,就省了很多事。实际上只要在我们的普罗米修斯、Zabbix等系统中,将异常分析算法进行指标化改造,要想实现类似D-SMART中智能预警的功能也并不难。其重点是异常分析算法的设计与异常分析指标化的设计。​

有关在传统运维监控系统中加入新的预警能力的更多相关文章

  1. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  2. 程序员如何提高代码能力? - 2

    前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源

  3. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

  4. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  5. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  6. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  7. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  8. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  9. ruby - 以毫秒为单位获取当前系统时间 - 2

    在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:

  10. ruby - 需要重构为新的 Ruby 1.9 哈希语法 - 2

    这个问题在这里已经有了答案:HashsyntaxinRuby[duplicate](1个回答)关闭5年前。我有一个Recipe,其中包含以下未通过lint测试的代码:service'apache'dosupports:status=>true,:restart=>true,:reload=>trueend失败并出现错误:UsethenewRuby1.9hashsyntax.supports:status=>true,:restart=>true,:reload=>true不确定新语法是什么样的...有人可以帮忙吗?

随机推荐