mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-01 14:47:38 +00:00
9387793f47
- Expose stats.seriesFetched at `/api/v1/query_range` responses too for the sake of consistency. - Initialize QueryStats when it is needed and pass it to EvalConfig then. This guarantees that the QueryStats is properly collected when the query contains some subqueries.
50 lines
1.4 KiB
Text
50 lines
1.4 KiB
Text
{% import (
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/app/vmselect/netstorage"
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/app/vmselect/promql"
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/querytracer"
|
|
) %}
|
|
|
|
{% stripspace %}
|
|
QueryRangeResponse generates response for /api/v1/query_range.
|
|
See https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries
|
|
{% func QueryRangeResponse(isPartial bool, rs []netstorage.Result, qt *querytracer.Tracer, qtDone func(), qs *promql.QueryStats) %}
|
|
{
|
|
{% code
|
|
seriesCount := len(rs)
|
|
pointsCount := 0
|
|
%}
|
|
"status":"success",
|
|
"isPartial":{% if isPartial %}true{% else %}false{% endif %},
|
|
"data":{
|
|
"resultType":"matrix",
|
|
"result":[
|
|
{% if len(rs) > 0 %}
|
|
{%= queryRangeLine(&rs[0]) %}
|
|
{% code pointsCount += len(rs[0].Values) %}
|
|
{% code rs = rs[1:] %}
|
|
{% for i := range rs %}
|
|
,{%= queryRangeLine(&rs[i]) %}
|
|
{% code pointsCount += len(rs[i].Values) %}
|
|
{% endfor %}
|
|
{% endif %}
|
|
]
|
|
},
|
|
"stats":{
|
|
"seriesFetched": "{%d qs.SeriesFetched %}"
|
|
}
|
|
{% code
|
|
qt.Printf("generate /api/v1/query_range response for series=%d, points=%d", seriesCount, pointsCount)
|
|
qtDone()
|
|
%}
|
|
{%= dumpQueryTrace(qt) %}
|
|
}
|
|
{% endfunc %}
|
|
|
|
{% func queryRangeLine(r *netstorage.Result) %}
|
|
{
|
|
"metric": {%= metricNameObject(&r.MetricName) %},
|
|
"values": {%= valuesWithTimestamps(r.Values, r.Timestamps) %}
|
|
}
|
|
{% endfunc %}
|
|
|
|
{% endstripspace %}
|