| 
									
										
										
										
											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 | 
					
						
							|  |  |  | } |