From b91a3dd280dffa2c21a2e82686762ed4792fa4d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Tue, 30 Dec 2025 19:56:42 +0800 Subject: [PATCH] fix(cloudmon): optimized account balance metric collect (#24010) --- pkg/cloudmon/misc/system.go | 12 +++++++++++ pkg/cloudmon/providerdriver/aliyun.go | 30 --------------------------- pkg/cloudmon/providerdriver/baidu.go | 26 ----------------------- pkg/cloudmon/providerdriver/base.go | 24 ++++++++++++++++++++- pkg/cloudmon/providerdriver/huawei.go | 26 ----------------------- pkg/cloudmon/providerdriver/qcloud.go | 26 ----------------------- pkg/cloudmon/providerdriver/volc.go | 26 ----------------------- pkg/cloudmon/resources/resources.go | 12 ++++++----- 8 files changed, 42 insertions(+), 140 deletions(-) diff --git a/pkg/cloudmon/misc/system.go b/pkg/cloudmon/misc/system.go index b82b6bc1aa..444df60284 100644 --- a/pkg/cloudmon/misc/system.go +++ b/pkg/cloudmon/misc/system.go @@ -198,6 +198,9 @@ func CollectServiceMetrics(ctx context.Context, userCred mcclient.TokenCredentia } func collectApiStatsMetrics(ctx context.Context, serviceName string, serviceType string, regionId string, url string, version, token string) ([]influxdb.SMetricData, error) { + if len(url) == 0 || utils.IsInStringArray(serviceType, []string{"mcp-server"}) { + return []influxdb.SMetricData{}, nil + } log.Debugf("collectApiStatsMetrics %s %s %s %s %s", serviceName, serviceType, regionId, url, version) statsUrl := httputils.JoinPath(baseUrlF(url), "stats") hdr := http.Header{} @@ -227,6 +230,9 @@ func collectApiStatsMetrics(ctx context.Context, serviceName string, serviceType } func collectWorkerMetrics(ctx context.Context, url, service, serviceType, regionId, version, token string) ([]influxdb.SMetricData, error) { + if len(url) == 0 || utils.IsInStringArray(serviceType, []string{"mcp-server"}) { + return []influxdb.SMetricData{}, nil + } statsUrl := httputils.JoinPath(baseUrlF(url), "worker_stats") hdr := http.Header{} hdr.Set("X-Auth-Token", token) @@ -319,6 +325,9 @@ func collectWorkerMetrics(ctx context.Context, url, service, serviceType, region } func collectDatabaseMetrics(ctx context.Context, ep api.EndpointDetails, version, token string) ([]influxdb.SMetricData, error) { + if utils.IsInStringArray(ep.ServiceType, []string{"cloudmon", "webconsole", "k8s", "vpcagent", "yunionapi", "yunionagent"}) { + return []influxdb.SMetricData{}, nil + } statsUrl := httputils.JoinPath(baseUrlF(ep.Url), "db_stats") hdr := http.Header{} hdr.Set("X-Auth-Token", token) @@ -406,6 +415,9 @@ func collectDatabaseMetrics(ctx context.Context, ep api.EndpointDetails, version } func collectProcessMetrics(ctx context.Context, ep api.EndpointDetails, version, token string) ([]influxdb.SMetricData, error) { + if utils.IsInStringArray(ep.ServiceType, []string{"monitor", "webconsole", "k8s", "mcp-server"}) { + return []influxdb.SMetricData{}, nil + } statsUrl := httputils.JoinPath(baseUrlF(ep.Url), "process_stats") hdr := http.Header{} hdr.Set("X-Auth-Token", token) diff --git a/pkg/cloudmon/providerdriver/aliyun.go b/pkg/cloudmon/providerdriver/aliyun.go index 01717b4648..d53b3082b1 100644 --- a/pkg/cloudmon/providerdriver/aliyun.go +++ b/pkg/cloudmon/providerdriver/aliyun.go @@ -15,13 +15,9 @@ package providerdriver import ( - "context" "time" - "yunion.io/x/cloudmux/pkg/cloudprovider" - api "yunion.io/x/onecloud/pkg/apis/compute" - "yunion.io/x/onecloud/pkg/util/influxdb" ) type AliyunCollect struct { @@ -36,32 +32,6 @@ func (self *AliyunCollect) IsSupportMetrics() bool { return true } -func (self *AliyunCollect) CollectAccountMetrics(ctx context.Context, account api.CloudaccountDetail) (influxdb.SMetricData, error) { - metric := influxdb.SMetricData{ - Name: string(cloudprovider.METRIC_RESOURCE_TYPE_CLOUD_ACCOUNT), - Timestamp: time.Now(), - Tags: []influxdb.SKeyValue{}, - Metrics: []influxdb.SKeyValue{}, - } - for k, v := range account.GetMetricTags() { - metric.Tags = append([]influxdb.SKeyValue{ - { - Key: k, - Value: v, - }, - }, metric.Tags...) - } - for k, v := range account.GetMetricPairs() { - metric.Metrics = append([]influxdb.SKeyValue{ - { - Key: k, - Value: v, - }, - }, metric.Metrics...) - } - return metric, nil -} - func (self *AliyunCollect) GetDelayDuration() time.Duration { return time.Minute * 3 } diff --git a/pkg/cloudmon/providerdriver/baidu.go b/pkg/cloudmon/providerdriver/baidu.go index e7c5ad4eb9..01760eb0b6 100644 --- a/pkg/cloudmon/providerdriver/baidu.go +++ b/pkg/cloudmon/providerdriver/baidu.go @@ -45,32 +45,6 @@ func init() { Register(&BaiduCollect{}) } -func (self *BaiduCollect) CollectAccountMetrics(ctx context.Context, account api.CloudaccountDetail) (influxdb.SMetricData, error) { - metric := influxdb.SMetricData{ - Name: string(cloudprovider.METRIC_RESOURCE_TYPE_CLOUD_ACCOUNT), - Timestamp: time.Now(), - Tags: []influxdb.SKeyValue{}, - Metrics: []influxdb.SKeyValue{}, - } - for k, v := range account.GetMetricTags() { - metric.Tags = append([]influxdb.SKeyValue{ - { - Key: k, - Value: v, - }, - }, metric.Tags...) - } - for k, v := range account.GetMetricPairs() { - metric.Metrics = append([]influxdb.SKeyValue{ - { - Key: k, - Value: v, - }, - }, metric.Metrics...) - } - return metric, nil -} - func (self *BaiduCollect) CollectServerMetrics(ctx context.Context, manager api.CloudproviderDetails, provider cloudprovider.ICloudProvider, res map[string]api.ServerDetails, start, end time.Time) error { metrics := []influxdb.SMetricData{} regionServers := map[string][]api.ServerDetails{} diff --git a/pkg/cloudmon/providerdriver/base.go b/pkg/cloudmon/providerdriver/base.go index 05b69ceab8..c4728ab4f6 100644 --- a/pkg/cloudmon/providerdriver/base.go +++ b/pkg/cloudmon/providerdriver/base.go @@ -47,7 +47,29 @@ func (self *SBaseCollectDriver) IsSupportMetrics() bool { } func (self *SBaseCollectDriver) CollectAccountMetrics(ctx context.Context, account api.CloudaccountDetail) (influxdb.SMetricData, error) { - return influxdb.SMetricData{}, errors.Wrapf(cloudprovider.ErrNotImplemented, "CollectAccountMetrics") + metric := influxdb.SMetricData{ + Name: string(cloudprovider.METRIC_RESOURCE_TYPE_CLOUD_ACCOUNT), + Timestamp: time.Now(), + Tags: []influxdb.SKeyValue{}, + Metrics: []influxdb.SKeyValue{}, + } + for k, v := range account.GetMetricTags() { + metric.Tags = append([]influxdb.SKeyValue{ + { + Key: k, + Value: v, + }, + }, metric.Tags...) + } + for k, v := range account.GetMetricPairs() { + metric.Metrics = append([]influxdb.SKeyValue{ + { + Key: k, + Value: v, + }, + }, metric.Metrics...) + } + return metric, nil } func (self *SBaseCollectDriver) CollectDBInstanceMetrics(ctx context.Context, manager api.CloudproviderDetails, provider cloudprovider.ICloudProvider, res map[string]api.DBInstanceDetails, start, end time.Time) error { diff --git a/pkg/cloudmon/providerdriver/huawei.go b/pkg/cloudmon/providerdriver/huawei.go index 7cf56e0b67..7e38f70564 100644 --- a/pkg/cloudmon/providerdriver/huawei.go +++ b/pkg/cloudmon/providerdriver/huawei.go @@ -44,32 +44,6 @@ func init() { Register(&HuaweiCollect{}) } -func (self *HuaweiCollect) CollectAccountMetrics(ctx context.Context, account api.CloudaccountDetail) (influxdb.SMetricData, error) { - metric := influxdb.SMetricData{ - Name: string(cloudprovider.METRIC_RESOURCE_TYPE_CLOUD_ACCOUNT), - Timestamp: time.Now(), - Tags: []influxdb.SKeyValue{}, - Metrics: []influxdb.SKeyValue{}, - } - for k, v := range account.GetMetricTags() { - metric.Tags = append([]influxdb.SKeyValue{ - { - Key: k, - Value: v, - }, - }, metric.Tags...) - } - for k, v := range account.GetMetricPairs() { - metric.Metrics = append([]influxdb.SKeyValue{ - { - Key: k, - Value: v, - }, - }, metric.Metrics...) - } - return metric, nil -} - func (self *HuaweiCollect) CollectModelartsPoolMetrics(ctx context.Context, manager api.CloudproviderDetails, provider cloudprovider.ICloudProvider, res map[string]api.ModelartsPoolDetails, start, end time.Time) error { metrics := []influxdb.SMetricData{} var wg sync.WaitGroup diff --git a/pkg/cloudmon/providerdriver/qcloud.go b/pkg/cloudmon/providerdriver/qcloud.go index 4131259c07..03ff5cd249 100644 --- a/pkg/cloudmon/providerdriver/qcloud.go +++ b/pkg/cloudmon/providerdriver/qcloud.go @@ -45,32 +45,6 @@ func init() { Register(&QcloudCollect{}) } -func (self *QcloudCollect) CollectAccountMetrics(ctx context.Context, account api.CloudaccountDetail) (influxdb.SMetricData, error) { - metric := influxdb.SMetricData{ - Name: string(cloudprovider.METRIC_RESOURCE_TYPE_CLOUD_ACCOUNT), - Timestamp: time.Now(), - Tags: []influxdb.SKeyValue{}, - Metrics: []influxdb.SKeyValue{}, - } - for k, v := range account.GetMetricTags() { - metric.Tags = append([]influxdb.SKeyValue{ - { - Key: k, - Value: v, - }, - }, metric.Tags...) - } - for k, v := range account.GetMetricPairs() { - metric.Metrics = append([]influxdb.SKeyValue{ - { - Key: k, - Value: v, - }, - }, metric.Metrics...) - } - return metric, nil -} - func (self *QcloudCollect) CollectServerMetrics(ctx context.Context, manager api.CloudproviderDetails, provider cloudprovider.ICloudProvider, res map[string]api.ServerDetails, start, end time.Time) error { metrics := []influxdb.SMetricData{} regionServers := map[string][]api.ServerDetails{} diff --git a/pkg/cloudmon/providerdriver/volc.go b/pkg/cloudmon/providerdriver/volc.go index 1a7b3726fc..4798fd66ab 100644 --- a/pkg/cloudmon/providerdriver/volc.go +++ b/pkg/cloudmon/providerdriver/volc.go @@ -45,32 +45,6 @@ func init() { Register(&VolcEngineCollect{}) } -func (self *VolcEngineCollect) CollectAccountMetrics(ctx context.Context, account api.CloudaccountDetail) (influxdb.SMetricData, error) { - metric := influxdb.SMetricData{ - Name: string(cloudprovider.METRIC_RESOURCE_TYPE_CLOUD_ACCOUNT), - Timestamp: time.Now(), - Tags: []influxdb.SKeyValue{}, - Metrics: []influxdb.SKeyValue{}, - } - for k, v := range account.GetMetricTags() { - metric.Tags = append([]influxdb.SKeyValue{ - { - Key: k, - Value: v, - }, - }, metric.Tags...) - } - for k, v := range account.GetMetricPairs() { - metric.Metrics = append([]influxdb.SKeyValue{ - { - Key: k, - Value: v, - }, - }, metric.Metrics...) - } - return metric, nil -} - func (self *VolcEngineCollect) CollectServerMetrics(ctx context.Context, manager api.CloudproviderDetails, provider cloudprovider.ICloudProvider, res map[string]api.ServerDetails, start, end time.Time) error { metrics := []influxdb.SMetricData{} regionServers := map[string][]api.ServerDetails{} diff --git a/pkg/cloudmon/resources/resources.go b/pkg/cloudmon/resources/resources.go index 2a2ad94a94..876dfd8ccd 100644 --- a/pkg/cloudmon/resources/resources.go +++ b/pkg/cloudmon/resources/resources.go @@ -17,6 +17,7 @@ package resources import ( "context" "fmt" + "math" "strings" "sync" "time" @@ -967,19 +968,20 @@ func (res *SResources) CollectMetrics(ctx context.Context, userCred mcclient.Tok driver, err := providerdriver.GetDriver(account.Provider) if err != nil { log.Errorf("failed get account %s(%s) driver %v", account.Name, account.Provider, err) - return + continue + } + + if math.Abs(account.Balance) < 0.000001 { + continue } metric, err := driver.CollectAccountMetrics(ctx, account) if err != nil { - if errors.Cause(err) != cloudprovider.ErrNotImplemented && errors.Cause(err) != cloudprovider.ErrNotSupported { - log.Errorf("CollectAccountMetrics for %s(%s) error: %v", account.Name, account.Provider, err) - continue - } continue } metrics = append(metrics, metric) } + log.Debugf("send %d account metrics to meter_db", len(metrics)) urls, err := tsdb.GetDefaultServiceSourceURLs(s, options.Options.SessionEndpointType) if err != nil { log.Errorf("Get influxdb %s service url: %v", options.Options.SessionEndpointType, err)