mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
68bad22fd2
address https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6706. See https://github.com/VictoriaMetrics/VictoriaMetrics/blob/vmalert-support-vlog-ds/docs/VictoriaLogs/vmalert.md. Related fix https://github.com/VictoriaMetrics/VictoriaMetrics/pull/7254. Note: in this pull request, vmalert doesn't support [backfilling](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/vmalert-support-vlog-ds/docs/VictoriaLogs/vmalert.md#rules-backfilling) for rules with a customized time filter. It might be added in the future, see [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/7289) for details. Feature can be tested with image `victoriametrics/vmalert:heads-vmalert-support-vlog-ds-0-g420629c-scratch`. --------- Signed-off-by: hagen1778 <roman@victoriametrics.com> Co-authored-by: hagen1778 <roman@victoriametrics.com>
61 lines
2.1 KiB
Go
61 lines
2.1 KiB
Go
package datasource
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
func (s *Client) setVLogsInstantReqParams(r *http.Request, query string, timestamp time.Time) {
|
|
// there is no type path prefix in victorialogs APIs right now, ignore appendTypePrefix.
|
|
if !*disablePathAppend {
|
|
r.URL.Path += "/select/logsql/stats_query"
|
|
}
|
|
q := r.URL.Query()
|
|
// set `time` param explicitly, it will be used as the timestamp of query results.
|
|
q.Set("time", timestamp.Format(time.RFC3339))
|
|
// set the `start` and `end` params if applyIntervalAsTimeFilter is enabled(time filter is missing in the rule expr),
|
|
// so the query will be executed in time range [timestamp - evaluationInterval, timestamp].
|
|
if s.applyIntervalAsTimeFilter && s.evaluationInterval > 0 {
|
|
q.Set("start", timestamp.Add(-s.evaluationInterval).Format(time.RFC3339))
|
|
q.Set("end", timestamp.Format(time.RFC3339))
|
|
}
|
|
r.URL.RawQuery = q.Encode()
|
|
s.setReqParams(r, query)
|
|
}
|
|
|
|
func (s *Client) setVLogsRangeReqParams(r *http.Request, query string, start, end time.Time) {
|
|
// there is no type path prefix in victorialogs APIs right now, ignore appendTypePrefix.
|
|
if !*disablePathAppend {
|
|
r.URL.Path += "/select/logsql/stats_query_range"
|
|
}
|
|
q := r.URL.Query()
|
|
q.Add("start", start.Format(time.RFC3339))
|
|
q.Add("end", end.Format(time.RFC3339))
|
|
// set step as evaluationInterval by default
|
|
if s.evaluationInterval > 0 {
|
|
q.Set("step", fmt.Sprintf("%ds", int(s.evaluationInterval.Seconds())))
|
|
}
|
|
r.URL.RawQuery = q.Encode()
|
|
s.setReqParams(r, query)
|
|
}
|
|
|
|
func parseVLogsResponse(req *http.Request, resp *http.Response) (res Result, err error) {
|
|
res, err = parsePrometheusResponse(req, resp)
|
|
if err != nil {
|
|
return Result{}, err
|
|
}
|
|
for i := range res.Data {
|
|
m := &res.Data[i]
|
|
for j := range m.Labels {
|
|
// reserve the stats func result name with a new label `stats_result` instead of dropping it,
|
|
// since there could be multiple stats results in a single query, for instance:
|
|
// _time:5m | stats quantile(0.5, request_duration_seconds) p50, quantile(0.9, request_duration_seconds) p90
|
|
if m.Labels[j].Name == "__name__" {
|
|
m.Labels[j].Name = "stats_result"
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|