游乐游手机版
首页/AI教程/文章详情

普罗米修斯告警管理器AlertManager功能详解与配置指南

时间:2026-06-11 16:38
AlertManager告警由标签指纹唯一标识,状态分为触发和已恢复两种。路由采用树形结构,支持精确匹配规则、分组控制(按标签分组、等待时间、分组间隔)以及多种接收端配置。存储仅保留未恢复的告警快照,默认保留周期为120小时,超出后自动清理。
在深入 AlertManager 之前,先给出总体的处理流程图,方便把握整体脉络。

整体流程概览:

image2019_6_3_15_21_34

告警(alerts)概念解析:

首先快速梳理一下 AlertManager 中告警的基本概念与状态。每条告警对应一个具体事件,包含名称、时间、状态,以及用户自定义的详细说明。其数据结构大致如下:

[{"startsAt": "2019-06-03T03:32:20.859Z","endsAt": "2019-06-03T03:32:20.859Z","annotations":{"additionalProp1": "string","additionalProp2": "string","additionalProp3": "string"},"labels":{"additionalProp1": "string","additionalProp2": "string","additionalProp3": "string"},"generatorURL": "string"}]

那么告警的唯一标识是如何生成的呢?系统会将 labels 下的所有项组合起来计算出一个指纹(fingerprint),因此可以认为 labels 集合本身就是唯一标识。合并告警、更新状态都依赖这个指纹来定位。相关参考代码如下:

// Fingerprint returns a unique hash for the alert. It is equivalent to
// the fingerprint of the alert's label set.
func (a *Alert) Fingerprint() Fingerprint {
	return a.Labels.Fingerprint()
}

// labelSetToFingerprint works exactly as LabelsToSignature but takes a LabelSet as
// parameter (rather than a label map) and returns a Fingerprint.
func labelSetToFingerprint(ls LabelSet) Fingerprint {
	if len(ls) == 0 {
		return Fingerprint(emptyLabelSignature)
	}
	labelNames := make(LabelNames, 0, len(ls))
	for labelName := range ls {
		labelNames = append(labelNames, labelName)
	}
	sort.Sort(labelNames)
	sum := hashNew()
	for _, labelName := range labelNames {
		sum = hashAdd(sum, string(labelName))
		sum = hashAddByte(sum, SeparatorByte)
		sum = hashAdd(sum, string(ls[labelName]))
		sum = hashAddByte(sum, SeparatorByte)
	}
	return Fingerprint(sum)
}

告警的状态只有两种:firing(触发中)和 resolved(已解决)。该状态由 Manager 根据收到的告警结构自行判断。什么时候算 firing?当 endsAt 为空,或者当前时间小于等于 endsAt 时,视为告警仍在触发。什么时候算 resolved?当 endsAt 不为空且大于当前时间时,视为已解决。代码逻辑非常清晰:

// Resolved returns true iff the activity interval ended in the past.
func (a *Alert) Resolved() bool {
	return a.ResolvedAt(time.Now())
}

// ResolvedAt returns true off the activity interval ended before
// the given timestamp.
func (a *Alert) ResolvedAt(ts time.Time) bool {
	if a.EndsAt.IsZero() {
		return false
	}
	return !a.EndsAt.After(ts)
}

路由(router)机制详解

路由可以看作是一棵树,借助它能够灵活配置告警的流转路径。根节点是 router,所有属性均可被子节点继承,因此根节点的属性相当于全局默认值。子节点 routers 可以有零个或多个,每个子节点都能独立配置属性来覆盖父节点。

每个 router 包含以下几类控制:

  • 匹配规则:matchmatch_re,前者做等值匹配,后者支持正则表达式,这是选择某个 router 的依据。
  • 流程控制:continue 表示告警是否继续向下路由,若为 false,则终止于当前节点,不再往下传递。
  • 分组规则:group 相关参数,用于告警聚合。
  • 接收端:receiver 指定处理方式,例如发送邮件、Webhook 等。

分组(group)策略说明

分组操作的核心价值在于将同一类告警归集到一条通知中。最典型的场景是:当某个核心服务或组件发生故障,可能瞬间触发成百上千条同类型告警。此时分组聚合能大幅降低通知数量,保持告警信息的清晰与有效。分组涉及三个关键参数:

  • group_by:指定按哪个标签(label)进行分组,多个标签用逗号分隔。
  • group_wait:从第一个新分组创建开始,到实际发送告警之间的等待时长。系统会在此时间段内将同一分组的所有告警合并为一条再发送。
  • group_interval:同一分组成功发送后,后续再有同组告警时,需等待此间隔时间后才能发送下一轮通知。

存储(storage)机制概览

AlertManager 不支持历史存储,仅保存告警快照。存储分为两部分:

(1)告警状态快照:只保存尚未恢复的告警,存储周期可配置,默认时长为 120 小时。底层数据结构为 map,key 格式为 GroupKey:r.GroupName,/r.Integration,/r.Idx,value 为 MeshEntry。具体结构如下:

type MeshEntry struct {
	Entry     *Entry    `protobuf:"bytes,1,opt,name=entry,proto3" json:"entry,omitempty"`
	ExpiresAt time.Time `protobuf:"bytes,2,opt,name=expires_at,json=expiresAt,proto3,stdtime" json:"expires_at"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type Entry struct {
	GroupKey      []byte     `protobuf:"bytes,1,opt,name=group_key,json=groupKey,proto3" json:"group_key,omitempty"`
	Receiver      *Receiver  `protobuf:"bytes,2,opt,name=receiver,proto3" json:"receiver,omitempty"`
	GroupHash     []byte     `protobuf:"bytes,3,opt,name=group_hash,json=groupHash,proto3" json:"group_hash,omitempty"`
	Resolved      bool       `protobuf:"varint,4,opt,name=resolved,proto3" json:"resolved,omitempty"`
	Timestamp     time.Time  `protobuf:"bytes,5,opt,name=timestamp,proto3,stdtime" json:"timestamp"`
	FiringAlerts  []uint64   `protobuf:"varint,6,rep,packed,name=firing_alerts,json=firingAlerts,proto3" json:"firing_alerts,omitempty"`
	ResolvedAlerts []uint64  `protobuf:"varint,7,rep,packed,name=resolved_alerts,json=resolvedAlerts,proto3" json:"resolved_alerts,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

(2)告警静音状态:存储周期由静音规则自行配置,此处不再展开细节。

来源:https://developer.aliyun.com/article/704660
上一篇年跨职能团队协作工具技术跃迁从线性列表到阵列拓扑 下一篇小微企业阿里云OSS图片存储与CDN分发最佳实践
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Windows Docker Desktop RabbitMQ生产级部署完整指南
AI教程 · 2026-06-29

Windows Docker Desktop RabbitMQ生产级部署完整指南

前言 在 Windows 本地开发环境中,直接安装 RabbitMQ 确实颇为周折:需要单独配置 Erlang 运行环境、手动管理环境变量、服务启停全凭手工操作。更令人困扰的是,版本兼容冲突、端口占用、环境不一致等问题层出不穷。笔者见过不少开发者为搭建环境就得耗费整整半天时间。 相比之下,借助 Do

AI搜索重构制造业采购逻辑的阿里云企业级GEOCMS优化实践
AI教程 · 2026-06-29

AI搜索重构制造业采购逻辑的阿里云企业级GEOCMS优化实践

先分享一个切实感受。过去两年,我们与福建制造企业合作较为频繁,发现一个非常突出的现象:超过80%的企业官网,产品参数仍然存放在PDF或图片中。AI爬虫?根本无法抓取。这些企业技术实力不弱、资质证照齐全、应用案例也丰富,但在AI搜索这一全新战场上,它们几乎处于隐身状态。 一、一个正在发生的行业变化 A

阿里云Token Plan团队版功能价格与省钱购买指南
AI教程 · 2026-06-29

阿里云Token Plan团队版功能价格与省钱购买指南

阿里云百炼近期推出了名为“Token Plan 团队版”的全新服务,这一服务专为企业与开发者量身打造,定位为AI大模型订阅平台。通过引入Credits作为统一计量单位,将文本生成、图像生成等多模态AI能力纳入单一计费体系,同时无缝兼容主流AI编程工具及智能体(Agent)生态系统。其核心亮点包括:全

阿里云物联网.NET Core客户端位置信息上报
AI教程 · 2026-06-29

阿里云物联网.NET Core客户端位置信息上报

阿里云物联网平台的位置服务并非一个完全独立的功能模块。位置信息可包含二维坐标与三维坐标,而位置数据的来源本质上是借助设备属性进行上传。换言之,若要让设备上报位置,您需先将其视为一个普通属性进行处理。 1)添加二维位置数据 操作过程十分简洁。进入数据分析 → 空间数据可视化 → 二维数据,点击添加,将

年阿里云服务器选型配置与网站部署全攻略
AI教程 · 2026-06-29

年阿里云服务器选型配置与网站部署全攻略

2026年,阿里云服务器生态已高度成熟,形成了清晰的轻量应用服务器与ECS云服务器两大产品阵营。无论你是计划搭建个人博客、企业官网,还是运营电商平台、进行应用开发,基本都能找到理想的解决方案。本指南将从服务器选型、配置选择、部署流程到安全运维,系统梳理2026年最实用的操作要点,帮助你少走弯路,让网