From 41dbc51fea53f6606c88422b99e11be10b352f6d Mon Sep 17 00:00:00 2001 From: mhf Date: Thu, 27 Oct 2022 11:40:32 +0800 Subject: [PATCH] cloudpodsMonitor --- pkg/cloudmon/providerdriver/cloudpods.go | 6 ++- pkg/monitor/models/unifiedmonitor.go | 5 +- pkg/multicloud/cloudpods/instance.go | 50 +++++++++++++++++++ pkg/multicloud/cloudpods/provider/provider.go | 4 ++ pkg/multicloud/cloudpods/shell/instance.go | 9 ++++ 5 files changed, 71 insertions(+), 3 deletions(-) diff --git a/pkg/cloudmon/providerdriver/cloudpods.go b/pkg/cloudmon/providerdriver/cloudpods.go index 029f00cb5d..c62e6abc22 100644 --- a/pkg/cloudmon/providerdriver/cloudpods.go +++ b/pkg/cloudmon/providerdriver/cloudpods.go @@ -19,13 +19,17 @@ import ( ) type CloudpodsCollect struct { - SBaseCollectDriver + SCollectByMetricTypeDriver } func (self *CloudpodsCollect) GetProvider() string { return api.CLOUD_PROVIDER_CLOUDPODS } +func (collect *CloudpodsCollect) IsSupportMetrics() bool { + return true +} + func init() { Register(&CloudpodsCollect{}) } diff --git a/pkg/monitor/models/unifiedmonitor.go b/pkg/monitor/models/unifiedmonitor.go index f6fc6ae4c1..651e21c197 100644 --- a/pkg/monitor/models/unifiedmonitor.go +++ b/pkg/monitor/models/unifiedmonitor.go @@ -539,8 +539,8 @@ func (self *SUnifiedMonitorManager) GetPropertySimpleQuery(ctx context.Context, if input.EndTime.Sub(input.StartTime).Hours() > 1 { return nil, httperrors.NewInputParameterError("The query interval is greater than one hour") } - st := input.StartTime.Format("2006-01-02T15:04:05Z") - et := input.EndTime.Format("2006-01-02T15:04:05Z") + st := input.StartTime.Format(time.RFC3339) + et := input.EndTime.Format(time.RFC3339) conditions := []string{} for k, v := range input.Tags { conditions = append(conditions, fmt.Sprintf("%s = '%s'", k, v)) @@ -548,6 +548,7 @@ func (self *SUnifiedMonitorManager) GetPropertySimpleQuery(ctx context.Context, conditions = append(conditions, fmt.Sprintf("time >= '%s'", st)) conditions = append(conditions, fmt.Sprintf("time <= '%s'", et)) sqlstr += strings.Join(conditions, " and ") + sqlstr += " limit 2000" dataSource, err := DataSourceManager.GetDefaultSource() if err != nil { return nil, errors.Wrap(err, "s.GetDefaultSource") diff --git a/pkg/multicloud/cloudpods/instance.go b/pkg/multicloud/cloudpods/instance.go index 66609289b4..37edff0d14 100644 --- a/pkg/multicloud/cloudpods/instance.go +++ b/pkg/multicloud/cloudpods/instance.go @@ -29,6 +29,7 @@ import ( modules "yunion.io/x/onecloud/pkg/mcclient/modules/compute" "yunion.io/x/onecloud/pkg/mcclient/modules/identity" "yunion.io/x/onecloud/pkg/mcclient/modules/logger" + "yunion.io/x/onecloud/pkg/mcclient/modules/monitor" "yunion.io/x/onecloud/pkg/mcclient/modules/webconsole" "yunion.io/x/onecloud/pkg/multicloud" ) @@ -513,3 +514,52 @@ func (self *SRegion) CreateInstance(hostId, hypervisor string, opts *cloudprovid ins := &SInstance{} return ins, self.create(&modules.Servers, input, ins) } + +type SMetricData struct { + Id string `json:"id"` + Time time.Time `json:"time"` + Value float64 `json:"value"` +} + +func (cli *SCloudpodsClient) GetMetrics(opts *cloudprovider.MetricListOptions) ([]cloudprovider.MetricValues, error) { + brandArr := []string{"OneCloud", "VMware"} + metrics := []SMetricData{} + for i := 0; i < len(brandArr); i++ { + params := map[string]interface{}{ + "metric_name": opts.MetricType, + "tags": map[string]interface{}{ + "brand": brandArr[i], + }, + } + onecloudObj, err := monitor.UnifiedMonitorManager.Get(cli.s, "simple-query", jsonutils.Marshal(params)) + if err != nil { + return nil, err + } + tmp := []SMetricData{} + onecloudObj.Unmarshal(&tmp, "values") + metrics = append(metrics, tmp...) + } + + idWithMetric := map[string][]cloudprovider.MetricValue{} + for _, v := range metrics { + if _, isExist := idWithMetric[v.Id]; !isExist { + idWithMetric[v.Id] = []cloudprovider.MetricValue{{ + Timestamp: v.Time, + Value: v.Value}} + } else { + idWithMetric[v.Id] = append(idWithMetric[v.Id], cloudprovider.MetricValue{ + Timestamp: v.Time, + Value: v.Value}) + } + } + + res := []cloudprovider.MetricValues{} + for _, metric := range metrics { + res = append(res, cloudprovider.MetricValues{ + Id: metric.Id, + MetricType: opts.MetricType, + Values: idWithMetric[metric.Id], + }) + } + return res, nil +} diff --git a/pkg/multicloud/cloudpods/provider/provider.go b/pkg/multicloud/cloudpods/provider/provider.go index 72e647d0a5..3cddcf95fe 100644 --- a/pkg/multicloud/cloudpods/provider/provider.go +++ b/pkg/multicloud/cloudpods/provider/provider.go @@ -154,3 +154,7 @@ func (self *SCloudpodsProvider) GetSysInfo() (jsonutils.JSONObject, error) { func (self *SCloudpodsProvider) GetVersion() string { return self.client.GetVersion() } + +func (provider *SCloudpodsProvider) GetMetrics(opts *cloudprovider.MetricListOptions) ([]cloudprovider.MetricValues, error) { + return provider.client.GetMetrics(opts) +} diff --git a/pkg/multicloud/cloudpods/shell/instance.go b/pkg/multicloud/cloudpods/shell/instance.go index 16eae75bfb..4816d0fbb6 100644 --- a/pkg/multicloud/cloudpods/shell/instance.go +++ b/pkg/multicloud/cloudpods/shell/instance.go @@ -15,6 +15,7 @@ package shell import ( + "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/multicloud/cloudpods" "yunion.io/x/onecloud/pkg/util/shellutils" ) @@ -60,4 +61,12 @@ func init() { return nil }) + shellutils.R(&cloudprovider.MetricListOptions{}, "instance-monitor-list", "Instance Monitor List", func(cli *cloudpods.SRegion, opts *cloudprovider.MetricListOptions) error { + metrics, err := cli.GetClient().GetMetrics(opts) + if err != nil { + return err + } + printList(metrics, len(metrics), 0, 0, []string{}) + return nil + }) }