lntest/harness: add method SaveProfilesPages
SaveProfilesPages will write the active goroutines to files pprof-n-*.log. Co-authored-by: taketa <853211b@gmail.com>
This commit is contained in:
parent
6028722d71
commit
314ba7db03
@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
@ -648,6 +649,60 @@ func (n *NetworkHarness) StopNode(node *HarnessNode) error {
|
|||||||
return node.stop()
|
return node.stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SaveProfilesPages hits profiles pages of all active nodes and writes it to
|
||||||
|
// disk using a similar naming scheme as to the regular set of logs.
|
||||||
|
func (n *NetworkHarness) SaveProfilesPages() {
|
||||||
|
for _, node := range n.activeNodes {
|
||||||
|
if err := saveProfilesPage(node); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// saveProfilesPage saves the profiles page for the given node to file.
|
||||||
|
func saveProfilesPage(node *HarnessNode) error {
|
||||||
|
resp, err := http.Get(
|
||||||
|
fmt.Sprintf(
|
||||||
|
"http://localhost:%d/debug/pprof/goroutine?debug=1",
|
||||||
|
node.cfg.ProfilePort,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Failed to get profile page "+
|
||||||
|
"(node_id=%d, name=%s): %v\n",
|
||||||
|
node.NodeID, node.cfg.Name, err)
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Failed to read profile page "+
|
||||||
|
"(node_id=%d, name=%s): %v\n",
|
||||||
|
node.NodeID, node.cfg.Name, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fileName := fmt.Sprintf(
|
||||||
|
"pprof-%d-%s-%s.log", node.NodeID, node.cfg.Name,
|
||||||
|
hex.EncodeToString(node.PubKey[:logPubKeyBytes]),
|
||||||
|
)
|
||||||
|
|
||||||
|
logFile, err := os.Create(fileName)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Failed to create file for profile page "+
|
||||||
|
"(node_id=%d, name=%s): %v\n",
|
||||||
|
node.NodeID, node.cfg.Name, err)
|
||||||
|
}
|
||||||
|
defer logFile.Close()
|
||||||
|
|
||||||
|
_, err = logFile.Write(body)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Failed to save profile page "+
|
||||||
|
"(node_id=%d, name=%s): %v\n",
|
||||||
|
node.NodeID, node.cfg.Name, err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// TODO(roasbeef): add a WithChannel higher-order function?
|
// TODO(roasbeef): add a WithChannel higher-order function?
|
||||||
// * python-like context manager w.r.t using a channel within a test
|
// * python-like context manager w.r.t using a channel within a test
|
||||||
// * possibly adds more funds to the target wallet if the funds are not
|
// * possibly adds more funds to the target wallet if the funds are not
|
||||||
|
Loading…
Reference in New Issue
Block a user