diff --git a/pkg/bk-monitor-worker/config/config.go b/pkg/bk-monitor-worker/config/config.go index f6a529bc2..3a8f09e10 100644 --- a/pkg/bk-monitor-worker/config/config.go +++ b/pkg/bk-monitor-worker/config/config.go @@ -232,6 +232,12 @@ var ( BkApiBcsCcApiUrl string // BkApiGseApiGwUrl bk-apigw bkgse base url BkApiGseApiGwUrl string + // SloPushGatewayApi 是否启用监控的apiGateway + BkMonitorApiGatewayEnabled bool + // BkMonitorApiGatewayBaseUrl 监控的apiGateway + BkMonitorApiGatewayBaseUrl string + // BkMonitorApiGatewayStage 监控的apiGateway的环境 + BkMonitorApiGatewayStage string // GoroutineLimit max size of task goroutine GoroutineLimit map[string]string @@ -404,6 +410,13 @@ func initVariables() { BkApiBcsCcApiUrl = GetValue("taskConfig.common.bkapi.bcsCcApiUrl", "") BkApiGseApiGwUrl = GetValue("taskConfig.common.bkapi.bkgseApiGwUrl", "") + // SloPushGatewayApi 是否启用监控的apiGateway + BkMonitorApiGatewayEnabled = GetValue("taskConfig.common.bkapi.bkmonitorApiGatewayEnabled", false) + // BkMonitorApiGatewayBaseUrl 监控的apiGateway + BkMonitorApiGatewayBaseUrl = GetValue("taskConfig.common.bkapi.bkmonitorApiGatewayBaseUrl", BkApiUrl) + // BkMonitorApiGatewayStage 监控的apiGateway的环境 + BkMonitorApiGatewayStage = GetValue("taskConfig.common.bkapi.bkmonitorApiGatewayStage", "stag") + GoroutineLimit = GetValue("taskConfig.common.goroutineLimit", map[string]string{}, viper.GetStringMapString) ESClusterMetricReportUrl = GetValue("taskConfig.logSearch.metric.reportUrl", "") diff --git a/pkg/bk-monitor-worker/config/metadata_config.go b/pkg/bk-monitor-worker/config/metadata_config.go index cd6225e66..a359eef74 100644 --- a/pkg/bk-monitor-worker/config/metadata_config.go +++ b/pkg/bk-monitor-worker/config/metadata_config.go @@ -123,6 +123,11 @@ var ( SkipInfluxdbTableIds []string // 是否可以删除 consul 路径 CanDeleteConsulPath bool + + // SloPushGatewayToken slo数据上报Token + SloPushGatewayToken string + // SloPushGatewayEndpoint slo数据上报端点 + SloPushGatewayEndpoint string ) func initMetadataVariables() { @@ -181,4 +186,7 @@ func initMetadataVariables() { BkdataIsAllowAllCmdbLevel = GetValue("taskConfig.metadata.bkdata.isAllowAllCmdbLevel", false) SkipInfluxdbTableIds = GetValue("taskConfig.metadata.global.skipInfluxdbTableIds", []string{}) CanDeleteConsulPath = GetValue("taskConfig.metadata.global.CanDeleteConsulPath", false) + + SloPushGatewayToken = GetValue("taskConfig.metadata.slo.sloPushGatewayToken", "") + SloPushGatewayEndpoint = GetValue("taskConfig.metadata.slo.sloPushGatewayEndpoint", "") } diff --git a/pkg/bk-monitor-worker/internal/api/client.go b/pkg/bk-monitor-worker/internal/api/client.go index bced598b8..53236bd8e 100644 --- a/pkg/bk-monitor-worker/internal/api/client.go +++ b/pkg/bk-monitor-worker/internal/api/client.go @@ -28,6 +28,7 @@ import ( "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/internal/api/cmdb" apiDefine "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/internal/api/define" "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/internal/api/metadata" + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/internal/api/monitor" "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/internal/api/nodeman" "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/utils/jsonx" ) @@ -42,6 +43,7 @@ var ( muForNodemanApi sync.Mutex muForBkdataApi sync.Mutex muForMetadataApi sync.Mutex + muForMonitorApi sync.Mutex ) var ( @@ -54,6 +56,7 @@ var ( nodemanApi *nodeman.Client bkdataApi *bkdata.Client metadataApi *metadata.Client + monitorApi *monitor.Client ) // GetGseApi 获取GseApi客户端 @@ -272,6 +275,41 @@ func GetMetadataApi() (*metadata.Client, error) { return metadataApi, nil } +// GetMonitorApi 获取metadataApi客户端 +func GetMonitorApi() (*monitor.Client, error) { + muForMonitorApi.Lock() + defer muForMonitorApi.Unlock() + if monitorApi != nil { + return monitorApi, nil + } + var config define.ClientConfigProvider + useBkMonitorApigw := cfg.BkMonitorApiGatewayEnabled + if useBkMonitorApigw { + config = bkapi.ClientConfig{ + Endpoint: cfg.BkMonitorApiGatewayBaseUrl, + Stage: cfg.BkMonitorApiGatewayStage, + AppCode: cfg.BkApiAppCode, + AppSecret: cfg.BkApiAppSecret, + JsonMarshaler: jsonx.Marshal, + } + } else { + config = bkapi.ClientConfig{ + Endpoint: fmt.Sprintf("%s/api/c/compapi/v2/monitor_v3/", cfg.BkApiUrl), + Stage: cfg.BkApiStage, + AppCode: cfg.BkApiAppCode, + AppSecret: cfg.BkApiAppSecret, + JsonMarshaler: jsonx.Marshal, + AuthorizationParams: map[string]string{"bk_username": "admin"}, + } + } + var err error + monitorApi, err = monitor.New(useBkMonitorApigw, config, bkapi.OptJsonResultProvider(), bkapi.OptJsonBodyProvider()) + if err != nil { + return nil, err + } + return monitorApi, nil +} + // HeaderProvider provide request header. type HeaderProvider struct { Header map[string]string diff --git a/pkg/bk-monitor-worker/internal/api/monitor/monitor.go b/pkg/bk-monitor-worker/internal/api/monitor/monitor.go new file mode 100644 index 000000000..22ebdf56b --- /dev/null +++ b/pkg/bk-monitor-worker/internal/api/monitor/monitor.go @@ -0,0 +1,41 @@ +// Tencent is pleased to support the open source community by making +// 蓝鲸智云 - 监控平台 (BlueKing - Monitor) available. +// Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +package monitor + +import ( + "github.com/TencentBlueKing/bk-apigateway-sdks/core/bkapi" + "github.com/TencentBlueKing/bk-apigateway-sdks/core/define" +) + +// Client for metadata +type Client struct { + define.BkApiClient + useBkMonitorApigw bool +} + +// New monitor client +func New(useBkMonitorApigw bool, configProvider define.ClientConfigProvider, opts ...define.BkApiClientOption) (*Client, error) { + client, err := bkapi.NewBkApiClient("monitor_v3", configProvider, opts...) + if err != nil { + return nil, err + } + + return &Client{BkApiClient: client, useBkMonitorApigw: useBkMonitorApigw}, nil +} + +// SearchAlert for monitor resource search_alert +func (c *Client) SearchAlert(opts ...define.OperationOption) define.Operation { + path := "search_alert" + return c.BkApiClient.NewOperation(bkapi.OperationConfig{ + Name: "search_alert", + Method: "POST", + Path: path, + }, opts...) +} diff --git a/pkg/bk-monitor-worker/internal/api/monitor/response.go b/pkg/bk-monitor-worker/internal/api/monitor/response.go new file mode 100644 index 000000000..042289b63 --- /dev/null +++ b/pkg/bk-monitor-worker/internal/api/monitor/response.go @@ -0,0 +1,34 @@ +// Tencent is pleased to support the open source community by making +// 蓝鲸智云 - 监控平台 (BlueKing - Monitor) available. +// Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +package monitor + +import ( + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/internal/api/define" +) + +type SearchAlertResp struct { + define.ApiCommonRespMeta + Data SearchAlertData `json:"data"` +} + +type SearchAlertData struct { + Total int `json:"total"` + Alerts []SearchAlertDataInfo `json:"alerts"` +} +type SearchAlertDataInfo struct { + BkBizID int32 `json:"bk_biz_id"` + BkBizName string `json:"bk_biz_name"` + StrategyID int32 `json:"strategy_id"` + StrategyName string `json:"strategy_name"` + FirstAnomalyTime int64 `json:"first_anomaly_time"` + LatestTime int64 `json:"latest_time"` + EventID string `json:"event_id"` + Status string `json:"status"` +} diff --git a/pkg/bk-monitor-worker/internal/metadata/apiservice/monitor.go b/pkg/bk-monitor-worker/internal/metadata/apiservice/monitor.go new file mode 100644 index 000000000..b4404a8d0 --- /dev/null +++ b/pkg/bk-monitor-worker/internal/metadata/apiservice/monitor.go @@ -0,0 +1,45 @@ +// Tencent is pleased to support the open source community by making +// 蓝鲸智云 - 监控平台 (BlueKing - Monitor) available. +// Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +package apiservice + +import ( + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/internal/api" + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/internal/api/monitor" + "github.com/pkg/errors" +) + +var Monitor MonitorService + +type MonitorService struct{} + +// SearchAlert 获取告警数据 +func (MonitorService) SearchAlert(conditions []map[string]interface{}, startTime int64, endTime int64, page int, pageSize int, BkBizID int32) (*monitor.SearchAlertData, error) { + monitorApi, err := api.GetMonitorApi() + if err != nil { + return nil, errors.Wrap(err, "GetMonitorApi failed") + } + var resp monitor.SearchAlertResp + var params = map[string]interface{}{ + "bk_biz_ids": []int{int(BkBizID)}, + "start_time": startTime, + "end_time": endTime, + "page": page, + "page_size": pageSize, + "conditions": conditions, + } + _, err = monitorApi.SearchAlert().SetBody(params).SetResult(&resp).Request() + if err != nil { + return nil, errors.Wrap(err, "SearchAlert failed") + } + if err := resp.Err(); err != nil { + return nil, errors.Wrap(err, "SearchAlert failed") + } + return &resp.Data, nil +} diff --git a/pkg/bk-monitor-worker/internal/metadata/models/slo/alarm_query_config_v2.go b/pkg/bk-monitor-worker/internal/metadata/models/slo/alarm_query_config_v2.go new file mode 100644 index 000000000..780d7d87b --- /dev/null +++ b/pkg/bk-monitor-worker/internal/metadata/models/slo/alarm_query_config_v2.go @@ -0,0 +1,29 @@ +// Tencent is pleased to support the open source community by making +// 蓝鲸智云 - 监控平台 (BlueKing - Monitor) available. +// Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +package slo + +const TableNameAlarmQueryConfigV2 = "alarm_query_config_v2" + +// AlarmQueryConfigV2 mapped from table +type AlarmQueryConfigV2 struct { + ID int32 `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"` + StrategyID int32 `gorm:"column:strategy_id;not null" json:"strategy_id"` + ItemID int32 `gorm:"column:item_id;not null" json:"item_id"` + Alias string `gorm:"column:alias;not null" json:"alias"` + DataSourceLabel string `gorm:"column:data_source_label;not null" json:"data_source_label"` + DataTypeLabel string `gorm:"column:data_type_label;not null" json:"data_type_label"` + MetricID string `gorm:"column:metric_id;not null" json:"metric_id"` + Config string `gorm:"column:config;not null" json:"config"` +} + +// TableName AlarmQueryConfigV2's table name +func (*AlarmQueryConfigV2) TableName() string { + return TableNameAlarmQueryConfigV2 +} diff --git a/pkg/bk-monitor-worker/internal/metadata/models/slo/alarm_strategy_label_2.go b/pkg/bk-monitor-worker/internal/metadata/models/slo/alarm_strategy_label_2.go new file mode 100755 index 000000000..bce741be0 --- /dev/null +++ b/pkg/bk-monitor-worker/internal/metadata/models/slo/alarm_strategy_label_2.go @@ -0,0 +1,23 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package slo + +const TableNameAlarmStrategyLabel = "alarm_strategy_label" + +//go:generate goqueryset -in alarm_strategy_label.go -out qs_alarm_strategy_label_gen.go + +// AlarmStrategyLabel mapped from table +// gen:qs +type AlarmStrategyLabel struct { + ID int32 `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"` + LabelName string `gorm:"column:label_name;not null" json:"label_name"` + BkBizID int32 `gorm:"column:bk_biz_id;not null" json:"bk_biz_id"` + StrategyID int32 `gorm:"column:strategy_id;not null" json:"strategy_id"` +} + +// TableName AlarmStrategyLabel's table name +func (*AlarmStrategyLabel) TableName() string { + return TableNameAlarmStrategyLabel +} diff --git a/pkg/bk-monitor-worker/internal/metadata/models/slo/alarm_strategy_v2.go b/pkg/bk-monitor-worker/internal/metadata/models/slo/alarm_strategy_v2.go new file mode 100644 index 000000000..d6de8523f --- /dev/null +++ b/pkg/bk-monitor-worker/internal/metadata/models/slo/alarm_strategy_v2.go @@ -0,0 +1,46 @@ +// Tencent is pleased to support the open source community by making +// 蓝鲸智云 - 监控平台 (BlueKing - Monitor) available. +// Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +package slo + +import ( + "time" +) + +const TableNameAlarmStrategyV2 = "alarm_strategy_v2" + +//go:generate goqueryset -in alarm_strategy_v2.go -out qs_alarm_strategy_v2_gen.go + +// AlarmStrategyV2 mapped from table +type AlarmStrategyV2 struct { + ID int32 `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"` + Name string `gorm:"column:name;not null" json:"name"` + BkBizID int32 `gorm:"column:bk_biz_id;not null" json:"bk_biz_id"` + Source string `gorm:"column:source;not null" json:"source"` + Scenario string `gorm:"column:scenario;not null" json:"scenario"` + Type string `gorm:"column:type;not null" json:"type"` + IsEnabled bool `gorm:"column:is_enabled;not null" json:"is_enabled"` + CreateUser string `gorm:"column:create_user;not null" json:"create_user"` + CreateTime time.Time `gorm:"column:create_time;not null" json:"create_time"` + UpdateUser string `gorm:"column:update_user;not null" json:"update_user"` + UpdateTime time.Time `gorm:"column:update_time;not null" json:"update_time"` + IsInvalid bool `gorm:"column:is_invalid;not null" json:"is_invalid"` + InvalidType string `gorm:"column:invalid_type;not null" json:"invalid_type"` + App string `gorm:"column:app" json:"app"` + Hash string `gorm:"column:hash" json:"hash"` + Path string `gorm:"column:path" json:"path"` + Snippet string `gorm:"column:snippet" json:"snippet"` + Priority int32 `gorm:"column:priority" json:"priority"` + PriorityGroupKey string `gorm:"column:priority_group_key" json:"priority_group_key"` +} + +// TableName AlarmStrategyV2's table name +func (*AlarmStrategyV2) TableName() string { + return TableNameAlarmStrategyV2 +} diff --git a/pkg/bk-monitor-worker/internal/metadata/models/slo/qs_alarm_strategy_label_gen.go b/pkg/bk-monitor-worker/internal/metadata/models/slo/qs_alarm_strategy_label_gen.go new file mode 100755 index 000000000..e154adfdf --- /dev/null +++ b/pkg/bk-monitor-worker/internal/metadata/models/slo/qs_alarm_strategy_label_gen.go @@ -0,0 +1,512 @@ +// Code generated by go-queryset. DO NOT EDIT. +package slo + +import ( + "errors" + "fmt" + "strings" + + "github.com/jinzhu/gorm" +) + +// ===== BEGIN of all query sets + +// ===== BEGIN of query set AlarmStrategyLabelQuerySet + +// AlarmStrategyLabelQuerySet is an queryset type for AlarmStrategyLabel +type AlarmStrategyLabelQuerySet struct { + db *gorm.DB +} + +// NewAlarmStrategyLabelQuerySet constructs new AlarmStrategyLabelQuerySet +func NewAlarmStrategyLabelQuerySet(db *gorm.DB) AlarmStrategyLabelQuerySet { + return AlarmStrategyLabelQuerySet{ + db: db.Model(&AlarmStrategyLabel{}), + } +} + +func (qs AlarmStrategyLabelQuerySet) w(db *gorm.DB) AlarmStrategyLabelQuerySet { + return NewAlarmStrategyLabelQuerySet(db) +} + +func (qs AlarmStrategyLabelQuerySet) Select(fields ...AlarmStrategyLabelDBSchemaField) AlarmStrategyLabelQuerySet { + names := []string{} + for _, f := range fields { + names = append(names, f.String()) + } + + return qs.w(qs.db.Select(strings.Join(names, ","))) +} + +// Create is an autogenerated method +// nolint: dupl +func (o *AlarmStrategyLabel) Create(db *gorm.DB) error { + return db.Create(o).Error +} + +// Delete is an autogenerated method +// nolint: dupl +func (o *AlarmStrategyLabel) Delete(db *gorm.DB) error { + return db.Delete(o).Error +} + +// All is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) All(ret *[]AlarmStrategyLabel) error { + return qs.db.Find(ret).Error +} + +// BkBizIDEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) BkBizIDEq(bkBizID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("bk_biz_id = ?", bkBizID)) +} + +// BkBizIDGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) BkBizIDGt(bkBizID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("bk_biz_id > ?", bkBizID)) +} + +// BkBizIDGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) BkBizIDGte(bkBizID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("bk_biz_id >= ?", bkBizID)) +} + +// BkBizIDIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) BkBizIDIn(bkBizID ...int32) AlarmStrategyLabelQuerySet { + if len(bkBizID) == 0 { + qs.db.AddError(errors.New("must at least pass one bkBizID in BkBizIDIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("bk_biz_id IN (?)", bkBizID)) +} + +// BkBizIDLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) BkBizIDLt(bkBizID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("bk_biz_id < ?", bkBizID)) +} + +// BkBizIDLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) BkBizIDLte(bkBizID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("bk_biz_id <= ?", bkBizID)) +} + +// BkBizIDNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) BkBizIDNe(bkBizID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("bk_biz_id != ?", bkBizID)) +} + +// BkBizIDNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) BkBizIDNotIn(bkBizID ...int32) AlarmStrategyLabelQuerySet { + if len(bkBizID) == 0 { + qs.db.AddError(errors.New("must at least pass one bkBizID in BkBizIDNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("bk_biz_id NOT IN (?)", bkBizID)) +} + +// Count is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) Count() (int, error) { + var count int + err := qs.db.Count(&count).Error + return count, err +} + +// Delete is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) Delete() error { + return qs.db.Delete(AlarmStrategyLabel{}).Error +} + +// DeleteNum is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) DeleteNum() (int64, error) { + db := qs.db.Delete(AlarmStrategyLabel{}) + return db.RowsAffected, db.Error +} + +// DeleteNumUnscoped is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) DeleteNumUnscoped() (int64, error) { + db := qs.db.Unscoped().Delete(AlarmStrategyLabel{}) + return db.RowsAffected, db.Error +} + +// GetDB is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) GetDB() *gorm.DB { + return qs.db +} + +// GetUpdater is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) GetUpdater() AlarmStrategyLabelUpdater { + return NewAlarmStrategyLabelUpdater(qs.db) +} + +// IDEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) IDEq(ID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("id = ?", ID)) +} + +// IDGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) IDGt(ID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("id > ?", ID)) +} + +// IDGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) IDGte(ID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("id >= ?", ID)) +} + +// IDIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) IDIn(ID ...int32) AlarmStrategyLabelQuerySet { + if len(ID) == 0 { + qs.db.AddError(errors.New("must at least pass one ID in IDIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("id IN (?)", ID)) +} + +// IDLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) IDLt(ID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("id < ?", ID)) +} + +// IDLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) IDLte(ID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("id <= ?", ID)) +} + +// IDNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) IDNe(ID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("id != ?", ID)) +} + +// IDNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) IDNotIn(ID ...int32) AlarmStrategyLabelQuerySet { + if len(ID) == 0 { + qs.db.AddError(errors.New("must at least pass one ID in IDNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("id NOT IN (?)", ID)) +} + +// LabelNameEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) LabelNameEq(labelName string) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("label_name = ?", labelName)) +} + +// LabelNameGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) LabelNameGt(labelName string) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("label_name > ?", labelName)) +} + +// LabelNameGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) LabelNameGte(labelName string) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("label_name >= ?", labelName)) +} + +// LabelNameIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) LabelNameIn(labelName ...string) AlarmStrategyLabelQuerySet { + if len(labelName) == 0 { + qs.db.AddError(errors.New("must at least pass one labelName in LabelNameIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("label_name IN (?)", labelName)) +} + +// LabelNameLike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) LabelNameLike(labelName string) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("label_name LIKE ?", labelName)) +} + +// LabelNameLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) LabelNameLt(labelName string) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("label_name < ?", labelName)) +} + +// LabelNameLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) LabelNameLte(labelName string) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("label_name <= ?", labelName)) +} + +// LabelNameNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) LabelNameNe(labelName string) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("label_name != ?", labelName)) +} + +// LabelNameNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) LabelNameNotIn(labelName ...string) AlarmStrategyLabelQuerySet { + if len(labelName) == 0 { + qs.db.AddError(errors.New("must at least pass one labelName in LabelNameNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("label_name NOT IN (?)", labelName)) +} + +// LabelNameNotlike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) LabelNameNotlike(labelName string) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("label_name NOT LIKE ?", labelName)) +} + +// Limit is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) Limit(limit int) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Limit(limit)) +} + +// Offset is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) Offset(offset int) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Offset(offset)) +} + +// One is used to retrieve one result. It returns gorm.ErrRecordNotFound +// if nothing was fetched +func (qs AlarmStrategyLabelQuerySet) One(ret *AlarmStrategyLabel) error { + return qs.db.First(ret).Error +} + +// OrderAscByBkBizID is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) OrderAscByBkBizID() AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Order("bk_biz_id ASC")) +} + +// OrderAscByID is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) OrderAscByID() AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Order("id ASC")) +} + +// OrderAscByLabelName is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) OrderAscByLabelName() AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Order("label_name ASC")) +} + +// OrderAscByStrategyID is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) OrderAscByStrategyID() AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Order("strategy_id ASC")) +} + +// OrderDescByBkBizID is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) OrderDescByBkBizID() AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Order("bk_biz_id DESC")) +} + +// OrderDescByID is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) OrderDescByID() AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Order("id DESC")) +} + +// OrderDescByLabelName is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) OrderDescByLabelName() AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Order("label_name DESC")) +} + +// OrderDescByStrategyID is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) OrderDescByStrategyID() AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Order("strategy_id DESC")) +} + +// StrategyIDEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) StrategyIDEq(strategyID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("strategy_id = ?", strategyID)) +} + +// StrategyIDGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) StrategyIDGt(strategyID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("strategy_id > ?", strategyID)) +} + +// StrategyIDGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) StrategyIDGte(strategyID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("strategy_id >= ?", strategyID)) +} + +// StrategyIDIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) StrategyIDIn(strategyID ...int32) AlarmStrategyLabelQuerySet { + if len(strategyID) == 0 { + qs.db.AddError(errors.New("must at least pass one strategyID in StrategyIDIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("strategy_id IN (?)", strategyID)) +} + +// StrategyIDLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) StrategyIDLt(strategyID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("strategy_id < ?", strategyID)) +} + +// StrategyIDLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) StrategyIDLte(strategyID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("strategy_id <= ?", strategyID)) +} + +// StrategyIDNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) StrategyIDNe(strategyID int32) AlarmStrategyLabelQuerySet { + return qs.w(qs.db.Where("strategy_id != ?", strategyID)) +} + +// StrategyIDNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyLabelQuerySet) StrategyIDNotIn(strategyID ...int32) AlarmStrategyLabelQuerySet { + if len(strategyID) == 0 { + qs.db.AddError(errors.New("must at least pass one strategyID in StrategyIDNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("strategy_id NOT IN (?)", strategyID)) +} + +// SetBkBizID is an autogenerated method +// nolint: dupl +func (u AlarmStrategyLabelUpdater) SetBkBizID(bkBizID int32) AlarmStrategyLabelUpdater { + u.fields[string(AlarmStrategyLabelDBSchema.BkBizID)] = bkBizID + return u +} + +// SetID is an autogenerated method +// nolint: dupl +func (u AlarmStrategyLabelUpdater) SetID(ID int32) AlarmStrategyLabelUpdater { + u.fields[string(AlarmStrategyLabelDBSchema.ID)] = ID + return u +} + +// SetLabelName is an autogenerated method +// nolint: dupl +func (u AlarmStrategyLabelUpdater) SetLabelName(labelName string) AlarmStrategyLabelUpdater { + u.fields[string(AlarmStrategyLabelDBSchema.LabelName)] = labelName + return u +} + +// SetStrategyID is an autogenerated method +// nolint: dupl +func (u AlarmStrategyLabelUpdater) SetStrategyID(strategyID int32) AlarmStrategyLabelUpdater { + u.fields[string(AlarmStrategyLabelDBSchema.StrategyID)] = strategyID + return u +} + +// Update is an autogenerated method +// nolint: dupl +func (u AlarmStrategyLabelUpdater) Update() error { + return u.db.Updates(u.fields).Error +} + +// UpdateNum is an autogenerated method +// nolint: dupl +func (u AlarmStrategyLabelUpdater) UpdateNum() (int64, error) { + db := u.db.Updates(u.fields) + return db.RowsAffected, db.Error +} + +// ===== END of query set AlarmStrategyLabelQuerySet + +// ===== BEGIN of AlarmStrategyLabel modifiers + +// AlarmStrategyLabelDBSchemaField describes database schema field. It requires for method 'Update' +type AlarmStrategyLabelDBSchemaField string + +// String method returns string representation of field. +// nolint: dupl +func (f AlarmStrategyLabelDBSchemaField) String() string { + return string(f) +} + +// AlarmStrategyLabelDBSchema stores db field names of AlarmStrategyLabel +var AlarmStrategyLabelDBSchema = struct { + ID AlarmStrategyLabelDBSchemaField + LabelName AlarmStrategyLabelDBSchemaField + BkBizID AlarmStrategyLabelDBSchemaField + StrategyID AlarmStrategyLabelDBSchemaField +}{ + + ID: AlarmStrategyLabelDBSchemaField("id"), + LabelName: AlarmStrategyLabelDBSchemaField("label_name"), + BkBizID: AlarmStrategyLabelDBSchemaField("bk_biz_id"), + StrategyID: AlarmStrategyLabelDBSchemaField("strategy_id"), +} + +// Update updates AlarmStrategyLabel fields by primary key +// nolint: dupl +func (o *AlarmStrategyLabel) Update(db *gorm.DB, fields ...AlarmStrategyLabelDBSchemaField) error { + dbNameToFieldName := map[string]interface{}{ + "id": o.ID, + "label_name": o.LabelName, + "bk_biz_id": o.BkBizID, + "strategy_id": o.StrategyID, + } + u := map[string]interface{}{} + for _, f := range fields { + fs := f.String() + u[fs] = dbNameToFieldName[fs] + } + if err := db.Model(o).Updates(u).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return err + } + + return fmt.Errorf("can't update AlarmStrategyLabel %v fields %v: %s", + o, fields, err) + } + + return nil +} + +// AlarmStrategyLabelUpdater is an AlarmStrategyLabel updates manager +type AlarmStrategyLabelUpdater struct { + fields map[string]interface{} + db *gorm.DB +} + +// NewAlarmStrategyLabelUpdater creates new AlarmStrategyLabel updater +// nolint: dupl +func NewAlarmStrategyLabelUpdater(db *gorm.DB) AlarmStrategyLabelUpdater { + return AlarmStrategyLabelUpdater{ + fields: map[string]interface{}{}, + db: db.Model(&AlarmStrategyLabel{}), + } +} + +// ===== END of AlarmStrategyLabel modifiers + +// ===== END of all query sets diff --git a/pkg/bk-monitor-worker/internal/metadata/models/slo/qs_alarm_strategy_v2_gen.go b/pkg/bk-monitor-worker/internal/metadata/models/slo/qs_alarm_strategy_v2_gen.go new file mode 100644 index 000000000..3af1c21e4 --- /dev/null +++ b/pkg/bk-monitor-worker/internal/metadata/models/slo/qs_alarm_strategy_v2_gen.go @@ -0,0 +1,1727 @@ +// Code generated by go-queryset. DO NOT EDIT. +package slo + +import ( + "errors" + "fmt" + "strings" + "time" + + "github.com/jinzhu/gorm" +) + +// ===== BEGIN of all query sets + +// ===== BEGIN of query set AlarmStrategyV2QuerySet + +// AlarmStrategyV2QuerySet is an queryset type for AlarmStrategyV2 +type AlarmStrategyV2QuerySet struct { + db *gorm.DB +} + +// NewAlarmStrategyV2QuerySet constructs new AlarmStrategyV2QuerySet +func NewAlarmStrategyV2QuerySet(db *gorm.DB) AlarmStrategyV2QuerySet { + return AlarmStrategyV2QuerySet{ + db: db.Model(&AlarmStrategyV2{}), + } +} + +func (qs AlarmStrategyV2QuerySet) w(db *gorm.DB) AlarmStrategyV2QuerySet { + return NewAlarmStrategyV2QuerySet(db) +} + +func (qs AlarmStrategyV2QuerySet) Select(fields ...AlarmStrategyV2DBSchemaField) AlarmStrategyV2QuerySet { + names := []string{} + for _, f := range fields { + names = append(names, f.String()) + } + + return qs.w(qs.db.Select(strings.Join(names, ","))) +} + +// Create is an autogenerated method +// nolint: dupl +func (o *AlarmStrategyV2) Create(db *gorm.DB) error { + return db.Create(o).Error +} + +// Delete is an autogenerated method +// nolint: dupl +func (o *AlarmStrategyV2) Delete(db *gorm.DB) error { + return db.Delete(o).Error +} + +// All is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) All(ret *[]AlarmStrategyV2) error { + return qs.db.Find(ret).Error +} + +// AppEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) AppEq(app string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("app = ?", app)) +} + +// AppGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) AppGt(app string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("app > ?", app)) +} + +// AppGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) AppGte(app string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("app >= ?", app)) +} + +// AppIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) AppIn(app ...string) AlarmStrategyV2QuerySet { + if len(app) == 0 { + qs.db.AddError(errors.New("must at least pass one app in AppIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("app IN (?)", app)) +} + +// AppLike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) AppLike(app string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("app LIKE ?", app)) +} + +// AppLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) AppLt(app string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("app < ?", app)) +} + +// AppLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) AppLte(app string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("app <= ?", app)) +} + +// AppNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) AppNe(app string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("app != ?", app)) +} + +// AppNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) AppNotIn(app ...string) AlarmStrategyV2QuerySet { + if len(app) == 0 { + qs.db.AddError(errors.New("must at least pass one app in AppNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("app NOT IN (?)", app)) +} + +// AppNotlike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) AppNotlike(app string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("app NOT LIKE ?", app)) +} + +// BkBizIDEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) BkBizIDEq(bkBizID int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("bk_biz_id = ?", bkBizID)) +} + +// BkBizIDGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) BkBizIDGt(bkBizID int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("bk_biz_id > ?", bkBizID)) +} + +// BkBizIDGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) BkBizIDGte(bkBizID int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("bk_biz_id >= ?", bkBizID)) +} + +// BkBizIDIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) BkBizIDIn(bkBizID ...int32) AlarmStrategyV2QuerySet { + if len(bkBizID) == 0 { + qs.db.AddError(errors.New("must at least pass one bkBizID in BkBizIDIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("bk_biz_id IN (?)", bkBizID)) +} + +// BkBizIDLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) BkBizIDLt(bkBizID int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("bk_biz_id < ?", bkBizID)) +} + +// BkBizIDLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) BkBizIDLte(bkBizID int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("bk_biz_id <= ?", bkBizID)) +} + +// BkBizIDNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) BkBizIDNe(bkBizID int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("bk_biz_id != ?", bkBizID)) +} + +// BkBizIDNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) BkBizIDNotIn(bkBizID ...int32) AlarmStrategyV2QuerySet { + if len(bkBizID) == 0 { + qs.db.AddError(errors.New("must at least pass one bkBizID in BkBizIDNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("bk_biz_id NOT IN (?)", bkBizID)) +} + +// Count is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) Count() (int, error) { + var count int + err := qs.db.Count(&count).Error + return count, err +} + +// CreateTimeEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateTimeEq(createTime time.Time) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("create_time = ?", createTime)) +} + +// CreateTimeGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateTimeGt(createTime time.Time) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("create_time > ?", createTime)) +} + +// CreateTimeGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateTimeGte(createTime time.Time) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("create_time >= ?", createTime)) +} + +// CreateTimeLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateTimeLt(createTime time.Time) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("create_time < ?", createTime)) +} + +// CreateTimeLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateTimeLte(createTime time.Time) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("create_time <= ?", createTime)) +} + +// CreateTimeNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateTimeNe(createTime time.Time) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("create_time != ?", createTime)) +} + +// CreateUserEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateUserEq(createUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("create_user = ?", createUser)) +} + +// CreateUserGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateUserGt(createUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("create_user > ?", createUser)) +} + +// CreateUserGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateUserGte(createUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("create_user >= ?", createUser)) +} + +// CreateUserIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateUserIn(createUser ...string) AlarmStrategyV2QuerySet { + if len(createUser) == 0 { + qs.db.AddError(errors.New("must at least pass one createUser in CreateUserIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("create_user IN (?)", createUser)) +} + +// CreateUserLike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateUserLike(createUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("create_user LIKE ?", createUser)) +} + +// CreateUserLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateUserLt(createUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("create_user < ?", createUser)) +} + +// CreateUserLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateUserLte(createUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("create_user <= ?", createUser)) +} + +// CreateUserNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateUserNe(createUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("create_user != ?", createUser)) +} + +// CreateUserNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateUserNotIn(createUser ...string) AlarmStrategyV2QuerySet { + if len(createUser) == 0 { + qs.db.AddError(errors.New("must at least pass one createUser in CreateUserNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("create_user NOT IN (?)", createUser)) +} + +// CreateUserNotlike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) CreateUserNotlike(createUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("create_user NOT LIKE ?", createUser)) +} + +// Delete is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) Delete() error { + return qs.db.Delete(AlarmStrategyV2{}).Error +} + +// DeleteNum is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) DeleteNum() (int64, error) { + db := qs.db.Delete(AlarmStrategyV2{}) + return db.RowsAffected, db.Error +} + +// DeleteNumUnscoped is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) DeleteNumUnscoped() (int64, error) { + db := qs.db.Unscoped().Delete(AlarmStrategyV2{}) + return db.RowsAffected, db.Error +} + +// GetDB is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) GetDB() *gorm.DB { + return qs.db +} + +// GetUpdater is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) GetUpdater() AlarmStrategyV2Updater { + return NewAlarmStrategyV2Updater(qs.db) +} + +// HashEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) HashEq(hash string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("hash = ?", hash)) +} + +// HashGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) HashGt(hash string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("hash > ?", hash)) +} + +// HashGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) HashGte(hash string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("hash >= ?", hash)) +} + +// HashIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) HashIn(hash ...string) AlarmStrategyV2QuerySet { + if len(hash) == 0 { + qs.db.AddError(errors.New("must at least pass one hash in HashIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("hash IN (?)", hash)) +} + +// HashLike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) HashLike(hash string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("hash LIKE ?", hash)) +} + +// HashLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) HashLt(hash string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("hash < ?", hash)) +} + +// HashLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) HashLte(hash string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("hash <= ?", hash)) +} + +// HashNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) HashNe(hash string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("hash != ?", hash)) +} + +// HashNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) HashNotIn(hash ...string) AlarmStrategyV2QuerySet { + if len(hash) == 0 { + qs.db.AddError(errors.New("must at least pass one hash in HashNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("hash NOT IN (?)", hash)) +} + +// HashNotlike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) HashNotlike(hash string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("hash NOT LIKE ?", hash)) +} + +// IDEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IDEq(ID int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("id = ?", ID)) +} + +// IDGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IDGt(ID int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("id > ?", ID)) +} + +// IDGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IDGte(ID int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("id >= ?", ID)) +} + +// IDIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IDIn(ID ...int32) AlarmStrategyV2QuerySet { + if len(ID) == 0 { + qs.db.AddError(errors.New("must at least pass one ID in IDIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("id IN (?)", ID)) +} + +// IDLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IDLt(ID int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("id < ?", ID)) +} + +// IDLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IDLte(ID int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("id <= ?", ID)) +} + +// IDNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IDNe(ID int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("id != ?", ID)) +} + +// IDNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IDNotIn(ID ...int32) AlarmStrategyV2QuerySet { + if len(ID) == 0 { + qs.db.AddError(errors.New("must at least pass one ID in IDNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("id NOT IN (?)", ID)) +} + +// InvalidTypeEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) InvalidTypeEq(invalidType string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("invalid_type = ?", invalidType)) +} + +// InvalidTypeGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) InvalidTypeGt(invalidType string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("invalid_type > ?", invalidType)) +} + +// InvalidTypeGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) InvalidTypeGte(invalidType string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("invalid_type >= ?", invalidType)) +} + +// InvalidTypeIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) InvalidTypeIn(invalidType ...string) AlarmStrategyV2QuerySet { + if len(invalidType) == 0 { + qs.db.AddError(errors.New("must at least pass one invalidType in InvalidTypeIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("invalid_type IN (?)", invalidType)) +} + +// InvalidTypeLike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) InvalidTypeLike(invalidType string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("invalid_type LIKE ?", invalidType)) +} + +// InvalidTypeLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) InvalidTypeLt(invalidType string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("invalid_type < ?", invalidType)) +} + +// InvalidTypeLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) InvalidTypeLte(invalidType string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("invalid_type <= ?", invalidType)) +} + +// InvalidTypeNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) InvalidTypeNe(invalidType string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("invalid_type != ?", invalidType)) +} + +// InvalidTypeNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) InvalidTypeNotIn(invalidType ...string) AlarmStrategyV2QuerySet { + if len(invalidType) == 0 { + qs.db.AddError(errors.New("must at least pass one invalidType in InvalidTypeNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("invalid_type NOT IN (?)", invalidType)) +} + +// InvalidTypeNotlike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) InvalidTypeNotlike(invalidType string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("invalid_type NOT LIKE ?", invalidType)) +} + +// IsEnabledEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IsEnabledEq(isEnabled bool) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("is_enabled = ?", isEnabled)) +} + +// IsEnabledIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IsEnabledIn(isEnabled ...bool) AlarmStrategyV2QuerySet { + if len(isEnabled) == 0 { + qs.db.AddError(errors.New("must at least pass one isEnabled in IsEnabledIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("is_enabled IN (?)", isEnabled)) +} + +// IsEnabledNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IsEnabledNe(isEnabled bool) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("is_enabled != ?", isEnabled)) +} + +// IsEnabledNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IsEnabledNotIn(isEnabled ...bool) AlarmStrategyV2QuerySet { + if len(isEnabled) == 0 { + qs.db.AddError(errors.New("must at least pass one isEnabled in IsEnabledNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("is_enabled NOT IN (?)", isEnabled)) +} + +// IsInvalidEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IsInvalidEq(isInvalid bool) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("is_invalid = ?", isInvalid)) +} + +// IsInvalidIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IsInvalidIn(isInvalid ...bool) AlarmStrategyV2QuerySet { + if len(isInvalid) == 0 { + qs.db.AddError(errors.New("must at least pass one isInvalid in IsInvalidIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("is_invalid IN (?)", isInvalid)) +} + +// IsInvalidNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IsInvalidNe(isInvalid bool) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("is_invalid != ?", isInvalid)) +} + +// IsInvalidNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) IsInvalidNotIn(isInvalid ...bool) AlarmStrategyV2QuerySet { + if len(isInvalid) == 0 { + qs.db.AddError(errors.New("must at least pass one isInvalid in IsInvalidNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("is_invalid NOT IN (?)", isInvalid)) +} + +// Limit is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) Limit(limit int) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Limit(limit)) +} + +// NameEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) NameEq(name string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("name = ?", name)) +} + +// NameGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) NameGt(name string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("name > ?", name)) +} + +// NameGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) NameGte(name string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("name >= ?", name)) +} + +// NameIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) NameIn(name ...string) AlarmStrategyV2QuerySet { + if len(name) == 0 { + qs.db.AddError(errors.New("must at least pass one name in NameIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("name IN (?)", name)) +} + +// NameLike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) NameLike(name string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("name LIKE ?", name)) +} + +// NameLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) NameLt(name string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("name < ?", name)) +} + +// NameLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) NameLte(name string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("name <= ?", name)) +} + +// NameNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) NameNe(name string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("name != ?", name)) +} + +// NameNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) NameNotIn(name ...string) AlarmStrategyV2QuerySet { + if len(name) == 0 { + qs.db.AddError(errors.New("must at least pass one name in NameNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("name NOT IN (?)", name)) +} + +// NameNotlike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) NameNotlike(name string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("name NOT LIKE ?", name)) +} + +// Offset is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) Offset(offset int) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Offset(offset)) +} + +// One is used to retrieve one result. It returns gorm.ErrRecordNotFound +// if nothing was fetched +func (qs AlarmStrategyV2QuerySet) One(ret *AlarmStrategyV2) error { + return qs.db.First(ret).Error +} + +// OrderAscByApp is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByApp() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("app ASC")) +} + +// OrderAscByBkBizID is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByBkBizID() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("bk_biz_id ASC")) +} + +// OrderAscByCreateTime is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByCreateTime() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("create_time ASC")) +} + +// OrderAscByCreateUser is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByCreateUser() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("create_user ASC")) +} + +// OrderAscByHash is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByHash() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("hash ASC")) +} + +// OrderAscByID is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByID() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("id ASC")) +} + +// OrderAscByInvalidType is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByInvalidType() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("invalid_type ASC")) +} + +// OrderAscByIsEnabled is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByIsEnabled() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("is_enabled ASC")) +} + +// OrderAscByIsInvalid is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByIsInvalid() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("is_invalid ASC")) +} + +// OrderAscByName is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByName() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("name ASC")) +} + +// OrderAscByPath is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByPath() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("path ASC")) +} + +// OrderAscByPriority is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByPriority() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("priority ASC")) +} + +// OrderAscByPriorityGroupKey is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByPriorityGroupKey() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("priority_group_key ASC")) +} + +// OrderAscByScenario is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByScenario() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("scenario ASC")) +} + +// OrderAscBySnippet is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscBySnippet() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("snippet ASC")) +} + +// OrderAscBySource is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscBySource() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("source ASC")) +} + +// OrderAscByType is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByType() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("type ASC")) +} + +// OrderAscByUpdateTime is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByUpdateTime() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("update_time ASC")) +} + +// OrderAscByUpdateUser is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderAscByUpdateUser() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("update_user ASC")) +} + +// OrderDescByApp is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByApp() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("app DESC")) +} + +// OrderDescByBkBizID is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByBkBizID() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("bk_biz_id DESC")) +} + +// OrderDescByCreateTime is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByCreateTime() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("create_time DESC")) +} + +// OrderDescByCreateUser is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByCreateUser() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("create_user DESC")) +} + +// OrderDescByHash is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByHash() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("hash DESC")) +} + +// OrderDescByID is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByID() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("id DESC")) +} + +// OrderDescByInvalidType is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByInvalidType() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("invalid_type DESC")) +} + +// OrderDescByIsEnabled is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByIsEnabled() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("is_enabled DESC")) +} + +// OrderDescByIsInvalid is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByIsInvalid() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("is_invalid DESC")) +} + +// OrderDescByName is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByName() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("name DESC")) +} + +// OrderDescByPath is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByPath() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("path DESC")) +} + +// OrderDescByPriority is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByPriority() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("priority DESC")) +} + +// OrderDescByPriorityGroupKey is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByPriorityGroupKey() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("priority_group_key DESC")) +} + +// OrderDescByScenario is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByScenario() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("scenario DESC")) +} + +// OrderDescBySnippet is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescBySnippet() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("snippet DESC")) +} + +// OrderDescBySource is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescBySource() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("source DESC")) +} + +// OrderDescByType is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByType() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("type DESC")) +} + +// OrderDescByUpdateTime is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByUpdateTime() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("update_time DESC")) +} + +// OrderDescByUpdateUser is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) OrderDescByUpdateUser() AlarmStrategyV2QuerySet { + return qs.w(qs.db.Order("update_user DESC")) +} + +// PathEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PathEq(path string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("path = ?", path)) +} + +// PathGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PathGt(path string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("path > ?", path)) +} + +// PathGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PathGte(path string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("path >= ?", path)) +} + +// PathIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PathIn(path ...string) AlarmStrategyV2QuerySet { + if len(path) == 0 { + qs.db.AddError(errors.New("must at least pass one path in PathIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("path IN (?)", path)) +} + +// PathLike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PathLike(path string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("path LIKE ?", path)) +} + +// PathLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PathLt(path string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("path < ?", path)) +} + +// PathLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PathLte(path string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("path <= ?", path)) +} + +// PathNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PathNe(path string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("path != ?", path)) +} + +// PathNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PathNotIn(path ...string) AlarmStrategyV2QuerySet { + if len(path) == 0 { + qs.db.AddError(errors.New("must at least pass one path in PathNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("path NOT IN (?)", path)) +} + +// PathNotlike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PathNotlike(path string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("path NOT LIKE ?", path)) +} + +// PriorityEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityEq(priority int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("priority = ?", priority)) +} + +// PriorityGroupKeyEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityGroupKeyEq(priorityGroupKey string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("priority_group_key = ?", priorityGroupKey)) +} + +// PriorityGroupKeyGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityGroupKeyGt(priorityGroupKey string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("priority_group_key > ?", priorityGroupKey)) +} + +// PriorityGroupKeyGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityGroupKeyGte(priorityGroupKey string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("priority_group_key >= ?", priorityGroupKey)) +} + +// PriorityGroupKeyIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityGroupKeyIn(priorityGroupKey ...string) AlarmStrategyV2QuerySet { + if len(priorityGroupKey) == 0 { + qs.db.AddError(errors.New("must at least pass one priorityGroupKey in PriorityGroupKeyIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("priority_group_key IN (?)", priorityGroupKey)) +} + +// PriorityGroupKeyLike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityGroupKeyLike(priorityGroupKey string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("priority_group_key LIKE ?", priorityGroupKey)) +} + +// PriorityGroupKeyLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityGroupKeyLt(priorityGroupKey string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("priority_group_key < ?", priorityGroupKey)) +} + +// PriorityGroupKeyLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityGroupKeyLte(priorityGroupKey string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("priority_group_key <= ?", priorityGroupKey)) +} + +// PriorityGroupKeyNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityGroupKeyNe(priorityGroupKey string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("priority_group_key != ?", priorityGroupKey)) +} + +// PriorityGroupKeyNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityGroupKeyNotIn(priorityGroupKey ...string) AlarmStrategyV2QuerySet { + if len(priorityGroupKey) == 0 { + qs.db.AddError(errors.New("must at least pass one priorityGroupKey in PriorityGroupKeyNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("priority_group_key NOT IN (?)", priorityGroupKey)) +} + +// PriorityGroupKeyNotlike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityGroupKeyNotlike(priorityGroupKey string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("priority_group_key NOT LIKE ?", priorityGroupKey)) +} + +// PriorityGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityGt(priority int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("priority > ?", priority)) +} + +// PriorityGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityGte(priority int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("priority >= ?", priority)) +} + +// PriorityIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityIn(priority ...int32) AlarmStrategyV2QuerySet { + if len(priority) == 0 { + qs.db.AddError(errors.New("must at least pass one priority in PriorityIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("priority IN (?)", priority)) +} + +// PriorityLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityLt(priority int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("priority < ?", priority)) +} + +// PriorityLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityLte(priority int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("priority <= ?", priority)) +} + +// PriorityNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityNe(priority int32) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("priority != ?", priority)) +} + +// PriorityNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) PriorityNotIn(priority ...int32) AlarmStrategyV2QuerySet { + if len(priority) == 0 { + qs.db.AddError(errors.New("must at least pass one priority in PriorityNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("priority NOT IN (?)", priority)) +} + +// ScenarioEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) ScenarioEq(scenario string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("scenario = ?", scenario)) +} + +// ScenarioGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) ScenarioGt(scenario string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("scenario > ?", scenario)) +} + +// ScenarioGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) ScenarioGte(scenario string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("scenario >= ?", scenario)) +} + +// ScenarioIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) ScenarioIn(scenario ...string) AlarmStrategyV2QuerySet { + if len(scenario) == 0 { + qs.db.AddError(errors.New("must at least pass one scenario in ScenarioIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("scenario IN (?)", scenario)) +} + +// ScenarioLike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) ScenarioLike(scenario string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("scenario LIKE ?", scenario)) +} + +// ScenarioLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) ScenarioLt(scenario string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("scenario < ?", scenario)) +} + +// ScenarioLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) ScenarioLte(scenario string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("scenario <= ?", scenario)) +} + +// ScenarioNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) ScenarioNe(scenario string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("scenario != ?", scenario)) +} + +// ScenarioNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) ScenarioNotIn(scenario ...string) AlarmStrategyV2QuerySet { + if len(scenario) == 0 { + qs.db.AddError(errors.New("must at least pass one scenario in ScenarioNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("scenario NOT IN (?)", scenario)) +} + +// ScenarioNotlike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) ScenarioNotlike(scenario string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("scenario NOT LIKE ?", scenario)) +} + +// SnippetEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SnippetEq(snippet string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("snippet = ?", snippet)) +} + +// SnippetGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SnippetGt(snippet string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("snippet > ?", snippet)) +} + +// SnippetGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SnippetGte(snippet string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("snippet >= ?", snippet)) +} + +// SnippetIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SnippetIn(snippet ...string) AlarmStrategyV2QuerySet { + if len(snippet) == 0 { + qs.db.AddError(errors.New("must at least pass one snippet in SnippetIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("snippet IN (?)", snippet)) +} + +// SnippetLike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SnippetLike(snippet string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("snippet LIKE ?", snippet)) +} + +// SnippetLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SnippetLt(snippet string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("snippet < ?", snippet)) +} + +// SnippetLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SnippetLte(snippet string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("snippet <= ?", snippet)) +} + +// SnippetNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SnippetNe(snippet string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("snippet != ?", snippet)) +} + +// SnippetNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SnippetNotIn(snippet ...string) AlarmStrategyV2QuerySet { + if len(snippet) == 0 { + qs.db.AddError(errors.New("must at least pass one snippet in SnippetNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("snippet NOT IN (?)", snippet)) +} + +// SnippetNotlike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SnippetNotlike(snippet string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("snippet NOT LIKE ?", snippet)) +} + +// SourceEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SourceEq(source string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("source = ?", source)) +} + +// SourceGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SourceGt(source string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("source > ?", source)) +} + +// SourceGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SourceGte(source string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("source >= ?", source)) +} + +// SourceIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SourceIn(source ...string) AlarmStrategyV2QuerySet { + if len(source) == 0 { + qs.db.AddError(errors.New("must at least pass one source in SourceIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("source IN (?)", source)) +} + +// SourceLike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SourceLike(source string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("source LIKE ?", source)) +} + +// SourceLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SourceLt(source string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("source < ?", source)) +} + +// SourceLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SourceLte(source string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("source <= ?", source)) +} + +// SourceNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SourceNe(source string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("source != ?", source)) +} + +// SourceNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SourceNotIn(source ...string) AlarmStrategyV2QuerySet { + if len(source) == 0 { + qs.db.AddError(errors.New("must at least pass one source in SourceNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("source NOT IN (?)", source)) +} + +// SourceNotlike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) SourceNotlike(source string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("source NOT LIKE ?", source)) +} + +// TypeEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) TypeEq(typeValue string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("type = ?", typeValue)) +} + +// TypeGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) TypeGt(typeValue string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("type > ?", typeValue)) +} + +// TypeGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) TypeGte(typeValue string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("type >= ?", typeValue)) +} + +// TypeIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) TypeIn(typeValue ...string) AlarmStrategyV2QuerySet { + if len(typeValue) == 0 { + qs.db.AddError(errors.New("must at least pass one typeValue in TypeIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("type IN (?)", typeValue)) +} + +// TypeLike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) TypeLike(typeValue string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("type LIKE ?", typeValue)) +} + +// TypeLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) TypeLt(typeValue string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("type < ?", typeValue)) +} + +// TypeLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) TypeLte(typeValue string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("type <= ?", typeValue)) +} + +// TypeNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) TypeNe(typeValue string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("type != ?", typeValue)) +} + +// TypeNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) TypeNotIn(typeValue ...string) AlarmStrategyV2QuerySet { + if len(typeValue) == 0 { + qs.db.AddError(errors.New("must at least pass one typeValue in TypeNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("type NOT IN (?)", typeValue)) +} + +// TypeNotlike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) TypeNotlike(typeValue string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("type NOT LIKE ?", typeValue)) +} + +// UpdateTimeEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateTimeEq(updateTime time.Time) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("update_time = ?", updateTime)) +} + +// UpdateTimeGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateTimeGt(updateTime time.Time) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("update_time > ?", updateTime)) +} + +// UpdateTimeGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateTimeGte(updateTime time.Time) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("update_time >= ?", updateTime)) +} + +// UpdateTimeLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateTimeLt(updateTime time.Time) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("update_time < ?", updateTime)) +} + +// UpdateTimeLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateTimeLte(updateTime time.Time) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("update_time <= ?", updateTime)) +} + +// UpdateTimeNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateTimeNe(updateTime time.Time) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("update_time != ?", updateTime)) +} + +// UpdateUserEq is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateUserEq(updateUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("update_user = ?", updateUser)) +} + +// UpdateUserGt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateUserGt(updateUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("update_user > ?", updateUser)) +} + +// UpdateUserGte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateUserGte(updateUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("update_user >= ?", updateUser)) +} + +// UpdateUserIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateUserIn(updateUser ...string) AlarmStrategyV2QuerySet { + if len(updateUser) == 0 { + qs.db.AddError(errors.New("must at least pass one updateUser in UpdateUserIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("update_user IN (?)", updateUser)) +} + +// UpdateUserLike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateUserLike(updateUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("update_user LIKE ?", updateUser)) +} + +// UpdateUserLt is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateUserLt(updateUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("update_user < ?", updateUser)) +} + +// UpdateUserLte is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateUserLte(updateUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("update_user <= ?", updateUser)) +} + +// UpdateUserNe is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateUserNe(updateUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("update_user != ?", updateUser)) +} + +// UpdateUserNotIn is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateUserNotIn(updateUser ...string) AlarmStrategyV2QuerySet { + if len(updateUser) == 0 { + qs.db.AddError(errors.New("must at least pass one updateUser in UpdateUserNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("update_user NOT IN (?)", updateUser)) +} + +// UpdateUserNotlike is an autogenerated method +// nolint: dupl +func (qs AlarmStrategyV2QuerySet) UpdateUserNotlike(updateUser string) AlarmStrategyV2QuerySet { + return qs.w(qs.db.Where("update_user NOT LIKE ?", updateUser)) +} + +// SetApp is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetApp(app string) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.App)] = app + return u +} + +// SetBkBizID is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetBkBizID(bkBizID int32) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.BkBizID)] = bkBizID + return u +} + +// SetCreateTime is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetCreateTime(createTime time.Time) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.CreateTime)] = createTime + return u +} + +// SetCreateUser is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetCreateUser(createUser string) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.CreateUser)] = createUser + return u +} + +// SetHash is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetHash(hash string) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.Hash)] = hash + return u +} + +// SetID is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetID(ID int32) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.ID)] = ID + return u +} + +// SetInvalidType is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetInvalidType(invalidType string) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.InvalidType)] = invalidType + return u +} + +// SetIsEnabled is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetIsEnabled(isEnabled bool) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.IsEnabled)] = isEnabled + return u +} + +// SetIsInvalid is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetIsInvalid(isInvalid bool) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.IsInvalid)] = isInvalid + return u +} + +// SetName is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetName(name string) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.Name)] = name + return u +} + +// SetPath is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetPath(path string) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.Path)] = path + return u +} + +// SetPriority is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetPriority(priority int32) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.Priority)] = priority + return u +} + +// SetPriorityGroupKey is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetPriorityGroupKey(priorityGroupKey string) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.PriorityGroupKey)] = priorityGroupKey + return u +} + +// SetScenario is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetScenario(scenario string) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.Scenario)] = scenario + return u +} + +// SetSnippet is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetSnippet(snippet string) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.Snippet)] = snippet + return u +} + +// SetSource is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetSource(source string) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.Source)] = source + return u +} + +// SetType is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetType(typeValue string) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.Type)] = typeValue + return u +} + +// SetUpdateTime is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetUpdateTime(updateTime time.Time) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.UpdateTime)] = updateTime + return u +} + +// SetUpdateUser is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) SetUpdateUser(updateUser string) AlarmStrategyV2Updater { + u.fields[string(AlarmStrategyV2DBSchema.UpdateUser)] = updateUser + return u +} + +// Update is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) Update() error { + return u.db.Updates(u.fields).Error +} + +// UpdateNum is an autogenerated method +// nolint: dupl +func (u AlarmStrategyV2Updater) UpdateNum() (int64, error) { + db := u.db.Updates(u.fields) + return db.RowsAffected, db.Error +} + +// ===== END of query set AlarmStrategyV2QuerySet + +// ===== BEGIN of AlarmStrategyV2 modifiers + +// AlarmStrategyV2DBSchemaField describes database schema field. It requires for method 'Update' +type AlarmStrategyV2DBSchemaField string + +// String method returns string representation of field. +// nolint: dupl +func (f AlarmStrategyV2DBSchemaField) String() string { + return string(f) +} + +// AlarmStrategyV2DBSchema stores db field names of AlarmStrategyV2 +var AlarmStrategyV2DBSchema = struct { + ID AlarmStrategyV2DBSchemaField + Name AlarmStrategyV2DBSchemaField + BkBizID AlarmStrategyV2DBSchemaField + Source AlarmStrategyV2DBSchemaField + Scenario AlarmStrategyV2DBSchemaField + Type AlarmStrategyV2DBSchemaField + IsEnabled AlarmStrategyV2DBSchemaField + CreateUser AlarmStrategyV2DBSchemaField + CreateTime AlarmStrategyV2DBSchemaField + UpdateUser AlarmStrategyV2DBSchemaField + UpdateTime AlarmStrategyV2DBSchemaField + IsInvalid AlarmStrategyV2DBSchemaField + InvalidType AlarmStrategyV2DBSchemaField + App AlarmStrategyV2DBSchemaField + Hash AlarmStrategyV2DBSchemaField + Path AlarmStrategyV2DBSchemaField + Snippet AlarmStrategyV2DBSchemaField + Priority AlarmStrategyV2DBSchemaField + PriorityGroupKey AlarmStrategyV2DBSchemaField +}{ + + ID: AlarmStrategyV2DBSchemaField("id"), + Name: AlarmStrategyV2DBSchemaField("name"), + BkBizID: AlarmStrategyV2DBSchemaField("bk_biz_id"), + Source: AlarmStrategyV2DBSchemaField("source"), + Scenario: AlarmStrategyV2DBSchemaField("scenario"), + Type: AlarmStrategyV2DBSchemaField("type"), + IsEnabled: AlarmStrategyV2DBSchemaField("is_enabled"), + CreateUser: AlarmStrategyV2DBSchemaField("create_user"), + CreateTime: AlarmStrategyV2DBSchemaField("create_time"), + UpdateUser: AlarmStrategyV2DBSchemaField("update_user"), + UpdateTime: AlarmStrategyV2DBSchemaField("update_time"), + IsInvalid: AlarmStrategyV2DBSchemaField("is_invalid"), + InvalidType: AlarmStrategyV2DBSchemaField("invalid_type"), + App: AlarmStrategyV2DBSchemaField("app"), + Hash: AlarmStrategyV2DBSchemaField("hash"), + Path: AlarmStrategyV2DBSchemaField("path"), + Snippet: AlarmStrategyV2DBSchemaField("snippet"), + Priority: AlarmStrategyV2DBSchemaField("priority"), + PriorityGroupKey: AlarmStrategyV2DBSchemaField("priority_group_key"), +} + +// Update updates AlarmStrategyV2 fields by primary key +// nolint: dupl +func (o *AlarmStrategyV2) Update(db *gorm.DB, fields ...AlarmStrategyV2DBSchemaField) error { + dbNameToFieldName := map[string]interface{}{ + "id": o.ID, + "name": o.Name, + "bk_biz_id": o.BkBizID, + "source": o.Source, + "scenario": o.Scenario, + "type": o.Type, + "is_enabled": o.IsEnabled, + "create_user": o.CreateUser, + "create_time": o.CreateTime, + "update_user": o.UpdateUser, + "update_time": o.UpdateTime, + "is_invalid": o.IsInvalid, + "invalid_type": o.InvalidType, + "app": o.App, + "hash": o.Hash, + "path": o.Path, + "snippet": o.Snippet, + "priority": o.Priority, + "priority_group_key": o.PriorityGroupKey, + } + u := map[string]interface{}{} + for _, f := range fields { + fs := f.String() + u[fs] = dbNameToFieldName[fs] + } + if err := db.Model(o).Updates(u).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return err + } + + return fmt.Errorf("can't update AlarmStrategyV2 %v fields %v: %s", + o, fields, err) + } + + return nil +} + +// AlarmStrategyV2Updater is an AlarmStrategyV2 updates manager +type AlarmStrategyV2Updater struct { + fields map[string]interface{} + db *gorm.DB +} + +// NewAlarmStrategyV2Updater creates new AlarmStrategyV2 updater +// nolint: dupl +func NewAlarmStrategyV2Updater(db *gorm.DB) AlarmStrategyV2Updater { + return AlarmStrategyV2Updater{ + fields: map[string]interface{}{}, + db: db.Model(&AlarmStrategyV2{}), + } +} + +// ===== END of AlarmStrategyV2 modifiers + +// ===== END of all query sets diff --git a/pkg/bk-monitor-worker/internal/metadata/service/slodata.go b/pkg/bk-monitor-worker/internal/metadata/service/slodata.go new file mode 100644 index 000000000..96bead219 --- /dev/null +++ b/pkg/bk-monitor-worker/internal/metadata/service/slodata.go @@ -0,0 +1,136 @@ +// Tencent is pleased to support the open source community by making +// 蓝鲸智云 - 监控平台 (BlueKing - Monitor) available. +// Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +package service + +import ( + "encoding/json" + "fmt" + + "github.com/jinzhu/gorm" + + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/internal/metadata/models/slo" +) + +// 导入内置 fmt + +// BkBizStrategy 定义只存储 BkBizID 和 StrategyID 的结构体 +type BkBizStrategy struct { + Middle string + BkBizID int32 + StrategyID int32 + Name string + Interval int32 +} + +// Config 配置信息 +type Config struct { + AggInterv int32 `json:"agg_interval"` +} + +// QueryAndDeduplicateStrategies 查询并去重的方法 +func QueryAndDeduplicateStrategies(db *gorm.DB, prefix string, middleParts string, suffixes string, bkBizId int) ([]BkBizStrategy, error) { + var allBkBizStrategies []BkBizStrategy + //uniqueMap := make(map[string]struct{}) + //bkBizIDSet := make(map[int32]struct{}) + + pattern := fmt.Sprintf("%s%s/%s/", prefix, middleParts, suffixes) + var results []struct { + Middle string + BkBizID int32 + StrategyID int32 + Name string + } + + res := db.Table("alarm_strategy_label AS label"). + Select("SUBSTRING_INDEX(SUBSTRING_INDEX(label.label_name, '/', 3), '/', -1) AS middle, label.bk_biz_id, label.strategy_id, strategy.name"). + Joins("INNER JOIN alarm_strategy_v2 AS strategy ON label.strategy_id = strategy.id"). + Where("label.bk_biz_id = ? AND label.strategy_id != ? AND label.label_name = ?", bkBizId, 0, pattern). + Find(&results) + + if res.Error != nil { + return nil, fmt.Errorf("failed to query data: %v", res.Error) + } + + for _, result := range results { + var config slo.AlarmQueryConfigV2 + res := db.Where("strategy_id = ?", result.StrategyID).First(&config) + if res.Error != nil && res.Error != gorm.ErrRecordNotFound { + return nil, fmt.Errorf("failed to query data: %v", res.Error) + } + + var interval int32 + if res.Error == nil { + var jsonConfig Config + if err := json.Unmarshal([]byte(config.Config), &jsonConfig); err != nil { + return nil, fmt.Errorf("failed to unmarshal config: %v", err) + } + interval = jsonConfig.AggInterv + } + allBkBizStrategies = append(allBkBizStrategies, BkBizStrategy{ + BkBizID: result.BkBizID, + StrategyID: result.StrategyID, + Name: result.Name, + Interval: interval, + Middle: result.Middle, + }) + } + + return allBkBizStrategies, nil +} + +// Result 结果 +type Result struct { + BkBizID int32 + Middle string +} + +// QueryBizV2 全量检索业务 +func QueryBizV2(db *gorm.DB, prefix string, suffixes []string) (map[int32][]string, error) { + //检索biz和场景 + bkBizIDToMiddleMap := make(map[int32]map[string]struct{}) + + for _, suffix := range suffixes { + // 定义标签 /slo/场景名称/后缀 + pattern := fmt.Sprintf("%s%%/%s/", prefix, suffix) + var results []Result + + //检索alarm_strategy_label表 + //bk_biz_id 和 strategy_id 不为0的,符合/slo/场景名称/后缀,且在alarm_strategy_v2中存在的策略 + //输出策略所属的bk_biz_id 和 场景名称(标签中间的部分) + res := db.Table("alarm_strategy_label AS label"). + Select("label.bk_biz_id, SUBSTRING_INDEX(SUBSTRING_INDEX(label.label_name, '/', 3), '/', -1) AS middle"). + Joins("INNER JOIN alarm_strategy_v2 AS strategy ON label.strategy_id = strategy.id"). + Where("label.bk_biz_id != ? AND label.strategy_id != ? AND label.label_name LIKE ?", 0, 0, pattern). + Find(&results) + + if res.Error != nil { + return nil, fmt.Errorf("failed to query data: %v", res.Error) + } + + for _, result := range results { + if _, exists := bkBizIDToMiddleMap[result.BkBizID]; !exists { + bkBizIDToMiddleMap[result.BkBizID] = make(map[string]struct{}) + } + bkBizIDToMiddleMap[result.BkBizID][result.Middle] = struct{}{} + } + } + + // 将 map 转换为需要的格式 + finalResult := make(map[int32][]string) + for bkBizID, middleSet := range bkBizIDToMiddleMap { + var middleList []string + for middle := range middleSet { + middleList = append(middleList, middle) + } + finalResult[bkBizID] = middleList + } + + return finalResult, nil +} diff --git a/pkg/bk-monitor-worker/internal/metadata/service/slodata_test.go b/pkg/bk-monitor-worker/internal/metadata/service/slodata_test.go new file mode 100644 index 000000000..b3971bb90 --- /dev/null +++ b/pkg/bk-monitor-worker/internal/metadata/service/slodata_test.go @@ -0,0 +1,133 @@ +// Tencent is pleased to support the open source community by making +// 蓝鲸智云 - 监控平台 (BlueKing - Monitor) available. +// Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +package service + +import ( + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/internal/metadata/models/slo" + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/store/mysql" + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/utils/mocker" + "github.com/stretchr/testify/assert" + "testing" + "time" +) + +func TestQueryBiz(t *testing.T) { + mocker.InitTestDBConfig("../../../bmw_test.yaml") + db := mysql.GetDBSession().DB + //标签前缀 + prefix := "/slo/" + //标签后缀 + suffixes := []string{"volume_test", "error_test", "latency_test", "availability_test"} + labels := slo.AlarmStrategyLabel{ + LabelName: "/slo/场景1/volume_test/", + StrategyID: 99, + BkBizID: 5000140, + } + db.Delete(&labels, "strategy_id = ?", 99) + err := labels.Create(db) + assert.NoError(t, err) + + alarmStrategy := slo.AlarmStrategyV2{ + ID: 99, + Name: "Test Strategy", + BkBizID: 5000140, + Source: "test_source", + Scenario: "test_scenario", + Type: "test_type", + IsEnabled: true, + CreateUser: "test_user", + CreateTime: time.Now(), + UpdateUser: "test_user", + UpdateTime: time.Now(), + IsInvalid: false, + InvalidType: "none", + App: "test_app", + Hash: "test_hash", + Path: "/test/path", + Snippet: "test_snippet", + Priority: 1, + PriorityGroupKey: "test_key", + } + db.Delete(&alarmStrategy, "id = ?", 99) + err2 := alarmStrategy.Create(db) + assert.NoError(t, err2) + + // 创建一个 map,键为 int 类型,值为 []string 类型 + alarmMap := make(map[int32][]string) + + // 初始化键 5000140 对应的值为 [“场景1”] + alarmMap[5000140] = []string{"场景1"} + + //寻找符合标签规范的全部策略。然后统计其上层全部业务 + allBizIds, err := QueryBizV2(db, prefix, suffixes) + assert.NoError(t, err) + assert.Equal(t, alarmMap, allBizIds) +} + +func TestQueryAndDeduplicateStrategies(t *testing.T) { + mocker.InitTestDBConfig("../../../bmw_test.yaml") + db := mysql.GetDBSession().DB + //标签前缀 + prefix := "/slo/" + //场景 + scene := "场景1" + //标签后缀 + sloName := "volume_test" + // 业务id + bkBizId := 5000140 + + labels := slo.AlarmStrategyLabel{ + LabelName: "/slo/场景1/volume_test/", + StrategyID: 99, + BkBizID: 5000140, + } + db.Delete(&labels, "strategy_id = ?", 99) + err := labels.Create(db) + assert.NoError(t, err) + + alarmStrategy := slo.AlarmStrategyV2{ + ID: 99, + Name: "Test Strategy", + BkBizID: 5000140, + Source: "test_source", + Scenario: "test_scenario", + Type: "test_type", + IsEnabled: true, + CreateUser: "test_user", + CreateTime: time.Now(), + UpdateUser: "test_user", + UpdateTime: time.Now(), + IsInvalid: false, + InvalidType: "none", + App: "test_app", + Hash: "test_hash", + Path: "/test/path", + Snippet: "test_snippet", + Priority: 1, + PriorityGroupKey: "test_key", + } + db.Delete(&alarmStrategy, "id = ?", 99) + err2 := alarmStrategy.Create(db) + assert.NoError(t, err2) + + strategy := BkBizStrategy{ + Middle: "场景1", + BkBizID: 5000140, + StrategyID: 99, + Name: "Test Strategy", + Interval: 0, + } + strategies := []BkBizStrategy{strategy} + + allBkBizStrategies, err := QueryAndDeduplicateStrategies(db, prefix, scene, sloName, bkBizId) + assert.NoError(t, err) + assert.Equal(t, strategies, allBkBizStrategies) + +} diff --git a/pkg/bk-monitor-worker/internal/metadata/service/slopush.go b/pkg/bk-monitor-worker/internal/metadata/service/slopush.go new file mode 100644 index 000000000..23dc0bd81 --- /dev/null +++ b/pkg/bk-monitor-worker/internal/metadata/service/slopush.go @@ -0,0 +1,400 @@ +// Tencent is pleased to support the open source community by making +// 蓝鲸智云 - 监控平台 (BlueKing - Monitor) available. +// Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +package service + +import ( + "fmt" + "math/big" + "strconv" + + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/utils/logger" + + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/internal/metadata/apiservice" + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/metrics" + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/store/mysql" +) + +var ( + Now int64 + MaxPageSize = 5000 + RangeDay = []int{1, 7, 30, 180, 365} + SloName = []string{"volume", "error", "latency", "availability"} +) + +// StrategyDetail 策略信息 +type StrategyDetail struct { + Interval int32 + Name string + BkBizID int32 +} + +// Alert 告警信息 +type Alert struct { + BkBizID int32 `json:"bk_biz_id"` + BkBizName string `json:"bk_biz_name"` + StrategyID int32 `json:"strategy_id"` + StrategyName string `json:"strategy_name"` + FirstAnomalyTime int64 `json:"first_anomaly_time"` + LatestTime int64 `json:"latest_time"` + EventID string `json:"event_id"` + Status string `json:"status"` +} + +// InitStraID 初始化 +func InitStraID(bkBizId int, scene string, now int64) (map[string][]BkBizStrategy, map[int]map[string]map[string][]int64, map[int][]map[int64]struct{}, error) { + Now = now + + TrueSloName := make(map[string][]BkBizStrategy) + TotalAlertTimeBucket := make(map[int]map[string]map[string][]int64) + TotalSloTimeBucketDict := make(map[int][]map[int64]struct{}) + + db := mysql.GetDBSession().DB + prefix := "/slo/" + for _, sloName := range SloName { + allBkBizStrategies, err := QueryAndDeduplicateStrategies(db, prefix, scene, sloName, bkBizId) + if err != nil { + return nil, nil, nil, fmt.Errorf("failed to query and deduplicate strategies for sloName %s: %w", sloName, err) + } + if len(allBkBizStrategies) > 0 { + TrueSloName[sloName] = allBkBizStrategies + } + } + + for _, day := range RangeDay { + TotalAlertTimeBucket[day] = make(map[string]map[string][]int64) + TotalSloTimeBucketDict[day] = make([]map[int64]struct{}, 0) + } + return TrueSloName, TotalAlertTimeBucket, TotalSloTimeBucketDict, nil +} + +// FindAllBiz 找到符合标准的biz +func FindAllBiz() (map[int32][]string, error) { + db := mysql.GetDBSession().DB + //标签前缀 + prefix := "/slo/" + //标签后缀 + suffixes := SloName //{"volume", "error", "latency", "availability"} + + // 寻找符合标签规范的全部策略。然后统计其上层全部业务 + allBizIds, err := QueryBizV2(db, prefix, suffixes) + if err != nil { + return nil, fmt.Errorf("failed to query business IDs: %w", err) + } + return allBizIds, nil +} + +func getStrategyAggInterval(strategyIDs []BkBizStrategy, allStrategyAggInterval map[int32]StrategyDetail) { + // Filter new strategy IDs + newStrategyIDs := []int32{} + for _, id := range strategyIDs { + if _, exists := allStrategyAggInterval[id.StrategyID]; !exists { + newStrategyIDs = append(newStrategyIDs, id.StrategyID) + } + } + if len(newStrategyIDs) == 0 { + return + } + + for _, strategy := range strategyIDs { + allStrategyAggInterval[strategy.StrategyID] = StrategyDetail{ + Interval: strategy.Interval, + Name: strategy.Name, + BkBizID: strategy.BkBizID, + } + } +} +func extractStrategyIDs(strategies []BkBizStrategy) []int32 { + var strategyIDs []int32 + for _, strategy := range strategies { + strategyIDs = append(strategyIDs, strategy.StrategyID) + } + return strategyIDs +} + +func getAllAlerts(startTime int64, strategyIDs []BkBizStrategy, AllStrategyAggInterval map[int32]StrategyDetail, BkBizID int32) ([]Alert, error) { + if len(strategyIDs) == 0 { + return []Alert{}, nil + } + + // 数据清洗,conditions + strategyIDs_con := extractStrategyIDs(strategyIDs) + getStrategyAggInterval(strategyIDs, AllStrategyAggInterval) + + conditions := []map[string]interface{}{ + {"key": "severity", "value": []int{1, 2, 3}}, + {"key": "strategy_id", "value": strategyIDs_con, "condition": "and"}, + } + + // 获取告警全量数据和总数 + total, alerts, err := getFatalAlerts(conditions, startTime, 1, 1, BkBizID) + if err != nil { + logger.Errorf("getFatalAlerts failed: %v", err) + return []Alert{}, err + } + totalPages := total / MaxPageSize + alertList := []Alert{} + for page := 1; page <= totalPages+1; page++ { + // 分页获取告警数据 + _, alerts, err = getFatalAlerts(conditions, startTime, page, MaxPageSize, BkBizID) + if err != nil { + logger.Errorf("getFatalAlerts failed: %v", err) + return []Alert{}, err + } + alertList = append(alertList, alerts...) + } + return alertList, nil +} + +func getFatalAlerts(conditions []map[string]interface{}, startTime int64, page, pageSize int, BkBizID int32) (int, []Alert, error) { + // 调用外部服务以获取告警数据 + alertData, err := apiservice.Monitor.SearchAlert(conditions, startTime, Now, page, pageSize, BkBizID) + if err != nil { + // 处理调用错误 + return 0, nil, fmt.Errorf("failed to search alerts: %v", err) + } + + // 检查返回的数据是否为空或格式不正确 + if alertData == nil { + return 0, nil, fmt.Errorf("alert data is nil") + } + + // 获取总数 + total := alertData.Total + + // 初始化告警列表 + alerts := make([]Alert, 0, len(alertData.Alerts)) + + // 遍历告警数据并转换为内部结构 + for _, alertInfo := range alertData.Alerts { + alerts = append(alerts, Alert{ + BkBizID: alertInfo.BkBizID, + BkBizName: alertInfo.BkBizName, + StrategyID: alertInfo.StrategyID, + StrategyName: alertInfo.StrategyName, + FirstAnomalyTime: alertInfo.FirstAnomalyTime, + LatestTime: alertInfo.LatestTime, + EventID: alertInfo.EventID, + Status: alertInfo.Status, + }) + } + + // 返回结果和 nil 错误 + return total, alerts, nil +} + +func addSloTimeIntoDict(day int, sloKey string, strategyID int32, beginTime, endTime int64, TotalAlertTimeBucket map[int]map[string]map[string][]int64) { + // 初始化告警时间桶 + if TotalAlertTimeBucket[day][sloKey] == nil { + TotalAlertTimeBucket[day][sloKey] = make(map[string][]int64) + } + + // 获取当前已存入的告警时间 + key := fmt.Sprintf("%d", strategyID) + existingTimes := TotalAlertTimeBucket[day][sloKey][key] + timeMap := make(map[int64]bool) + + // Populate the time map with existing times + for _, t := range existingTimes { + timeMap[t] = true + } + + // 存入新告警时间 + for t := beginTime; t < endTime; t++ { + if !timeMap[t] { + TotalAlertTimeBucket[day][sloKey][fmt.Sprintf("%d", strategyID)] = append(TotalAlertTimeBucket[day][sloKey][fmt.Sprintf("%d", strategyID)], t) + timeMap[t] = true + } + } + + // 添加总告警数 + if _, exists := TotalAlertTimeBucket[day][sloKey]["error_number"]; !exists { + TotalAlertTimeBucket[day][sloKey]["error_number"] = []int64{0} + } + TotalAlertTimeBucket[day][sloKey]["error_number"][0]++ +} + +// GetAllAlertTime 获取告警事件 +func GetAllAlertTime(TotalAlertTimeBucket map[int]map[string]map[string][]int64, TrueSloName map[string][]BkBizStrategy, BkBizID int32, scene string) map[int32]StrategyDetail { + //定义策略详细信息 + AllStrategyAggInterval := make(map[int32]StrategyDetail) + for day := range TotalAlertTimeBucket { + //每天的告警数据 + + //定义起始时间,当前时间-时间周期(1,7,30,180,365) + startTime := Now - int64(day*24*60*60) + for sloName, sloStrategyList := range TrueSloName { + // 每个方法论进行获取数据 + + // 获取当前起始时间、当前方法论名称下策略、当前bizid下的告警数据,同时数据放到 AllStrategyAggInterval + alertList, _ := getAllAlerts(startTime, sloStrategyList, AllStrategyAggInterval, BkBizID) + sloKey := sloName + "_alert_time" + if TotalAlertTimeBucket[day][sloKey] == nil { + // 若当前时间周期,方法论下时间数据为空则新建map + TotalAlertTimeBucket[day][sloKey] = make(map[string][]int64) + } + for _, strategyID := range sloStrategyList { + // 若当前时间周期,方法论,策略下时间数据为空则新建数组 + if TotalAlertTimeBucket[day][sloKey][fmt.Sprintf("%d", strategyID.StrategyID)] == nil { + TotalAlertTimeBucket[day][sloKey][fmt.Sprintf("%d", strategyID.StrategyID)] = []int64{} + } + } + for _, alert := range alertList { + // 获取当前的告警信息 + strategyID := alert.StrategyID + // 若当前告警数据不属于查询的策略之中则跳过 + if _, exists := AllStrategyAggInterval[strategyID]; !exists { + continue + } + // 设置结束时间 + endTime := alert.LatestTime + // 若结束时间为0则设置为当前时间 + if endTime == 0 { + endTime = Now + } + // 判断latest_time和first_anomaly_time是否相同,如果相同则需要添加一个聚合周期时间。因为endtime是终止时间,alert.FirstAnomalyTime为起始时间。 + if endTime == alert.FirstAnomalyTime { + endTime += int64(AllStrategyAggInterval[strategyID].Interval) + } + // 往TotalAlertTimeBucket添加时间数据。时间周期,方法论名,策略,起始时间,终止时间,存储桶 + addSloTimeIntoDict(day, sloKey, strategyID, maxForSlo(alert.FirstAnomalyTime, startTime), endTime, TotalAlertTimeBucket) + metricSlo := endTime - maxForSlo(alert.FirstAnomalyTime, startTime) + metrics.RecordSloErrorEventTimeInfo(float64(metricSlo), fmt.Sprintf("%d", BkBizID), strconv.Itoa(day), fmt.Sprintf("%d", strategyID), scene, + strconv.FormatInt(maxForSlo(alert.FirstAnomalyTime, startTime), 10), strconv.FormatInt(endTime, 10), alert.EventID, alert.Status) + } + } + } + return AllStrategyAggInterval +} + +// CalculateMetric 计算指标数据 +func CalculateMetric(TotalAlertTimeBucket map[int]map[string]map[string][]int64, TrueSloName map[string][]BkBizStrategy, AllStrategyAggInterval map[int32]StrategyDetail, TotalSloTimeBucketDict map[int][]map[int64]struct{}, BkBizID int32, scene string) { + // 遍历 TotalAlertTimeBucket 中的每一天 + for day := range TotalAlertTimeBucket { + dayTime := int64(day * 24 * 60 * 60) // 将天数转换为秒数 + totalErrorNumber := 0 // 初始化总错误次数 + totalErrorSecondsSet := make(map[int64]struct{}) // 初始化总错误秒数集合 + totalVelatSloTimeSet := make(map[int64]struct{}) // 初始化总可用性时间集合 + + // 遍历 TrueSloName 中的每个 SLO 名称 + for preName := range TrueSloName { + sloName := preName + "_alert_time" // 生成 SLO 告警时间的键 + strategyAlertTimes := TotalAlertTimeBucket[day][sloName] // 获取该键的告警时间 + + // 获取错误次数,如果存在则删除该键 + var errorNumber int + if val, exists := strategyAlertTimes["error_number"]; exists && len(val) > 0 { + errorNumber = int(val[0]) + delete(strategyAlertTimes, "error_number") + } else { + errorNumber = 0 + } + + // 遍历策略的告警时间 + for strategyIDStr := range strategyAlertTimes { + strategyID64, _ := strconv.ParseInt(strategyIDStr, 10, 32) + strategyID := int32(strategyID64) + if _, exists := AllStrategyAggInterval[strategyID]; !exists { + continue // 如果策略不存在于 AllStrategyAggInterval 中则跳过 + } + errorData := strategyAlertTimes[strategyIDStr] + for _, t := range errorData { + totalErrorSecondsSet[t] = struct{}{} // 将错误时间点加入总错误秒数集合 + } + metrics.RecordSloErrorTimeInfo(float64(len(errorData)), fmt.Sprintf("%d", AllStrategyAggInterval[strategyID].BkBizID), fmt.Sprintf("%d", day), fmt.Sprintf("%d", strategyID), AllStrategyAggInterval[strategyID].Name, preName, scene) + } + + velatSloTime := make(map[int64]struct{}) + if len(strategyAlertTimes) > 0 { + // 遍历所有策略的告警时间并加入可用性时间集合 + for _, times := range strategyAlertTimes { + for _, t := range times { + velatSloTime[t] = struct{}{} + } + } + TotalSloTimeBucketDict[day] = append(TotalSloTimeBucketDict[day], velatSloTime) + value := getDivisionVal(int64(len(velatSloTime)), dayTime) + totalVelatSloTimeSet = mergeSets(totalVelatSloTimeSet, velatSloTime) + metrics.RecordSloInfo(value, fmt.Sprintf("%d", BkBizID), fmt.Sprintf("%d", day), preName, scene) + } else { + metrics.RecordSloInfo(100.0, fmt.Sprintf("%d", BkBizID), fmt.Sprintf("%d", day), preName, scene) + } + totalErrorNumber += errorNumber + } + + // 计算 MTTR 和 MTBF + var mttrVal, mtbfVal float64 + if totalErrorNumber == 0 { + mttrVal = 0 + mtbfVal = 0 + } else { + mttrVal = float64(len(totalErrorSecondsSet)) / float64(totalErrorNumber) // 平均修复时间 + mtbfVal = float64(dayTime-int64(len(totalVelatSloTimeSet))) / float64(totalErrorNumber) // 平均故障间隔时间 + } + metrics.RecordMttr(mttrVal, fmt.Sprintf("%d", BkBizID), fmt.Sprintf("%d", day), scene) + metrics.RecordMtbf(mtbfVal, fmt.Sprintf("%d", BkBizID), fmt.Sprintf("%d", day), scene) + + // 记录 SLO 错误时间和 SLO 值 + totalTimeLen := 0 + if len(TotalSloTimeBucketDict[day]) > 0 { + for _, set := range TotalSloTimeBucketDict[day] { + totalTimeLen += len(set) + } + } + metrics.RecordSloErrorTime(float64(totalTimeLen), fmt.Sprintf("%d", BkBizID), fmt.Sprintf("%d", day), scene) + value := getDivisionVal(int64(totalTimeLen), dayTime) + metrics.RecordSlo(value, fmt.Sprintf("%d", BkBizID), fmt.Sprintf("%d", day), scene) + } +} + +func mergeSets(set1, set2 map[int64]struct{}) map[int64]struct{} { + for k := range set2 { + set1[k] = struct{}{} + } + return set1 +} + +func getDivisionVal(velatSloTime, dayTime int64) float64 { + // 使用 big.Float 进行精确计算 + dayTimeBig := new(big.Float).SetInt64(dayTime) + velatSloTimeBig := new(big.Float).SetInt64(velatSloTime) + diff := new(big.Float).Sub(dayTimeBig, velatSloTimeBig) + value := new(big.Float).Quo(diff, dayTimeBig) + value.Mul(value, big.NewFloat(100)) + + // 格式化为两位小数精度的浮点数 + float2Value, _ := value.Float64() + float2Value = roundToTwoDecimalPlaces(float2Value) + + // 如果百分比恰好为100.0,并且集合不为空,则调整为99.99 + if float2Value == 100.0 && velatSloTime > 0 { + float2Value = 99.99 + } + return float2Value +} + +// roundToTwoDecimalPlaces 将浮点数四舍五入到两位小数 +func roundToTwoDecimalPlaces(f float64) float64 { + value := new(big.Float).SetFloat64(f) + value.SetMode(big.ToZero) + value.SetPrec(64) + value.Quo(value, big.NewFloat(1)) + value.Mul(value, big.NewFloat(100)) + value.SetPrec(64) + value.Quo(value, big.NewFloat(100)) + float2Value, _ := value.Float64() + return float2Value +} + +func maxForSlo(a, b int64) int64 { + if a > b { + return a + } + return b +} diff --git a/pkg/bk-monitor-worker/internal/metadata/service/slopush_test.go b/pkg/bk-monitor-worker/internal/metadata/service/slopush_test.go new file mode 100644 index 000000000..82f993ba7 --- /dev/null +++ b/pkg/bk-monitor-worker/internal/metadata/service/slopush_test.go @@ -0,0 +1,83 @@ +// Tencent is pleased to support the open source community by making +// 蓝鲸智云 - 监控平台 (BlueKing - Monitor) available. +// Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +package service + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/internal/metadata/models/slo" + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/store/mysql" + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/utils/mocker" +) + +func TestSloPush(t *testing.T) { + mocker.InitTestDBConfig("../../../bmw_test.yaml") + db := mysql.GetDBSession().DB + labels := slo.AlarmStrategyLabel{ + LabelName: "/slo/场景2/volume/", + StrategyID: 100, + BkBizID: 5000140, + } + db.Delete(&labels, "strategy_id = ?", 99) + err := labels.Create(db) + assert.NoError(t, err) + + alarmStrategy := slo.AlarmStrategyV2{ + ID: 100, + Name: "Test Strategy", + BkBizID: 5000140, + Source: "test_source", + Scenario: "test_scenario", + Type: "test_type", + IsEnabled: true, + CreateUser: "test_user", + CreateTime: time.Now(), + UpdateUser: "test_user", + UpdateTime: time.Now(), + IsInvalid: false, + InvalidType: "none", + App: "test_app", + Hash: "test_hash", + Path: "/test/path", + Snippet: "test_snippet", + Priority: 1, + PriorityGroupKey: "test_key", + } + db.Delete(&alarmStrategy, "id = ?", 100) + err2 := alarmStrategy.Create(db) + assert.NoError(t, err2) + + //检索所有满足标签的业务 + bizID, err := FindAllBiz() + // 创建一个 map,键为 int 类型,值为 []string 类型 + alarmMap := make(map[int32][]string) + // 初始化键 5000140 对应的值为 [“场景1”] + alarmMap[5000140] = []string{"场景2"} + assert.Equal(t, alarmMap, bizID) + now := time.Now().Unix() + _, _, _, err = InitStraID(5000140, "场景2", now) + assert.NoError(t, err) + conditions := []map[string]interface{}{ + { + "key": "severity", + "value": []int{1, 2, 3}, + }, + { + "key": "strategy_id", + "value": []int{1}, + "condition": "and", + }, + } + _, _, err = getFatalAlerts(conditions, 1709100660, 1, 5000, 5000140) + assert.NoError(t, err) +} diff --git a/pkg/bk-monitor-worker/internal/metadata/task/slo.go b/pkg/bk-monitor-worker/internal/metadata/task/slo.go new file mode 100644 index 000000000..8575d04a2 --- /dev/null +++ b/pkg/bk-monitor-worker/internal/metadata/task/slo.go @@ -0,0 +1,122 @@ +// Tencent is pleased to support the open source community by making +// 蓝鲸智云 - 监控平台 (BlueKing - Monitor) available. +// Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +package task + +import ( + "context" + "fmt" + "sync" + "time" + + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/utils/logger" + "github.com/prometheus/client_golang/prometheus" + + cfg "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/config" + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/internal/metadata/service" + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/metrics" + t "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/task" +) + +// SloPush 上报slo数据指标 +func SloPush(ctx context.Context, t *t.Task) error { + defer func() { + if err := recover(); err != nil { + logger.Errorf("SloPush Runtime panic caught: %v", err) + } + }() + + if !confirmSloConfig() { + return nil + } + + logger.Info("start auto SloPush task") + + //注册全局Registry + var Registry = prometheus.NewRegistry() + + //检索所有满足标签的业务 + bizID, err := service.FindAllBiz() + if err != nil { + logger.Errorf("find all biz_id for slo failed, %v", err) + } + logger.Info("Biz and scenes: ", bizID) + var wg sync.WaitGroup + //初始化注册表 + metrics.InitGauge(Registry) + //获取当前时间 + now := time.Now().Unix() + logger.Info("Now time:", now) + // 定义错误通道 + errChan := make(chan error, len(bizID)) + for bkBizID, scenes := range bizID { + //按照业务数据上报 + wg.Add(1) + scenes := scenes + bkBizID := bkBizID + // 开启协程完成数据计算和注册 + go func() { + defer wg.Done() + // 错误处理 + defer func() { + if err := recover(); err != nil { + // 将错误发送到错误通道 + errChan <- fmt.Errorf("goroutine panic caught: %v", err) + } + }() + for _, scene := range scenes { + // 初始化 + TrueSloName, TotalAlertTimeBucket, TotalSloTimeBucketDict, err := service.InitStraID(int(bkBizID), scene, now) + if err != nil { + logger.Errorf("slo init failed: %v", err) + continue + } + // 获取告警数据 + AllStrategyAggInterval := service.GetAllAlertTime(TotalAlertTimeBucket, TrueSloName, bkBizID, scene) + // 计算指标 + service.CalculateMetric(TotalAlertTimeBucket, TrueSloName, AllStrategyAggInterval, + TotalSloTimeBucketDict, bkBizID, scene) + } + }() + } + // 等待所有 goroutine 执行完毕 + wg.Wait() + close(errChan) + // 处理错误 + for err := range errChan { + if err != nil { + logger.Errorf("SloPush task encountered error: %v", err) + } + } + metricFamilies, err := Registry.Gather() + if err != nil { + logger.Errorf("Could not gather metrics: %v", err) + } + + // 遍历并打印收集到的度量指标 + for _, mf := range metricFamilies { + logger.Debugf("Metric Family: %s", mf.GetName()) + for _, m := range mf.GetMetric() { + logger.Debugf(" Metric: %v", m) + } + } + metrics.PushRes(Registry) + logger.Info("auto deploy SloPush successfully") + return nil +} + +// confirmSloConfig 判断是否开启任务 +func confirmSloConfig() bool { + if cfg.SloPushGatewayEndpoint == "" || cfg.SloPushGatewayToken == "" { + logger.Info("Both SloPushGatewayToken and SloPushGatewayEndpoint are empty") + return false + } else { + return true + } +} diff --git a/pkg/bk-monitor-worker/metrics/slometrics.go b/pkg/bk-monitor-worker/metrics/slometrics.go new file mode 100644 index 000000000..b8bb2d4a3 --- /dev/null +++ b/pkg/bk-monitor-worker/metrics/slometrics.go @@ -0,0 +1,227 @@ +// Tencent is pleased to support the open source community by making +// 蓝鲸智云 - 监控平台 (BlueKing - Monitor) available. +// Copyright (C) 2022 THL A29 Limited, a Tencent company. All rights reserved. +// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. +// You may obtain a copy of the License at http://opensource.org/licenses/MIT +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. + +package metrics + +import ( + "log" + "net/http" + + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/utils/logger" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/push" + + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/config" +) + +type bkClient struct{} + +// MetricData 用于存储指标数据 +type MetricData struct { + Metric string + Value float64 + Labels map[string]string +} + +func (c *bkClient) Do(r *http.Request) (*http.Response, error) { + r.Header.Set("X-BK-TOKEN", config.SloPushGatewayToken) + return http.DefaultClient.Do(r) +} + +// 定义指标 +var ( + sloErrorTimeInfo = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "slo_error_time_info", + Help: "Total SLO error time info", + }, + []string{"bk_biz_id", "range_time", "strategy_id", "strategy_name", "velat", "scene"}, + ) + + sloInfo = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "slo_info", + Help: "Total SLO info", + }, + []string{"bk_biz_id", "range_time", "velat", "scene"}, + ) + + mttr = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "mttr", + Help: "Total MTTR", + }, + []string{"bk_biz_id", "range_time", "scene"}, + ) + + mtbf = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "mtbf", + Help: "Total MTBF", + }, + []string{"bk_biz_id", "range_time", "scene"}, + ) + + sloMetric = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "slo", + Help: "Total SLO", + }, + []string{"bk_biz_id", "range_time", "scene"}, + ) + + sloErrorTime = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "slo_error_time", + Help: "Total slo_error_time", + }, + []string{"bk_biz_id", "range_time", "scene"}, + ) + + sloErrorEventTimeInfo = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "slo_error_event_time_info", + Help: "Total slo_error_event_time_info", + }, + []string{"bk_biz_id", "range_time", "strategy_id", "scene", "start_time", "end_time", "event_id", "event_status"}, + ) + + sloMonitor = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "slo_monitor", + Help: "Total slo_monitor", + }, + []string{"bk_biz_id", "scene", "name", "status", "error"}, + ) +) + +// 注册指标 +func InitGauge(Registry *prometheus.Registry) { + Registry.MustRegister( + sloErrorTimeInfo, + sloInfo, + mttr, + mtbf, + sloMetric, + sloErrorTime, + sloMonitor, + sloErrorEventTimeInfo, + ) +} + +// RecordSloErrorTimeInfo updates the sloErrorTimeInfo metric with the provided values +func RecordSloMonitor(bk_biz_id string, scene string, name string, flag string, errString string) { + metric, err := sloMonitor.GetMetricWithLabelValues(bk_biz_id, scene, name, flag, errString) + if err != nil { + logger.Errorf("prom get [sloMonitor] right metric failed: %s", err) + return + } + metric.Add(1) +} + +// RecordSloErrorTimeInfo updates the sloErrorTimeInfo metric with the provided values +func RecordSloErrorTimeInfo(value float64, bk_biz_id string, range_time string, strategy_id string, strategy_name string, velat string, scene string) { + metric, err := sloErrorTimeInfo.GetMetricWithLabelValues(bk_biz_id, range_time, strategy_id, strategy_name, velat, scene) + + if err != nil { + logger.Errorf("prom get [sloErrorTimeInfo] metric failed: %s", err) + RecordSloMonitor(bk_biz_id, scene, "SloErrorTimeInfo", "0", err.Error()) + return + } + RecordSloMonitor(bk_biz_id, scene, "SloErrorTimeInfo", "1", "") + metric.Set(value) +} + +// RecordSloInfo updates the sloInfo metric with the provided values +func RecordSloInfo(value float64, bk_biz_id string, range_time string, velat string, scene string) { + metric, err := sloInfo.GetMetricWithLabelValues(bk_biz_id, range_time, velat, scene) + if err != nil { + log.Printf("prom get [sloInfo] metric failed: %s", err) + RecordSloMonitor(bk_biz_id, scene, "SloInfo", "0", err.Error()) + return + } + RecordSloMonitor(bk_biz_id, scene, "SloInfo", "1", "") + metric.Set(value) +} + +// RecordMttr updates the mttr metric with the provided values +func RecordMttr(value float64, bk_biz_id string, range_time string, scene string) { + metric, err := mttr.GetMetricWithLabelValues(bk_biz_id, range_time, scene) + if err != nil { + log.Printf("prom get [mttr] metric failed: %s", err) + RecordSloMonitor(bk_biz_id, scene, "Mttr", "0", err.Error()) + return + } + RecordSloMonitor(bk_biz_id, scene, "Mttr", "1", "") + metric.Set(value) +} + +// RecordMtbf updates the mtbf metric with the provided values +func RecordMtbf(value float64, bk_biz_id string, range_time string, scene string) { + metric, err := mtbf.GetMetricWithLabelValues(bk_biz_id, range_time, scene) + if err != nil { + log.Printf("prom get [mtbf] metric failed: %s", err) + RecordSloMonitor(bk_biz_id, scene, "Mtbf", "0", err.Error()) + return + } + RecordSloMonitor(bk_biz_id, scene, "Mtbf", "1", "") + metric.Set(value) +} + +// RecordSlo updates the slo metric with the provided values +func RecordSlo(value float64, bk_biz_id string, range_time string, scene string) { + metric, err := sloMetric.GetMetricWithLabelValues(bk_biz_id, range_time, scene) + if err != nil { + log.Printf("prom get [slo] metric failed: %s", err) + RecordSloMonitor(bk_biz_id, scene, "Slo", "0", err.Error()) + return + } + RecordSloMonitor(bk_biz_id, scene, "Slo", "1", "") + metric.Set(value) +} + +// RecordSloErrorTime updates the sloErrorTime metric with the provided values +func RecordSloErrorTime(value float64, bk_biz_id string, range_time string, scene string) { + metric, err := sloErrorTime.GetMetricWithLabelValues(bk_biz_id, range_time, scene) + if err != nil { + log.Printf("prom get [sloErrorTime] metric failed: %s", err) + RecordSloMonitor(bk_biz_id, scene, "SloErrorTime", "0", err.Error()) + return + } + RecordSloMonitor(bk_biz_id, scene, "SloErrorTime", "1", "") + metric.Set(value) +} + +// RecordSloErrorEventTimeInfo updates the sloErrorEventTimeInfo metric with the provided values +func RecordSloErrorEventTimeInfo(value float64, bk_biz_id string, range_time string, strategy_id string, scene string, start_time string, end_time string, event_id string, event_status string) { + metric, err := sloErrorEventTimeInfo.GetMetricWithLabelValues(bk_biz_id, range_time, strategy_id, scene, start_time, end_time, event_id, event_status) + if err != nil { + log.Printf("prom get [sloErrorEventTimeInfo] metric failed: %s", err) + RecordSloMonitor(bk_biz_id, scene, "SloErrorEventTimeInfo", "0", err.Error()) + return + } + RecordSloMonitor(bk_biz_id, scene, "SloErrorEventTimeInfo", "1", "") + metric.Set(value) +} + +func PushRes(Registry *prometheus.Registry) { + // 创建一个新的 Pusher + pusher := push.New(config.SloPushGatewayEndpoint, "slo").Gatherer(Registry) + + // 设置自定义客户端 + pusher.Client(&bkClient{}) + + // 推送指标数据 + if err := pusher.Push(); err != nil { + log.Printf("failed to push metric: %v", err) + return + } + + logger.Info("Pushed all metrics successfully") +} diff --git a/pkg/bk-monitor-worker/service/scheduler/periodic/periodic.go b/pkg/bk-monitor-worker/service/scheduler/periodic/periodic.go index ef3a70e6b..c5551a8ac 100644 --- a/pkg/bk-monitor-worker/service/scheduler/periodic/periodic.go +++ b/pkg/bk-monitor-worker/service/scheduler/periodic/periodic.go @@ -14,6 +14,8 @@ import ( "sync" "time" + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/utils/logger" + "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/common" cfg "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/config" cmESTask "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/internal/clustermetrics/es" @@ -22,7 +24,6 @@ import ( "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/processor" "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/task" "github.com/TencentBlueKing/bkmonitor-datalink/pkg/bk-monitor-worker/worker" - "github.com/TencentBlueKing/bkmonitor-datalink/pkg/utils/logger" ) type PeriodicTask struct { @@ -64,6 +65,8 @@ func getPeriodicTasks() map[string]PeriodicTask { ClearDeprecatedRedisKey := "periodic:metadata:clear_deprecated_redis_key" CleanDataIdConsulPath := "periodic:metadata:clean_data_id_consul_path" + SloPush := "periodic:metadata:slo_push" + return map[string]PeriodicTask{ refreshTsMetric: { Cron: "*/5 * * * *", @@ -176,6 +179,10 @@ func getPeriodicTasks() map[string]PeriodicTask { Cron: "0 2 * * *", // 每天凌晨2点执行 Handler: metadataTask.CleanDataIdConsulPath, }, + SloPush: { + Cron: "*/2 * * * *", + Handler: metadataTask.SloPush, + }, } }