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  }