4
4
"fmt"
5
5
"github.com/gofiber/fiber/v2"
6
6
"github.com/gorilla/schema"
7
+ jsoniter "github.com/json-iterator/go"
7
8
"github.com/metrico/qryn/reader/service"
8
9
"github.com/metrico/qryn/reader/utils/logger"
9
10
"github.com/pkg/errors"
@@ -161,34 +162,98 @@ func parseQueryRangeProps(ctx *fiber.Ctx) (QueryRangeProps, error) {
161
162
return res , err
162
163
}
163
164
165
+ //func PromError(code int, msg string, w http.ResponseWriter) {
166
+ // w.WriteHeader(code)
167
+ // w.Header().Set("Content-Type", "application/json")
168
+ // w.Write([]byte(fmt.Sprintf(`{"status": "error", "errorType":"error", "error": %s}`,
169
+ // strconv.Quote(msg))))
170
+ //}
171
+
164
172
func PromError (code int , msg string , w http.ResponseWriter ) {
165
173
w .WriteHeader (code )
166
174
w .Header ().Set ("Content-Type" , "application/json" )
167
- w .Write ([]byte (fmt .Sprintf (`{"status": "error", "errorType":"error", "error": %s}` ,
168
- strconv .Quote (msg ))))
175
+
176
+ json := jsoniter .ConfigFastest
177
+ stream := json .BorrowStream (nil )
178
+ defer json .ReturnStream (stream )
179
+
180
+ stream .WriteObjectStart ()
181
+ stream .WriteObjectField ("status" )
182
+ stream .WriteString ("error" )
183
+ stream .WriteMore ()
184
+ stream .WriteObjectField ("errorType" )
185
+ stream .WriteString ("error" )
186
+ stream .WriteMore ()
187
+ stream .WriteObjectField ("error" )
188
+ stream .WriteString (msg )
189
+ stream .WriteObjectEnd ()
190
+
191
+ w .Write (stream .Buffer ())
169
192
}
170
193
194
+ //func writeResponse(res *promql.Result, w http.ResponseWriter) error {
195
+ // var err error
196
+ // w.Header().Set("Content-Type", "application/json")
197
+ // _, err = w.Write([]byte(fmt.Sprintf(`{"status" : "success", "data" : {"resultType" : "%s", "result" : [`,
198
+ // res.Value.Type())))
199
+ // if err != nil {
200
+ // return err
201
+ // }
202
+ // switch res.Value.(type) {
203
+ // case promql.Matrix:
204
+ // err = writeMatrix(res, w)
205
+ // break
206
+ // case promql.Vector:
207
+ // err = writeVector(res, w)
208
+ // break
209
+ // case promql.Scalar:
210
+ // err = writeScalar(res, w)
211
+ // }
212
+ // if err != nil {
213
+ // return err
214
+ // }
215
+ // w.Write([]byte("]}}"))
216
+ // return nil
217
+ //}
218
+
171
219
func writeResponse (res * promql.Result , w http.ResponseWriter ) error {
172
- var err error
173
220
w .Header ().Set ("Content-Type" , "application/json" )
174
- _ , err = w .Write ([]byte (fmt .Sprintf (`{"status" : "success", "data" : {"resultType" : "%s", "result" : [` ,
175
- res .Value .Type ())))
221
+
222
+ json := jsoniter .ConfigFastest
223
+ stream := json .BorrowStream (nil )
224
+ defer json .ReturnStream (stream )
225
+
226
+ stream .WriteObjectStart ()
227
+ stream .WriteObjectField ("status" )
228
+ stream .WriteString ("success" )
229
+ stream .WriteMore ()
230
+ stream .WriteObjectField ("data" )
231
+ stream .WriteObjectStart ()
232
+ stream .WriteObjectField ("resultType" )
233
+ stream .WriteString (string (res .Value .Type ()))
234
+ stream .WriteMore ()
235
+ stream .WriteObjectField ("result" )
236
+ stream .WriteArrayStart ()
237
+
238
+ _ , err := w .Write (stream .Buffer ())
176
239
if err != nil {
177
240
return err
178
241
}
242
+ stream .Reset (nil )
243
+
179
244
switch res .Value .(type ) {
180
245
case promql.Matrix :
181
246
err = writeMatrix (res , w )
182
- break
183
247
case promql.Vector :
184
248
err = writeVector (res , w )
185
- break
186
249
case promql.Scalar :
187
250
err = writeScalar (res , w )
188
251
}
252
+
189
253
if err != nil {
190
254
return err
191
255
}
256
+
192
257
w .Write ([]byte ("]}}" ))
193
258
return nil
194
259
}
@@ -199,46 +264,136 @@ func writeScalar(res *promql.Result, w http.ResponseWriter) error {
199
264
return nil
200
265
}
201
266
267
+ // func writeMatrix(res *promql.Result, w http.ResponseWriter) error {
268
+ // val := res.Value.(promql.Matrix)
269
+ // for i, s := range val {
270
+ // if i > 0 {
271
+ // w.Write([]byte(","))
272
+ // }
273
+ // w.Write([]byte(`{"metric": {`))
274
+ // for j, v := range s.Metric {
275
+ // if j > 0 {
276
+ // w.Write([]byte(","))
277
+ // }
278
+ // w.Write([]byte(fmt.Sprintf("%s:%s", strconv.Quote(v.Name), strconv.Quote(v.Value))))
279
+ // }
280
+ // w.Write([]byte(`},"values": [`))
281
+ // for j, v := range s.Points {
282
+ // if j > 0 {
283
+ // w.Write([]byte(","))
284
+ // }
285
+ // w.Write([]byte(fmt.Sprintf(`[%f,"%f"]`, float64(v.T)/1000, v.V)))
286
+ // }
287
+ // w.Write([]byte("]}"))
288
+ // }
289
+ // return nil
290
+ // }
202
291
func writeMatrix (res * promql.Result , w http.ResponseWriter ) error {
203
292
val := res .Value .(promql.Matrix )
293
+
294
+ json := jsoniter .ConfigFastest
295
+
204
296
for i , s := range val {
205
297
if i > 0 {
206
298
w .Write ([]byte ("," ))
207
299
}
208
- w .Write ([]byte (`{"metric": {` ))
300
+
301
+ stream := json .BorrowStream (nil )
302
+
303
+ stream .WriteObjectStart ()
304
+ stream .WriteObjectField ("metric" )
305
+ stream .WriteObjectStart ()
306
+
209
307
for j , v := range s .Metric {
210
308
if j > 0 {
211
- w . Write ([] byte ( "," ) )
309
+ stream . WriteMore ( )
212
310
}
213
- w .Write ([]byte (fmt .Sprintf ("%s:%s" , strconv .Quote (v .Name ), strconv .Quote (v .Value ))))
311
+ stream .WriteObjectField (v .Name )
312
+ stream .WriteString (v .Value )
214
313
}
215
- w .Write ([]byte (`},"values": [` ))
314
+
315
+ stream .WriteObjectEnd ()
316
+ stream .WriteMore ()
317
+ stream .WriteObjectField ("values" )
318
+ stream .WriteArrayStart ()
319
+
216
320
for j , v := range s .Points {
217
321
if j > 0 {
218
- w . Write ([] byte ( "," ) )
322
+ stream . WriteMore ( )
219
323
}
220
- w .Write ([]byte (fmt .Sprintf (`[%f,"%f"]` , float64 (v .T )/ 1000 , v .V )))
324
+ stream .WriteArrayStart ()
325
+ stream .WriteFloat64 (float64 (v .T ) / 1000 )
326
+ stream .WriteMore ()
327
+ stream .WriteString (strconv .FormatFloat (v .V , 'f' , - 1 , 64 ))
328
+ stream .WriteArrayEnd ()
221
329
}
222
- w .Write ([]byte ("]}" ))
330
+
331
+ stream .WriteArrayEnd ()
332
+ stream .WriteObjectEnd ()
333
+
334
+ w .Write (stream .Buffer ())
335
+ json .ReturnStream (stream )
223
336
}
337
+
224
338
return nil
225
339
}
226
340
341
+ //func writeVector(res *promql.Result, w http.ResponseWriter) error {
342
+ // val := res.Value.(promql.Vector)
343
+ // for i, s := range val {
344
+ // if i > 0 {
345
+ // w.Write([]byte(","))
346
+ // }
347
+ // w.Write([]byte(`{"metric":{`))
348
+ // for j, lbl := range s.Metric {
349
+ // if j > 0 {
350
+ // w.Write([]byte(","))
351
+ // }
352
+ // w.Write([]byte(fmt.Sprintf("%s:%s", strconv.Quote(lbl.Name), strconv.Quote(lbl.Value))))
353
+ // }
354
+ // w.Write([]byte(fmt.Sprintf(`},"value":[%f,"%f"]}`, float64(s.T/1000), s.V)))
355
+ // }
356
+ // return nil
357
+ //}
358
+
227
359
func writeVector (res * promql.Result , w http.ResponseWriter ) error {
228
360
val := res .Value .(promql.Vector )
361
+
362
+ json := jsoniter .ConfigFastest
363
+
229
364
for i , s := range val {
230
365
if i > 0 {
231
366
w .Write ([]byte ("," ))
232
367
}
233
- w .Write ([]byte (`{"metric":{` ))
368
+
369
+ stream := json .BorrowStream (nil )
370
+
371
+ stream .WriteObjectStart ()
372
+ stream .WriteObjectField ("metric" )
373
+ stream .WriteObjectStart ()
374
+
234
375
for j , lbl := range s .Metric {
235
376
if j > 0 {
236
- w . Write ([] byte ( "," ) )
377
+ stream . WriteMore ( )
237
378
}
238
- w .Write ([]byte (fmt .Sprintf ("%s:%s" , strconv .Quote (lbl .Name ), strconv .Quote (lbl .Value ))))
379
+ stream .WriteObjectField (lbl .Name )
380
+ stream .WriteString (lbl .Value )
239
381
}
240
- w .Write ([]byte (fmt .Sprintf (`},"value":[%f,"%f"]}` , float64 (s .T / 1000 ), s .V )))
382
+
383
+ stream .WriteObjectEnd ()
384
+ stream .WriteMore ()
385
+ stream .WriteObjectField ("value" )
386
+ stream .WriteArrayStart ()
387
+ stream .WriteFloat64 (float64 (s .T ) / 1000 )
388
+ stream .WriteMore ()
389
+ stream .WriteString (strconv .FormatFloat (s .V , 'f' , - 1 , 64 ))
390
+ stream .WriteArrayEnd ()
391
+ stream .WriteObjectEnd ()
392
+
393
+ w .Write (stream .Buffer ())
394
+ json .ReturnStream (stream )
241
395
}
396
+
242
397
return nil
243
398
}
244
399
0 commit comments