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