Alertmanager中的指纹字段是唯一的吗?

mhy*_*efi 6 fingerprinting prometheus-alertmanager

我正在开发一个仪表板,它接收所有 Alertmanager 读数并处理它们。我在请求负载中寻找一个唯一的字段,以在我的数据库中创建一个唯一的外部警报 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": ""
}
Run Code Online (Sandbox Code Playgroud)

我第一次使用该generatorURL字段,但后来意识到许多不同的警报具有相同的值generatorURL。我一直在努力fingerprint,情况好多了。但是,我遇到过 2 到 15 个警报具有相同fingerprint.

我想知道:

  1. Alertmanager 请求中真的没有唯一字段吗?
  2. 这是 Alertmanager 逻辑(或我的警报)的本质,即使用相同的警报创建了许多警报,我应该只处理它并在我这边处理它,即如果给定的是fingerprint,则不要在我的数据库中创建事件fingerprint已使用。我还担心,如果我设置unique=True警报模型,一些具有相同指纹的新警报将会被错过......

lik*_*412 8

如果你跳转到alert.Fingerprint()定义,像这样,可以找到指纹的实现

所以,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)
}
Run Code Online (Sandbox Code Playgroud)