1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package monitoring
18
19 import (
20 "context"
21 "fmt"
22 "math"
23 "net/url"
24
25 monitoringpb "cloud.google.com/go/monitoring/apiv3/v2/monitoringpb"
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/option/internaloption"
30 gtransport "google.golang.org/api/transport/grpc"
31 "google.golang.org/grpc"
32 "google.golang.org/protobuf/proto"
33 )
34
35 var newQueryClientHook clientHook
36
37
38 type QueryCallOptions struct {
39 QueryTimeSeries []gax.CallOption
40 }
41
42 func defaultQueryGRPCClientOptions() []option.ClientOption {
43 return []option.ClientOption{
44 internaloption.WithDefaultEndpoint("monitoring.googleapis.com:443"),
45 internaloption.WithDefaultEndpointTemplate("monitoring.UNIVERSE_DOMAIN:443"),
46 internaloption.WithDefaultMTLSEndpoint("monitoring.mtls.googleapis.com:443"),
47 internaloption.WithDefaultUniverseDomain("googleapis.com"),
48 internaloption.WithDefaultAudience("https://monitoring.googleapis.com/"),
49 internaloption.WithDefaultScopes(DefaultAuthScopes()...),
50 internaloption.EnableJwtWithScope(),
51 option.WithGRPCDialOption(grpc.WithDefaultCallOptions(
52 grpc.MaxCallRecvMsgSize(math.MaxInt32))),
53 }
54 }
55
56 func defaultQueryCallOptions() *QueryCallOptions {
57 return &QueryCallOptions{
58 QueryTimeSeries: []gax.CallOption{},
59 }
60 }
61
62
63 type internalQueryClient interface {
64 Close() error
65 setGoogleClientInfo(...string)
66 Connection() *grpc.ClientConn
67 QueryTimeSeries(context.Context, *monitoringpb.QueryTimeSeriesRequest, ...gax.CallOption) *TimeSeriesDataIterator
68 }
69
70
71
72
73
74
75
76 type QueryClient struct {
77
78 internalClient internalQueryClient
79
80
81 CallOptions *QueryCallOptions
82 }
83
84
85
86
87
88 func (c *QueryClient) Close() error {
89 return c.internalClient.Close()
90 }
91
92
93
94
95 func (c *QueryClient) setGoogleClientInfo(keyval ...string) {
96 c.internalClient.setGoogleClientInfo(keyval...)
97 }
98
99
100
101
102
103 func (c *QueryClient) Connection() *grpc.ClientConn {
104 return c.internalClient.Connection()
105 }
106
107
108 func (c *QueryClient) QueryTimeSeries(ctx context.Context, req *monitoringpb.QueryTimeSeriesRequest, opts ...gax.CallOption) *TimeSeriesDataIterator {
109 return c.internalClient.QueryTimeSeries(ctx, req, opts...)
110 }
111
112
113
114
115 type queryGRPCClient struct {
116
117 connPool gtransport.ConnPool
118
119
120 CallOptions **QueryCallOptions
121
122
123 queryClient monitoringpb.QueryServiceClient
124
125
126 xGoogHeaders []string
127 }
128
129
130
131
132
133
134
135 func NewQueryClient(ctx context.Context, opts ...option.ClientOption) (*QueryClient, error) {
136 clientOpts := defaultQueryGRPCClientOptions()
137 if newQueryClientHook != nil {
138 hookOpts, err := newQueryClientHook(ctx, clientHookParams{})
139 if err != nil {
140 return nil, err
141 }
142 clientOpts = append(clientOpts, hookOpts...)
143 }
144
145 connPool, err := gtransport.DialPool(ctx, append(clientOpts, opts...)...)
146 if err != nil {
147 return nil, err
148 }
149 client := QueryClient{CallOptions: defaultQueryCallOptions()}
150
151 c := &queryGRPCClient{
152 connPool: connPool,
153 queryClient: monitoringpb.NewQueryServiceClient(connPool),
154 CallOptions: &client.CallOptions,
155 }
156 c.setGoogleClientInfo()
157
158 client.internalClient = c
159
160 return &client, nil
161 }
162
163
164
165
166
167 func (c *queryGRPCClient) Connection() *grpc.ClientConn {
168 return c.connPool.Conn()
169 }
170
171
172
173
174 func (c *queryGRPCClient) setGoogleClientInfo(keyval ...string) {
175 kv := append([]string{"gl-go", gax.GoVersion}, keyval...)
176 kv = append(kv, "gapic", getVersionClient(), "gax", gax.Version, "grpc", grpc.Version)
177 c.xGoogHeaders = []string{"x-goog-api-client", gax.XGoogHeader(kv...)}
178 }
179
180
181
182 func (c *queryGRPCClient) Close() error {
183 return c.connPool.Close()
184 }
185
186 func (c *queryGRPCClient) QueryTimeSeries(ctx context.Context, req *monitoringpb.QueryTimeSeriesRequest, opts ...gax.CallOption) *TimeSeriesDataIterator {
187 hds := []string{"x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))}
188
189 hds = append(c.xGoogHeaders, hds...)
190 ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)
191 opts = append((*c.CallOptions).QueryTimeSeries[0:len((*c.CallOptions).QueryTimeSeries):len((*c.CallOptions).QueryTimeSeries)], opts...)
192 it := &TimeSeriesDataIterator{}
193 req = proto.Clone(req).(*monitoringpb.QueryTimeSeriesRequest)
194 it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.TimeSeriesData, string, error) {
195 resp := &monitoringpb.QueryTimeSeriesResponse{}
196 if pageToken != "" {
197 req.PageToken = pageToken
198 }
199 if pageSize > math.MaxInt32 {
200 req.PageSize = math.MaxInt32
201 } else if pageSize != 0 {
202 req.PageSize = int32(pageSize)
203 }
204 err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
205 var err error
206 resp, err = c.queryClient.QueryTimeSeries(ctx, req, settings.GRPC...)
207 return err
208 }, opts...)
209 if err != nil {
210 return nil, "", err
211 }
212
213 it.Response = resp
214 return resp.GetTimeSeriesData(), resp.GetNextPageToken(), nil
215 }
216 fetch := func(pageSize int, pageToken string) (string, error) {
217 items, nextPageToken, err := it.InternalFetch(pageSize, pageToken)
218 if err != nil {
219 return "", err
220 }
221 it.items = append(it.items, items...)
222 return nextPageToken, nil
223 }
224
225 it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf)
226 it.pageInfo.MaxSize = int(req.GetPageSize())
227 it.pageInfo.Token = req.GetPageToken()
228
229 return it
230 }
231
View as plain text