mirror of
https://github.com/kubeshark/kubeshark.git
synced 2025-06-01 12:36:44 +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 envoyBinary = "/envoy"
|
|
|
|
func discoverRelevantEnvoyPids(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 envoy 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 checkEnvoyPid(procfs, pid.Name(), pods) {
|
|
result = append(result, pid.Name())
|
|
}
|
|
}
|
|
|
|
logger.Log.Infof("Found %v relevant envoy processes - %v", len(result), result)
|
|
|
|
return result, nil
|
|
}
|
|
|
|
func checkEnvoyPid(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, envoyBinary) {
|
|
return false
|
|
}
|
|
|
|
environmentFile := fmt.Sprintf("%v/%v/environ", procfs, pid)
|
|
podIp, err := getSingleValueFromEnvironmentVariableFile(environmentFile, "INSTANCE_IP")
|
|
|
|
if err != nil {
|
|
return false
|
|
}
|
|
|
|
if podIp == "" {
|
|
logger.Log.Debugf("Found an envoy process without INSTANCE_IP variable %v\n", pid)
|
|
return false
|
|
}
|
|
|
|
logger.Log.Infof("Found envoy pid %v with cluster ip %v", pid, podIp)
|
|
|
|
for _, pod := range pods {
|
|
if pod.Status.PodIP == podIp {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|