1// Copyright 2019 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// Code generated by gapic-generator. DO NOT EDIT.
16
17package monitoring
18
19import (
20	"context"
21	"fmt"
22	"math"
23	"net/url"
24	"time"
25
26	"github.com/golang/protobuf/proto"
27	gax "github.com/googleapis/gax-go/v2"
28	"google.golang.org/api/iterator"
29	"google.golang.org/api/option"
30	"google.golang.org/api/transport"
31	metricpb "google.golang.org/genproto/googleapis/api/metric"
32	monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres"
33	monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3"
34	"google.golang.org/grpc"
35	"google.golang.org/grpc/codes"
36	"google.golang.org/grpc/metadata"
37)
38
39// MetricCallOptions contains the retry settings for each method of MetricClient.
40type MetricCallOptions struct {
41	ListMonitoredResourceDescriptors []gax.CallOption
42	GetMonitoredResourceDescriptor   []gax.CallOption
43	ListMetricDescriptors            []gax.CallOption
44	GetMetricDescriptor              []gax.CallOption
45	CreateMetricDescriptor           []gax.CallOption
46	DeleteMetricDescriptor           []gax.CallOption
47	ListTimeSeries                   []gax.CallOption
48	CreateTimeSeries                 []gax.CallOption
49}
50
51func defaultMetricClientOptions() []option.ClientOption {
52	return []option.ClientOption{
53		option.WithEndpoint("monitoring.googleapis.com:443"),
54		option.WithScopes(DefaultAuthScopes()...),
55		option.WithGRPCDialOption(grpc.WithDefaultCallOptions(
56			grpc.MaxCallRecvMsgSize(math.MaxInt32))),
57	}
58}
59
60func defaultMetricCallOptions() *MetricCallOptions {
61	retry := map[[2]string][]gax.CallOption{
62		{"default", "idempotent"}: {
63			gax.WithRetry(func() gax.Retryer {
64				return gax.OnCodes([]codes.Code{
65					codes.DeadlineExceeded,
66					codes.Unavailable,
67				}, gax.Backoff{
68					Initial:    100 * time.Millisecond,
69					Max:        60000 * time.Millisecond,
70					Multiplier: 1.3,
71				})
72			}),
73		},
74	}
75	return &MetricCallOptions{
76		ListMonitoredResourceDescriptors: retry[[2]string{"default", "idempotent"}],
77		GetMonitoredResourceDescriptor:   retry[[2]string{"default", "idempotent"}],
78		ListMetricDescriptors:            retry[[2]string{"default", "idempotent"}],
79		GetMetricDescriptor:              retry[[2]string{"default", "idempotent"}],
80		CreateMetricDescriptor:           retry[[2]string{"default", "non_idempotent"}],
81		DeleteMetricDescriptor:           retry[[2]string{"default", "idempotent"}],
82		ListTimeSeries:                   retry[[2]string{"default", "idempotent"}],
83		CreateTimeSeries:                 retry[[2]string{"default", "non_idempotent"}],
84	}
85}
86
87// MetricClient is a client for interacting with Stackdriver Monitoring API.
88//
89// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls.
90type MetricClient struct {
91	// The connection to the service.
92	conn *grpc.ClientConn
93
94	// The gRPC API client.
95	metricClient monitoringpb.MetricServiceClient
96
97	// The call options for this service.
98	CallOptions *MetricCallOptions
99
100	// The x-goog-* metadata to be sent with each request.
101	xGoogMetadata metadata.MD
102}
103
104// NewMetricClient creates a new metric service client.
105//
106// Manages metric descriptors, monitored resource descriptors, and
107// time series data.
108func NewMetricClient(ctx context.Context, opts ...option.ClientOption) (*MetricClient, error) {
109	conn, err := transport.DialGRPC(ctx, append(defaultMetricClientOptions(), opts...)...)
110	if err != nil {
111		return nil, err
112	}
113	c := &MetricClient{
114		conn:        conn,
115		CallOptions: defaultMetricCallOptions(),
116
117		metricClient: monitoringpb.NewMetricServiceClient(conn),
118	}
119	c.setGoogleClientInfo()
120	return c, nil
121}
122
123// Connection returns the client's connection to the API service.
124func (c *MetricClient) Connection() *grpc.ClientConn {
125	return c.conn
126}
127
128// Close closes the connection to the API service. The user should invoke this when
129// the client is no longer required.
130func (c *MetricClient) Close() error {
131	return c.conn.Close()
132}
133
134// setGoogleClientInfo sets the name and version of the application in
135// the `x-goog-api-client` header passed on each request. Intended for
136// use by Google-written clients.
137func (c *MetricClient) setGoogleClientInfo(keyval ...string) {
138	kv := append([]string{"gl-go", versionGo()}, keyval...)
139	kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version)
140	c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...))
141}
142
143// ListMonitoredResourceDescriptors lists monitored resource descriptors that match a filter. This method does not require a Stackdriver account.
144func (c *MetricClient) ListMonitoredResourceDescriptors(ctx context.Context, req *monitoringpb.ListMonitoredResourceDescriptorsRequest, opts ...gax.CallOption) *MonitoredResourceDescriptorIterator {
145	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName())))
146	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
147	opts = append(c.CallOptions.ListMonitoredResourceDescriptors[0:len(c.CallOptions.ListMonitoredResourceDescriptors):len(c.CallOptions.ListMonitoredResourceDescriptors)], opts...)
148	it := &MonitoredResourceDescriptorIterator{}
149	req = proto.Clone(req).(*monitoringpb.ListMonitoredResourceDescriptorsRequest)
150	it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoredrespb.MonitoredResourceDescriptor, string, error) {
151		var resp *monitoringpb.ListMonitoredResourceDescriptorsResponse
152		req.PageToken = pageToken
153		if pageSize > math.MaxInt32 {
154			req.PageSize = math.MaxInt32
155		} else {
156			req.PageSize = int32(pageSize)
157		}
158		err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
159			var err error
160			resp, err = c.metricClient.ListMonitoredResourceDescriptors(ctx, req, settings.GRPC...)
161			return err
162		}, opts...)
163		if err != nil {
164			return nil, "", err
165		}
166		return resp.ResourceDescriptors, resp.NextPageToken, nil
167	}
168	fetch := func(pageSize int, pageToken string) (string, error) {
169		items, nextPageToken, err := it.InternalFetch(pageSize, pageToken)
170		if err != nil {
171			return "", err
172		}
173		it.items = append(it.items, items...)
174		return nextPageToken, nil
175	}
176	it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)
177	it.pageInfo.MaxSize = int(req.PageSize)
178	it.pageInfo.Token = req.PageToken
179	return it
180}
181
182// GetMonitoredResourceDescriptor gets a single monitored resource descriptor. This method does not require a Stackdriver account.
183func (c *MetricClient) GetMonitoredResourceDescriptor(ctx context.Context, req *monitoringpb.GetMonitoredResourceDescriptorRequest, opts ...gax.CallOption) (*monitoredrespb.MonitoredResourceDescriptor, error) {
184	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName())))
185	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
186	opts = append(c.CallOptions.GetMonitoredResourceDescriptor[0:len(c.CallOptions.GetMonitoredResourceDescriptor):len(c.CallOptions.GetMonitoredResourceDescriptor)], opts...)
187	var resp *monitoredrespb.MonitoredResourceDescriptor
188	err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
189		var err error
190		resp, err = c.metricClient.GetMonitoredResourceDescriptor(ctx, req, settings.GRPC...)
191		return err
192	}, opts...)
193	if err != nil {
194		return nil, err
195	}
196	return resp, nil
197}
198
199// ListMetricDescriptors lists metric descriptors that match a filter. This method does not require a Stackdriver account.
200func (c *MetricClient) ListMetricDescriptors(ctx context.Context, req *monitoringpb.ListMetricDescriptorsRequest, opts ...gax.CallOption) *MetricDescriptorIterator {
201	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName())))
202	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
203	opts = append(c.CallOptions.ListMetricDescriptors[0:len(c.CallOptions.ListMetricDescriptors):len(c.CallOptions.ListMetricDescriptors)], opts...)
204	it := &MetricDescriptorIterator{}
205	req = proto.Clone(req).(*monitoringpb.ListMetricDescriptorsRequest)
206	it.InternalFetch = func(pageSize int, pageToken string) ([]*metricpb.MetricDescriptor, string, error) {
207		var resp *monitoringpb.ListMetricDescriptorsResponse
208		req.PageToken = pageToken
209		if pageSize > math.MaxInt32 {
210			req.PageSize = math.MaxInt32
211		} else {
212			req.PageSize = int32(pageSize)
213		}
214		err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
215			var err error
216			resp, err = c.metricClient.ListMetricDescriptors(ctx, req, settings.GRPC...)
217			return err
218		}, opts...)
219		if err != nil {
220			return nil, "", err
221		}
222		return resp.MetricDescriptors, resp.NextPageToken, nil
223	}
224	fetch := func(pageSize int, pageToken string) (string, error) {
225		items, nextPageToken, err := it.InternalFetch(pageSize, pageToken)
226		if err != nil {
227			return "", err
228		}
229		it.items = append(it.items, items...)
230		return nextPageToken, nil
231	}
232	it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)
233	it.pageInfo.MaxSize = int(req.PageSize)
234	it.pageInfo.Token = req.PageToken
235	return it
236}
237
238// GetMetricDescriptor gets a single metric descriptor. This method does not require a Stackdriver account.
239func (c *MetricClient) GetMetricDescriptor(ctx context.Context, req *monitoringpb.GetMetricDescriptorRequest, opts ...gax.CallOption) (*metricpb.MetricDescriptor, error) {
240	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName())))
241	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
242	opts = append(c.CallOptions.GetMetricDescriptor[0:len(c.CallOptions.GetMetricDescriptor):len(c.CallOptions.GetMetricDescriptor)], opts...)
243	var resp *metricpb.MetricDescriptor
244	err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
245		var err error
246		resp, err = c.metricClient.GetMetricDescriptor(ctx, req, settings.GRPC...)
247		return err
248	}, opts...)
249	if err != nil {
250		return nil, err
251	}
252	return resp, nil
253}
254
255// CreateMetricDescriptor creates a new metric descriptor.
256// User-created metric descriptors define
257// custom metrics (at /monitoring/custom-metrics).
258func (c *MetricClient) CreateMetricDescriptor(ctx context.Context, req *monitoringpb.CreateMetricDescriptorRequest, opts ...gax.CallOption) (*metricpb.MetricDescriptor, error) {
259	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName())))
260	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
261	opts = append(c.CallOptions.CreateMetricDescriptor[0:len(c.CallOptions.CreateMetricDescriptor):len(c.CallOptions.CreateMetricDescriptor)], opts...)
262	var resp *metricpb.MetricDescriptor
263	err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
264		var err error
265		resp, err = c.metricClient.CreateMetricDescriptor(ctx, req, settings.GRPC...)
266		return err
267	}, opts...)
268	if err != nil {
269		return nil, err
270	}
271	return resp, nil
272}
273
274// DeleteMetricDescriptor deletes a metric descriptor. Only user-created
275// custom metrics (at /monitoring/custom-metrics) can be deleted.
276func (c *MetricClient) DeleteMetricDescriptor(ctx context.Context, req *monitoringpb.DeleteMetricDescriptorRequest, opts ...gax.CallOption) error {
277	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName())))
278	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
279	opts = append(c.CallOptions.DeleteMetricDescriptor[0:len(c.CallOptions.DeleteMetricDescriptor):len(c.CallOptions.DeleteMetricDescriptor)], opts...)
280	err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
281		var err error
282		_, err = c.metricClient.DeleteMetricDescriptor(ctx, req, settings.GRPC...)
283		return err
284	}, opts...)
285	return err
286}
287
288// ListTimeSeries lists time series that match a filter. This method does not require a Stackdriver account.
289func (c *MetricClient) ListTimeSeries(ctx context.Context, req *monitoringpb.ListTimeSeriesRequest, opts ...gax.CallOption) *TimeSeriesIterator {
290	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName())))
291	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
292	opts = append(c.CallOptions.ListTimeSeries[0:len(c.CallOptions.ListTimeSeries):len(c.CallOptions.ListTimeSeries)], opts...)
293	it := &TimeSeriesIterator{}
294	req = proto.Clone(req).(*monitoringpb.ListTimeSeriesRequest)
295	it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.TimeSeries, string, error) {
296		var resp *monitoringpb.ListTimeSeriesResponse
297		req.PageToken = pageToken
298		if pageSize > math.MaxInt32 {
299			req.PageSize = math.MaxInt32
300		} else {
301			req.PageSize = int32(pageSize)
302		}
303		err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
304			var err error
305			resp, err = c.metricClient.ListTimeSeries(ctx, req, settings.GRPC...)
306			return err
307		}, opts...)
308		if err != nil {
309			return nil, "", err
310		}
311		return resp.TimeSeries, resp.NextPageToken, nil
312	}
313	fetch := func(pageSize int, pageToken string) (string, error) {
314		items, nextPageToken, err := it.InternalFetch(pageSize, pageToken)
315		if err != nil {
316			return "", err
317		}
318		it.items = append(it.items, items...)
319		return nextPageToken, nil
320	}
321	it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)
322	it.pageInfo.MaxSize = int(req.PageSize)
323	it.pageInfo.Token = req.PageToken
324	return it
325}
326
327// CreateTimeSeries creates or adds data to one or more time series.
328// The response is empty if all time series in the request were written.
329// If any time series could not be written, a corresponding failure message is
330// included in the error response.
331func (c *MetricClient) CreateTimeSeries(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest, opts ...gax.CallOption) error {
332	md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName())))
333	ctx = insertMetadata(ctx, c.xGoogMetadata, md)
334	opts = append(c.CallOptions.CreateTimeSeries[0:len(c.CallOptions.CreateTimeSeries):len(c.CallOptions.CreateTimeSeries)], opts...)
335	err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
336		var err error
337		_, err = c.metricClient.CreateTimeSeries(ctx, req, settings.GRPC...)
338		return err
339	}, opts...)
340	return err
341}
342
343// MetricDescriptorIterator manages a stream of *metricpb.MetricDescriptor.
344type MetricDescriptorIterator struct {
345	items    []*metricpb.MetricDescriptor
346	pageInfo *iterator.PageInfo
347	nextFunc func() error
348
349	// InternalFetch is for use by the Google Cloud Libraries only.
350	// It is not part of the stable interface of this package.
351	//
352	// InternalFetch returns results from a single call to the underlying RPC.
353	// The number of results is no greater than pageSize.
354	// If there are no more results, nextPageToken is empty and err is nil.
355	InternalFetch func(pageSize int, pageToken string) (results []*metricpb.MetricDescriptor, nextPageToken string, err error)
356}
357
358// PageInfo supports pagination. See the google.golang.org/api/iterator package for details.
359func (it *MetricDescriptorIterator) PageInfo() *iterator.PageInfo {
360	return it.pageInfo
361}
362
363// Next returns the next result. Its second return value is iterator.Done if there are no more
364// results. Once Next returns Done, all subsequent calls will return Done.
365func (it *MetricDescriptorIterator) Next() (*metricpb.MetricDescriptor, error) {
366	var item *metricpb.MetricDescriptor
367	if err := it.nextFunc(); err != nil {
368		return item, err
369	}
370	item = it.items[0]
371	it.items = it.items[1:]
372	return item, nil
373}
374
375func (it *MetricDescriptorIterator) bufLen() int {
376	return len(it.items)
377}
378
379func (it *MetricDescriptorIterator) takeBuf() interface{} {
380	b := it.items
381	it.items = nil
382	return b
383}
384
385// MonitoredResourceDescriptorIterator manages a stream of *monitoredrespb.MonitoredResourceDescriptor.
386type MonitoredResourceDescriptorIterator struct {
387	items    []*monitoredrespb.MonitoredResourceDescriptor
388	pageInfo *iterator.PageInfo
389	nextFunc func() error
390
391	// InternalFetch is for use by the Google Cloud Libraries only.
392	// It is not part of the stable interface of this package.
393	//
394	// InternalFetch returns results from a single call to the underlying RPC.
395	// The number of results is no greater than pageSize.
396	// If there are no more results, nextPageToken is empty and err is nil.
397	InternalFetch func(pageSize int, pageToken string) (results []*monitoredrespb.MonitoredResourceDescriptor, nextPageToken string, err error)
398}
399
400// PageInfo supports pagination. See the google.golang.org/api/iterator package for details.
401func (it *MonitoredResourceDescriptorIterator) PageInfo() *iterator.PageInfo {
402	return it.pageInfo
403}
404
405// Next returns the next result. Its second return value is iterator.Done if there are no more
406// results. Once Next returns Done, all subsequent calls will return Done.
407func (it *MonitoredResourceDescriptorIterator) Next() (*monitoredrespb.MonitoredResourceDescriptor, error) {
408	var item *monitoredrespb.MonitoredResourceDescriptor
409	if err := it.nextFunc(); err != nil {
410		return item, err
411	}
412	item = it.items[0]
413	it.items = it.items[1:]
414	return item, nil
415}
416
417func (it *MonitoredResourceDescriptorIterator) bufLen() int {
418	return len(it.items)
419}
420
421func (it *MonitoredResourceDescriptorIterator) takeBuf() interface{} {
422	b := it.items
423	it.items = nil
424	return b
425}
426
427// TimeSeriesIterator manages a stream of *monitoringpb.TimeSeries.
428type TimeSeriesIterator struct {
429	items    []*monitoringpb.TimeSeries
430	pageInfo *iterator.PageInfo
431	nextFunc func() error
432
433	// InternalFetch is for use by the Google Cloud Libraries only.
434	// It is not part of the stable interface of this package.
435	//
436	// InternalFetch returns results from a single call to the underlying RPC.
437	// The number of results is no greater than pageSize.
438	// If there are no more results, nextPageToken is empty and err is nil.
439	InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.TimeSeries, nextPageToken string, err error)
440}
441
442// PageInfo supports pagination. See the google.golang.org/api/iterator package for details.
443func (it *TimeSeriesIterator) PageInfo() *iterator.PageInfo {
444	return it.pageInfo
445}
446
447// Next returns the next result. Its second return value is iterator.Done if there are no more
448// results. Once Next returns Done, all subsequent calls will return Done.
449func (it *TimeSeriesIterator) Next() (*monitoringpb.TimeSeries, error) {
450	var item *monitoringpb.TimeSeries
451	if err := it.nextFunc(); err != nil {
452		return item, err
453	}
454	item = it.items[0]
455	it.items = it.items[1:]
456	return item, nil
457}
458
459func (it *TimeSeriesIterator) bufLen() int {
460	return len(it.items)
461}
462
463func (it *TimeSeriesIterator) takeBuf() interface{} {
464	b := it.items
465	it.items = nil
466	return b
467}
468