@@ -29,6 +29,7 @@ import (
29
29
"github.com/grafana/metrictank/util"
30
30
opentracing "github.com/opentracing/opentracing-go"
31
31
tags "github.com/opentracing/opentracing-go/ext"
32
+ traceLog "github.com/opentracing/opentracing-go/log"
32
33
"github.com/raintank/dur"
33
34
log "github.com/sirupsen/logrus"
34
35
)
@@ -136,24 +137,48 @@ func (s *Server) findSeries(ctx context.Context, orgId uint32, patterns []string
136
137
return series , nil
137
138
}
138
139
140
+ func (s * Server ) proxyToGraphite (ctx * middleware.Context ) {
141
+ proxyCtx , span := tracing .NewSpan (ctx .Req .Context (), s .Tracer , "graphiteproxy" )
142
+ tags .SpanKindRPCClient .Set (span )
143
+ tags .PeerService .Set (span , "graphite" )
144
+ ctx .Req = macaron.Request {ctx .Req .WithContext (proxyCtx )}
145
+ ctx .Req .Request .Body = ctx .Body
146
+ carrier := opentracing .HTTPHeadersCarrier (ctx .Req .Header )
147
+ err := s .Tracer .Inject (span .Context (), opentracing .HTTPHeaders , carrier )
148
+ if err != nil {
149
+ log .Errorf ("HTTP renderMetrics failed to inject span into headers: %s" , err .Error ())
150
+ }
151
+ graphiteProxy .ServeHTTP (ctx .Resp , ctx .Req .Request )
152
+ if span != nil {
153
+ span .Finish ()
154
+ }
155
+ renderReqProxied .Inc ()
156
+ }
157
+
139
158
func (s * Server ) renderMetrics (ctx * middleware.Context , request models.GraphiteRender ) {
159
+ // retrieve te span that was created by the api Middleware handler. The handler will
160
+ // call span.Finish()
140
161
span := opentracing .SpanFromContext (ctx .Req .Context ())
141
162
163
+ span .SetTag ("orgid" , ctx .OrgId )
164
+
142
165
// note: the model is already validated to assure at least one of them has len >0
143
166
if len (request .Targets ) == 0 {
144
167
request .Targets = request .TargetsRails
145
168
}
146
169
147
- span .SetTag ("from" , request .FromTo .From )
148
- span .SetTag ("until" , request .FromTo .Until )
149
- span .SetTag ("to" , request .FromTo .To )
150
- span .SetTag ("tz" , request .FromTo .Tz )
151
- span .SetTag ("mdp" , request .MaxDataPoints )
152
- span .SetTag ("targets" , request .Targets )
153
- span .SetTag ("format" , request .Format )
154
- span .SetTag ("noproxy" , request .NoProxy )
155
- span .SetTag ("process" , request .Process )
156
- span .SetTag ("orgid" , ctx .OrgId )
170
+ // log information about the request.
171
+ span .LogFields (
172
+ traceLog .String ("from" , request .FromTo .From ),
173
+ traceLog .String ("until" , request .FromTo .Until ),
174
+ traceLog .String ("to" , request .FromTo .To ),
175
+ traceLog .String ("tz" , request .FromTo .Tz ),
176
+ traceLog .Int32 ("mdp" , int32 (request .MaxDataPoints )),
177
+ traceLog .String ("targets" , fmt .Sprintf ("%q" , request .Targets )),
178
+ traceLog .String ("format" , request .Format ),
179
+ traceLog .Bool ("noproxy" , request .NoProxy ),
180
+ traceLog .String ("process" , request .Process ),
181
+ )
157
182
158
183
now := time .Now ()
159
184
defaultFrom := uint32 (now .Add (- time .Duration (24 ) * time .Hour ).Unix ())
@@ -168,9 +193,11 @@ func (s *Server) renderMetrics(ctx *middleware.Context, request models.GraphiteR
168
193
return
169
194
}
170
195
171
- span .SetTag ("fromUnix" , fromUnix )
172
- span .SetTag ("toUnix" , toUnix )
173
- span .SetTag ("span" , toUnix - fromUnix )
196
+ span .LogFields (
197
+ traceLog .Int32 ("fromUnix" , int32 (fromUnix )),
198
+ traceLog .Int32 ("toUnix" , int32 (toUnix )),
199
+ traceLog .Int32 ("span" , int32 (toUnix - fromUnix )),
200
+ )
174
201
175
202
// render API is modeled after graphite, so from exclusive, to inclusive.
176
203
// in MT, from is inclusive, to is exclusive (which is akin to slice syntax)
@@ -187,9 +214,7 @@ func (s *Server) renderMetrics(ctx *middleware.Context, request models.GraphiteR
187
214
reqRenderTargetCount .Value (len (request .Targets ))
188
215
189
216
if request .Process == "none" {
190
- ctx .Req .Request .Body = ctx .Body
191
- graphiteProxy .ServeHTTP (ctx .Resp , ctx .Req .Request )
192
- renderReqProxied .Inc ()
217
+ s .proxyToGraphite (ctx )
193
218
return
194
219
}
195
220
@@ -207,40 +232,30 @@ func (s *Server) renderMetrics(ctx *middleware.Context, request models.GraphiteR
207
232
ctx .Error (http .StatusBadRequest , "localOnly requested, but the request cant be handled locally" )
208
233
return
209
234
}
210
- newctx , span := tracing .NewSpan (ctx .Req .Context (), s .Tracer , "graphiteproxy" )
211
- tags .SpanKindRPCClient .Set (span )
212
- tags .PeerService .Set (span , "graphite" )
213
- ctx .Req = macaron.Request {ctx .Req .WithContext (newctx )}
214
- ctx .Req .Request .Body = ctx .Body
215
- graphiteProxy .ServeHTTP (ctx .Resp , ctx .Req .Request )
216
- if span != nil {
217
- span .Finish ()
218
- }
235
+ s .proxyToGraphite (ctx )
219
236
proxyStats .Miss (string (fun ))
220
- renderReqProxied .Inc ()
221
237
return
222
238
}
223
239
ctx .Error (http .StatusBadRequest , err .Error ())
224
240
return
225
241
}
226
242
227
- newctx , span := tracing .NewSpan (ctx .Req .Context (), s .Tracer , "executePlan" )
228
- defer span .Finish ()
229
- ctx .Req = macaron.Request {ctx .Req .WithContext (newctx )}
230
- out , meta , err := s .executePlan (ctx .Req .Context (), ctx .OrgId , plan )
243
+ execCtx , execSpan := tracing .NewSpan (ctx .Req .Context (), s .Tracer , "executePlan" )
244
+ defer execSpan .Finish ()
245
+ out , meta , err := s .executePlan (execCtx , ctx .OrgId , plan )
231
246
if err != nil {
232
247
err := response .WrapError (err )
233
248
if err .Code () != http .StatusBadRequest {
234
- tracing .Failure (span )
249
+ tracing .Failure (execSpan )
235
250
}
236
- tracing .Error (span , err )
251
+ tracing .Error (execSpan , err )
237
252
response .Write (ctx , err )
238
253
return
239
254
}
240
255
241
256
// check to see if the request has been canceled, if so abort now.
242
257
select {
243
- case <- newctx .Done ():
258
+ case <- execCtx .Done ():
244
259
//request canceled
245
260
response .Write (ctx , response .RequestCanceledErr )
246
261
return
0 commit comments