And delete Debug.GoroutineDumpURL, which was already in c2n. Updates #8923 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>main
parent
24509f8b22
commit
239ad57446
@ -1,40 +0,0 @@ |
|||||||
// Copyright (c) Tailscale Inc & AUTHORS
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
package controlclient |
|
||||||
|
|
||||||
import ( |
|
||||||
"bytes" |
|
||||||
"compress/gzip" |
|
||||||
"context" |
|
||||||
"log" |
|
||||||
"net/http" |
|
||||||
"time" |
|
||||||
|
|
||||||
"tailscale.com/util/goroutines" |
|
||||||
) |
|
||||||
|
|
||||||
func dumpGoroutinesToURL(c *http.Client, targetURL string) { |
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) |
|
||||||
defer cancel() |
|
||||||
|
|
||||||
zbuf := new(bytes.Buffer) |
|
||||||
zw := gzip.NewWriter(zbuf) |
|
||||||
zw.Write(goroutines.ScrubbedGoroutineDump(true)) |
|
||||||
zw.Close() |
|
||||||
|
|
||||||
req, err := http.NewRequestWithContext(ctx, "PUT", targetURL, zbuf) |
|
||||||
if err != nil { |
|
||||||
log.Printf("dumpGoroutinesToURL: %v", err) |
|
||||||
return |
|
||||||
} |
|
||||||
req.Header.Set("Content-Encoding", "gzip") |
|
||||||
t0 := time.Now() |
|
||||||
_, err = c.Do(req) |
|
||||||
d := time.Since(t0).Round(time.Millisecond) |
|
||||||
if err != nil { |
|
||||||
log.Printf("dumpGoroutinesToURL error: %v to %v (after %v)", err, targetURL, d) |
|
||||||
} else { |
|
||||||
log.Printf("dumpGoroutinesToURL complete to %v (after %v)", targetURL, d) |
|
||||||
} |
|
||||||
} |
|
||||||
@ -0,0 +1,17 @@ |
|||||||
|
// Copyright (c) Tailscale Inc & AUTHORS
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
//go:build !js && !wasm
|
||||||
|
|
||||||
|
package ipnlocal |
||||||
|
|
||||||
|
import ( |
||||||
|
"net/http" |
||||||
|
"runtime/pprof" |
||||||
|
) |
||||||
|
|
||||||
|
func init() { |
||||||
|
c2nLogHeap = func(w http.ResponseWriter, r *http.Request) { |
||||||
|
pprof.WriteHeapProfile(w) |
||||||
|
} |
||||||
|
} |
||||||
@ -1,45 +0,0 @@ |
|||||||
// Copyright (c) Tailscale Inc & AUTHORS
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
//go:build !js
|
|
||||||
|
|
||||||
// Package logheap logs a heap pprof profile.
|
|
||||||
package logheap |
|
||||||
|
|
||||||
import ( |
|
||||||
"bytes" |
|
||||||
"context" |
|
||||||
"log" |
|
||||||
"net/http" |
|
||||||
"runtime" |
|
||||||
"runtime/pprof" |
|
||||||
"time" |
|
||||||
) |
|
||||||
|
|
||||||
// LogHeap uploads a JSON logtail record with the base64 heap pprof by means
|
|
||||||
// of an HTTP POST request to the endpoint referred to in postURL.
|
|
||||||
func LogHeap(postURL string) { |
|
||||||
if postURL == "" { |
|
||||||
return |
|
||||||
} |
|
||||||
runtime.GC() |
|
||||||
buf := new(bytes.Buffer) |
|
||||||
if err := pprof.WriteHeapProfile(buf); err != nil { |
|
||||||
log.Printf("LogHeap: %v", err) |
|
||||||
return |
|
||||||
} |
|
||||||
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) |
|
||||||
defer cancel() |
|
||||||
req, err := http.NewRequestWithContext(ctx, "POST", postURL, buf) |
|
||||||
if err != nil { |
|
||||||
log.Printf("LogHeap: %v", err) |
|
||||||
return |
|
||||||
} |
|
||||||
res, err := http.DefaultClient.Do(req) |
|
||||||
if err != nil { |
|
||||||
log.Printf("LogHeap: %v", err) |
|
||||||
return |
|
||||||
} |
|
||||||
defer res.Body.Close() |
|
||||||
} |
|
||||||
@ -1,7 +0,0 @@ |
|||||||
// Copyright (c) Tailscale Inc & AUTHORS
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
package logheap |
|
||||||
|
|
||||||
func LogHeap(postURL string) { |
|
||||||
} |
|
||||||
Loading…
Reference in new issue