| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- // 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())
- 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)
- }
- }
|