@@ -302,6 +302,7 @@ var _ = Describe("manger.Manager", func() {
302302 LeaderElectionID : "test-leader-election-id-2" ,
303303 HealthProbeBindAddress : "0" ,
304304 MetricsBindAddress : "0" ,
305+ PprofBindAddress : "0" ,
305306 })
306307 Expect (err ).To (BeNil ())
307308
@@ -347,6 +348,7 @@ var _ = Describe("manger.Manager", func() {
347348 LeaderElectionID : "test-leader-election-id-3" ,
348349 HealthProbeBindAddress : "0" ,
349350 MetricsBindAddress : "0" ,
351+ PprofBindAddress : "0" ,
350352 })
351353 Expect (err ).To (BeNil ())
352354
@@ -381,6 +383,7 @@ var _ = Describe("manger.Manager", func() {
381383 },
382384 HealthProbeBindAddress : "0" ,
383385 MetricsBindAddress : "0" ,
386+ PprofBindAddress : "0" ,
384387 })
385388 Expect (err ).ToNot (HaveOccurred ())
386389 Expect (m1 ).ToNot (BeNil ())
@@ -401,6 +404,7 @@ var _ = Describe("manger.Manager", func() {
401404 },
402405 HealthProbeBindAddress : "0" ,
403406 MetricsBindAddress : "0" ,
407+ PprofBindAddress : "0" ,
404408 })
405409 Expect (err ).ToNot (HaveOccurred ())
406410 Expect (m2 ).ToNot (BeNil ())
@@ -1478,6 +1482,99 @@ var _ = Describe("manger.Manager", func() {
14781482 })
14791483 })
14801484
1485+ Context ("should start serving pprof" , func () {
1486+ var listener net.Listener
1487+ var opts Options
1488+
1489+ BeforeEach (func () {
1490+ listener = nil
1491+ opts = Options {
1492+ newPprofListener : func (addr string ) (net.Listener , error ) {
1493+ var err error
1494+ listener , err = defaultPprofListener (addr )
1495+ return listener , err
1496+ },
1497+ }
1498+ })
1499+
1500+ AfterEach (func () {
1501+ if listener != nil {
1502+ listener .Close ()
1503+ }
1504+ })
1505+
1506+ It ("should stop serving pprof when stop is called" , func () {
1507+ opts .PprofBindAddress = ":0"
1508+ m , err := New (cfg , opts )
1509+ Expect (err ).NotTo (HaveOccurred ())
1510+
1511+ ctx , cancel := context .WithCancel (context .Background ())
1512+ go func () {
1513+ defer GinkgoRecover ()
1514+ Expect (m .Start (ctx )).NotTo (HaveOccurred ())
1515+ }()
1516+ <- m .Elected ()
1517+
1518+ // Check the pprof started
1519+ endpoint := fmt .Sprintf ("http://%s" , listener .Addr ().String ())
1520+ _ , err = http .Get (endpoint )
1521+ Expect (err ).NotTo (HaveOccurred ())
1522+
1523+ // Shutdown the server
1524+ cancel ()
1525+
1526+ // Expect the pprof server to shutdown
1527+ Eventually (func () error {
1528+ _ , err = http .Get (endpoint )
1529+ return err
1530+ }, 10 * time .Second ).ShouldNot (Succeed ())
1531+ })
1532+
1533+ It ("should serve pprof endpoints" , func () {
1534+ opts .PprofBindAddress = ":0"
1535+ m , err := New (cfg , opts )
1536+ Expect (err ).NotTo (HaveOccurred ())
1537+
1538+ ctx , cancel := context .WithCancel (context .Background ())
1539+ defer cancel ()
1540+ go func () {
1541+ defer GinkgoRecover ()
1542+ Expect (m .Start (ctx )).NotTo (HaveOccurred ())
1543+ }()
1544+ <- m .Elected ()
1545+
1546+ pprofIndexEndpoint := fmt .Sprintf ("http://%s/debug/pprof/" , listener .Addr ().String ())
1547+ resp , err := http .Get (pprofIndexEndpoint )
1548+ Expect (err ).NotTo (HaveOccurred ())
1549+ defer resp .Body .Close ()
1550+ Expect (resp .StatusCode ).To (Equal (http .StatusOK ))
1551+
1552+ pprofCmdlineEndpoint := fmt .Sprintf ("http://%s/debug/pprof/cmdline" , listener .Addr ().String ())
1553+ resp , err = http .Get (pprofCmdlineEndpoint )
1554+ Expect (err ).NotTo (HaveOccurred ())
1555+ defer resp .Body .Close ()
1556+ Expect (resp .StatusCode ).To (Equal (http .StatusOK ))
1557+
1558+ pprofProfileEndpoint := fmt .Sprintf ("http://%s/debug/pprof/profile" , listener .Addr ().String ())
1559+ resp , err = http .Get (pprofProfileEndpoint )
1560+ Expect (err ).NotTo (HaveOccurred ())
1561+ defer resp .Body .Close ()
1562+ Expect (resp .StatusCode ).To (Equal (http .StatusOK ))
1563+
1564+ pprofSymbolEndpoint := fmt .Sprintf ("http://%s/debug/pprof/symbol" , listener .Addr ().String ())
1565+ resp , err = http .Get (pprofSymbolEndpoint )
1566+ Expect (err ).NotTo (HaveOccurred ())
1567+ defer resp .Body .Close ()
1568+ Expect (resp .StatusCode ).To (Equal (http .StatusOK ))
1569+
1570+ pprofTraceEndpoint := fmt .Sprintf ("http://%s/debug/pprof/trace" , listener .Addr ().String ())
1571+ resp , err = http .Get (pprofTraceEndpoint )
1572+ Expect (err ).NotTo (HaveOccurred ())
1573+ defer resp .Body .Close ()
1574+ Expect (resp .StatusCode ).To (Equal (http .StatusOK ))
1575+ })
1576+ })
1577+
14811578 Describe ("Add" , func () {
14821579 It ("should immediately start the Component if the Manager has already Started another Component" ,
14831580 func () {
0 commit comments