github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/openstack/ces/v1/metrics/results.go (about) 1 package metrics 2 3 import ( 4 "bytes" 5 "strconv" 6 7 "github.com/opentelekomcloud/gophertelekomcloud" 8 "github.com/opentelekomcloud/gophertelekomcloud/pagination" 9 ) 10 11 type ListMetricsResponse struct { 12 // Specifies the list of metric objects. 13 Metrics []MetricInfoList `json:"metrics"` 14 // Specifies the metadata of query results, including the pagination information. 15 MetaData MetaData `json:"meta_data"` 16 } 17 18 type MetricInfoList struct { 19 // Specifies the metric namespace. 20 Namespace string `json:"namespace"` 21 // Specifies the metric name, such as cpu_util. 22 MetricName string `json:"metric_name"` 23 // Specifies the metric unit. 24 Unit string `json:"unit"` 25 // Specifies the list of metric dimensions. 26 Dimensions []MetricsDimension `json:"dimensions"` 27 } 28 29 type MetaData struct { 30 // Specifies the number of returned results. 31 Count int `json:"count"` 32 // Specifies the pagination marker. 33 Marker string `json:"marker"` 34 // Specifies the total number of metrics. 35 Total int `json:"total"` 36 } 37 38 type MetricsDimension struct { 39 // Specifies the dimension. 40 Name string `json:"name"` 41 // Specifies the dimension value, for example, an ECS ID. 42 Value string `json:"value"` 43 } 44 45 type ListResult struct { 46 golangsdk.Result 47 } 48 49 func ExtractMetrics(r pagination.Page) (ListMetricsResponse, error) { 50 var s ListMetricsResponse 51 err := r.(MetricsPage).ExtractInto(&s) 52 return s, err 53 } 54 55 func ExtractAllPagesMetrics(r pagination.Page) (ListMetricsResponse, error) { 56 var s ListMetricsResponse 57 s.Metrics = make([]MetricInfoList, 0) 58 err := r.(MetricsPage).ExtractInto(&s) 59 if len(s.Metrics) == 0 { 60 return s, nil 61 } 62 s.MetaData.Count = len(s.Metrics) 63 s.MetaData.Total = len(s.Metrics) 64 var buf bytes.Buffer 65 buf.WriteString(s.Metrics[len(s.Metrics)-1].Namespace) 66 buf.WriteString(".") 67 buf.WriteString(s.Metrics[len(s.Metrics)-1].MetricName) 68 for _, dimension := range s.Metrics[len(s.Metrics)-1].Dimensions { 69 buf.WriteString(".") 70 buf.WriteString(dimension.Name) 71 buf.WriteString(":") 72 buf.WriteString(dimension.Value) 73 } 74 s.MetaData.Marker = buf.String() 75 return s, err 76 } 77 78 type MetricsPage struct { 79 pagination.LinkedPageBase 80 } 81 82 func (r MetricsPage) NextPageURL() (string, error) { 83 metrics, err := ExtractMetrics(r) 84 if err != nil { 85 return "", err 86 } 87 88 if len(metrics.Metrics) < 1 { 89 return "", nil 90 } 91 92 limit := r.URL.Query().Get("limit") 93 num, _ := strconv.Atoi(limit) 94 if num > len(metrics.Metrics) { 95 return "", nil 96 } 97 98 metricslen := len(metrics.Metrics) - 1 99 100 var buf bytes.Buffer 101 buf.WriteString(metrics.Metrics[metricslen].Namespace) 102 buf.WriteString(".") 103 buf.WriteString(metrics.Metrics[metricslen].MetricName) 104 for _, dimension := range metrics.Metrics[metricslen].Dimensions { 105 buf.WriteString(".") 106 buf.WriteString(dimension.Name) 107 buf.WriteString(":") 108 buf.WriteString(dimension.Value) 109 } 110 return r.WrapNextPageURL(buf.String()) 111 } 112 113 func (r MetricsPage) IsEmpty() (bool, error) { 114 s, err := ExtractMetrics(r) 115 if err != nil { 116 return false, err 117 } 118 return len(s.Metrics) == 0, err 119 } 120 121 func (r MetricsPage) WrapNextPageURL(start string) (string, error) { 122 limit := r.URL.Query().Get("limit") 123 if limit == "" { 124 return "", nil 125 } 126 uq := r.URL.Query() 127 uq.Set("start", start) 128 r.URL.RawQuery = uq.Encode() 129 return r.URL.String(), nil 130 }