关于告警:面向多告警源如何构建统一告警管理体系

本文介绍告警对立治理的最佳实际,以帮忙企业更好地解决异构监控零碎所带来的挑战和问题。 背景信息在云原生时代,企业IT基础设施的规模越来越大,越来越多的零碎和服务被部署在云环境中。为了监控这些简单的IT环境,企业通常会抉择应用异构监控零碎,例如Prometheus、Grafana、Zabbix等,以获取更全面的监控数据,以便更好地理解其IT基础设施的运行状况和性能体现。 然而,这种异构监控零碎也带来了一些问题,其中最显着的是告警信息的扩散。因为不同的监控零碎可能会产生不同的告警信息,这些信息可能会扩散在各个系统中,导致企业很难全面理解其IT零碎的告警情况。这使得响应告警变得更加艰难,同时也减少了人工治理的复杂性和工作量。 为了解决这些问题,企业须要一种更加对立和集中的告警治理计划,以确保告警信息可能及时达到正确的人员,以便他们可能疾速采取必要的措施来应答潜在的问题。 告警治理的痛点场景一:企业迁徙上云后,云上产品的告警不对立 在一个典型的云原生业务利用部署架构中,通常会应用到如下产品 ACK、ECS、RDS,利用通过Kubernetes部署在阿里云的ECS上并拜访云上的RDS。在这个架构中通常会用到如下监控产品来对系统进行监控。 通过CloudMonitor对阿里云基础设施ECS和RDS进行监控,当资源出现异常时进行告警。通过Prometheus对Kubernetes以及部署在kubernetes上的Pod进行监控,当Kubernetes出现异常时进行告警。通过ARMS对部署在Kubernetes上的利用进行监控,包含利用间接的调用链。当利用异样时进行告警。通过SLS对利用产生的日志进行监控,当日志出现异常时进行告警。在这样一个场景下因为用到了多个云产品对整个零碎进行监控会导致使用者须要在多个产品上反复配置联系人、告诉形式、值班等运维配置。且不同零碎之间的告警无奈产生有机联合,当一个问题呈现时不能疾速关联不同告警零碎中的相干告警。 场景二:多云、混合云架构下,异构监控零碎告警不对立 当企业的利用部署在多云环境或混合云环境下时,监控零碎产生的告警可能会更加扩散和简单,给企业的运维工作带来很大的挑战。因为不同的云平台和公有云架构之间的差别,监控数据的采集和解决形式也可能不同,因而,不同监控零碎产生的告警信息也可能体现出差异化,这会带来一系列的问题。 首先,不同监控零碎产生的告警信息扩散在不同的中央,运维人员须要消耗更多的工夫和精力去解决这些信息。其次,不同零碎产生的告警信息难以对立进行治理和剖析,使得问题的诊断和解决更加艰难。此外,因为不同零碎的告警信息可能存在反复或抵触,治理和解决这些信息也会变得更加简单。 场景三:自研监控零碎、自定义事件告警接入在利用开发运维过程中,随着零碎规模的扩充和复杂度的进步,各个角落中的胶水代码逐步增多。这些代码尽管是连贯不同模块和零碎的重要纽带,但一旦呈现问题,因为扩散在不同的中央,很难立刻发现和解决。这就使得企业难以保证系统的高可用性和稳定性。如何灵便的低成本的接入这部分代码产生的告警也成为企业应用运维的痛点之一。 对立告警治理在构建对立告警治理平台过程中,不同的监控系统对告警定义、解决流程都不一样,往往会存在上面问题: 不同零碎产生的告警格局不同,接入老本高。不同零碎间的告警接入后因为格局不对立,难以对立解决逻辑。不同告警零碎对于告警等级的定义不同。不同告警零碎对于告警主动复原的解决形式不同。有的告警零碎反对主动复原,有的不反对。ARMS告警治理[1]设计的集成、事件处理流、告诉策略等性能专门针对告警对立治理的场景,解决了对立治理过程中遇到的诸多问题。 ARMS告警治理如何接入不同格局的告警?传统告警通常包含如下一些内容,这种结构化的告警通常只实用于繁多告警源。当多个告警源的数据汇总到一起后通常会导致数据结构的抵触。因而ARMS应用了半结构化的数据来存储告警。 阿里云监控告警数据格式: Zabbix告警数据格式: Nagios告警数据格式: 半结构化的告警数据结构[ { "labels": { "alertname": "<requiredAlertNames>", "<labelnames>": "<labelvalues>", ... }, "annotations": { "<labelnames>": "<labelvalues>", }, "startsAt": "<rfc3339>", "endsAt": "<rfc3339>", "generatorURL": "<generator_url>" }, ...]labels(标签):告警元数据,一组标签惟一标识一个事件,所有标签均雷同的事件为同一个事件,反复上报会进行合并,例如:alertname: 告警名称。annotations(正文):正文是告警事件的附加形容,正文不属于元数据。例如:message: 告警内容。不同工夫点产生的同一个事件他们的标签是雷同的,然而正文能够是不同的。比方告警内容的正文可能不同,例如:“主机i-12b3ac3* CPU使用率继续三分钟大于75%,以后值82%”。startsAt(告警开始工夫):告警事件开始工夫。endsAt(告警完结工夫):告警事件完结工夫。generatorUrl(事件URL地址):告警事件URL地址。如上述代码所示,ARMS参考开源Prometheus告警定义[2],应用一个半结构化的数据结构来形容告警。通过高度可扩大的键值对来形容告警,这样就能够非常灵活的对告警内容进行扩大从而接入不同的数据源产生的告警。 任意JSON格局的自定义告警接入能力ARMS告警提供了任意一种JSON格局接入的能力(自定义集成[3])。只有告警数据结构满足JSON格局就能接入。如下图所示,自定义告警接入须要先将告警内的JSON数据上传到ARMS告警核心后,通过页面编辑字段映射的形式将告警内容中的要害信息映射到ARMS告警数据结构中。 ARMS定义了如alertname等关键字段,对于更多的扩大字段,用户能够在集成中通过新增扩大字段的形式进行配置。所有的扩大字段都能够使用到前面的告警解决逻辑中。以下图为例将原始告警报文中的hostname字段映射到扩大的hostname字段,hostip字段映射到扩大的hostip字段。 罕用监控工具告警快捷接入能力ARMS默认提供了云上云下多种监控零碎的告警接入能力,能够参考集成概述[4]进行疾速接入。 ARMS告警治理如何对立告警等级?ARMS中将告警分为P1、P2、P3、P4四个等级。通过配置映射表,将多个不同类型的等级归一到P1-P4四个等级。如下图所示,将L1、Critical、重大告警这三种不同形容的告警等级都映射为P1告警,这样就能够对立不同零碎中对于告警等级的不同定义。 ARMS告警治理对于不同格局的告警如何对立解决逻辑?因为ARMS告警采纳了半结构化的数据结构,能够通过标签来对立告警的解决逻辑。通常咱们须要至多2个标签来对立告警的解决逻辑。一个标签用来决定这个告警应该告诉给哪些人,比方业务标签(service,biz)。另一个标签用来决定这个告警利用通过什么样的形式进行告诉和降级。如下表所示,通常应用告警等级(severity)来定义告警解决的SLA。 ARMS设计了告诉策略和降级策略两种策略来满足不同等级的告警的解决要求,您能够参考告诉策略最佳实际[5]来进行配置。 标签设计准则当咱们在设计用于告警解决的业务标签时须要满足如下准则: 互斥准则:指防止对同一个资源应用两个或以上的标签键。例如:如果曾经应用了标签键service来标识业务,就不要再应用biz或业务等相似的标签键。个体详尽准则:指所有资源都必须绑定已布局的标签键及其对应的标签值。例如:某公司有3个业务,标签键是service,则应至多有3个标签值别离代表这3个业务。无限值准则:指为资源只保留外围标签值,删除多余的标签值。例如:某公司共有5个业务,那么应该有且仅有这5个业务的标签,方便管理。除了业务标签也能够定义其余的标签来进行告警的治理,比方应用环境标签来辨别开发和测试环境的告警。这些标签应该满足上述设计准则,这样能够简化告警治理配置的复杂度。 通过事件处理流给告警打标签(富化告警)当咱们设计好标签后如何对不同告警源的告警打标呢。在ARMS告警治理中设计了低代码形式的事件处理流[6],通过利落拽的配置形式能够实现给告警打标签的能力(富化告警)。 场景一:匹配特定条件后给告警打标签 某xx业务应用了自研监控零碎,通过自定义集成将自研的告警接入到ARMS告警治理中后,须要对这部分告警对立打上业务标签xx。事件处理流的配置如下: a. 登录ARMS控制台[7],在左侧导航栏抉择告警治理,而后单击新建解决流。 b. 在弹出的面板创立事件处理流,编辑触发条件匹配自定义集成的名称为“xx自研监控零碎”。 c. 增加设置业务标签动作,将"xx"设置为业务(service)标签值。 ...

June 13, 2023 · 1 min · jiezi

关于告警:直播预告-数据库自治平台-KAP-监控告警架构及实例演示

线上沙龙-技术流第 25 期营业啦02月15日(周三)19:30KaiwuDB - B站直播间 企业级数据集群往往有成千盈百的各类型运算或利用同时运行,为保障系统的稳固可靠性,势必须要克服宏大数据量、简单运算逻辑、互相关联大数据组件等重难点,并优化各式告警监控、危险监测应答、问题捕获解决等外围能力。 KaiwuDB 自主研发的数据库自治平台( KAP )集系统监控、治理、诊断、自治于一体,其中监控告警担当承前启后的要害角色。本期直播咱们邀请到 KaiwuDB 高级研发工程师边旭霞老师,为大家介绍《数据库自治平台 KAP 监控告警架构及实例演示》。 边旭霞老师具备丰盛的大数据分析和运维教训,曾负责数据经营治理平台的原型设计与开发等重点项目,现次要负责 KAP 的原型设计及研发管理工作。 KAP 的监控告警基于 Prometheus 构建,平台中实现了 Metric 数据采集、存储及可视化展现;并在监控指标根底上,实现了分组告警机制、告警的按需推送和精准推送,优化了传统的监控告警形式,欠缺自治平台根底能力建设。 直播敲重点KAP 监控告警架构监控及告警定制化平台利用实例演示对数据库自治感兴趣的搭档千万不要错过本期直播,扫描下方二维码,B 站直播不迷路,2月15日晚 7:30,咱们不见不散↓ ↓ ↓

February 9, 2023 · 1 min · jiezi

关于告警:技术分享-基于-Alertmanager-告警系统的改造

作者:莫善 某互联网公司高级 DBA。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 一、引言告警跟运维工作非亲非故,一个好的告警零碎不仅能晋升运维的效率,还能晋升相干人员的工作舒适度及生存品质。相同,如果告警零碎比拟拉胯,那运维的工作就比拟好受了。比方,中午收到无关痛痒的告警信息,又比方这个告警正在解决还始终在发,再比方同一时间产生很多告警,而后不重要的告警把重要的告警刷走了,等等。 本文想分享一下在应用Alertmanager的过程中遇到的一些困扰,以及分享一下最近在做的告警零碎革新的我的项目,仅做经验交流。 二、后期筹备咱们线上采纳Prometheus + Alertmanager的架构进行监控告警。所以本文次要是基于Alertmanager组件进行介绍。 alertmanager, version 0.17.0 (branch: HEAD, revision: c7551cd75c414dc81df027f691e2eb21d4fd85b2) build user: [email protected] build date: 20190503-09:10:07 go version: go1.12.41、待处理问题(1)告警烦扰因历史遗留问题,咱们线上环境的环境是一个集群一个prometheus,而后共享一个告警通道Alertmanager,有时候会呈现A集群的告警信息跑到B集群的告警中。比方会收到像上面这种状况: cluster: clusterAinstance: clusterB Nodealert_name: xxx 这个问题始终没找到起因,也没法稳固复现。(2)告警降级当初的告警零碎在触发告警时候不会降级。比方优先发给值班人员,其次会依据接管人,告警工夫,告警介质等进行降级。 对于告警降级后文有解释阐明。(3)告警复原对于曾经复原的告警,Alertmanager不会发送一份告警复原的提醒。 (4)告警克制Alertmanager针对反复的告警能够做到自定义工夫进行克制,然而不太智能,比方,同一个告警项,后面三次发送距离短点,超过三次的距离能够长点,比方第1,3,5,10,20,30分钟发送。另外也不能做到自适应工夫克制,比方工作工夫克制工夫距离能够长一点(同一个告警十分钟发一次),休息时间的克制工夫短一点(同一个告警五分钟发一次)。 (5)告警静默Alertmanager反对告警静默性能,然而须要在Alertmanager平台进行配置。如果一个机器宕机后,可能触发很多告警须要静默,所以增加及预先删除静默规定的治理比拟麻烦。 另外还有一个比拟头疼的问题,失常通过告警页面能够点击【Silence】是能够将待静默的告警信息带到配置告警静默的页面,然而大部分时候都是不行的(空白页面),须要手动填写须要静默的告警信息,这就很头疼了。 (6)语音告警Alertmanager目前不反对语音告警。 这个问题不做为独自的问题进行介绍,会放在告警降级局部。2、发现新问题为了解决上述提到的【告警烦扰】问题,咱们采取的办法是将一个Alertmanager拆成多个(一个集群一个),这样能解决【告警烦扰问题】,那么又带来了新的问题。 如何实现告警收敛?如何治理告警静默?(1)告警收敛同一时刻产生多条告警,就会导致相干人员收到多条告警信息,这样即节约告警资源,也对排查问题带来肯定的烦扰。比方单机多实例的场景,一台机器宕机,同时会产生好几十条告警,或者一个集群呈现问题,所有节点都触发告警。针对这种场景如果没有告警收敛,会比拟苦楚。 Alertmanager自身反对收敛,因为咱们须要解决【告警烦扰】问题,所以咱们革新的时候拆成了一个集群一个Alertmanager,这样咱们环境就没法用自带的收敛性能了。(2)告警静默原本单个Alertmanager的告警静默就比拟难治理了,如果多个告警项,可能是多个Alertmanager须要静默,静默的治理就更加麻烦了。 针对以上问题,上面会一一介绍一下解决思路,局部解决方案不见得适宜所有环境,其余环境或者有更好的解决方案,这里仅供参考。 三、告警革新1、告警烦扰问题如前文所述,通过将一个Alertmanager拆成n个,这种形式看起来比拟笨,然而却无效,如果有一个上帝视角将所有Alertmanager治理起来,就当作一个数据库实例去看待,其实也很不便。这类组件也不须要很多的系统资源,应用虚拟机齐全够用。另外其实也有一个益处,退出说Alertmanager呈现问题,比方过程失常,然而不会发告警了,这样也不至于团灭。 咱们平台的监控、告警都曾经实现自动化,并且都是通过平台进行治理,用一个Alertmanager跟多个,在部署装置上老本差不多,然而不太好治理(这个后文有阐明)。2、告警降级问题发送告警的介质次要分几种,邮件,企业微信(其余即时通讯工具),短信,电话/语音。从左到右老本顺次增高,所以为了告警资源不被节约,尽可能的节俭短信/电话这种告警介质,所以咱们心愿咱们的告警零碎是能自适应的进行调整。这个降级分如下几个维度: 第一 告警介质的降级。邮件 --> 企业微信 --> 短信 --> 电话(同一个告警项发送超过3次就向上降级一个介质,具体能够依据需要定义)。第二 告警接管人降级。一级 --> 二级 --> leader。第三 依照工夫降级。工作工夫通过邮件/企业微信发送告警,工作工夫之外通过短信/电话发送告警。这个问题想通过Alertmanager来解决如同不可行,所以只能通过其余伎俩进行曲线救国了。咱们采取的形式是开发一个脚本读取Alertmanager的告警信息,而后通过脚本进行发送告警信息。 其实也能够间接读取prometheus的告警信息,原理上差不太多。 Send a detailed message to the DBA by Mail #只有是告警就会通过邮件告知 if now_time > 8 and now_time < 22 : Send a simple message to the DBA by WX else #依照告警工夫降级告警介质 if alert_count > 3 and phone_count < 3 : Send a simple simple message to the DBA by phone #短信告警降级电话告警 elif alert_count > 3 and phone_count > 3 : Send a simple message to the leader by phone #接管告警人员降级 else Send a simple message to the DBA by SMS #告警介质降级承受告警的人员蕴含值班DBA及我的项目负责人,如果接管告警的对象无奈收到告警信息(联系方式异样,到职),就会读取通讯录获取一位同组的人员进行从新发送告警。 ...

September 27, 2022 · 5 min · jiezi

关于告警:vivo统一告警平台设计与实践

一、背景一套监控零碎检测和告警是密不可分的,检测用来发现异常,告警用来将问题信息发送给相应的人。vivo监控零碎1.0时代各个监控零碎别离保护一套计算、存储、检测、告警收敛逻辑,这种架构下对底层数据交融十分不利,也就无奈实现监控零碎更宽泛场景的利用,所以须要进行整体规划,从新对整个监控零碎架构进行调整,在这样的背景下对立监控的指标被确立。 以前监控被划分为根底监控、通用监控、调用链、日志监控、拨测监控等几大零碎,对立监控的指标是将各个监控指标数据进行对立计算、对立存储、对立检测、对立告警、对立展现。这里不作赘述,前面会出一期vivo监控零碎演进的文章进一步阐明。 下面咱们说了监控对立的大背景。以前各个监控零碎会各自进行告警收敛、音讯组装等工作,为了缩小冗余,须要将收敛等工作由一个服务对立做解决,与此同时告警核心平台也到了更新迭代的阶段,这样就须要建设一个对外部各业务对立提供告警收敛、音讯组装、告警发送的告警平台,有了这个构想,咱们筹备将各零碎告警收敛能力与告警发送能力下沉,将对立告警服务做成一个与各监控服务解偶的通用服务。 二、现状剖析对于1.0时代的监控零碎来说,如图1所示各个监控零碎要先进行告警收敛,而后别离和老的告警核心进行对接,能力将告警音讯发送进去。每一套零碎都要独自进行保护一套规定,有很多反复性能建设,而理论这些性能具备高度通用性,齐全能够建设正当模型对异样检测服务生成的异样进行对立解决,从而生成问题,而后进行对立的音讯组装,最初发送告警音讯。  (图1 老监控零碎告警流程图) 在监控零碎中一个异样从被检测进去到最终收回告警有几个重要概念: 异样 在一个检测窗口(窗口大小能够自定义),一个或几个指标值达到检测规定定义的异样阈值,就产生一个异样。如图2所示,检测规定定义当指标值在一个检测窗口为6的检测周期内,有3个数据点超过阈值就认为有异样,咱们简称这个检测规定为6-3,如图所示第一个检测窗口内(蓝色虚线筐内)只有6和7两个点的指标值超过阈值(95),不满足6-3的条件,所以第一个检测窗口没有异样。在第二个检测窗口内(绿色虚线框内)有6、7、8三个点的指标值超过阈值(95),所以第二个窗口就是一个异样。 问题 一个间断的周期内产生的所有同类异样的汇合,咱们称之为问题。如图2所示,第二个检测窗口就是一个异样,同时这个异样也会对应有一个问题A,如果第三个检测窗口也是一个异样,那么这个异样对应的问题也是A,所以问题和异样是一对多的关系。 告警 当一个问题通过告警零碎将音讯以短信、电话、邮件等形式告知给用户时,咱们称之为一条告警。 复原 当问题对应的异样不满足检测规定定义的异样条件时,就认为所有异样都复原了,同时问题也认为复原了,复原也会发送相应的复原告诉。  (图2 时序数据异样检测原理图) 三、掂量指标一个零碎咱们如何掂量它的好坏,如何晋升它,如何治理它?管理学巨匠彼得·德鲁克曾说“你如果无奈度量它,就无奈治理它(If you can’t measure it, you can’t manage it)”。从这里能够看出,如果想全面治理晋升一个零碎,就须要先对它的各项性能指标有一个掂量,晓得它的薄弱点在哪里,找到病症所在能力隔靴搔痒。  (图3 运维指标工夫节点关系图) 图3是监控零碎经营指标和对应工夫节点关系图,次要体现了MTTD、MTTA、MTTF、MTTR、MTBF等指标与工夫节点的对应关系,这些指标对于晋升零碎性能,帮忙运维团队及早发现问题有很高的参考价值。业界有很多云告警平台也很重视这些指标,上面咱们着重介绍一下MTTA、MTTR这两个和告警平台关系严密的指标: MTTA(Mean time to acknowledge,均匀应答工夫): (图4 MTTA计算公式) t[i] -- 监控零碎运行期间第i个服务呈现问题后运维团队或者研发人员响应问题的工夫;r[i] -- 监控零碎运行期间第i个服务呈现问题的总次数。均匀应答工夫是运维团队或者研发团队响应所有问题所破费的均匀工夫。MTTA度量规范用于掂量运维团队或研发团队的响应能力和警报系统的效率。通过跟踪和最小化MTTA,项目管理团队能够优化流程,进步问题解决效率,保障服务可用性,晋升用户满意度[1]。 MTTR(Mean Time To Repair,均匀培修工夫): (图5 MTTR计算公式[2]) t[ri] -- 监控零碎运行期间第i个服务呈现r次告警后服务恢复正常状态的总工夫r[i] -- 监控零碎运行期间第i个服务呈现告警的总次数均匀修复工夫(MTTR)是修复零碎并将其复原到失常性能所需的均匀工夫。运维或研发人员开始解决异样,MTTR便开始计算,并且始终进行到被中断的服务完全恢复(包含所需的任何测试工夫)为止。在IT服务治理行业中,MTTR中的R并不总是示意培修。它也能够示意复原,响应或解决。只管这些指标都对应MTTR,然而它们都有各自的含意,因而,要弄清楚要应用哪个MTTR,有助于咱们更好的剖析了解问题。让咱们简要地看一下它们各自的含意: 1)均匀复原工夫(Mean time to recovery)是从零碎告警中复原所需的均匀工夫。这涵盖了从服务异样导致告警到恢复正常的整个过程。MTTR是掂量整个复原过程速度的指标。 2)均匀响应工夫(Mean time to respond)示意从呈现第一个告警开始到零碎从故障中复原到失常状态所需的均匀工夫,不包含告警零碎中的任何提早。该MTTR通常用于网络安全中,以掂量团队缓解零碎攻打的效率。 3)均匀解决工夫(Mean time to resolve)示意齐全解决系统故障所破费的均匀工夫,包含检测故障、诊断问题以及确保故障不再产生来解决问题所需的工夫。此 MTTR 指标次要用于掂量不可预感事件的解决过程,而不是服务申请。 晋升 MTTA 的外围是找对人、找到人[3],只有在最短的工夫内找对能解决问题的人才能无效晋升MTTR。通常在生产实践过程中咱们会遇到“告警泛滥”的问题,大量的告警呈现时须要运维人员或者开发同学去解决,对于应激敏感的同学来说很容易呈现“狼来了”的景象,只有收到告警就会很缓和,同时当大量的告警信息频发骚扰咱们运维人员,会引发告警疲劳,体现为不重要的事件太多,最基本的问题较少,频繁解决一般事件,重要的信息吞没在汪洋大海中。[4] ...

November 22, 2021 · 1 min · jiezi

关于告警:面对疾风吧如何搭建高协同的精准告警体系

作者|九辩 世上没有一个零碎是百分之百尽如人意的。如果想要保障可用性,那么技术团队就得对服务的各种状态一目了然,能在第一工夫发现问题且疾速定位问题起因。但要想做到以上这两点,只能依赖欠缺的监控&告警体系去监控服务运行状态,但技术团队又不可能时时刻刻都盯着看板并关注到所有方面。因而,告警成为团队监控服务质量与可用性的最次要伎俩。 但在实际过程中,技术团队所获取的告警往往不是太少了,而是太多。咱们看看某跨境电商零碎 SRE 每天的工作日常,或者每个工程师对此都不生疏: 关上通信工具 IM,运维群的告警音讯提醒 99+,甚至 999+;点开群查看音讯,满屏告警题目、等级和分派人,但信息过多无奈疾速筛选和确定高优先级告警;挨个关上信息,查看告警内容并评估理论优先级,这其中包含但不限于服务超时、网络重传、数据库响应慢;发现等级为“P1”的告警,查看内容来自交易系统服务超时,告警分派人是交易系统开发同学,开发同学查看发现交易系统以后没有异样,认为是数据库问题,返回群顺次点击查看;到了公司关上告警核心零碎,按告警等级高下排序再点开列表条目,别离与业务开发、网络设备保护和数据库 DBA 散会沟通,综合剖析发现“交易系统服务超时告警”是因为“网络重传”引起的“数据库响应慢”。能够看到,随着企业数字化不断深入,IT 零碎划分、异构性都使得企业技术架构变得愈发简单。为了更好地保障系统稳定性,也为了防止脱漏故障,技术团队通常会在监控零碎中,针对基础设施、平台、利用设置大量监控指标和告警规定,从网络到机器、从实例到模块、再到下层业务。尽管极大进步了故障发现能力,但也很容易导致一个异样或故障触发大量告警,造成告警风暴。比方,一个机器产生故障时,监控机器衰弱度的告警规定产生报警;监控机器上实例运行状态的告警规定也产生告警;这些实例的上游利用模块受到影响也开始告警。比方,利用模块中的实例收回告警,上游利用模块也产生告警。当利用模块中蕴含的实例比拟多时,产生数百条告警音讯。再有甚者,网络、机器、域名、利用模块、业务等同时产生多层次、多方面异样告警,产生数万条告警音讯。 与此同时,在异样产生时传统告警体系通过邮件、短信、电话等形式向相干人员进行告警,但大量告警音讯并不能帮忙他们迅速寻找根因和制订止损计划,反而会吞没真正无效的信息。与此同时,问题解决往往须要协同不同团队并及时同步停顿,单点发送不利于问题形容与解决跟进。大量反复形容状况与跨团队的责任人沟通,大大拖长了 MTTR。 很多中小型互联网公司都有绝对残缺的监控与告警零碎,告警品质和应急效率相较于大型及超大型企业会高很多。这是因为监控零碎都在一个运维团队开发与保护,业务构造、产品能力及应用形式绝对简略且对立,监控零碎的次要应用人为产品运维工程师,配置的监控及告警品质较高。但随着企业规模的一直增长,中小型企业也将与大型企业面临着雷同问题: 监控零碎越来越多,各监控零碎的操作形式、产品能力无奈拉通对齐;大多数监控零碎对于技术团队,功能设计体验差且学习老本高。技术团队不晓得该配置哪些监控以及告警规定,导致未做到危险点 100% 笼罩,或者导致了大量有效告警;不同监控零碎对应责任人越来越多,当组织架构发生变化时,各监控零碎订阅关系无奈及时更新。最初的情况就变成了报警量越来越大,有效报警越来越多,技术团队放弃监控告警,而后开始恶性循环。具体归因以上景象,咱们发现问题次要集中在以下几点: 「标准化告警解决流体系」的缺失告警源数据不足统一标准以及对立维度的标签企业内各个域的运维零碎独立建设,没有统一标准且大部分告警数据只蕴含题目、等级和根底内容。运维人员消耗大量工夫逐条浏览告警、剖析告警起源和最终起因。而这一过程中,又非常依赖 SRE 的过往教训。深究其背地起因,次要是因为来自各个域的告警数据,告警策略配置逻辑不统一,没有标签或者标签定义不对立,SRE 须要在繁冗的告警中辨认无效信息,剖析告警之间的关联性,找到本源。传统的IT运维零碎为了标准化和丰盛告警信息,会从企业层面定义对立的告警数据规范,每个域的告警零碎须要按此接入。强制标准化的办法在实践中肯定会遇到如下问题:1)不同运维域革新老本大,我的项目推动艰难;2)数据扩展性差,一个数据规范改变牵动所有运维域。 不足全局视角的告警数据处理和富化IT 零碎运维将来自不同域的告警集成对立解决,初衷是把握更多信息,从而进行更精确的判断。但如果只是被动承受并分派告警,告警运维零碎作为运维信息中枢的价值并未体现,效率与体验也没有改善。对此,运维人员能够被动对这些告警内容进行一次“消化”、“排汇”和“丰盛”,将充斥乐音的信息变得清晰规整。那么,告警运维体系就须要能够对告警进行合成、提取和内容加强的工具。 组织协同解决告警难以落地如何通过组织协同灵活处理告警?在一个组织中,各个服务的稳定性往往落实在一个或多个组织的日常工作中。告警解决须要在团队内、团队之间进行协同。当告警触发时依据以后排班打算对主值班人员进行告诉,一段时间未解决则告诉备值班人员, 主备值班都未及时处理的状况下降级到管理员。当值班人员发现告警须要上下游其余团队解决时,或须要进步优先级解决时,须要可能批改告警等级,可能把告警疾速转派给其余人员,并且被转派的人员可能取得该告警解决权限。 如何防止组织隔离的复杂性灵活处理告警?失常场景下,技术团队不心愿看到其余团队的告警的同时,也不心愿该团队的告警被其余团队看到(波及故障等敏感信息)。但当告警须要跨团队协同解决时,又须要可能疾速将这个告警转派给其余人员且同时对其受权。怎么在云上实现这些灵便多变的权限治理需要?以后云上传统的受权办法是为每个成员在云上建设对应的子账号,对其进行受权。这种形式显著不适宜告警解决,线上业务曾经受损了难道还要找管理员受权能力解决告警吗?面对上述问题,不同规模的企业给出了不同的解决方案: 规模较小企业:把组织内的人配置为云平台上的告警联系人,告警触发后,依据内容告诉其中局部人。长处:当团队规模较小时,通过简略配置即可实现告警的散发解决。毛病:须要一直同步组织架构和告警联系人的关系,比方新人员入职,老员工到职时须要及时同步。 规模较大企业:把告警通过对立webhook 投递到外部告警平台中进行二次散发解决。长处:自建零碎能够和企业外部组织架构和权限零碎买通,对于满足组织隔离的复杂性和告警散发的灵活性。毛病:自建告警平台,投入大,老本高。 针对上述两大问题,咱们须要更加残缺的思路去解决上述问题,通过大量实际,咱们提供以下思路供大家参考: 「标准化告警事件处理流」联合上述运维案例的痛点以及告警标准化面临的艰难,咱们不再强制推动各运维域在集成前进行适配。开发运维人员应用运维核心提供的“标准化告警事件处理流”性能,凭借以下伎俩去编排和保护不同场景下的解决流,对不同起源的告警进行标准化和内容加强。 借助告警平台灵便的编排组合能力以及丰盛的解决动作,去疾速解决多样化告警场景从告警运维核心视角来看,不同起源或者场景的告警数据处理流程各不相同。通过所提供的数据处理、数据辨认和逻辑管制等丰盛的解决流动作,面对标准化或者场景化诉求,SRE 用条件过滤出以后关注的告警,抉择动作编排解决流。通过测试启用后,告警数据会依照预期的规范存入告警零碎进行分派告诉;SRE 的告警运维教训,能够积淀下来供后续自动化解决。 内容 CMDB 富化,突破信息孤岛企业IT运维过程中,突破不同起源告警的“信息孤岛”是一件重要且富裕挑战的工作,而企业的 CMDB 数据正是最好的原料。通过保护动态和 API 接口的形式集成 CMDB 数据,告警事件处理流能够通过 CMDB 对信息进行富化,使得来自不同域的告警产生维度上的关联。这样在告警处理过程中,IT 资源之间的告警能够建立联系,便于疾速剖析定位根因。 通过 AI 内容辨认,疾速理解告警散布借助于 AI 内容辨认能力,对告警内容进行剖析归类。运维人员能够从全局统计中理解零碎告警散布,具体开发运维人员可能高深莫测辨认出具体告警的对象类型和谬误分类,缩短了从景象到根因之间到门路。并且在预先复盘过程中,智能归类信息能够作为 IT 系统优化和改良口头的决策参考数据。 「面向告警的组织协同」在标准化之外,咱们能够看到对于告警解决,组织协同须要足够非常灵活。不能再以“组织”为核心来解决告警,应以“告警”为核心构建组织。当告警产生时须要协调所需的上下游解决人来构建一个解决告警的长期组织,在长期组织中的成员具备告警解决权限,当告警解决后能够疾速遣散长期组织,防止被告警频繁打搅和非必要故障信息流传。 联系人自助注册到告警零碎对于麻利化的运维团队而言,应防止手动保护须要解决告警的组织成员在告警零碎中的联系方式。手动保护联系人的形式不适宜于频繁变动的组织。优良的告警零碎应该由每个组织成员实现本人的联系方式保护和告诉设置,这样既防止频繁的组织架构变动对管理员更新联系人信息的及时性要求,也能满足不同人对于告诉形式抉择的不同偏好。 复用已有账号体系,防止在工作中应用多个账号零碎通常的企业都会应用一个例如钉钉、飞书或者企业微信的办公类协同IM工具。该当防止在告警解决平台中应用独立的账号体系。如果一个企业平时应用钉钉等软件进行办公,而后告警零碎有反对通过钉钉来解决告警,那么这个告警零碎就很容易可能退出到企业的生产工具链中。反之,如果企业平时都是应用钉钉,然而告警零碎须要应用独自的账号来登录,不仅须要保护两套账号,还容易造成沟通不畅,信息处理不及时等问题。 灵便的权限调配形式告警权限调配形式应是以最疾速解决这个告警为目标的,当一个告警产生后值班人员如果不能自己解决,应该第一工夫协调所需团队与资源来解决该告警。同时当告警解决实现后又可能将长期协调的成员权限进行回收,确保业务平安,防止信息泄露。联合工作中罕用的告警协调形式,拉群沟通无疑是最合乎告警解决的一种形式。当告警产生时值班人员长期拉人进群查看并解决告警。此时群就成为了人造的受权载体,进群取得告警查看解决权限,退群后不再被告警打搅。 丰盛的可扩大能力团队协同过程中可能存在诸多协同工具同时使用,比方告警处理过程中,对于重要告警解决须要进行复盘,复盘后可能会指定一些工作内容来从根本上解决告警。这个过程中可能波及到其余工具的使用,比方合作文档类工具,项目管理类工具。告警零碎须要可能更不便的对接这些零碎,更加全面融入到企业办公工具链条中。 联合上述思路,阿里云将之进行产品化,并与 ARMS 监控深度集成,为客户提供更为欠缺的告警与监控体系。 ARMS 告警运维核心外围劣势对接 10+ 的监控数据源ARMS 自身曾经提供利用监控、用户体验监控、Prometheus 等数据源,同时对云上罕用的日志服务、云监控等一系列数据源无缝对接对接,用户一键即可实现大部分报警的接入。 弱小的报警关联能力基于 ARMS APM 能力,对常见告警问题进行疾速关联,并主动输入响应的故障剖析报告。 ...

October 14, 2021 · 1 min · jiezi

关于告警:得物技术直播服务监控告警归因实践

背景随同得物社区、直播业务疾速倒退,用户体量也越来越大,服务的稳定性要求日益趋高。那如何疾速的对监控告警进行归因、疾速的解决问题,我想每个人都有本人的排查定位伎俩。对教训稍少的同学,可能大家都经验过雷同的几个阶段,蛊惑告警信息不知从何动手、排查思路容易走入误区、问题起因不知如何筛选。本文着眼于该常识的积淀,通过互相学习、借鉴团队智慧、总结排查case,心愿最终能够让大家受害,疾速定位、及时止损。 一、直播监控告警归因实际本文不波及到具体的业务问题归因,而是如何将告警信息归因到某一方面。对于业务档次的代码问题,这须要欠缺的日志输入、全链路追踪信息、符合条件的问题上下文等去判断,思路也是相通的。 目前得物社区、直播业务应用go、处于k8s环境,监控指标应用grafana展现,天眼告警平台飞书告诉。目前存在的告警规定有:RT异样、QPS异样、goroutine异样、panic异样、http状态异样、业务异样等。最近直播业务碰到一次某服务RT抖动,尽管扩容解决了相应抖动,但在归因定位过程中也走过一些弯路,上面是对整个排查过程的一个展现: 服务监控体现告警信息反馈:服务RT异样回升、goroutine回升。通过grafana查看服务指标, 发现该工夫点有呈现流量尖刺,QPS回升显著 查看HTTP、GRPC指标,均匀RT、99线显著回升 Mysql指标中RT回升显著,猜想可能是因为mysql有大批量查问或者慢查问,导致RT稳定,从而导致告警 Reids指标中RT回升显著,猜想是因为redis抖动,导致RT回升,呈现超时而后流量被打到了mysql上 甄选可能的起因 监控指标 内部HTTP全副接口RT回升QPS呈现流量尖刺 Redis全副申请RT回升QPS随流量稳定 Mysql全副申请RT回升QPS随流量稳定 Goroutine全副Pod都上涨显著 三方依赖全副申请RT回升 联合上述景象,咱们首先能确定影响范畴为服务级别。其次发现服务日志中呈现redis timeout的谬误日志,调用三方服务呈现超时谬误日志。 第一点思考系统资源是否短缺,通过查看cpu、memory指标,告警工夫点系统资源不造成瓶颈。那么咱们能够排除这二个起因导致的此次服务抖动。 其次服务处于k8s环境中,由多个pod提供服务能力。且每个pod被调度在不同的node上,也就是不同的ecs上。同时该服务处于整体抖动状态,能够排除pod单机故障起因。 该服务整体受到影响,同k8s集群中其余服务失常,这能够排除网络故障的起因。总结下来所有的流量出入接口都受到影响,排除依赖服务故障的起因。那么接下来能思考的就是服务的存储层(mysql、redis等) 存在故障,或者服务流量门路某个节点存在问题。 定位问题通过阿里云的RDS,查看mysql、redis的性能趋势显示失常,并无慢查问日志,机器资源短缺,网络带宽无异样,同时也不存在高可用切换。那么初步判断,存储层应该是没有问题的。 那么如何确定非存储层的问题呢?如果有应用同一存储层的另一服务,告警时段处于失常,那么就能够排除存储层故障。在直播微服务体系中,有另外一个服务应用雷同的存储层,在告警时段服务处于失常状态,如此就能够确定排除此起因。 那么只剩下流量门路节点故障这一个起因,回顾一下整个链路, 服务应用k8s部署运维, 引入了istio做service mesh, 是不是该组件导致的问题呢?监控面板中也有istio的监控,如下: 从监控中查看如同并没有问题,只是在告警工夫点有稳定。问题排查到这里,发现如同都没问题,那么起因到底是什么呢?回顾一下后面的剖析,咱们发现能确定性的排除其余起因,同时服务扩容后,RT抖动也恢复正常了。 所以还是将眼光转向流量门路节点的问题,寻求运维侧的同学反对,心愿实时查看下istio的状态。这时候,我发现运维侧同学反馈的istio负载和监控面板中不统一,这里也就是团队成员走弯路的中央,因为istio的负载指标显示谬误,所以跳过了该起因。通过多方排查,最终发现监控面板收集数据存在异样,通过修复监控数据展现,最终istio的实在负载如下: 实在的istio的负载,明确的指明了此次告警的起因。最初,经确认,目前sidecar应用的资源为2c1g。服务初期应用的pod配置为1c512m, 随着业务倒退pod数越来越多,所以抉择了降级pod的资源配置为4c2g。并且通过服务拆分,该告警服务流量转发居多,导致istio的cpu负载过高,从而导致此次抖动。因为目前sidecar资源固定2c1g, 所以通过把服务配置降级为1c2g减少pod数量,pod数量与sidecar数量是1:1,从而减少了sidecar的资源池,防止后续呈现此类抖动。 二、影响级别、可能的起因、参考思路咱们须要疾速定位问题,那么首先要确定影响的范畴级别,以及存在哪些可能的起因。通过直播服务抖动的归因实际,能发现是一系列的筛选过程,最终失去答案。 对于非社区、直播技术栈的业务而言,我想都能总结出一套实用于本身服务的条例。 对于直播服务技术栈,存在的范畴级别,可能的起因如下所示: 异样体现cpu起因memory存储层流量门路三方依赖网络故障接口级别服务中某接口存在异样状态,其余接口失常 存在 存在 pod级别某一pod存在异样状态,同服务其余pod失常存在存在存在存在 存在服务级别某一服务所有pod都存在异样状态,同集群中其余服务失常 存在存在 集群级别服务所在集群整体受影响,如前段时间测试环境ingress问题 存在 存在IDC级别IDC范畴内服务整体影响 存在 存在cpu方面:长期流量、代码问题、服务缩容、定时脚本内存方面:长期流量、代码问题、服务缩容, (k8s中须要辨别RSS和cache)<!----> mysql、redis:长期流量、慢查问、大批量查问、资源有余、高可用主动切换、手动切换流量门路节点:南北向流量中ingress导致、东西向流量中istio导致参考思路:咱们在收到告警信息时,首先须要判断受影响的范畴,其次思考可能存在的起因,再根据现有条件、现状,针对性的排除某些起因。问题的排查过程就如同一个漏斗,最终漏斗的最下一层就是问题的根因,如下所示: 上面是一些疾速排除起因的case: ...

September 3, 2021 · 1 min · jiezi

关于prometheus:夜莺和prometheus告警流程对比分析pull模型远胜push模型

夜莺和prometheus告警流程比照剖析prometheus告警流程剖析以 sum(rate(coredns_dns_requests_total[1m])) > 100 为例alert和record复用大部分逻辑prometheus依据配置文件中拿到规定解析规定查问本地存储或远端存储(带触发条件),trigger在存储端返回一组以后点后果集,返回多少个对应多少条告警依据内存中的历史数据判断告警持续时间(for 1 min)有没有达到发送告警event给alertmanager由alertmanager做告警的发送、静默、分组路由、关联、回调夜莺告警流程剖析monapi 定时从db同步策略,judge 依据本人的ident 拿到属于本人的策略transfer依据存活的judge 拿到所有策略,将策略的judge地址填好transfer收到 agent push的数据后,算hash拿到策略列表 - 依据策略拿到judge地址,依据缓存拿到对应的队列,将数据塞入队列中judge收到策略后,依据策略中的fun做触发依据策略中配置实现 发送工夫、告警降级、回调等两边本质区别零碎阈值判断是否反对多series告警触发条件组合条件nodata夜莺v4 push代表由judge接收点触发判断,查问本地数据不反对,每个策略针对繁多series对应judge中内存列表只能用预聚合解决将happen、all、any等和聚合 avg max min等揉在一起需做pull需做pullprometheus pull代表由promql 查问存储promql间接反对查问到一个就是一条,多个就是多条prometheus触发条件只反对 持续时间,其余的全副为聚合funcpromql and反对promql absent反对告警push模式的性能晋升问题总结就是相比于性能损耗pull模型带来的灵活性是微小的push型的告警模式无疑会带来性能晋升因为pull模型须要每次查问存储,尽管是以后点,但也有些损耗然而 - 古代的tsdb 有倒排索引+布隆过滤器的加持,告警查问损耗能够降到很低- pull模型带来的是非常灵活的触发表达式,从这点看,性能损耗能够疏忽不急- 而且当初告警触发时都须要带上一些聚合的办法,这点push模型做不到告警push模式能够工作在查问存储挂掉的case因为push本地内存中有响应的数据,然而我感觉这是个伪劣势在夜莺中引入pull的问题最大的能源是否是相中了promql存储和采集不反对promql触发和聚合混在一起代码剖析夜莺v4代码问题策略太多双层map reinit 耗时长全局变量满天飞syncStras 全副更新,耗时长,db read高 - 每个judge实例拿到的还是全局数据,而且没有抢锁设计,导致多个judge实例同时全表读db- 除非db那里做分片,分regionjudge push模型报警很难将 pull模式融入进来prometheus告警代码剖析update 加载配置文件,增量更新告警/聚合 groupgroup.Eval 计算组里的规定 - `// Eval runs a single evaluation cycle in which all rules are evaluated sequentially.`- `vector, err := rule.Eval(ctx, ts, g.opts.QueryFunc, g.opts.ExternalURL)`- 返回的是vector `type Vector []Sample` 代表享有对立时刻的一堆point- rule.Eval 分为规定和聚合 `alert/record`- 调用 EngineQueryFunc ,外部调 instance_query - `// EngineQueryFunc returns a new query function that executes instant queries against// the given engine.`- 如果没取到数据,证实没达到触发条件则,只解决历史的alert,看看持续时间到了没- 如果rule是 alert则走发送逻辑` if ar, ok := rule.(*AlertingRule); ok {ar.sendAlerts(ctx, ts, g.opts.ResendDelay, g.interval, g.opts.NotifyFunc)}` - alert 存在headblock中,record 写入存储中?夜莺v4 告警代码 剖析judge 依据本人的ident 拿到属于本人的策略 stras := cache.StraCache.GetByNode(node) ...

April 15, 2021 · 1 min · jiezi

关于告警:AlertManager集群搭建

一、AlertManager集群搭建1、背景单节点的告警管理器,如果宕机了,那么所有的告警信息都发送不进来,还是比拟危险的,因而咱们须要搭建一个高可用的告警管理器。 此处,记录一下搭建3个节点的alertmanager集群。 2、机器机器集群端口web页面端口127.0.0.190839082127.0.0.190859084127.0.0.1908790863、集群可用配置To create a highly available cluster of the Alertmanager the instances need to be configured to communicate with each other. This is configured using the --cluster.* flags. --cluster.listen-address string: cluster listen address (default "0.0.0.0:9094"; empty string disables HA mode) 集群服务监听的地址--cluster.advertise-address string: cluster advertise address--cluster.peer value: initial peers (repeat flag for each additional peer) 初始化时关联其它实例的集群机器地址--cluster.peer-timeout value: peer timeout period (default "15s")--cluster.gossip-interval value: cluster message propagation speed (default "200ms")--cluster.pushpull-interval value: lower values will increase convergence speeds at expense of bandwidth (default "1m0s")--cluster.settle-timeout value: maximum time to wait for cluster connections to settle before evaluating notifications.--cluster.tcp-timeout value: timeout value for tcp connections, reads and writes (default "10s")--cluster.probe-timeout value: time to wait for ack before marking node unhealthy (default "500ms")--cluster.probe-interval value: interval between random node probes (default "1s")--cluster.reconnect-interval value: interval between attempting to reconnect to lost peers (default "10s")--cluster.reconnect-timeout value: length of time to attempt to reconnect to a lost peer (default: "6h0m0s")The chosen port in the cluster.listen-address flag is the port that needs to be specified in the cluster.peer flag of the other peers. ...

March 10, 2021 · 2 min · jiezi

关于告警:alertmanager的使用

一、Alertanager的装置1、下载 2、装置# 不同的平台下载不同的安装包wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.darwin-amd64.tar.gz# 解压tar zxvf alertmanager-0.21.0.darwin-amd64.tar.gz# 重命名mv alertmanager-0.21.0.darwin-amd64.tar.gz alertmanager3、启动# 启动的时候指定配置文件的门路和启动端口./alertmanager --config.file=alertmanager.yml --web.listen-address=":9093"# 显示帮忙信息./alertmanager --help4、alertmanager和prometheus的整合批改prometheus.yml配置文件 alerting: alertmanagers: - static_configs: - targets: - 127.0.0.1:9082 # 告警管理器的地址整合参考链接https://prometheus.io/docs/prometheus/latest/configuration/configuration/#alertmanager_config 二、告警分组分组机制能够将某一类型的告警信息合并成一个大的告警信息,防止发送太多的告警邮件。 比方:咱们有3台服务器都染指了Prometheus,这3台服务器同时宕机了,那么如果不分组可能会发送3个告警信息,如果分组了,那么会合并成一个大的告警信息。 1、告警规定监控服务器宕机的工夫超过1分钟就发送告警邮件。 groups:- name: Test-Group-001 # 组的名字,在这个文件中必须要惟一 rules: - alert: InstanceDown # 告警的名字,在组中须要惟一 expr: up == 0 # 表达式, 执行后果为true: 示意须要告警 for: 1m # 超过多少工夫才认为须要告警(即up==0须要继续的工夫) labels: severity: warning # 定义标签 annotations: summary: "服务 {{ $labels.instance }} 下线了" description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."2、alertmanager.yml配置global: resolve_timeout: 5m # 整合qq邮件 smtp_smarthost: 'smtp.qq.com:465' smtp_from: '1451578387@qq.com' smtp_auth_username: '1451578387@qq.com' smtp_auth_identity: 'xxxxxx' smtp_auth_password: 'xxxxxx' smtp_require_tls: false# 路由 route: group_by: ['alertname'] # 依据什么分组,此处配置的是依据告警的名字分组,没有指定 group_by 貌似是依据规定文件的 groups[n].name 来分组的。 group_wait: 10s # 当产生一个新分组时,告警信息须要等到 group_wait 才能够发送进来。 group_interval: 10s # 如果上次告警信息发送胜利,此时又来了一个新的告警数据,则须要期待 group_interval 才能够发送进来 repeat_interval: 120s # 如果上次告警信息发送胜利,且问题没有解决,则期待 repeat_interval 再次发送告警数据 receiver: 'email' # 告警的接收者,须要和 receivers[n].name 的值统一。receivers:- name: 'email' email_configs: - to: '1451578387@qq.com'3、分组相干的alertmanager的配置route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 120s group_wait、group_interval和repeat_interval的解释参考上方的正文。和此链接https://www.robustperception.... ...

March 9, 2021 · 3 min · jiezi