File: measures.go

package info (click to toggle)
golang-github-gophercloud-utils 0.0~git20200508.b0167b9-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 784 kB
  • sloc: sh: 20; makefile: 7
file content (132 lines) | stat: -rw-r--r-- 4,531 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package v1

import (
	"testing"
	"time"

	"github.com/gophercloud/gophercloud"
	"github.com/gophercloud/gophercloud/acceptance/tools"
	"github.com/gophercloud/utils/gnocchi/metric/v1/measures"
)

// CreateMeasures will create measures inside a single Gnocchi metric. An error will be returned if the
// measures could not be created.
func CreateMeasures(t *testing.T, client *gophercloud.ServiceClient, metricID string) error {
	currentTimestamp := time.Now().UTC()
	pastHourTimestamp := currentTimestamp.Add(-1 * time.Hour)
	currentValue := float64(tools.RandomInt(100, 200))
	pastHourValue := float64(tools.RandomInt(500, 600))
	measuresToCreate := []measures.MeasureOpts{
		{
			Timestamp: &currentTimestamp,
			Value:     currentValue,
		},
		{
			Timestamp: &pastHourTimestamp,
			Value:     pastHourValue,
		},
	}
	createOpts := measures.CreateOpts{
		Measures: measuresToCreate,
	}

	t.Logf("Attempting to create measures inside a Gnocchi metric %s", metricID)
	if err := measures.Create(client, metricID, createOpts).ExtractErr(); err != nil {
		return err
	}

	t.Logf("Successfully created measures inside the Gnocchi metric %s", metricID)
	return nil
}

// MeasuresBatchCreateMetrics will create measures inside different metrics via batch request.
// An error will be returned if measures could not be created.
func MeasuresBatchCreateMetrics(t *testing.T, client *gophercloud.ServiceClient, metricIDs ...string) error {
	currentTimestamp := time.Now().UTC()
	pastHourTimestamp := currentTimestamp.Add(-1 * time.Hour)
	currentValue := float64(tools.RandomInt(100, 200))
	pastHourValue := float64(tools.RandomInt(500, 600))
	createOpts := make([]measures.MetricOpts, len(metricIDs))

	// Populate batch options with provided metric IDs and generated values.
	for i, m := range metricIDs {
		createOpts[i] = measures.MetricOpts{
			ID: m,
			Measures: []measures.MeasureOpts{
				{
					Timestamp: &currentTimestamp,
					Value:     currentValue,
				},
				{
					Timestamp: &pastHourTimestamp,
					Value:     pastHourValue,
				},
			},
		}
	}

	t.Logf("Attempting to create measures inside Gnocchi metrics via batch request")
	if err := measures.BatchCreateMetrics(client, createOpts).ExtractErr(); err != nil {
		return err
	}

	t.Logf("Successfully created measures inside Gnocchi metrics")
	return nil
}

// MeasuresBatchCreateResourcesMetrics will create measures inside different metrics via batch request to resource IDs.
// The batchResourcesMetrics arguments is a mapping between resource IDs and corresponding metric names.
// An error will be returned if measures could not be created.
func MeasuresBatchCreateResourcesMetrics(t *testing.T, client *gophercloud.ServiceClient, batchResourcesMetrics map[string][]string) error {
	currentTimestamp := time.Now().UTC()
	pastHourTimestamp := currentTimestamp.Add(-1 * time.Hour)
	currentValue := float64(tools.RandomInt(100, 200))
	pastHourValue := float64(tools.RandomInt(500, 600))

	// measureSet is a set of measures for an every metric.
	measureSet := []measures.MeasureOpts{
		{
			Timestamp: &currentTimestamp,
			Value:     currentValue,
		},
		{
			Timestamp: &pastHourTimestamp,
			Value:     pastHourValue,
		},
	}

	// batchResourcesMetricsOpts is an internal slice representation of measures.BatchResourcesMetricsOpts stucts.
	batchResourcesMetricsOpts := make([]measures.BatchResourcesMetricsOpts, 0)

	for resourceID, metricNames := range batchResourcesMetrics {
		// resourcesMetricsOpts is an internal slice representation of measures.ResourcesMetricsOpts structs.
		resourcesMetricsOpts := make([]measures.ResourcesMetricsOpts, 0)

		// Populate batch options for each metric of a resource.
		for _, metricName := range metricNames {
			resourcesMetricsOpts = append(resourcesMetricsOpts, measures.ResourcesMetricsOpts{
				MetricName: metricName,
				Measures:   measureSet,
			})
		}

		// Save batch options of a resource.
		batchResourcesMetricsOpts = append(batchResourcesMetricsOpts, measures.BatchResourcesMetricsOpts{
			ResourceID:       resourceID,
			ResourcesMetrics: resourcesMetricsOpts,
		})
	}

	createOpts := measures.BatchCreateResourcesMetricsOpts{
		CreateMetrics:         true,
		BatchResourcesMetrics: batchResourcesMetricsOpts,
	}

	t.Logf("Attempting to create measures inside Gnocchi metrics via batch request with resource IDs")
	if err := measures.BatchCreateResourcesMetrics(client, createOpts).ExtractErr(); err != nil {
		return err
	}

	t.Logf("Successfully created measures inside Gnocchi metrics")
	return nil
}