vmalert: do not hold pointer to http.Request (#3467)

http.Request was used as a part of state struct
for generating the curl command when viewing the rule's
state changes.
It appears, that holding a referencing is far more expensive
than generating the curl command immediately.
On the test with 40k rules, this change reduces memory
and CPU usage by 50%.

Signed-off-by: hagen1778 <roman@victoriametrics.com>

Signed-off-by: hagen1778 <roman@victoriametrics.com>
This commit is contained in:
Roman Khavronenko 2022-12-09 16:13:29 +01:00 committed by GitHub
parent 2406c0dcfd
commit b97bd01605
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 6 additions and 7 deletions

View file

@ -284,7 +284,7 @@ func (ar *AlertingRule) Exec(ctx context.Context, ts time.Time, limit int) ([]pr
duration: time.Since(start),
samples: len(qMetrics),
err: err,
req: req,
curl: requestToCurl(req),
}
defer func() {

View file

@ -121,7 +121,7 @@ func (rr *RecordingRule) Exec(ctx context.Context, ts time.Time, limit int) ([]p
at: ts,
duration: time.Since(start),
samples: len(qMetrics),
req: req,
curl: requestToCurl(req),
}
defer func() {

View file

@ -3,7 +3,6 @@ package main
import (
"context"
"errors"
"net/http"
"sync"
"time"
@ -54,8 +53,8 @@ type ruleStateEntry struct {
// stores the number of samples returned during
// the last evaluation
samples int
// stores the HTTP request used by datasource during rule.Exec
req *http.Request
// stores the curl command reflecting the HTTP request used during rule.Exec
curl string
}
const defaultStateEntriesLimit = 20

View file

@ -457,7 +457,7 @@
<td class="text-center">{%f.3 u.duration.Seconds() %}s</td>
<td class="text-center">{%s u.at.Format(time.RFC3339) %}</td>
<td>
<textarea class="curl-area" rows="1" onclick="this.focus();this.select()">{%s requestToCurl(u.req) %}</textarea>
<textarea class="curl-area" rows="1" onclick="this.focus();this.select()">{%s u.curl %}</textarea>
</td>
</tr>
</li>

View file

@ -1358,7 +1358,7 @@ func StreamRuleDetails(qw422016 *qt422016.Writer, r *http.Request, rule APIRule)
<td>
<textarea class="curl-area" rows="1" onclick="this.focus();this.select()">`)
//line app/vmalert/web.qtpl:460
qw422016.E().S(requestToCurl(u.req))
qw422016.E().S(u.curl)
//line app/vmalert/web.qtpl:460
qw422016.N().S(`</textarea>
</td>