我正在开发一个仪表板,它接收所有警报管理器读数并处理它们。我在请求有效负载中查找了一个唯一的字段,以便在数据库中创建唯一的外部警报 ID。请求有效负载如下所示:
{
"status": "firing",
"labels": {
"alertname": "",
"app": "",
"cluster": "",
"deployed_location": "",
"instance": "",
"job": "",
"kubernetes_namespace": "",
"kubernetes_pod_name": "",
"pod_template_hash": "",
"release": "",
"replica": "",
"severity": ""
},
"annotations": {
"description": "",
"summary": ""
},
"startsAt": "",
"endsAt": "",
"generatorURL": "",
"fingerprint": ""
}
我首先使用了generatorURL
字段,但后来意识到许多不同的警报对generatorURL
具有相同的值。我一直在尝试fingerprint
,情况好多了。但是,我遇到的情况是 2 到 15 个警报具有相同的fingerprint
.
我想知道:
- 警报管理器请求中真的没有唯一的字段吗?
- Alertmanager 逻辑(或我的警报(的本质是使用相同的
fingerprint
创建许多警报,我应该处理它并在我这边处理它,即如果给定的fingerprint
已经使用,则不要在我的数据库中创建事件。我还担心,如果我在警报模型上设置unique=True
,则会错过一些具有相同指纹的新警报......
如果你跳到alert.Fingerprint()
定义,像这个,可以找到指纹的impl
所以,alert.Fingerprint()
对labels
来说是独一无二的
// 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)
}