mirror of
https://github.com/ccfos/nightingale.git
synced 2026-03-02 22:19:10 +00:00
* get alert mute by api * add service api * fix sync datasource * change event persist * add hearbeat * change pushgw update target * code refactor * fix get user members * refactor get alert rules * update AlertCurEventGetByRuleIdAndDsId * refactor get from api * add role perm list and change get datasource * refactor: get ops and metrics * change some logs * change get datasource
171 lines
4.7 KiB
Go
171 lines
4.7 KiB
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/ccfos/nightingale/v6/pkg/ctx"
|
|
"github.com/ccfos/nightingale/v6/pkg/poster"
|
|
)
|
|
|
|
type AlertingEngines struct {
|
|
Id int64 `json:"id" gorm:"primaryKey"`
|
|
Instance string `json:"instance"`
|
|
EngineCluster string `json:"cluster" gorm:"engine_cluster"`
|
|
DatasourceId int64 `json:"datasource_id"`
|
|
Clock int64 `json:"clock"`
|
|
}
|
|
|
|
func (e *AlertingEngines) TableName() string {
|
|
return "alerting_engines"
|
|
}
|
|
|
|
// UpdateCluster 页面上用户会给各个n9e-server分配要关联的目标集群是什么
|
|
func (e *AlertingEngines) UpdateDatasourceId(ctx *ctx.Context, id int64) error {
|
|
count, err := Count(DB(ctx).Model(&AlertingEngines{}).Where("id<>? and instance=? and datasource_id=?", e.Id, e.Instance, id))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if count > 0 {
|
|
return fmt.Errorf("instance %s and datasource_id %d already exists", e.Instance, id)
|
|
}
|
|
|
|
e.DatasourceId = id
|
|
return DB(ctx).Model(e).Select("datasource_id").Updates(e).Error
|
|
}
|
|
|
|
func AlertingEngineAdd(ctx *ctx.Context, instance string, datasourceId int64) error {
|
|
count, err := Count(DB(ctx).Model(&AlertingEngines{}).Where("instance=? and datasource_id=?", instance, datasourceId))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if count > 0 {
|
|
return fmt.Errorf("instance %s and datasource_id %d already exists", instance, datasourceId)
|
|
}
|
|
|
|
err = DB(ctx).Create(&AlertingEngines{
|
|
Instance: instance,
|
|
DatasourceId: datasourceId,
|
|
Clock: time.Now().Unix(),
|
|
}).Error
|
|
|
|
return err
|
|
}
|
|
|
|
func AlertingEngineDel(ctx *ctx.Context, ids []int64) error {
|
|
if len(ids) == 0 {
|
|
return nil
|
|
}
|
|
return DB(ctx).Where("id in ?", ids).Delete(new(AlertingEngines)).Error
|
|
}
|
|
|
|
func AlertingEngineGetDatasourceIds(ctx *ctx.Context, instance string) ([]int64, error) {
|
|
var objs []AlertingEngines
|
|
err := DB(ctx).Where("instance=?", instance).Find(&objs).Error
|
|
if err != nil {
|
|
return []int64{}, err
|
|
}
|
|
|
|
if len(objs) == 0 {
|
|
return []int64{}, nil
|
|
}
|
|
var ids []int64
|
|
for i := 0; i < len(objs); i++ {
|
|
ids = append(ids, objs[i].DatasourceId)
|
|
}
|
|
|
|
return ids, nil
|
|
}
|
|
|
|
// AlertingEngineGets 拉取列表数据,用户要在页面上看到所有 n9e-server 实例列表,然后为其分配 cluster
|
|
func AlertingEngineGets(ctx *ctx.Context, where string, args ...interface{}) ([]*AlertingEngines, error) {
|
|
var objs []*AlertingEngines
|
|
var err error
|
|
session := DB(ctx).Order("instance")
|
|
if where == "" {
|
|
err = session.Find(&objs).Error
|
|
} else {
|
|
err = session.Where(where, args...).Find(&objs).Error
|
|
}
|
|
return objs, err
|
|
}
|
|
|
|
func AlertingEngineGet(ctx *ctx.Context, where string, args ...interface{}) (*AlertingEngines, error) {
|
|
lst, err := AlertingEngineGets(ctx, where, args...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(lst) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
return lst[0], nil
|
|
}
|
|
|
|
func AlertingEngineGetsClusters(ctx *ctx.Context, where string, args ...interface{}) ([]string, error) {
|
|
var arr []string
|
|
var err error
|
|
session := DB(ctx).Model(new(AlertingEngines)).Where("engine_cluster != ''").Order("engine_cluster").Distinct("engine_cluster")
|
|
if where == "" {
|
|
err = session.Pluck("engine_cluster", &arr).Error
|
|
} else {
|
|
err = session.Where(where, args...).Pluck("engine_cluster", &arr).Error
|
|
}
|
|
return arr, err
|
|
}
|
|
|
|
func AlertingEngineGetsInstances(ctx *ctx.Context, where string, args ...interface{}) ([]string, error) {
|
|
var arr []string
|
|
var err error
|
|
session := DB(ctx).Model(new(AlertingEngines)).Order("instance")
|
|
if where == "" {
|
|
err = session.Pluck("instance", &arr).Error
|
|
} else {
|
|
err = session.Where(where, args...).Pluck("instance", &arr).Error
|
|
}
|
|
return arr, err
|
|
}
|
|
|
|
type HeartbeatInfo struct {
|
|
Instance string `json:"instance"`
|
|
EngineCluster string `json:"engine_cluster"`
|
|
DatasourceId int64 `json:"datasource_id"`
|
|
}
|
|
|
|
func AlertingEngineHeartbeatWithCluster(ctx *ctx.Context, instance, cluster string, datasourceId int64) error {
|
|
if !ctx.IsCenter {
|
|
info := HeartbeatInfo{
|
|
Instance: instance,
|
|
EngineCluster: cluster,
|
|
DatasourceId: datasourceId,
|
|
}
|
|
err := poster.PostByUrls(ctx, "/v1/n9e/server-heartbeat", info)
|
|
return err
|
|
}
|
|
|
|
var total int64
|
|
err := DB(ctx).Model(new(AlertingEngines)).Where("instance=? and engine_cluster = ? and datasource_id=?", instance, cluster, datasourceId).Count(&total).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if total == 0 {
|
|
// insert
|
|
err = DB(ctx).Create(&AlertingEngines{
|
|
Instance: instance,
|
|
DatasourceId: datasourceId,
|
|
EngineCluster: cluster,
|
|
Clock: time.Now().Unix(),
|
|
}).Error
|
|
} else {
|
|
// updates
|
|
fields := map[string]interface{}{"clock": time.Now().Unix()}
|
|
err = DB(ctx).Model(new(AlertingEngines)).Where("instance=? and engine_cluster = ? and datasource_id=?", instance, cluster, datasourceId).Updates(fields).Error
|
|
}
|
|
|
|
return err
|
|
}
|