From c7f55d59e00e6a572a424da33c11fd28f0fffdfd Mon Sep 17 00:00:00 2001 From: codecv Date: Fri, 13 Jan 2023 12:15:20 +0800 Subject: [PATCH 1/2] [Task][TencentCloud] Utilization Analysis Support Tencent #42 --- internal/providers/tencent/api.go | 200 +++++++++++++++++++++++++++++- 1 file changed, 195 insertions(+), 5 deletions(-) diff --git a/internal/providers/tencent/api.go b/internal/providers/tencent/api.go index 1ec53f4..007a26e 100644 --- a/internal/providers/tencent/api.go +++ b/internal/providers/tencent/api.go @@ -2,6 +2,7 @@ package tencent import ( "context" + "fmt" "strconv" "strings" "time" @@ -238,16 +239,152 @@ func convCurrency(priceUnit string) (currency string) { return } +// DescribeMetricList +// api doc https://cloud.tencent.com/document/api/248/31014 func (p *TencentCloud) DescribeMetricList(ctx context.Context, param types.DescribeMetricListRequest) (types.DescribeMetricList, error) { // TODO implement me - return types.DescribeMetricList{}, nil + + time.Sleep(500 * time.Millisecond) + + //check undefined type + if param.MetricName == types.Undefined { + return types.DescribeMetricList{}, errors.New("param 'metricName' undefined") + } + + request := monitor.NewGetMonitorDataRequest() + + //time + start := param.StartTime.Format(time.RFC3339) + end := param.EndTime.Format(time.RFC3339) + request.StartTime = &start + request.EndTime = &end + + //period + period, err := strconv.ParseUint(param.Period, 10, 64) + if err != nil { + return types.DescribeMetricList{}, err + } + request.Period = &period + + //instances + var instances []*monitor.Instance + var dimensions []*monitor.Dimension + name := "InstanceId" + for _, ins := range param.Filter.InstanceIds { + + dimensions = append(dimensions, &monitor.Dimension{ + Name: &name, + Value: &ins, + }) + + } + instances = append(instances, &monitor.Instance{ + Dimensions: dimensions, + }) + request.Instances = instances + + //namespace + nameSpace := "QCE/CVM" + request.Namespace = &nameSpace + + //metric name + var metricName string + switch param.MetricName { + case types.MetricItemCPUUtilization: + + metricName = "CPUUsage" + break + //内存使用情况 + case types.MetricItemMemoryUsedUtilization: + metricName = "MemUsage" + break + } + request.MetricName = &metricName + + monitorData, err := p.monitorClient.GetMonitorData(request) + if err != nil { + return types.DescribeMetricList{}, err + } + fmt.Println(monitorData) + + //Timestamp int64 时间戳 + //InstanceId string 实例id + //Min, Max, Average float64 最小,最大,平均值 + + var metricSamples []types.MetricSample + + for _, d := range monitorData.Response.DataPoints { + + //组合时间戳 数据 + var min float64 + var max float64 + var ave float64 + for index, t := range d.Values { + + ave += *t + if index == 0 { + min = *t + max = *t + + continue + } + + if min > *t { + min = *t + } + + if max < *t { + max = *t + } + + } + + metricSamples = append(metricSamples, types.MetricSample{ + Timestamp: param.StartTime.UnixMilli(), + InstanceId: param.Filter.InstanceIds[0], + Min: min, + Max: max, + Average: ave / float64(len(d.Values)), + }) + + } + + return types.DescribeMetricList{ + List: metricSamples, + }, nil } +// DescribeRegions +// +// get all available regions of the current account +// +// /* func (p *TencentCloud) DescribeRegions(ctx context.Context, param types.DescribeRegionsRequest) (types.DescribeRegions, error) { // TODO implement me - return types.DescribeRegions{}, nil -} + request := cvm.NewDescribeRegionsRequest() + + regions, err := p.cvmClient.DescribeRegions(request) + + if err != nil { + return types.DescribeRegions{}, err + } + + regionSet := regions.Response.RegionSet + + var ItemRegions []types.ItemRegion + for _, item := range regionSet { + itemRegion := types.ItemRegion{} + itemRegion.RegionId = *item.Region + itemRegion.LocalName = *item.RegionName + + ItemRegions = append(ItemRegions, itemRegion) + } + + return types.DescribeRegions{ + List: ItemRegions, + }, nil +} func (p *TencentCloud) DescribeInstanceBill(ctx context.Context, param types.DescribeInstanceBillRequest, isAll bool) (types.DescribeInstanceBill, error) { return types.DescribeInstanceBill{}, nil } @@ -256,6 +393,59 @@ func (p *TencentCloud) QueryAvailableInstances(ctx context.Context, param types. return types.QueryAvailableInstances{}, nil } -func (p *TencentCloud) DescribeInstances(ctx context.Context, param types.DescribeInstancesRequest) (types.DescribeInstances, error) { - return types.DescribeInstances{}, nil +func formatChargeType(t string) cloud.SubscriptionType { + + switch t { + case "PREPAID": + return cloud.PrePaid + case "POSTPAID_BY_HOUR": + return cloud.PostPaid + default: + return cloud.Undefined + } + +} + +// DescribeInstances +// +// get available instances of the current region +// +// /* +func (p *TencentCloud) DescribeInstances(_ context.Context, param types.DescribeInstancesRequest) (types.DescribeInstances, error) { + + request := cvm.NewDescribeInstancesRequest() + + instances, err := p.cvmClient.DescribeInstances(request) + if err != nil { + return types.DescribeInstances{}, err + } + + instanceSet := instances.Response.InstanceSet + var itemDescribeInstances []types.ItemDescribeInstance + for _, instance := range instanceSet { + var itemDescribeInstance = types.ItemDescribeInstance{ + InstanceId: *instance.InstanceId, + InstanceName: *instance.InstanceName, + RegionName: *instance.Placement.Zone, + SubscriptionType: formatChargeType(*instance.InstanceChargeType), + InternetChargeType: *instance.InstanceChargeType, + } + + var publicIps []string + for _, ip := range instance.PublicIpAddresses { + publicIps = append(publicIps, *ip) + } + + var privateIps []string + for _, ip := range instance.PrivateIpAddresses { + privateIps = append(privateIps, *ip) + } + + itemDescribeInstance.PublicIpAddress = publicIps + itemDescribeInstance.InnerIpAddress = privateIps + + itemDescribeInstances = append(itemDescribeInstances, itemDescribeInstance) + } + + return types.DescribeInstances{TotalCount: int(*instances.Response.TotalCount), List: itemDescribeInstances}, nil } From 6551e5a14b6a2ec322b2b337605523081979b966 Mon Sep 17 00:00:00 2001 From: codecv Date: Fri, 13 Jan 2023 21:43:20 +0800 Subject: [PATCH 2/2] [Task][TencentCloud] Utilization Analysis Support Tencent #42 second commit --- internal/providers/tencent/api.go | 49 ++++++++++++++++++------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/internal/providers/tencent/api.go b/internal/providers/tencent/api.go index 007a26e..583f6d9 100644 --- a/internal/providers/tencent/api.go +++ b/internal/providers/tencent/api.go @@ -239,10 +239,8 @@ func convCurrency(priceUnit string) (currency string) { return } -// DescribeMetricList -// api doc https://cloud.tencent.com/document/api/248/31014 +// DescribeMetricList api doc https://cloud.tencent.com/document/api/248/31014 func (p *TencentCloud) DescribeMetricList(ctx context.Context, param types.DescribeMetricListRequest) (types.DescribeMetricList, error) { - // TODO implement me time.Sleep(500 * time.Millisecond) @@ -354,16 +352,10 @@ func (p *TencentCloud) DescribeMetricList(ctx context.Context, param types.Descr }, nil } -// DescribeRegions -// -// get all available regions of the current account -// -// /* +// DescribeRegions get all available regions of the current account func (p *TencentCloud) DescribeRegions(ctx context.Context, param types.DescribeRegionsRequest) (types.DescribeRegions, error) { - // TODO implement me request := cvm.NewDescribeRegionsRequest() - regions, err := p.cvmClient.DescribeRegions(request) if err != nil { @@ -406,21 +398,38 @@ func formatChargeType(t string) cloud.SubscriptionType { } -// DescribeInstances -// -// get available instances of the current region -// -// /* +// DescribeInstances get available instances of the current region + func (p *TencentCloud) DescribeInstances(_ context.Context, param types.DescribeInstancesRequest) (types.DescribeInstances, error) { request := cvm.NewDescribeInstancesRequest() - instances, err := p.cvmClient.DescribeInstances(request) - if err != nil { - return types.DescribeInstances{}, err + var offset int64 = 0 + var limit int64 = 100 + var total int64 = 0 + request.Offset = &offset + var instanceSet []*cvm.Instance + for true { + + request.Offset = &offset + request.Limit = &limit + instancesRes, err := p.cvmClient.DescribeInstances(request) + if err != nil { + return types.DescribeInstances{}, err + } + + instanceSet = append(instanceSet, instancesRes.Response.InstanceSet...) + instanceSet = instancesRes.Response.InstanceSet + total += *instancesRes.Response.TotalCount + + if int64(len(instancesRes.Response.InstanceSet)) < limit { + break + } + + offset += limit + } - instanceSet := instances.Response.InstanceSet var itemDescribeInstances []types.ItemDescribeInstance for _, instance := range instanceSet { var itemDescribeInstance = types.ItemDescribeInstance{ @@ -447,5 +456,5 @@ func (p *TencentCloud) DescribeInstances(_ context.Context, param types.Describe itemDescribeInstances = append(itemDescribeInstances, itemDescribeInstance) } - return types.DescribeInstances{TotalCount: int(*instances.Response.TotalCount), List: itemDescribeInstances}, nil + return types.DescribeInstances{TotalCount: int(total), List: itemDescribeInstances}, nil }