Уникально ли поле отпечатка пальца в Alertmanager?

Я разрабатываю приборную панель, которая принимает все показания Alertmanager и обрабатывает их. Я искал уникальное поле в полезной нагрузке запроса, чтобы создать уникальный внешний идентификатор предупреждения в моей базе данных. Полезные данные запроса выглядят примерно так:

{
  "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.

Мне интересно:

  1. Неужели в запросах Alertmanager нет уникального поля?
  2. Природа логики Alertmanager (или моих предупреждений) состоит в том, что ряд предупреждений создается с одним и тем же fingerprint, и я должен просто иметь дело с ним и обрабатывать его на своей стороне, т.е. не создавать инцидент в моей БД, если заданный fingerprint уже используется. Я также беспокоюсь, что если я установлю unique=True в своей модели предупреждений, некоторые новые предупреждения с таким же отпечатком пальца будут пропущены ...

person mhyousefi    schedule 27.11.2019    source источник
comment
На данный момент я почти уверен, что поле отпечатка пальца НЕ уникально. Что еще интереснее, так это то, что я использую fingerprint, alertName и startsAt для создания уникального идентификатора, и я все еще получаю повторяющиеся предупреждения.   -  person mhyousefi    schedule 18.01.2020


Ответы (1)


Если вы перейдете к определению 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)
}
person likid1412    schedule 02.10.2020