Emit latency traces when sampling is set to headers

Latency reports will include the header(s) responsible for the trace
Updated ADR to have it reflect implementation

Signed-off-by: Matthias Hanel <mh@synadia.com>
This commit is contained in:
Matthias Hanel
2020-08-11 15:34:02 -04:00
parent 9bad6725aa
commit e1350a05f3
7 changed files with 532 additions and 58 deletions

View File

@@ -14,7 +14,11 @@
package server
import (
"bufio"
"bytes"
"fmt"
"net/http"
"net/textproto"
)
type parserState int
@@ -26,6 +30,7 @@ type parseState struct {
pa pubArg
argBuf []byte
msgBuf []byte
header http.Header // access via getHeader
scratch [MAX_CONTROL_LINE_SIZE]byte
}
@@ -442,7 +447,7 @@ func (c *client) parse(buf []byte) error {
c.traceMsg(c.msgBuf)
}
c.processInboundMsg(c.msgBuf)
c.argBuf, c.msgBuf = nil, nil
c.argBuf, c.msgBuf, c.header = nil, nil, nil
c.drop, c.as, c.state = 0, i+1, OP_START
// Drop all pub args
c.pa.arg, c.pa.pacache, c.pa.origin, c.pa.account, c.pa.subject = nil, nil, nil, nil, nil
@@ -1175,3 +1180,17 @@ func (c *client) clonePubArg() error {
}
}
}
func (ps *parseState) getHeader() http.Header {
if ps.header == nil {
if hdr := ps.pa.hdr; hdr > 0 {
reader := bufio.NewReader(bytes.NewReader(ps.msgBuf[0:hdr]))
tp := textproto.NewReader(reader)
tp.ReadLine() // skip over first line, contains version
if mimeHeader, err := tp.ReadMIMEHeader(); err == nil {
ps.header = http.Header(mimeHeader)
}
}
}
return ps.header
}