logtail: always send a json array

The code goes to some effort to send a single JSON object
when there's only a single line and a JSON array when there
are multiple lines.

It makes the code more complex and more expensive;
when we add a second line, we have to use a second buffer
to duplicate the first one after adding a leading square brackets.

The savings come to two bytes. Instead, always send an array.

Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
This commit is contained in:
Josh Bleecher Snyder
2021-08-17 12:14:38 -07:00
committed by Josh Bleecher Snyder
parent 93284209bc
commit 278e7de9c9
2 changed files with 23 additions and 39 deletions

View File

@@ -203,6 +203,7 @@ func (l *Logger) drainBlock() (shuttingDown bool) {
// If no logs are available, drainPending blocks until logs are available.
func (l *Logger) drainPending() (res []byte) {
buf := new(bytes.Buffer)
buf.WriteByte('[')
entries := 0
var batchDone bool
@@ -242,28 +243,15 @@ func (l *Logger) drainPending() (res []byte) {
b = l.encodeText(b, true)
}
switch {
case entries == 0:
buf.Write(b)
case entries == 1:
buf2 := new(bytes.Buffer)
buf2.WriteByte('[')
buf2.Write(buf.Bytes())
buf2.WriteByte(',')
buf2.Write(b)
buf.Reset()
buf.Write(buf2.Bytes())
default:
if entries > 0 {
buf.WriteByte(',')
buf.Write(b)
}
buf.Write(b)
entries++
}
if entries > 1 {
buf.WriteByte(']')
}
if buf.Len() == 0 {
buf.WriteByte(']')
if buf.Len() <= len("[]") {
return nil
}
return buf.Bytes()