in pkg/process/finders/scanner/finder.go [326:392]
func (p *ProcessFinder) regexFindMatchedProcesses() ([]*Process, error) {
// all system processes
processes, err := process.ProcessesWithContext(p.ctx)
if err != nil {
return nil, err
}
// find all matches processes
findedProcesses := make([]*Process, 0)
for _, pro := range processes {
// find the matched process finder
finderConfig, cmdline, err := p.findMatchesFinder(pro)
if err != nil {
log.Warnf("failed to match process %d, reason: %v", pro.Pid, err)
continue
}
if finderConfig == nil {
continue
}
// build the linux process and add to the list
ps := NewProcessByRegex(pro, cmdline, finderConfig)
ps.entity.Layer = finderConfig.Layer
ps.entity.ServiceName, err = p.buildEntity(err, ps, finderConfig.serviceNameBuilder)
ps.entity.InstanceName, err = p.buildEntity(err, ps, finderConfig.instanceNameBuilder)
ps.entity.ProcessName, err = p.buildEntity(err, ps, finderConfig.processNameBuilder)
ps.entity.Labels = finderConfig.ParsedLabels
if err != nil {
log.Warnf("failed to build the process data for pid: %d, reason: %v", pro.Pid, err)
continue
} else {
findedProcesses = append(findedProcesses, ps)
}
}
if len(findedProcesses) == 0 {
return nil, nil
}
// remove duplicated(identity) process
identity2Processes := make(map[string][]*Process)
for _, ps := range findedProcesses {
id := ps.BuildIdentity()
if identity2Processes[id] == nil {
identity2Processes[id] = make([]*Process, 0)
}
identity2Processes[id] = append(identity2Processes[id], ps)
}
result := make([]*Process, 0)
for _, psList := range identity2Processes {
reportProcess := psList[0]
if len(psList) > 1 {
pidList := make([]int32, 0)
for _, ps := range psList {
pidList = append(pidList, ps.pid)
}
log.WithField("command_line", reportProcess.cmd).
WithField("service_name", reportProcess.entity.ServiceName).
WithField("instance_name", reportProcess.entity.InstanceName).
WithField("process_name", reportProcess.entity.ProcessName).
WithField("labels", reportProcess.entity.Labels).
WithField("pid_list", pidList).
Warnf("find multiple similar process in Scanner, " +
"only report the first of these processes. " +
"please update the name of process to identity them more clear.")
}
result = append(result, reportProcess)
}
return result, nil
}