| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | package pprof
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import (
 | 
					
						
							| 
									
										
										
										
											2017-04-24 10:27:26 -04:00
										 |  |  | 	"net"
 | 
					
						
							| 
									
										
										
										
											2019-03-29 02:37:17 -04:00
										 |  |  | 	"strconv"
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-24 18:14:41 +02:00
										 |  |  | 	"github.com/coredns/caddy"
 | 
					
						
							| 
									
										
										
										
											2017-09-14 09:36:06 +01:00
										 |  |  | 	"github.com/coredns/coredns/plugin"
 | 
					
						
							| 
									
										
										
										
											2018-04-22 21:40:33 +01:00
										 |  |  | 	clog "github.com/coredns/coredns/plugin/pkg/log"
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-22 21:40:33 +01:00
										 |  |  | var log = clog.NewWithPlugin("pprof")
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-24 10:27:26 -04:00
										 |  |  | const defaultAddr = "localhost:6053"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-20 08:02:30 +01:00
										 |  |  | func init() { plugin.Register("pprof", setup) }
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | func setup(c *caddy.Controller) error {
 | 
					
						
							| 
									
										
										
										
											2017-04-24 10:27:26 -04:00
										 |  |  | 	h := &handler{addr: defaultAddr}
 | 
					
						
							| 
									
										
										
										
											2018-02-28 18:16:05 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	i := 0
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 	for c.Next() {
 | 
					
						
							| 
									
										
										
										
											2018-02-28 18:16:05 -08:00
										 |  |  | 		if i > 0 {
 | 
					
						
							|  |  |  | 			return plugin.Error("pprof", plugin.ErrOnce)
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2018-02-28 18:16:05 -08:00
										 |  |  | 		i++
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-24 10:27:26 -04:00
										 |  |  | 		args := c.RemainingArgs()
 | 
					
						
							|  |  |  | 		if len(args) == 1 {
 | 
					
						
							|  |  |  | 			h.addr = args[0]
 | 
					
						
							|  |  |  | 			_, _, e := net.SplitHostPort(h.addr)
 | 
					
						
							|  |  |  | 			if e != nil {
 | 
					
						
							| 
									
										
										
										
											2019-03-29 02:37:17 -04:00
										 |  |  | 				return plugin.Error("pprof", c.Errf("%v", e))
 | 
					
						
							| 
									
										
										
										
											2017-04-24 10:27:26 -04:00
										 |  |  | 			}
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2019-03-29 02:37:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-24 10:27:26 -04:00
										 |  |  | 		if len(args) > 1 {
 | 
					
						
							| 
									
										
										
										
											2017-09-14 09:36:06 +01:00
										 |  |  | 			return plugin.Error("pprof", c.ArgErr())
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2019-03-29 02:37:17 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		for c.NextBlock() {
 | 
					
						
							|  |  |  | 			switch c.Val() {
 | 
					
						
							|  |  |  | 			case "block":
 | 
					
						
							|  |  |  | 				args := c.RemainingArgs()
 | 
					
						
							|  |  |  | 				if len(args) > 1 {
 | 
					
						
							|  |  |  | 					return plugin.Error("pprof", c.ArgErr())
 | 
					
						
							|  |  |  | 				}
 | 
					
						
							|  |  |  | 				h.rateBloc = 1
 | 
					
						
							|  |  |  | 				if len(args) > 0 {
 | 
					
						
							|  |  |  | 					t, err := strconv.Atoi(args[0])
 | 
					
						
							|  |  |  | 					if err != nil {
 | 
					
						
							|  |  |  | 						return plugin.Error("pprof", c.Errf("property '%s' invalid integer value '%v'", "block", args[0]))
 | 
					
						
							|  |  |  | 					}
 | 
					
						
							|  |  |  | 					h.rateBloc = t
 | 
					
						
							|  |  |  | 				}
 | 
					
						
							|  |  |  | 			default:
 | 
					
						
							|  |  |  | 				return plugin.Error("pprof", c.Errf("unknown property '%s'", c.Val()))
 | 
					
						
							|  |  |  | 			}
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 		}
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-17 23:58:00 -08:00
										 |  |  | 	c.OnStartup(h.Startup)
 | 
					
						
							|  |  |  | 	c.OnShutdown(h.Shutdown)
 | 
					
						
							| 
									
										
										
										
											2016-08-19 17:14:17 -07:00
										 |  |  | 	return nil
 | 
					
						
							|  |  |  | }
 |