Использование jsonnet для обновления правила по умолчанию для оператора Prometheus

Я пытаюсь переопределить правила по умолчанию в Kube-Prometheus-Stack. Я включил правила по умолчанию при развертывании Kube-Prometheus-Stack. Я пробовал использовать jsonnet, как показано в этом примере https://github.com/prometheus-operator/kube-prometheus/blob/master/docs/developing-prometheus-rules-and-grafana-dashboards.md.

Но я думаю, что я неправильно выполняю шаги, поэтому он работает не так, как ожидалось.

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

Создал файл jsonnet (my-custom-update.jsonnet) для обновления правила KubePodCrashLooping,

 local filter = {
  prometheusAlerts+:: {
    groups: std.map(
      function(group)
        if group.name == 'kubernetes-apps' then
          group {
            rules: std.filter(function(rule)
              rule.alert != "KubePodCrashLooping",
              group.rules
            )
          }
        else
          group,
      super.groups
    ),
  },
};
local update = {
  prometheusAlerts+:: {
    groups: std.map(
      function(group)
        if group.name == 'kubernetes-apps' then
          group {
            rules: std.map(
              function(rule)
                if rule.alert == "KubePodCrashLooping" then
                  rule {
                    expr: "kube_statefulset_status_replicas_ready{job=\"kube-state-metrics\",statefulset!=\"vault\"} != kube_statefulset_status_replicas{job=\"kube-state-metrics\",statefulset!=\"vault\"}"
                  }
                else
                  rule,
                group.rules
            )
          }
        else
          group,
      super.groups
    ),
  },
};
local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') + filter + update + {
    prometheusAlerts+:: (import 'prometheus-rules.json'),
};

{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
{ ['0prometheus-operator-' + name]: kp.prometheusOperator[name] for name in std.objectFields(kp.prometheusOperator) } +
{ ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
{ ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
{ ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } +
{ ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } +
{ ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) } +
{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } 

Создайте этот файл jsonnet с помощью сценария build.sh, представленного в документе,

./build.sh my-custom-update.jsonnet

Это фактически удалило правило KubePodCrashLooping вместо его обновления. Это создало все файлы yaml в каталоге манифестов

Я думаю, что мне чего-то не хватает .. Пожалуйста, посоветуйте.


person Rad4    schedule 30.09.2020    source источник
comment
Вашему местному жителю не хватает тела. Вам нужно выражение после последнего ; в вашем фрагменте.   -  person sbarzowski    schedule 01.10.2020
comment
@sbarzowski .. Спасибо за ответ .. Я обновил код сейчас .. На этот раз без ошибок. Я добавил локальный КП для обновления тела. Я не уверен, что это правильный путь. Но это удаление правила вместо обновление. Пожалуйста, посоветуйте.   -  person Rad4    schedule 01.10.2020
comment
Пожалуйста, проверьте сгенерированные файлы YAML. Вы можете найти там обновленное правило?   -  person sbarzowski    schedule 01.10.2020


Ответы (1)


Теперь у меня это работает,

local kp = (import 'kube-prometheus/kube-prometheus.libsonnet') +{
_config+:: {
namespace: 'monitoring',
},
prometheusAlerts+:: {
groups:
std.map(
function(group)
if group.name == 'kubernetes-apps' then
group {
rules: std.map(function(rule)
if rule.alert == "KubeStatefulSetReplicasMismatch" then
rule {
expr: "kube_statefulset_status_replicas_ready{job=\"kube-state-metrics\",statefulset!=\"vault\"} != kube_statefulset_status_replicas{job=\"kube-state-metrics\",statefulset!=\"vault\"}",
labels: {
priority: 'P1',
severity: 'info',
},
}
else
rule
,
group.rules
)
}
else
group,
super.groups
),
},
};


{ ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
{ ['0prometheus-operator-' + name]: kp.prometheusOperator[name] for name in std.objectFields(kp.prometheusOperator) } +
{ ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
{ ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
{ ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } +
{ ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } +
{ ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) } +
{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) }
person Rad4    schedule 01.10.2020