mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
app/vlselect: add start_offset
query arg for /select/logsql/tail endpoint for returning historical logs before live tailing
(cherry picked from commit 3a5f1019ba
)
This commit is contained in:
parent
98fe1950a1
commit
ab3b4020b4
3 changed files with 22 additions and 4 deletions
|
@ -407,6 +407,13 @@ func ProcessLiveTailRequest(ctx context.Context, w http.ResponseWriter, r *http.
|
||||||
}
|
}
|
||||||
refreshInterval := time.Millisecond * time.Duration(refreshIntervalMsecs)
|
refreshInterval := time.Millisecond * time.Duration(refreshIntervalMsecs)
|
||||||
|
|
||||||
|
startOffsetMsecs, err := httputils.GetDuration(r, "start_offset", 5*1000)
|
||||||
|
if err != nil {
|
||||||
|
httpserver.Errorf(w, r, "%s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
startOffset := startOffsetMsecs * 1e6
|
||||||
|
|
||||||
ctxWithCancel, cancel := context.WithCancel(ctx)
|
ctxWithCancel, cancel := context.WithCancel(ctx)
|
||||||
tp := newTailProcessor(cancel)
|
tp := newTailProcessor(cancel)
|
||||||
|
|
||||||
|
@ -414,6 +421,7 @@ func ProcessLiveTailRequest(ctx context.Context, w http.ResponseWriter, r *http.
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
|
|
||||||
end := time.Now().UnixNano()
|
end := time.Now().UnixNano()
|
||||||
|
start := end - startOffset
|
||||||
doneCh := ctxWithCancel.Done()
|
doneCh := ctxWithCancel.Done()
|
||||||
flusher, ok := w.(http.Flusher)
|
flusher, ok := w.(http.Flusher)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -421,14 +429,12 @@ func ProcessLiveTailRequest(ctx context.Context, w http.ResponseWriter, r *http.
|
||||||
}
|
}
|
||||||
qOrig := q
|
qOrig := q
|
||||||
for {
|
for {
|
||||||
start := end - tailOffsetNsecs
|
|
||||||
end = time.Now().UnixNano()
|
|
||||||
|
|
||||||
q = qOrig.Clone(end)
|
q = qOrig.Clone(end)
|
||||||
q.AddTimeFilter(start, end)
|
q.AddTimeFilter(start, end)
|
||||||
// q.Optimize() call is needed for converting '*' into filterNoop.
|
// q.Optimize() call is needed for converting '*' into filterNoop.
|
||||||
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6785#issuecomment-2358547733
|
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6785#issuecomment-2358547733
|
||||||
q.Optimize()
|
q.Optimize()
|
||||||
|
|
||||||
if err := vlstorage.RunQuery(ctxWithCancel, tenantIDs, q, tp.writeBlock); err != nil {
|
if err := vlstorage.RunQuery(ctxWithCancel, tenantIDs, q, tp.writeBlock); err != nil {
|
||||||
httpserver.Errorf(w, r, "cannot execute tail query [%s]: %s", q, err)
|
httpserver.Errorf(w, r, "cannot execute tail query [%s]: %s", q, err)
|
||||||
return
|
return
|
||||||
|
@ -447,6 +453,8 @@ func ProcessLiveTailRequest(ctx context.Context, w http.ResponseWriter, r *http.
|
||||||
case <-doneCh:
|
case <-doneCh:
|
||||||
return
|
return
|
||||||
case <-ticker.C:
|
case <-ticker.C:
|
||||||
|
start = end - tailOffsetNsecs
|
||||||
|
end = time.Now().UnixNano()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ according to [these docs](https://docs.victoriametrics.com/victorialogs/quicksta
|
||||||
|
|
||||||
## tip
|
## tip
|
||||||
|
|
||||||
|
* FEATURE: support returning historical logs from [live tailing API](https://docs.victoriametrics.com/victorialogs/querying/#live-tailing) via `start_offset` query arg. For example, request to `/select/logsql/tail?query=*&start_offset=5m` returns logs for the last 5 minutes before starting returning live tailing logs for the given `query`.
|
||||||
* FEATURE: add an ability to specify extra fields for logs ingested via [HTTP-based data ingestion protocols](https://docs.victoriametrics.com/victorialogs/data-ingestion/#http-apis). See `extra_fields` query arg and `VL-Extra-Fields` HTTP header in [these docs](https://docs.victoriametrics.com/victorialogs/data-ingestion/#http-parameters).
|
* FEATURE: add an ability to specify extra fields for logs ingested via [HTTP-based data ingestion protocols](https://docs.victoriametrics.com/victorialogs/data-ingestion/#http-apis). See `extra_fields` query arg and `VL-Extra-Fields` HTTP header in [these docs](https://docs.victoriametrics.com/victorialogs/data-ingestion/#http-parameters).
|
||||||
* BUGFIX: Properly parse structured metadata when ingesting logs with Loki ingestion protocol. An issue has been introduced in [v0.3.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v0.3.0-victorialogs). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/7431) for the details.
|
* BUGFIX: Properly parse structured metadata when ingesting logs with Loki ingestion protocol. An issue has been introduced in [v0.3.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v0.3.0-victorialogs). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/7431) for the details.
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,8 @@ curl -N http://localhost:9428/select/logsql/tail -d 'query=error'
|
||||||
```
|
```
|
||||||
|
|
||||||
The `-N` command-line flag is essential to pass to `curl` during live tailing, since otherwise curl may delay displaying matching logs
|
The `-N` command-line flag is essential to pass to `curl` during live tailing, since otherwise curl may delay displaying matching logs
|
||||||
because of internal response buffering.
|
because of internal response buffering. It is recommended using [vlogscli](https://docs.victoriametrics.com/victorialogs/querying/vlogscli/) for live tailing -
|
||||||
|
see [these docs](https://docs.victoriametrics.com/victorialogs/querying/vlogscli/#live-tailing).
|
||||||
|
|
||||||
The `<query>` must conform the following rules:
|
The `<query>` must conform the following rules:
|
||||||
|
|
||||||
|
@ -146,6 +147,14 @@ The `<query>` must conform the following rules:
|
||||||
- It is recommended to return [`_stream_id`](https://docs.victoriametrics.com/victorialogs/keyconcepts/#stream-fields) field for more accurate live tailing
|
- It is recommended to return [`_stream_id`](https://docs.victoriametrics.com/victorialogs/keyconcepts/#stream-fields) field for more accurate live tailing
|
||||||
across multiple streams.
|
across multiple streams.
|
||||||
|
|
||||||
|
Live tailing supports returning historical logs, which were ingested into VictoriaLogs before the start of live tailing. Pass `start_offset=<d>` query
|
||||||
|
arg to `/select/logsql/tail` where `<d>` is the duration for returning historical logs. For example, the following request returns historical logs
|
||||||
|
which were ingested into VictoriaLogs during the last hour, before starting live tailing:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -N http://localhost:9428/select/logsql/tail -d 'query=*' -d 'start_offset=1h'
|
||||||
|
```
|
||||||
|
|
||||||
**Performance tip**: live tailing works the best if it matches newly ingested logs at relatively slow rate (e.g. up to 1K matching logs per second),
|
**Performance tip**: live tailing works the best if it matches newly ingested logs at relatively slow rate (e.g. up to 1K matching logs per second),
|
||||||
e.g. it is optimized for the case when real humans inspect the output of live tailing in the real time. If live tailing returns logs at too high rate,
|
e.g. it is optimized for the case when real humans inspect the output of live tailing in the real time. If live tailing returns logs at too high rate,
|
||||||
then it is recommended adding more specific [filters](https://docs.victoriametrics.com/victorialogs/logsql/#filters) to the `<query>`, so it matches less logs.
|
then it is recommended adding more specific [filters](https://docs.victoriametrics.com/victorialogs/logsql/#filters) to the `<query>`, so it matches less logs.
|
||||||
|
|
Loading…
Reference in a new issue