tailcfg: add MapResponse.Debug mechanism to trigger logging heap pprof

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick
2020-04-07 22:24:06 -07:00
committed by Brad Fitzpatrick
parent b0c10fa610
commit 703d789005
4 changed files with 102 additions and 0 deletions

45
log/logheap/logheap.go Normal file
View File

@ -0,0 +1,45 @@
// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package logheap logs a heap pprof profile.
package logheap
import (
"bytes"
"encoding/json"
"io"
"os"
"runtime"
"runtime/pprof"
"time"
)
// LogHeap writes a JSON logtail record with the base64 heap pprof to
// os.Stderr.
func LogHeap() {
logHeap(os.Stderr)
}
type logTail struct {
ClientTime string `json:"client_time"`
}
type pprofRec struct {
Heap []byte `json:"heap,omitempty"`
}
type logLine struct {
LogTail logTail `json:"logtail"`
Pprof pprofRec `json:"pprof"`
}
func logHeap(w io.Writer) error {
runtime.GC()
buf := new(bytes.Buffer)
pprof.WriteHeapProfile(buf)
return json.NewEncoder(w).Encode(logLine{
LogTail: logTail{ClientTime: time.Now().Format(time.RFC3339Nano)},
Pprof: pprofRec{Heap: buf.Bytes()},
})
}