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