修改prometheus实现数据库存储报警规则和收集目标

从数据库获取报警规则和服务目标组

prometheus本身报警规则及服务发现策略基于文件配置很不方便,对于非K8S服务监控经常需要操作配置文件,不利于管理系统平台化建设。
实现思路:将相关配置信息存储在MySQL里,加入新的逻辑,实现保留文件加载配置的同时,加载MySQL中的信息,
动态生成static_configalert_rule从而实现报警及监控目标的配置UI化.

MySQL配置

使用以下环境变量定义MySQL元信息

MYSQL_HOST #主机名/ip
MYSQL_PORT #端口
MYSQL_USER #用户名
MYSQL_PWD #密码
MYSQL_DB #数据库名

因为使用gorm实现,对于代码需要引入依赖

	"github.com/jinzhu/gorm"
	_ "github.com/go-sql-driver/mysql"

表结构定义

报警规则表结构定义

type AlertRule struct {
	ID        uint `gorm:"primary_key"`
	CreatedAt time.Time
	UpdatedAt time.Time
	Group       string    `json:"group,omitempty"`   // 存储报警规则的组
	Alert       string    `json:"alert,omitempty"`  // 存储报警规则的名称
	Expr        string    `json:"expr,omitempty"`  // 存储报警规则的表达式
	For         string    `json:"for,omitempty"` // 存储报警规则的延迟时间
	Labels      JSON `sql:"type:json" json:"labels,omitempty"`// 存储报警规则的label
	Annotations JSON `sql:"type:json" json:"annotations,omitempty"` // 存储报警规则的注释
}

func (self *AlertRule) TableName() string {
	return "alert_rule"
}

type JSON []map[string]string

func (c JSON) Value() (driver.Value, error) {
	b, err := json.Marshal(c)
	return string(b), err
}

func (c *JSON) Scan(input interface{}) error {
	return json.Unmarshal(input.([]byte), c)
}

代码逻辑

github.com/prometheus/prometheus/rules/manager.go LoadGroups方法 返回前加入以下代码

    //出事连接
    var rules []AlertRule
    db_url:=fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true&loc=Local",os.Getenv("MYSQL_USER"),os.Getenv("MYSQL_PWD"),os.Getenv("MYSQL_HOST"),os.Getenv("MYSQL_PORT"),os.Getenv("MYSQL_DB"))
	db,err:=gorm.Open("mysql", fmt)
	if err!=nil {
		level.Error(m.logger).Log( "init db error: ",err)
	}else {
		level.Info(m.logger).Log("get db connection success")
	}
    //获取报警条目
	err=db.Model(&AlertRule{}).Scan(&rules).Error
	if err!=nil {
		level.Error(m.logger).Log(err)
	}else {
		level.Info(m.logger).Log("get rules success")
	}
	defer func(db *gorm.DB) {
		err:=db.Close()
		if err!=nil {
			level.Error(m.logger).Log("close db error: ",err)
		}
	}(db)
	arules := make(map[string][]Rule)
	for _,v:=range rules {
		expr, err := promql.ParseExpr(v.Expr)
		if err != nil {
			return nil, []error{err}
		}
		var lbs=labels.Labels{labels.Label{
			Name: "product",
			Value: v.Group,
		}}
		for _,v:=range v.Labels {
			lbs=append(lbs,labels.Label{
				v["key"],v["value"],
			})
		}

		var ans=labels.Labels{}
		for _,v:=range v.Annotations {
			ans=append(ans,labels.Label{
				v["key"],v["value"],
			})
		}
		arules[v.Group]= append(arules[v.Group], NewAlertingRule(v.Alert,expr,interval,lbs,ans,nil,shouldRestore,log.With(m.logger, "alert", v.Alert)))
	}
	level.Info(m.logger).Log(arules)
	for k,v:=range arules {
		rules:=make([]Rule,0,len(v))
		rules=v[0:len(v)]
		groups[groupKey(k,"rule.yaml")]=NewGroup(k,"rule.yaml",interval, rules,shouldRestore,m.opts)
	}

job及targer代码

从数据库获取信息生成static config配置

结构定义

type AlertSdRule struct {
	ID        uint      `gorm:"primary_key"`
	CreatedAt time.Time `json:"create_at"`
	UpdatedAt time.Time `json:"update_at"`

	Target   string `gorm:"type:varchar(200);not null" json:"target"`
	Labels   JSON   `sql:"type:json" json:"type"`
	GroupId  int    `gorm:"type:integer;not null" json:"group_id"`
	Describe string `gorm:"type:varchar(200);not null" json:"describe"`
}

func (self *AlertSdRule) TableName() string {
	return "alert_sd_rule"
}

type AlertSdGroup struct {
	ID        uint      `gorm:"primary_key"`
	CreatedAt time.Time `json:"create_at"`
	UpdatedAt time.Time `json:"update_at"`

	Name         string `gorm:"type:varchar(200);not null" json:"name"`
	MetricsPath  string `gorm:"type:varchar(200);not null" json:"metrics_path"`
	Labels       JSON   `sql:"type:json" json:"labels"`
	Scheme       string `gorm:"type:varchar(200);not null" json:"scheme"`
	Interval     int    `gorm:"type:integer;not null" json:"interval"`
	Timeout      int    `gorm:"type:integer;not null" json:"timeout"`
	Describe     string `gorm:"type:varchar(200);not null" json:"describe"`
	AuthUser     string `gorm:"type:varchar(200)" json:"auth_user"`
	AuthPassword string `gorm:"type:varchar(200)" json:"auth_password"`
	AuthToken    string `gorm:"type:varchar(200)" json:"auth_token"`
}

func (self *AlertSdGroup) TableName() string {
	return "alert_sd_group"
}

type JSON []map[string]string

func (c JSON) Value() (driver.Value, error) {
	b, err := json.Marshal(c)
	return string(b), err
}

func (c *JSON) Scan(input interface{}) error {
	return json.Unmarshal(input.([]byte), c)
}

代码逻辑

main.go reloadConfig中

    //初始化数据库连接
    db_url:=fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true&loc=Local",os.Getenv("MYSQL_USER"),os.Getenv("MYSQL_PWD"),os.Getenv("MYSQL_HOST"),os.Getenv("MYSQL_PORT"),os.Getenv("MYSQL_DB"))
	conn, err := gorm.Open("mysql", db_url)
	if err != nil {
		panic(err)
	}
	var groups []AlertSdGroup
    // 获取所有的JOB
	err = conn.Model(&AlertSdGroup{}).Scan(&groups).Error
	if err != nil {
		panic(err)
	}
	for _, group := range groups {
		var rules []AlertSdRule
        // 获取指定job缩包含的targets
		err = conn.Model(&AlertSdRule{}).Where("group_id = ?", group.ID).Scan(&rules).Error
		if err != nil {
			panic(err)
		}
		var targetgroups = []*targetgroup.Group{}
		for _, rule := range rules {
			var labels model.LabelSet = map[model.LabelName]model.LabelValue{}
			for _, label := range group.Labels {
				key := model.LabelName(label["key"])
				value := model.LabelValue(label["value"])
				labels[key] = value
			}
			for _, label := range rule.Labels {
				key := model.LabelName(label["key"])
				value := model.LabelValue(label["value"])
				labels[key] = value
			}
			targetgroups = append(targetgroups, &targetgroup.Group{
				Targets: []model.LabelSet{
					model.LabelSet{
						"__address__": model.LabelValue(rule.Target),
					},
				},
				Labels: labels,
				Source: fmt.Sprint(rule.ID),
			})
		}
        //生成对应组的scrapeConfig
		scrapeConfig := &config.ScrapeConfig{
			JobName:        group.Name,
			Scheme:         group.Scheme,
			ScrapeInterval: model.Duration(time.Duration(group.Interval) * time.Second),
			ScrapeTimeout:  model.Duration(time.Duration(group.Timeout) * time.Second),
			MetricsPath:    group.MetricsPath,
			HTTPClientConfig: config_util.HTTPClientConfig{
				TLSConfig: config_util.TLSConfig{
					InsecureSkipVerify: true,
				},
			},
			ServiceDiscoveryConfig: sd_config.ServiceDiscoveryConfig{
				StaticConfigs: targetgroups,
			},
		}
        //生成对应组的scrapeConfig的认证方式
		if group.AuthUser != "" && group.AuthPassword != "" {
			scrapeConfig.HTTPClientConfig.BasicAuth = &config_util.BasicAuth{
				Username: group.AuthUser,
				Password: config_util.Secret(group.AuthPassword),
			}
		} else if group.AuthToken != "" {
			scrapeConfig.HTTPClientConfig.BearerToken = config_util.Secret(group.AuthToken)
		}
		conf.ScrapeConfigs = append(conf.ScrapeConfigs, scrapeConfig)
	}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Prometheus是一种用于监控和报警的开源系统。超全面的Prometheus报警规则集合是指包含了对各种监控指标进行报警规则集合。 首先,对于系统资源的监控,可以设置CPU利用率、内存使用率、磁盘空间等指标的报警规则。当这些指标超过设定的阈值时,Prometheus会触发相应的报警。 其次,对于网络相关的监控,可以设置网络流量、网络延迟等指标的报警规则。当网络出现异常情况时,比如流量突然剧增或者延迟超出设定的范围,Prometheus会发送报警通知。 此外,还可以设置应用程序相关的监控指标的报警规则。比如,对于Web服务器可以设置HTTP响应码的报警规则,当错误响应码的比例超过一定阈值时,Prometheus会发出报警。对于数据库,可以设置查询延迟、连接数等指标的报警规则。 在超全面的Prometheus报警规则集合中,还可以根据业务需求自定义扩展报警规则。比如,可以针对特定业务逻辑设置业务指标的报警规则。当业务异常时,Prometheus会发送报警,提醒相关负责人进行处理。 总而言之,超全面的Prometheus报警规则集合能够对各种系统、网络和应用程序的指标进行全面的监控,并在出现异常情况时及时发出报警通知。这有助于及时发现和解决问题,提高系统的可用性和稳定性。 ### 回答2: Prometheus是一种广泛应用于监控和报警的开源系统,提供了丰富的报警规则集合,可以帮助我们及时发现系统中的问题并采取相应的措施。 首先,Prometheus通过其基于时间序列的数据模型,可以对服务器、应用程序以及其他网络设备进行实时监控。它可以收集存储各种指标,如内存、CPU使用率、网络流量等,以便进行分析和报警。 其次,Prometheus提供了灵活而强大的查询语言PromQL,可以根据用户的需求编写各种定制化的报警规则。用户可以根据自己的系统特点和需求,定义各种指标的阈值,一旦某个指标超过或低于设定的阈值,系统就会触发相应的报警动作,如发送邮件、短信或调用其他外部服务。 此外,Prometheus还支持基于时间窗口的报警规则,即连续一段时间内超过或低于阈值才触发报警,避免了短时间波动带来的误报警情况。 Prometheus还支持灵活的告警分级机制,允许用户为不同的监控对象设置不同的报警级别,以便针对不同的问题采取不同的处理策略。 此外,Prometheus还支持报警的静默模式,即用户可以手动关闭某个报警规则,以避免在某些特定情况下产生误报。 总之,Prometheus提供了一个超全面且灵活的报警规则集合,可以满足不同系统的监控和报警需求。用户可以根据自己的实际情况,定制化地配置各种报警规则,以便及时发现并解决系统中的问题。 ### 回答3: 超全面的prometheus报警规则集合是一个包含了大量规则的集合,用于监控和报警系统中可能出现的问题和异常情况。 这个集合中的规则涵盖了各种系统指标,例如 CPU 使用率、内存使用率、磁盘空间、网络流量等等。它们旨在帮助管理员监控系统的运行状况,并在出现异常时及时发出警报,以便能够进行及时的故障排除和修复。 超全面的prometheus报警规则集合还包括了许多预定义的警报规则,用于监控重要的系统组件和服务,如数据库、消息队列、集群状态等。这些规则可以根据实际需求进行自定义配置,以适应不同系统和应用的监控需求。 此外,集合中的规则还包括了一些常见的警报规则模板,用于处理常见的异常情况,如网络中断、服务崩溃、CPU 负载过高等。这些模板可以帮助管理员更快地设置和配置报警规则,减少了规则编写的工作量,同时也提高了监控系统的响应速度。 总之,超全面的prometheus报警规则集合是一个功能强大、可定制性高的工具,用于监控和报警系统中各种异常情况。通过使用这个集合,管理员可以更好地了解系统的运行状况,并在出现问题时能够及时采取相应的措施,确保系统的可用性和稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值