golang调用prometheus-operator api创建PromtheusRule

17 篇文章 1 订阅
16 篇文章 1 订阅

prometheus-operator使用PrometheusRule来代替了规则文件。每个告警规则对应一个PrometheusRule对象。所有的PrometheusRule对象会被Prometheus-Operator转换为规则文件挂载在promtheus pod内部的 /etc/prometheus/rules/prometheus-k8s-rulefiles-0 目录下。

package api

import (
	"errors"
	"fmt"
	operatorV1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1"
	"github.com/coreos/prometheus-operator/pkg/client/versioned"
	jsoniter "github.com/json-iterator/go"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/fields"
	"k8s.io/apimachinery/pkg/types"
	"k8s.io/klog"
)

const ApiVersion = "monitoring.coreos.com/v1"

// ================创建告警规则================
// 查询告警规则是否存在
func GetPrometheusRule(clientSet *versioned.Clientset, namespace string, alertName string) (*operatorV1.PrometheusRule, error) {
	return clientSet.MonitoringV1().PrometheusRules(namespace).Get(alertName, metav1.GetOptions{})
}

// 根据ns查询告警规则
func GetRulesByClusterNs(clientSet *versioned.Clientset, monitorNs, sign, clusterId string) (*operatorV1.PrometheusRuleList, error) {
	return clientSet.MonitoringV1().PrometheusRules(monitorNs).List(metav1.ListOptions{
		LabelSelector: fields.SelectorFromSet(fields.Set(map[string]string{
			"sign":    sign,
			"cluster": clusterId,
		})).String(),
	})
}

// sign, 如果是pod,那么对应pod的namespace,如果是宿主机,那么对应宿主机ip
func CreateRule(clientSet *versioned.Clientset, groups []operatorV1.RuleGroup, monitorNs, sign, cluster, alertName string, showLog bool) (*operatorV1.PrometheusRule, error) {
	if showLog {
		klog.Infof("received create PrometheusRule in namespace:%s, name:%s", monitorNs, alertName)
	}
	pr := &operatorV1.PrometheusRule{
		TypeMeta: metav1.TypeMeta{
			APIVersion: ApiVersion,
			Kind:       "PrometheusRule",
		},
		ObjectMeta: metav1.ObjectMeta{
			Name:      alertName,
			Namespace: monitorNs,
			Labels: map[string]string{
				"prometheus": "k8s",
				"role":       "alert-rules",
				"sign":       sign,
				"cluster":    cluster,
			},
		},
		Spec: operatorV1.PrometheusRuleSpec{
			Groups: groups,
		},
	}
	return clientSet.MonitoringV1().PrometheusRules(monitorNs).Create(pr)
}

// 修改告警规则
func PatchRule(clientSet *versioned.Clientset, groups []operatorV1.RuleGroup, namespace, ruleName string, showLog bool) (*operatorV1.PrometheusRule, error) {
	if showLog {
		klog.Infof("received patch PrometheusRule in namespace:%s, name:%s", namespace, ruleName)
	}
	patch := PathRule{
		Metadata: Metadata{
			Namespace: namespace,
			Name:      ruleName,
		},
		Spec: operatorV1.PrometheusRuleSpec{
			Groups: groups,
		},
	}
	data, err := jsoniter.Marshal(patch)
	if err != nil {
		return nil, errors.New(fmt.Sprintf("update %s rule, but format err:%s ", ruleName, err.Error()))
	}
	return clientSet.MonitoringV1().PrometheusRules(namespace).Patch(ruleName, types.MergePatchType, data)
}

// 删除PrometheusRule
func DeleteRule(clientSet *versioned.Clientset, namespace, name string) error {
	return clientSet.MonitoringV1().PrometheusRules(namespace).Delete(name, &metav1.DeleteOptions{})
}


type PathRule struct {
	Metadata Metadata                      `json:"metadata"`
	Spec     operatorV1.PrometheusRuleSpec `json:"spec"`
}

type Metadata struct {
	Namespace string `json:"namespace"`
	Name      string `json:"name"`
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值