Use pgrep with a pattern
This commit is contained in:
		
							parent
							
								
									d505be1fd4
								
							
						
					
					
						commit
						e2aa0e8a35
					
				|  | @ -18,6 +18,7 @@ type Specification struct { | |||
| 	PidFile string `toml:"pid_file"` | ||||
| 	Exe     string | ||||
| 	Prefix  string | ||||
| 	Pattern string | ||||
| } | ||||
| 
 | ||||
| type Procstat struct { | ||||
|  | @ -35,6 +36,7 @@ var sampleConfig = ` | |||
|   pid_file = "/var/run/nginx.pid" | ||||
|   # executable name (used by pgrep) | ||||
|   # exe = "nginx" | ||||
|   # pattern = "nginx" | ||||
| ` | ||||
| 
 | ||||
| func (_ *Procstat) SampleConfig() string { | ||||
|  | @ -54,8 +56,8 @@ func (p *Procstat) Gather(acc plugins.Accumulator) error { | |||
| 			defer wg.Done() | ||||
| 			procs, err := spec.createProcesses() | ||||
| 			if err != nil { | ||||
| 				log.Printf("Error: procstat getting process, exe: [%s] pidfile: [%s] %s", | ||||
| 					spec.Exe, spec.PidFile, err.Error()) | ||||
| 				log.Printf("Error: procstat getting process, exe: [%s] pidfile: [%s] pattern: [%s] %s", | ||||
| 					spec.Exe, spec.PidFile, spec.Pattern, err.Error()) | ||||
| 			} else { | ||||
| 				for _, proc := range procs { | ||||
| 					p := NewSpecProcessor(spec.Prefix, acc, proc) | ||||
|  | @ -103,8 +105,10 @@ func (spec *Specification) getAllPids() ([]int32, error) { | |||
| 		pids, err = pidsFromFile(spec.PidFile) | ||||
| 	} else if spec.Exe != "" { | ||||
| 		pids, err = pidsFromExe(spec.Exe) | ||||
| 	} else if spec.Pattern != "" { | ||||
| 		pids, err = pidsFromPattern(spec.Pattern) | ||||
| 	} else { | ||||
| 		err = fmt.Errorf("Either exe or pid_file has to be specified") | ||||
| 		err = fmt.Errorf("Either exe, pid_file or pattern has to be specified") | ||||
| 	} | ||||
| 
 | ||||
| 	return pids, err | ||||
|  | @ -147,6 +151,26 @@ func pidsFromExe(exe string) ([]int32, error) { | |||
| 	return out, outerr | ||||
| } | ||||
| 
 | ||||
| func pidsFromPattern(pattern string) ([]int32, error) { | ||||
| 	var out []int32 | ||||
| 	var outerr error | ||||
| 	pgrep, err := exec.Command("pgrep", "-f", pattern).Output() | ||||
| 	if err != nil { | ||||
| 		return out, fmt.Errorf("Failed to execute pgrep. Error: '%s'", err) | ||||
| 	} else { | ||||
| 		pids := strings.Fields(string(pgrep)) | ||||
| 		for _, pid := range pids { | ||||
| 			ipid, err := strconv.Atoi(pid) | ||||
| 			if err == nil { | ||||
| 				out = append(out, int32(ipid)) | ||||
| 			} else { | ||||
| 				outerr = err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return out, outerr | ||||
| } | ||||
| 
 | ||||
| func init() { | ||||
| 	plugins.Add("procstat", func() plugins.Plugin { | ||||
| 		return NewProcstat() | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue