mirror of
https://github.com/kubeshark/kubeshark.git
synced 2025-04-29 12:26:03 +00:00
* Make `logger` a separate module such that don't depend on `shared` module as a whole for logging * Update `Dockerfile`
84 lines
1.7 KiB
Go
84 lines
1.7 KiB
Go
package source
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/up9inc/mizu/logger"
|
|
v1 "k8s.io/api/core/v1"
|
|
)
|
|
|
|
const linkerdBinary = "/linkerd2-proxy"
|
|
|
|
func discoverRelevantLinkerdPids(procfs string, pods []v1.Pod) ([]string, error) {
|
|
result := make([]string, 0)
|
|
|
|
pids, err := ioutil.ReadDir(procfs)
|
|
|
|
if err != nil {
|
|
return result, err
|
|
}
|
|
|
|
logger.Log.Infof("Starting linkerd auto discoverer %v %v - scanning %v potential pids",
|
|
procfs, pods, len(pids))
|
|
|
|
for _, pid := range pids {
|
|
if !pid.IsDir() {
|
|
continue
|
|
}
|
|
|
|
if !numberRegex.MatchString(pid.Name()) {
|
|
continue
|
|
}
|
|
|
|
if checkLinkerdPid(procfs, pid.Name(), pods) {
|
|
result = append(result, pid.Name())
|
|
}
|
|
}
|
|
|
|
logger.Log.Infof("Found %v relevant linkerd processes - %v", len(result), result)
|
|
|
|
return result, nil
|
|
}
|
|
|
|
func checkLinkerdPid(procfs string, pid string, pods []v1.Pod) bool {
|
|
execLink := fmt.Sprintf("%v/%v/exe", procfs, pid)
|
|
exec, err := os.Readlink(execLink)
|
|
|
|
if err != nil {
|
|
// Debug on purpose - it may happen due to many reasons and we only care
|
|
// for it during troubleshooting
|
|
//
|
|
logger.Log.Debugf("Unable to read link %v - %v\n", execLink, err)
|
|
return false
|
|
}
|
|
|
|
if !strings.HasSuffix(exec, linkerdBinary) {
|
|
return false
|
|
}
|
|
|
|
environmentFile := fmt.Sprintf("%v/%v/environ", procfs, pid)
|
|
podName, err := getSingleValueFromEnvironmentVariableFile(environmentFile, "_pod_name")
|
|
|
|
if err != nil {
|
|
return false
|
|
}
|
|
|
|
if podName == "" {
|
|
logger.Log.Debugf("Found a linkerd process without _pod_name variable %v\n", pid)
|
|
return false
|
|
}
|
|
|
|
logger.Log.Infof("Found linkerd pid %v with pod name %v", pid, podName)
|
|
|
|
for _, pod := range pods {
|
|
if pod.Name == podName {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|