天天看点

Promethus之AlertManager介绍

总的流程图:

Promethus之AlertManager介绍

alerts:

alert概念

这里先简单介绍下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所有项组合起来计算得到的一个指纹信息,所以可以认为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根据收到了alert结构来自行判断并赋值的,manager是怎么判断firing呢?

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,子节点可以是0个或多个,子节点可以单独配置属性以覆盖父节点的属性。

每个router可以包含以下属性

流程控制:

  • match,match_re 是匹配规则,这个是每个router选择的依据。前者是等于匹配,后者是正则匹配。
  • continue,告警是否继续向下路由,如果是否则终止于此节点不再向下路由。
  • group规则:告警聚合规则

receiver:指定接收端,可以理解为处理方式。

group

分组操作主要是应用于将同一类告警归集为一个告警通知中,

一个特别典型的应用场景:当某核心服务或组件故障,可能引发成百上千的同类型告警,此时这个分组聚合,就会使告警通知有效减少,使告警通知保持清晰,有效。

分组有三个参数:

group by:指定分组依据哪个label,可以是多个以逗号隔开。

group_wait:分组聚合时间窗口,当第一个新分组开始到发送告警的等待时间,系统会将这段时间的同组告警合并为一条。

group_interval :同一分组的告警发送间隔,如果分组1已经成功发送了,后来的告警也还属于分组1,则等待这个间隔时间后再发送。

storage

不支持历史存储,只存储告警快照

(1)告警状态快照,未恢复的告警。存储周期可以配置,默认120小时

结构:map,key GroupKey:r.GroupName,/r.Integration,/r.Idx   value:MeshEntry
           

具体结构如下:

type MeshEntry struct {
 // The original raw notify log entry.
 Entry *Entry `protobuf:"bytes,1,opt,name=entry,proto3" json:"entry,omitempty"`
 // A timestamp indicating when the mesh peer should evict
 // the log entry from its state.
 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 {
 // The key identifying the dispatching group.
 GroupKey []byte `protobuf:"bytes,1,opt,name=group_key,json=groupKey,proto3" json:"group_key,omitempty"`
 // The receiver that was notified.
 Receiver *Receiver `protobuf:"bytes,2,opt,name=receiver,proto3" json:"receiver,omitempty"`
 // Hash over the state of the group at notification time.
 // Deprecated in favor of FiringAlerts field, but kept for compatibility.
 GroupHash []byte `protobuf:"bytes,3,opt,name=group_hash,json=groupHash,proto3" json:"group_hash,omitempty"`
 // Whether the notification was about a resolved alert.
 // Deprecated in favor of ResolvedAlerts field, but kept for compatibility.
 Resolved bool `protobuf:"varint,4,opt,name=resolved,proto3" json:"resolved,omitempty"`
 // Timestamp of the succeeding notification.
 Timestamp time.Time `protobuf:"bytes,5,opt,name=timestamp,proto3,stdtime" json:"timestamp"`
 // FiringAlerts list of hashes of firing alerts at the last notification time.
 FiringAlerts []uint64 `protobuf:"varint,6,rep,packed,name=firing_alerts,json=firingAlerts,proto3" json:"firing_alerts,omitempty"`
 // ResolvedAlerts list of hashes of resolved alerts at the last notification time.
 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)告警静音状态。

存储周期由静音规则配置。