Update dependencies
This commit is contained in:
4
vendor/tailscale.com/logtail/api.md
generated
vendored
4
vendor/tailscale.com/logtail/api.md
generated
vendored
@@ -6,14 +6,14 @@ retrieving, and processing log entries.
|
||||
# Overview
|
||||
|
||||
HTTP requests are received at the service **base URL**
|
||||
[https://log.tailscale.io](https://log.tailscale.io), and return JSON-encoded
|
||||
[https://log.tailscale.com](https://log.tailscale.com), and return JSON-encoded
|
||||
responses using standard HTTP response codes.
|
||||
|
||||
Authorization for the configuration and retrieval APIs is done with a secret
|
||||
API key passed as the HTTP basic auth username. Secret keys are generated via
|
||||
the web UI at base URL. An example of using basic auth with curl:
|
||||
|
||||
curl -u <log_api_key>: https://log.tailscale.io/collections
|
||||
curl -u <log_api_key>: https://log.tailscale.com/collections
|
||||
|
||||
In the future, an HTTP header will allow using MessagePack instead of JSON.
|
||||
|
||||
|
||||
31
vendor/tailscale.com/logtail/logtail.go
generated
vendored
31
vendor/tailscale.com/logtail/logtail.go
generated
vendored
@@ -1,11 +1,12 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
// Package logtail sends logs to log.tailscale.io.
|
||||
// Package logtail sends logs to log.tailscale.com.
|
||||
package logtail
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"cmp"
|
||||
"context"
|
||||
"crypto/rand"
|
||||
"encoding/binary"
|
||||
@@ -55,7 +56,7 @@ const bufferSize = 4 << 10
|
||||
|
||||
// DefaultHost is the default host name to upload logs to when
|
||||
// Config.BaseURL isn't provided.
|
||||
const DefaultHost = "log.tailscale.io"
|
||||
const DefaultHost = "log.tailscale.com"
|
||||
|
||||
const defaultFlushDelay = 2 * time.Second
|
||||
|
||||
@@ -69,7 +70,7 @@ type Config struct {
|
||||
Collection string // collection name, a domain name
|
||||
PrivateID logid.PrivateID // private ID for the primary log stream
|
||||
CopyPrivateID logid.PrivateID // private ID for a log stream that is a superset of this log stream
|
||||
BaseURL string // if empty defaults to "https://log.tailscale.io"
|
||||
BaseURL string // if empty defaults to "https://log.tailscale.com"
|
||||
HTTPC *http.Client // if empty defaults to http.DefaultClient
|
||||
SkipClientTime bool // if true, client_time is not written to logs
|
||||
LowMemory bool // if true, logtail minimizes memory use
|
||||
@@ -78,6 +79,7 @@ type Config struct {
|
||||
StderrLevel int // max verbosity level to write to stderr; 0 means the non-verbose messages only
|
||||
Buffer Buffer // temp storage, if nil a MemoryBuffer
|
||||
CompressLogs bool // whether to compress the log uploads
|
||||
MaxUploadSize int // maximum upload size; 0 means using the default
|
||||
|
||||
// MetricsDelta, if non-nil, is a func that returns an encoding
|
||||
// delta in clientmetrics to upload alongside existing logs.
|
||||
@@ -157,6 +159,7 @@ func NewLogger(cfg Config, logf tslogger.Logf) *Logger {
|
||||
url: cfg.BaseURL + "/c/" + cfg.Collection + "/" + cfg.PrivateID.String() + urlSuffix,
|
||||
lowMem: cfg.LowMemory,
|
||||
buffer: cfg.Buffer,
|
||||
maxUploadSize: cfg.MaxUploadSize,
|
||||
skipClientTime: cfg.SkipClientTime,
|
||||
drainWake: make(chan struct{}, 1),
|
||||
sentinel: make(chan int32, 16),
|
||||
@@ -192,6 +195,7 @@ type Logger struct {
|
||||
skipClientTime bool
|
||||
netMonitor *netmon.Monitor
|
||||
buffer Buffer
|
||||
maxUploadSize int
|
||||
drainWake chan struct{} // signal to speed up drain
|
||||
drainBuf []byte // owned by drainPending for reuse
|
||||
flushDelayFn func() time.Duration // negative or zero return value to upload aggressively, or >0 to batch at this delay
|
||||
@@ -213,6 +217,7 @@ type Logger struct {
|
||||
procSequence uint64
|
||||
flushTimer tstime.TimerController // used when flushDelay is >0
|
||||
writeBuf [bufferSize]byte // owned by Write for reuse
|
||||
bytesBuf bytes.Buffer // owned by appendTextOrJSONLocked for reuse
|
||||
jsonDec jsontext.Decoder // owned by appendTextOrJSONLocked for reuse
|
||||
|
||||
shutdownStartMu sync.Mutex // guards the closing of shutdownStart
|
||||
@@ -324,7 +329,7 @@ func (l *Logger) drainPending() (b []byte) {
|
||||
}
|
||||
}()
|
||||
|
||||
maxLen := maxSize
|
||||
maxLen := cmp.Or(l.maxUploadSize, maxSize)
|
||||
if l.lowMem {
|
||||
// When operating in a low memory environment, it is better to upload
|
||||
// in multiple operations than it is to allocate a large body and OOM.
|
||||
@@ -506,7 +511,7 @@ func (l *Logger) upload(ctx context.Context, body []byte, origlen int) (retryAft
|
||||
}
|
||||
if runtime.GOOS == "js" {
|
||||
// We once advertised we'd accept optional client certs (for internal use)
|
||||
// on log.tailscale.io but then Tailscale SSH js/wasm clients prompted
|
||||
// on log.tailscale.com but then Tailscale SSH js/wasm clients prompted
|
||||
// users (on some browsers?) to pick a client cert. We'll fix the server's
|
||||
// TLS ServerHello, but we can also fix it client side for good measure.
|
||||
//
|
||||
@@ -725,9 +730,16 @@ func (l *Logger) appendTextOrJSONLocked(dst, src []byte, level int) []byte {
|
||||
// whether it contains the reserved "logtail" name at the top-level.
|
||||
var logtailKeyOffset, logtailValOffset, logtailValLength int
|
||||
validJSON := func() bool {
|
||||
// TODO(dsnet): Avoid allocation of bytes.Buffer struct.
|
||||
// The jsontext.NewDecoder API operates on an io.Reader, for which
|
||||
// bytes.Buffer provides a means to convert a []byte into an io.Reader.
|
||||
// However, bytes.NewBuffer normally allocates unless
|
||||
// we immediately shallow copy it into a pre-allocated Buffer struct.
|
||||
// See https://go.dev/issue/67004.
|
||||
l.bytesBuf = *bytes.NewBuffer(src)
|
||||
defer func() { l.bytesBuf = bytes.Buffer{} }() // avoid pinning src
|
||||
|
||||
dec := &l.jsonDec
|
||||
dec.Reset(bytes.NewBuffer(src))
|
||||
dec.Reset(&l.bytesBuf)
|
||||
if tok, err := dec.ReadToken(); tok.Kind() != '{' || err != nil {
|
||||
return false
|
||||
}
|
||||
@@ -767,9 +779,10 @@ func (l *Logger) appendTextOrJSONLocked(dst, src []byte, level int) []byte {
|
||||
// That's okay as the Tailscale log service limit is actually 2*maxSize.
|
||||
// However, so long as logging applications aim to target the maxSize limit,
|
||||
// there should be no trouble eventually uploading logs.
|
||||
if len(src) > maxSize {
|
||||
maxLen := cmp.Or(l.maxUploadSize, maxSize)
|
||||
if len(src) > maxLen {
|
||||
errDetail := fmt.Sprintf("entry too large: %d bytes", len(src))
|
||||
errData := appendTruncatedString(nil, src, maxSize/len(`\uffff`)) // escaping could increase size
|
||||
errData := appendTruncatedString(nil, src, maxLen/len(`\uffff`)) // escaping could increase size
|
||||
|
||||
dst = append(dst, '{')
|
||||
dst = l.appendMetadata(dst, l.skipClientTime, true, l.procID, l.procSequence, errDetail, errData, level)
|
||||
|
||||
Reference in New Issue
Block a user