@@ -148,6 +148,7 @@ var _ = Describe("manger.Manager", func() {
148148 LeaderElectionID : "test-leader-election-id-2" ,
149149 HealthProbeBindAddress : "0" ,
150150 MetricsBindAddress : "0" ,
151+ PprofBindAddress : "0" ,
151152 })
152153 Expect (err ).To (BeNil ())
153154
@@ -193,6 +194,7 @@ var _ = Describe("manger.Manager", func() {
193194 LeaderElectionID : "test-leader-election-id-3" ,
194195 HealthProbeBindAddress : "0" ,
195196 MetricsBindAddress : "0" ,
197+ PprofBindAddress : "0" ,
196198 })
197199 Expect (err ).To (BeNil ())
198200
@@ -227,6 +229,7 @@ var _ = Describe("manger.Manager", func() {
227229 },
228230 HealthProbeBindAddress : "0" ,
229231 MetricsBindAddress : "0" ,
232+ PprofBindAddress : "0" ,
230233 })
231234 Expect (err ).ToNot (HaveOccurred ())
232235 Expect (m1 ).ToNot (BeNil ())
@@ -247,6 +250,7 @@ var _ = Describe("manger.Manager", func() {
247250 },
248251 HealthProbeBindAddress : "0" ,
249252 MetricsBindAddress : "0" ,
253+ PprofBindAddress : "0" ,
250254 })
251255 Expect (err ).ToNot (HaveOccurred ())
252256 Expect (m2 ).ToNot (BeNil ())
@@ -1280,6 +1284,99 @@ var _ = Describe("manger.Manager", func() {
12801284 })
12811285 })
12821286
1287+ Context ("should start serving pprof" , func () {
1288+ var listener net.Listener
1289+ var opts Options
1290+
1291+ BeforeEach (func () {
1292+ listener = nil
1293+ opts = Options {
1294+ newPprofListener : func (addr string ) (net.Listener , error ) {
1295+ var err error
1296+ listener , err = defaultPprofListener (addr )
1297+ return listener , err
1298+ },
1299+ }
1300+ })
1301+
1302+ AfterEach (func () {
1303+ if listener != nil {
1304+ listener .Close ()
1305+ }
1306+ })
1307+
1308+ It ("should stop serving pprof when stop is called" , func () {
1309+ opts .PprofBindAddress = ":0"
1310+ m , err := New (cfg , opts )
1311+ Expect (err ).NotTo (HaveOccurred ())
1312+
1313+ ctx , cancel := context .WithCancel (context .Background ())
1314+ go func () {
1315+ defer GinkgoRecover ()
1316+ Expect (m .Start (ctx )).NotTo (HaveOccurred ())
1317+ }()
1318+ <- m .Elected ()
1319+
1320+ // Check the pprof started
1321+ endpoint := fmt .Sprintf ("http://%s" , listener .Addr ().String ())
1322+ _ , err = http .Get (endpoint )
1323+ Expect (err ).NotTo (HaveOccurred ())
1324+
1325+ // Shutdown the server
1326+ cancel ()
1327+
1328+ // Expect the pprof server to shutdown
1329+ Eventually (func () error {
1330+ _ , err = http .Get (endpoint )
1331+ return err
1332+ }, 10 * time .Second ).ShouldNot (Succeed ())
1333+ })
1334+
1335+ It ("should serve pprof endpoints" , func () {
1336+ opts .PprofBindAddress = ":0"
1337+ m , err := New (cfg , opts )
1338+ Expect (err ).NotTo (HaveOccurred ())
1339+
1340+ ctx , cancel := context .WithCancel (context .Background ())
1341+ defer cancel ()
1342+ go func () {
1343+ defer GinkgoRecover ()
1344+ Expect (m .Start (ctx )).NotTo (HaveOccurred ())
1345+ }()
1346+ <- m .Elected ()
1347+
1348+ pprofIndexEndpoint := fmt .Sprintf ("http://%s/debug/pprof/" , listener .Addr ().String ())
1349+ resp , err := http .Get (pprofIndexEndpoint )
1350+ Expect (err ).NotTo (HaveOccurred ())
1351+ defer resp .Body .Close ()
1352+ Expect (resp .StatusCode ).To (Equal (http .StatusOK ))
1353+
1354+ pprofCmdlineEndpoint := fmt .Sprintf ("http://%s/debug/pprof/cmdline" , listener .Addr ().String ())
1355+ resp , err = http .Get (pprofCmdlineEndpoint )
1356+ Expect (err ).NotTo (HaveOccurred ())
1357+ defer resp .Body .Close ()
1358+ Expect (resp .StatusCode ).To (Equal (http .StatusOK ))
1359+
1360+ pprofProfileEndpoint := fmt .Sprintf ("http://%s/debug/pprof/profile" , listener .Addr ().String ())
1361+ resp , err = http .Get (pprofProfileEndpoint )
1362+ Expect (err ).NotTo (HaveOccurred ())
1363+ defer resp .Body .Close ()
1364+ Expect (resp .StatusCode ).To (Equal (http .StatusOK ))
1365+
1366+ pprofSymbolEndpoint := fmt .Sprintf ("http://%s/debug/pprof/symbol" , listener .Addr ().String ())
1367+ resp , err = http .Get (pprofSymbolEndpoint )
1368+ Expect (err ).NotTo (HaveOccurred ())
1369+ defer resp .Body .Close ()
1370+ Expect (resp .StatusCode ).To (Equal (http .StatusOK ))
1371+
1372+ pprofTraceEndpoint := fmt .Sprintf ("http://%s/debug/pprof/trace" , listener .Addr ().String ())
1373+ resp , err = http .Get (pprofTraceEndpoint )
1374+ Expect (err ).NotTo (HaveOccurred ())
1375+ defer resp .Body .Close ()
1376+ Expect (resp .StatusCode ).To (Equal (http .StatusOK ))
1377+ })
1378+ })
1379+
12831380 Describe ("Add" , func () {
12841381 It ("should immediately start the Component if the Manager has already Started another Component" ,
12851382 func () {
0 commit comments