pkg/server/metrics.go (65 lines of code) (raw):
package server
import (
"context"
"net/http"
"github.com/JetBrains/ij-perf-report-aggregator/pkg/data-query"
"github.com/valyala/bytebufferpool"
"github.com/valyala/quicktemplate"
)
func (t *StatsServer) handleLoadRequestV2(request *http.Request) (*bytebufferpool.ByteBuffer, bool, error) {
dataQueries, wrappedAsArray, err := data_query.ReadQueryV2(request)
if err != nil {
return nil, false, err
}
return t.load(request, dataQueries, wrappedAsArray)
}
func (t *StatsServer) handleLoadRequest(request *http.Request) (*bytebufferpool.ByteBuffer, bool, error) {
dataQueries, wrappedAsArray, err := data_query.ReadQuery(request)
if err != nil {
return nil, false, err
}
return t.load(request, dataQueries, wrappedAsArray)
}
func (t *StatsServer) load(request *http.Request, dataQueries []data_query.Query, wrappedAsArray bool) (*bytebufferpool.ByteBuffer, bool, error) {
buffer := byteBufferPool.Get()
isOk := false
defer func() {
if !isOk {
byteBufferPool.Put(buffer)
}
}()
templateWriter := quicktemplate.AcquireWriter(buffer)
defer quicktemplate.ReleaseWriter(templateWriter)
jsonWriter := templateWriter.N()
if len(dataQueries) > 1 || wrappedAsArray {
jsonWriter.S("[")
}
for index, dataQuery := range dataQueries {
if index != 0 {
jsonWriter.S(",")
}
err := t.computeMeasureResponse(request.Context(), dataQuery, jsonWriter)
if err != nil {
return nil, false, err
}
}
if len(dataQueries) > 1 || wrappedAsArray {
jsonWriter.S("]")
}
isOk = true
if len(buffer.B) == 0 {
jsonWriter.S("[]")
}
return buffer, true, nil
}
func (t *StatsServer) computeMeasureResponse(ctx context.Context, query data_query.Query, jsonWriter *quicktemplate.QWriter) error {
table := query.Table
if table == "" {
table = "report"
}
err := data_query.SelectRows(ctx, query, table, t, jsonWriter)
if err != nil {
return err
}
return nil
}