From 5ae6bfdbe7eeb7c98ab935951c5e95a99ba23400 Mon Sep 17 00:00:00 2001 From: yodigos Date: Thu, 8 Aug 2024 11:32:32 +0300 Subject: [PATCH 01/15] Collect Language Version in Runtime --- common/envs/detailedEnvs.go | 10 ++++ common/{ => envs}/envOverwrite/originalenv.go | 0 common/{ => envs}/envOverwrite/overwriter.go | 0 .../envOverwrite/overwriter_test.go | 0 common/lang_detection.go | 5 ++ .../envoverwiter_test.go | 2 +- .../instrumentation/instrumentation.go | 2 +- k8sutils/pkg/envoverwrite/origenv.go | 2 +- odiglet/debug.Dockerfile | 55 +++++++++++++++++-- .../instrumentation/instrumentlang/java.go | 2 +- .../instrumentation/instrumentlang/nodejs.go | 2 +- .../instrumentation/instrumentlang/python.go | 2 +- .../pkg/kube/runtime_details/inspection.go | 15 ++--- procdiscovery/pkg/inspectors/dotnet/dotnet.go | 8 ++- procdiscovery/pkg/inspectors/golang/golang.go | 8 ++- procdiscovery/pkg/inspectors/java/java.go | 9 ++- procdiscovery/pkg/inspectors/langdetect.go | 31 ++++++----- procdiscovery/pkg/inspectors/mysql/mysql.go | 8 ++- procdiscovery/pkg/inspectors/nodejs/nodejs.go | 14 ++++- procdiscovery/pkg/inspectors/python/python.go | 13 ++++- procdiscovery/pkg/process/process.go | 49 +++++++++++------ 21 files changed, 171 insertions(+), 66 deletions(-) create mode 100644 common/envs/detailedEnvs.go rename common/{ => envs}/envOverwrite/originalenv.go (100%) rename common/{ => envs}/envOverwrite/overwriter.go (100%) rename common/{ => envs}/envOverwrite/overwriter_test.go (100%) diff --git a/common/envs/detailedEnvs.go b/common/envs/detailedEnvs.go new file mode 100644 index 000000000..dc2f6741d --- /dev/null +++ b/common/envs/detailedEnvs.go @@ -0,0 +1,10 @@ +package envs + +const NodeVersionConst = "NODE_VERSION" +const PythonVersionConst = "PYTHON_VERSION" + +// EnvValuesMap is a map of environment variables and their separators +var EnvValuesMap = map[string]string{ + NodeVersionConst: " ", + PythonVersionConst: ":", +} diff --git a/common/envOverwrite/originalenv.go b/common/envs/envOverwrite/originalenv.go similarity index 100% rename from common/envOverwrite/originalenv.go rename to common/envs/envOverwrite/originalenv.go diff --git a/common/envOverwrite/overwriter.go b/common/envs/envOverwrite/overwriter.go similarity index 100% rename from common/envOverwrite/overwriter.go rename to common/envs/envOverwrite/overwriter.go diff --git a/common/envOverwrite/overwriter_test.go b/common/envs/envOverwrite/overwriter_test.go similarity index 100% rename from common/envOverwrite/overwriter_test.go rename to common/envs/envOverwrite/overwriter_test.go diff --git a/common/lang_detection.go b/common/lang_detection.go index afc27115a..4e569dcf8 100644 --- a/common/lang_detection.go +++ b/common/lang_detection.go @@ -1,5 +1,10 @@ package common +type ProgramLanguageDetails struct { + Language ProgrammingLanguage + Version string +} + // +kubebuilder:validation:Enum=java;python;go;dotnet;javascript;mysql;unknown;ignored type ProgrammingLanguage string diff --git a/instrumentor/controllers/instrumentationdevice/envoverwiter_test.go b/instrumentor/controllers/instrumentationdevice/envoverwiter_test.go index 1c2d8375a..b317aaffd 100644 --- a/instrumentor/controllers/instrumentationdevice/envoverwiter_test.go +++ b/instrumentor/controllers/instrumentationdevice/envoverwiter_test.go @@ -6,7 +6,7 @@ import ( odigosv1 "github.com/odigos-io/odigos/api/odigos/v1alpha1" "github.com/odigos-io/odigos/common" "github.com/odigos-io/odigos/common/consts" - "github.com/odigos-io/odigos/common/envOverwrite" + "github.com/odigos-io/odigos/common/envs/envOverwrite" "github.com/odigos-io/odigos/instrumentor/internal/testutil" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" diff --git a/instrumentor/instrumentation/instrumentation.go b/instrumentor/instrumentation/instrumentation.go index 3e6774164..b14009b05 100644 --- a/instrumentor/instrumentation/instrumentation.go +++ b/instrumentor/instrumentation/instrumentation.go @@ -5,7 +5,7 @@ import ( "fmt" "strings" - "github.com/odigos-io/odigos/common/envOverwrite" + "github.com/odigos-io/odigos/common/envs/envOverwrite" "sigs.k8s.io/controller-runtime/pkg/client" odigosv1 "github.com/odigos-io/odigos/api/odigos/v1alpha1" diff --git a/k8sutils/pkg/envoverwrite/origenv.go b/k8sutils/pkg/envoverwrite/origenv.go index b6329dff8..58364ce12 100644 --- a/k8sutils/pkg/envoverwrite/origenv.go +++ b/k8sutils/pkg/envoverwrite/origenv.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/odigos-io/odigos/common/consts" - "github.com/odigos-io/odigos/common/envOverwrite" + "github.com/odigos-io/odigos/common/envs/envOverwrite" "sigs.k8s.io/controller-runtime/pkg/client" ) diff --git a/odiglet/debug.Dockerfile b/odiglet/debug.Dockerfile index cc6805583..16159714a 100644 --- a/odiglet/debug.Dockerfile +++ b/odiglet/debug.Dockerfile @@ -1,12 +1,52 @@ FROM python:3.11 AS python-builder +ARG ODIGOS_VERSION WORKDIR /python-instrumentation -ADD odiglet/agents/python/requirements.txt . -RUN mkdir workspace && pip install --target workspace -r requirements.txt +COPY ../agents/python ./agents/python +RUN echo "VERSION = \"$ODIGOS_VERSION\";" > ./agents/python/configurator/version.py +RUN mkdir workspace && pip install ./agents/python/ --target workspace -FROM node:16 AS nodejs-builder + +######### Node.js Native Community Agent ######### +# +# The Node.js agent is built in multiple stages so it can be built with either upstream +# @odigos/opentelemetry-node or with a local clone to test changes during development. +# The implemntation is based on the following blog post: +# https://www.docker.com/blog/dockerfiles-now-support-multiple-build-contexts/ + +# The first build stage 'nodejs-agent-native-community-clone' clones the agent sources from github main branch. +FROM alpine AS nodejs-agent-native-community-clone +RUN apk add git +WORKDIR /src +ARG NODEJS_AGENT_VERSION=main +RUN git clone https://github.com/odigos-io/opentelemetry-node.git && cd opentelemetry-node && git checkout $NODEJS_AGENT_VERSION + +# The second build stage 'nodejs-agent-native-community-src' prepares the actual code we are going to compile and embed in odiglet. +# By default, it uses the previous 'nodejs-agent-native-community-src' stage, but one can override it by setting the +# --build-context nodejs-agent-native-community-src=../opentelemetry-node flag in the docker build command. +# This allows us to nobe the agent sources and test changes during development. +# The output of this stage is the resolved source code to be used in the next stage. +FROM scratch AS nodejs-agent-native-community-src +COPY --from=nodejs-agent-native-community-clone /src/opentelemetry-node / + +# The third build stage 'nodejs-agent-native-community-builder' compiles the agent sources and prepares the final output. +# it COPY from the previous 'nodejs-agent-native-community-src' stage, so it can be used with either the upstream or local sources. +# The output of this stage is the compiled agent code in: +# - package source code in '/nodejs-instrumentation/build/src' directory. +# - all required dependencies in '/nodejs-instrumentation/prod_node_modules' directory. +# These artifacts are later copied into the odiglet final image to be mounted into auto-instrumented pods at runtime. +FROM node:18 AS nodejs-agent-native-community-builder +ARG ODIGOS_VERSION WORKDIR /nodejs-instrumentation -COPY odiglet/agents/nodejs . -RUN npm install +COPY --from=nodejs-agent-native-community-src /package.json /yarn.lock ./ +# prepare the production node_modules content in a separate directory +RUN yarn --production --frozen-lockfile +RUN mv node_modules ./prod_node_modules +# install all dependencies including dev so we can yarn compile +RUN yarn --frozen-lockfile +COPY --from=nodejs-agent-native-community-src / ./ +# inject the actual version into the agent code +RUN echo "export const VERSION = \"$ODIGOS_VERSION\";" > ./src/version.ts +RUN yarn compile FROM busybox:1.36.1 AS dotnet-builder WORKDIR /dotnet-instrumentation @@ -30,6 +70,7 @@ COPY api/ api/ COPY common/ common/ COPY k8sutils/ k8sutils/ COPY procdiscovery/ procdiscovery/ +COPY opampserver/ opampserver/ WORKDIR /go/src/github.com/odigos-io/odigos/odiglet COPY odiglet/ . @@ -52,7 +93,9 @@ RUN chmod 644 /instrumentations/java/javaagent.jar COPY --from=python-builder /python-instrumentation/workspace /instrumentations/python # NodeJS -COPY --from=nodejs-builder /nodejs-instrumentation/build/workspace /instrumentations/nodejs +COPY --from=nodejs-agent-native-community-builder /nodejs-instrumentation/build/src /instrumentations/nodejs +COPY --from=nodejs-agent-native-community-builder /nodejs-instrumentation/prod_node_modules /instrumentations/nodejs/node_modules + # .NET COPY --from=dotnet-builder /dotnet-instrumentation /instrumentations/dotnet diff --git a/odiglet/pkg/instrumentation/instrumentlang/java.go b/odiglet/pkg/instrumentation/instrumentlang/java.go index ac5b027ee..b60a3c2b9 100644 --- a/odiglet/pkg/instrumentation/instrumentlang/java.go +++ b/odiglet/pkg/instrumentation/instrumentlang/java.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/odigos-io/odigos/common" - "github.com/odigos-io/odigos/common/envOverwrite" + "github.com/odigos-io/odigos/common/envs/envOverwrite" "github.com/odigos-io/odigos/odiglet/pkg/env" "github.com/odigos-io/odigos/odiglet/pkg/instrumentation/consts" "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1" diff --git a/odiglet/pkg/instrumentation/instrumentlang/nodejs.go b/odiglet/pkg/instrumentation/instrumentlang/nodejs.go index 0ba032b08..d09c8d501 100644 --- a/odiglet/pkg/instrumentation/instrumentlang/nodejs.go +++ b/odiglet/pkg/instrumentation/instrumentlang/nodejs.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/odigos-io/odigos/common" - "github.com/odigos-io/odigos/common/envOverwrite" + "github.com/odigos-io/odigos/common/envs/envOverwrite" "github.com/odigos-io/odigos/odiglet/pkg/env" "github.com/odigos-io/odigos/odiglet/pkg/instrumentation/consts" "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1" diff --git a/odiglet/pkg/instrumentation/instrumentlang/python.go b/odiglet/pkg/instrumentation/instrumentlang/python.go index 8c6eec05d..f87cd0766 100644 --- a/odiglet/pkg/instrumentation/instrumentlang/python.go +++ b/odiglet/pkg/instrumentation/instrumentlang/python.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/odigos-io/odigos/common" - "github.com/odigos-io/odigos/common/envOverwrite" + "github.com/odigos-io/odigos/common/envs/envOverwrite" "github.com/odigos-io/odigos/odiglet/pkg/env" "github.com/odigos-io/odigos/odiglet/pkg/instrumentation/consts" "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1" diff --git a/odiglet/pkg/kube/runtime_details/inspection.go b/odiglet/pkg/kube/runtime_details/inspection.go index 0a0c43ed0..65e9315f6 100644 --- a/odiglet/pkg/kube/runtime_details/inspection.go +++ b/odiglet/pkg/kube/runtime_details/inspection.go @@ -93,13 +93,13 @@ func runtimeInspection(pods []corev1.Pod, ignoredContainers []string) ([]odigosv continue } - var lang common.ProgrammingLanguage + programLanguageDetails := common.ProgramLanguageDetails{Language: common.UnknownProgrammingLanguage} var inspectProc *procdiscovery.Details var detectErr error for _, proc := range processes { - lang, detectErr = inspectors.DetectLanguage(proc) - if detectErr == nil && lang != common.UnknownProgrammingLanguage { + programLanguageDetails, detectErr = inspectors.DetectLanguage(proc) + if detectErr == nil && programLanguageDetails.Language != common.UnknownProgrammingLanguage { inspectProc = &proc break } @@ -108,21 +108,22 @@ func runtimeInspection(pods []corev1.Pod, ignoredContainers []string) ([]odigosv envs := make([]odigosv1.EnvVar, 0) if inspectProc == nil { log.Logger.V(0).Info("unable to detect language for any process", "pod", pod.Name, "container", container.Name, "namespace", pod.Namespace) - lang = common.UnknownProgrammingLanguage + programLanguageDetails.Language = common.UnknownProgrammingLanguage } else { if len(processes) > 1 { log.Logger.V(0).Info("multiple processes found in pod container, only taking the first one with detected language into account", "pod", pod.Name, "container", container.Name, "namespace", pod.Namespace) } // Convert map to slice for k8s format - envs = make([]odigosv1.EnvVar, 0, len(inspectProc.Envs)) - for envName, envValue := range inspectProc.Envs { + envs = make([]odigosv1.EnvVar, 0, len(inspectProc.Environments.OverwriteEnvs)) + for envName, envValue := range inspectProc.Environments.OverwriteEnvs { + envs = append(envs, odigosv1.EnvVar{Name: envName, Value: envValue}) } } resultsMap[container.Name] = odigosv1.RuntimeDetailsByContainer{ ContainerName: container.Name, - Language: lang, + Language: programLanguageDetails.Language, EnvVars: envs, } } diff --git a/procdiscovery/pkg/inspectors/dotnet/dotnet.go b/procdiscovery/pkg/inspectors/dotnet/dotnet.go index b58724773..ad5d0bb4a 100644 --- a/procdiscovery/pkg/inspectors/dotnet/dotnet.go +++ b/procdiscovery/pkg/inspectors/dotnet/dotnet.go @@ -16,14 +16,16 @@ const ( dotnet = "DOTNET" ) -func (d *DotnetInspector) Inspect(p *process.Details) (common.ProgrammingLanguage, bool) { +func (d *DotnetInspector) Inspect(p *process.Details) (common.ProgramLanguageDetails, bool) { + var programLanguageDetails common.ProgramLanguageDetails data, err := os.ReadFile(fmt.Sprintf("/proc/%d/environ", p.ProcessID)) if err == nil { environ := string(data) if strings.Contains(environ, aspnet) || strings.Contains(environ, dotnet) { - return common.DotNetProgrammingLanguage, true + programLanguageDetails.Language = common.DotNetProgrammingLanguage + return programLanguageDetails, true } } - return "", false + return programLanguageDetails, false } diff --git a/procdiscovery/pkg/inspectors/golang/golang.go b/procdiscovery/pkg/inspectors/golang/golang.go index 7a53ec194..387e2539a 100644 --- a/procdiscovery/pkg/inspectors/golang/golang.go +++ b/procdiscovery/pkg/inspectors/golang/golang.go @@ -10,12 +10,14 @@ import ( type GolangInspector struct{} -func (g *GolangInspector) Inspect(p *process.Details) (common.ProgrammingLanguage, bool) { +func (g *GolangInspector) Inspect(p *process.Details) (common.ProgramLanguageDetails, bool) { + var programLanguageDetails common.ProgramLanguageDetails file := fmt.Sprintf("/proc/%d/exe", p.ProcessID) _, err := buildinfo.ReadFile(file) if err != nil { - return "", false + return programLanguageDetails, false } + programLanguageDetails.Language = common.GoProgrammingLanguage - return common.GoProgrammingLanguage, true + return programLanguageDetails, true } diff --git a/procdiscovery/pkg/inspectors/java/java.go b/procdiscovery/pkg/inspectors/java/java.go index 6e1a0096d..9d43358ec 100644 --- a/procdiscovery/pkg/inspectors/java/java.go +++ b/procdiscovery/pkg/inspectors/java/java.go @@ -11,10 +11,13 @@ type JavaInspector struct{} const processName = "java" -func (j *JavaInspector) Inspect(p *process.Details) (common.ProgrammingLanguage, bool) { +func (j *JavaInspector) Inspect(p *process.Details) (common.ProgramLanguageDetails, bool) { + var programLanguageDetails common.ProgramLanguageDetails + if strings.Contains(p.ExeName, processName) || strings.Contains(p.CmdLine, processName) { - return common.JavaProgrammingLanguage, true + programLanguageDetails.Language = common.JavaProgrammingLanguage + return programLanguageDetails, true } - return "", false + return programLanguageDetails, false } diff --git a/procdiscovery/pkg/inspectors/langdetect.go b/procdiscovery/pkg/inspectors/langdetect.go index 77c020ff8..8b114a2ee 100644 --- a/procdiscovery/pkg/inspectors/langdetect.go +++ b/procdiscovery/pkg/inspectors/langdetect.go @@ -22,7 +22,7 @@ func (e ErrLanguageDetectionConflict) Error() string { } type inspector interface { - Inspect(process *process.Details) (common.ProgrammingLanguage, bool) + Inspect(process *process.Details) (common.ProgramLanguageDetails, bool) } var inspectorsList = []inspector{ @@ -37,23 +37,28 @@ var inspectorsList = []inspector{ // DetectLanguage returns the detected language for the process or // common.UnknownProgrammingLanguage if the language could not be detected, in which case error == nil // if error or language detectors disagree common.UnknownProgrammingLanguage is also returned -func DetectLanguage(process process.Details) (common.ProgrammingLanguage, error) { - detectedLanguage := common.UnknownProgrammingLanguage +func DetectLanguage(process process.Details) (common.ProgramLanguageDetails, error) { + detectedProgramLanguageDetails := common.ProgramLanguageDetails{ + Language: common.UnknownProgrammingLanguage, + } + for _, i := range inspectorsList { - language, detected := i.Inspect(&process) + languageDetails, detected := i.Inspect(&process) if detected { - if detectedLanguage == common.UnknownProgrammingLanguage { - detectedLanguage = language + if detectedProgramLanguageDetails.Language == common.UnknownProgrammingLanguage { + detectedProgramLanguageDetails = languageDetails continue } - return common.UnknownProgrammingLanguage, ErrLanguageDetectionConflict{ - languages: [2]common.ProgrammingLanguage{ - detectedLanguage, - language, - }, - } + return common.ProgramLanguageDetails{ + Language: common.UnknownProgrammingLanguage, + }, ErrLanguageDetectionConflict{ + languages: [2]common.ProgrammingLanguage{ + detectedProgramLanguageDetails.Language, + languageDetails.Language, + }, + } } } - return detectedLanguage, nil + return detectedProgramLanguageDetails, nil } diff --git a/procdiscovery/pkg/inspectors/mysql/mysql.go b/procdiscovery/pkg/inspectors/mysql/mysql.go index 11766e069..ae141a8b6 100644 --- a/procdiscovery/pkg/inspectors/mysql/mysql.go +++ b/procdiscovery/pkg/inspectors/mysql/mysql.go @@ -13,10 +13,12 @@ type MySQLInspector struct{} const MySQLProcessName = "mysqld" -func (j *MySQLInspector) Inspect(p *process.Details) (common.ProgrammingLanguage, bool) { +func (j *MySQLInspector) Inspect(p *process.Details) (common.ProgramLanguageDetails, bool) { + var programLanguageDetails common.ProgramLanguageDetails if strings.HasSuffix(p.ExeName, MySQLProcessName) || strings.HasSuffix(p.CmdLine, MySQLProcessName) { - return common.MySQLProgrammingLanguage, true + programLanguageDetails.Language = common.MySQLProgrammingLanguage + return programLanguageDetails, true } - return "", false + return programLanguageDetails, false } diff --git a/procdiscovery/pkg/inspectors/nodejs/nodejs.go b/procdiscovery/pkg/inspectors/nodejs/nodejs.go index f8f3ba043..0c0ee02dd 100644 --- a/procdiscovery/pkg/inspectors/nodejs/nodejs.go +++ b/procdiscovery/pkg/inspectors/nodejs/nodejs.go @@ -1,6 +1,7 @@ package nodejs import ( + "github.com/odigos-io/odigos/common/envs" "strings" "github.com/odigos-io/odigos/common" @@ -11,10 +12,17 @@ type NodejsInspector struct{} const nodeProcessName = "node" -func (n *NodejsInspector) Inspect(process *process.Details) (common.ProgrammingLanguage, bool) { +func (n *NodejsInspector) Inspect(process *process.Details) (common.ProgramLanguageDetails, bool) { + var programLanguageDetails common.ProgramLanguageDetails + if strings.Contains(process.ExeName, nodeProcessName) || strings.Contains(process.CmdLine, nodeProcessName) { - return common.JavascriptProgrammingLanguage, true + programLanguageDetails.Language = common.JavascriptProgrammingLanguage + if value, exists := process.Environments.DetailedEnvs[envs.NodeVersionConst]; exists { + programLanguageDetails.Version = value + } + + return programLanguageDetails, true } - return "", false + return programLanguageDetails, false } diff --git a/procdiscovery/pkg/inspectors/python/python.go b/procdiscovery/pkg/inspectors/python/python.go index 6eac846f2..f8d2cc54a 100644 --- a/procdiscovery/pkg/inspectors/python/python.go +++ b/procdiscovery/pkg/inspectors/python/python.go @@ -1,6 +1,7 @@ package python import ( + "github.com/odigos-io/odigos/common/envs" "strings" "github.com/odigos-io/odigos/common" @@ -11,10 +12,16 @@ type PythonInspector struct{} const pythonProcessName = "python" -func (p *PythonInspector) Inspect(process *process.Details) (common.ProgrammingLanguage, bool) { +func (p *PythonInspector) Inspect(process *process.Details) (common.ProgramLanguageDetails, bool) { + var programLanguageDetails common.ProgramLanguageDetails if strings.Contains(process.ExeName, pythonProcessName) || strings.Contains(process.CmdLine, pythonProcessName) { - return common.PythonProgrammingLanguage, true + programLanguageDetails.Language = common.PythonProgrammingLanguage + if value, exists := process.Environments.DetailedEnvs[envs.PythonVersionConst]; exists { + programLanguageDetails.Version = value + } + + return programLanguageDetails, true } - return "", false + return programLanguageDetails, false } diff --git a/procdiscovery/pkg/process/process.go b/procdiscovery/pkg/process/process.go index 8bb7ce069..d6b13050f 100644 --- a/procdiscovery/pkg/process/process.go +++ b/procdiscovery/pkg/process/process.go @@ -3,19 +3,25 @@ package process import ( "bufio" "fmt" + "github.com/odigos-io/odigos/common/envs" "io" "os" "strings" - "github.com/odigos-io/odigos/common/envOverwrite" + "github.com/odigos-io/odigos/common/envs/envOverwrite" ) type Details struct { - ProcessID int - ExeName string - CmdLine string + ProcessID int + ExeName string + CmdLine string + Environments *Envs +} + +type Envs struct { + DetailedEnvs map[string]string // Envs only contains the environment variables that we are interested in - Envs map[string]string + OverwriteEnvs map[string]string } // Find all processes in the system. @@ -60,10 +66,10 @@ func GetPidDetails(pid int) Details { envVars := getRelevantEnvVars(pid) return Details{ - ProcessID: pid, - ExeName: exeName, - CmdLine: cmdLine, - Envs: envVars, + ProcessID: pid, + ExeName: exeName, + CmdLine: cmdLine, + Environments: envVars, } } @@ -95,7 +101,7 @@ func getCommandLine(pid int) string { } } -func getRelevantEnvVars(pid int) map[string]string { +func getRelevantEnvVars(pid int) *Envs { envFileName := fmt.Sprintf("/proc/%d/environ", pid) fileContent, err := os.ReadFile(envFileName) if err != nil { @@ -105,14 +111,16 @@ func getRelevantEnvVars(pid int) map[string]string { } r := bufio.NewReader(strings.NewReader(string(fileContent))) - result := make(map[string]string) // We only care about the environment variables that we might overwrite - relevantEnvVars := make(map[string]interface{}) + relevantOverwriteEnvVars := make(map[string]interface{}) for k := range envOverwrite.EnvValuesMap { - relevantEnvVars[k] = nil + relevantOverwriteEnvVars[k] = nil } + overWriteEnvsResult := make(map[string]string) + detailedEnvsResult := make(map[string]string) + for { // The entries are separated by // null bytes ('\0'), and there may be a null byte at the end. @@ -130,10 +138,19 @@ func getRelevantEnvVars(pid int) map[string]string { continue } - if _, ok := relevantEnvVars[envParts[0]]; ok { - result[envParts[0]] = envParts[1] + if _, ok := relevantOverwriteEnvVars[envParts[0]]; ok { + overWriteEnvsResult[envParts[0]] = envParts[1] } + + if _, ok := envs.EnvValuesMap[envParts[0]]; ok { + detailedEnvsResult[envParts[0]] = envParts[1] + } + } + + envs := &Envs{ + OverwriteEnvs: overWriteEnvsResult, + DetailedEnvs: detailedEnvsResult, } - return result + return envs } From 73fe0e23d068d627e13e7dcdf858da19c772bc76 Mon Sep 17 00:00:00 2001 From: yodigos Date: Thu, 8 Aug 2024 11:37:51 +0300 Subject: [PATCH 02/15] Collect Language Version in Runtime --- common/envs/detailedEnvs.go | 4 ++-- procdiscovery/pkg/process/process.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/envs/detailedEnvs.go b/common/envs/detailedEnvs.go index dc2f6741d..c957c36ed 100644 --- a/common/envs/detailedEnvs.go +++ b/common/envs/detailedEnvs.go @@ -3,8 +3,8 @@ package envs const NodeVersionConst = "NODE_VERSION" const PythonVersionConst = "PYTHON_VERSION" -// EnvValuesMap is a map of environment variables and their separators -var EnvValuesMap = map[string]string{ +// EnvDetailsSeparatorMap is a map of environment variables and their separators +var EnvDetailsSeparatorMap = map[string]string{ NodeVersionConst: " ", PythonVersionConst: ":", } diff --git a/procdiscovery/pkg/process/process.go b/procdiscovery/pkg/process/process.go index d6b13050f..426d5c8be 100644 --- a/procdiscovery/pkg/process/process.go +++ b/procdiscovery/pkg/process/process.go @@ -142,7 +142,7 @@ func getRelevantEnvVars(pid int) *Envs { overWriteEnvsResult[envParts[0]] = envParts[1] } - if _, ok := envs.EnvValuesMap[envParts[0]]; ok { + if _, ok := envs.EnvDetailsSeparatorMap[envParts[0]]; ok { detailedEnvsResult[envParts[0]] = envParts[1] } } From 4b76852ff904775f782b8ab1ffccb885a7dac529 Mon Sep 17 00:00:00 2001 From: yodigos Date: Thu, 8 Aug 2024 11:40:32 +0300 Subject: [PATCH 03/15] Collect Language Version in Runtime --- procdiscovery/pkg/process/process.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/procdiscovery/pkg/process/process.go b/procdiscovery/pkg/process/process.go index 426d5c8be..042a852f5 100644 --- a/procdiscovery/pkg/process/process.go +++ b/procdiscovery/pkg/process/process.go @@ -15,12 +15,12 @@ type Details struct { ProcessID int ExeName string CmdLine string - Environments *Envs + Environments *ProcessEnvs } -type Envs struct { +type ProcessEnvs struct { DetailedEnvs map[string]string - // Envs only contains the environment variables that we are interested in + // OverwriteEnvs only contains the environment variables that we are interested in OverwriteEnvs map[string]string } @@ -101,7 +101,7 @@ func getCommandLine(pid int) string { } } -func getRelevantEnvVars(pid int) *Envs { +func getRelevantEnvVars(pid int) *ProcessEnvs { envFileName := fmt.Sprintf("/proc/%d/environ", pid) fileContent, err := os.ReadFile(envFileName) if err != nil { @@ -147,7 +147,7 @@ func getRelevantEnvVars(pid int) *Envs { } } - envs := &Envs{ + envs := &ProcessEnvs{ OverwriteEnvs: overWriteEnvsResult, DetailedEnvs: detailedEnvsResult, } From f477ecb819e88aab4397d10c9ade0539bf0d4fbe Mon Sep 17 00:00:00 2001 From: yodigos Date: Thu, 8 Aug 2024 14:11:35 +0300 Subject: [PATCH 04/15] Update Application CRD --- odiglet/debug.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odiglet/debug.Dockerfile b/odiglet/debug.Dockerfile index 16159714a..780411f4a 100644 --- a/odiglet/debug.Dockerfile +++ b/odiglet/debug.Dockerfile @@ -63,7 +63,7 @@ RUN ARCH_SUFFIX=$(cat /tmp/arch_suffix) && \ unzip opentelemetry-dotnet-instrumentation-linux-glibc-${ARCH_SUFFIX}.zip && \ rm opentelemetry-dotnet-instrumentation-linux-glibc-${ARCH_SUFFIX}.zip -FROM --platform=$BUILDPLATFORM keyval/odiglet-base:v1.5 as builder +FROM --platform=$BUILDPLATFORM keyval/odiglet-base:v1.5 AS builder WORKDIR /go/src/github.com/odigos-io/odigos # Copyy local modules required by the build COPY api/ api/ From 6824d2189a5e474d2bfc031e879f56f7d5c0e258 Mon Sep 17 00:00:00 2001 From: yodigos Date: Thu, 8 Aug 2024 16:59:57 +0300 Subject: [PATCH 05/15] Added Version --- common/{envs => }/envOverwrite/originalenv.go | 0 common/{envs => }/envOverwrite/overwriter.go | 0 common/{envs => }/envOverwrite/overwriter_test.go | 0 common/lang_detection.go | 4 ++-- .../instrumentationdevice/envoverwiter_test.go | 2 +- instrumentor/instrumentation/instrumentation.go | 2 +- k8sutils/pkg/envoverwrite/origenv.go | 2 +- odiglet/pkg/instrumentation/instrumentlang/java.go | 2 +- odiglet/pkg/instrumentation/instrumentlang/nodejs.go | 2 +- odiglet/pkg/instrumentation/instrumentlang/python.go | 2 +- .../pkg/inspectors/detailsEnvs.go | 8 +++----- procdiscovery/pkg/inspectors/golang/golang.go | 3 ++- procdiscovery/pkg/inspectors/java/java.go | 7 +++++-- procdiscovery/pkg/inspectors/nodejs/nodejs.go | 5 ++--- procdiscovery/pkg/inspectors/python/python.go | 5 ++--- procdiscovery/pkg/process/process.go | 10 ++++++---- 16 files changed, 28 insertions(+), 26 deletions(-) rename common/{envs => }/envOverwrite/originalenv.go (100%) rename common/{envs => }/envOverwrite/overwriter.go (100%) rename common/{envs => }/envOverwrite/overwriter_test.go (100%) rename common/envs/detailedEnvs.go => procdiscovery/pkg/inspectors/detailsEnvs.go (52%) diff --git a/common/envs/envOverwrite/originalenv.go b/common/envOverwrite/originalenv.go similarity index 100% rename from common/envs/envOverwrite/originalenv.go rename to common/envOverwrite/originalenv.go diff --git a/common/envs/envOverwrite/overwriter.go b/common/envOverwrite/overwriter.go similarity index 100% rename from common/envs/envOverwrite/overwriter.go rename to common/envOverwrite/overwriter.go diff --git a/common/envs/envOverwrite/overwriter_test.go b/common/envOverwrite/overwriter_test.go similarity index 100% rename from common/envs/envOverwrite/overwriter_test.go rename to common/envOverwrite/overwriter_test.go diff --git a/common/lang_detection.go b/common/lang_detection.go index 4e569dcf8..a1cfe0ec2 100644 --- a/common/lang_detection.go +++ b/common/lang_detection.go @@ -1,8 +1,8 @@ package common type ProgramLanguageDetails struct { - Language ProgrammingLanguage - Version string + Language ProgrammingLanguage + RuntimeVersion string } // +kubebuilder:validation:Enum=java;python;go;dotnet;javascript;mysql;unknown;ignored diff --git a/instrumentor/controllers/instrumentationdevice/envoverwiter_test.go b/instrumentor/controllers/instrumentationdevice/envoverwiter_test.go index b317aaffd..1c2d8375a 100644 --- a/instrumentor/controllers/instrumentationdevice/envoverwiter_test.go +++ b/instrumentor/controllers/instrumentationdevice/envoverwiter_test.go @@ -6,7 +6,7 @@ import ( odigosv1 "github.com/odigos-io/odigos/api/odigos/v1alpha1" "github.com/odigos-io/odigos/common" "github.com/odigos-io/odigos/common/consts" - "github.com/odigos-io/odigos/common/envs/envOverwrite" + "github.com/odigos-io/odigos/common/envOverwrite" "github.com/odigos-io/odigos/instrumentor/internal/testutil" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" diff --git a/instrumentor/instrumentation/instrumentation.go b/instrumentor/instrumentation/instrumentation.go index b14009b05..3e6774164 100644 --- a/instrumentor/instrumentation/instrumentation.go +++ b/instrumentor/instrumentation/instrumentation.go @@ -5,7 +5,7 @@ import ( "fmt" "strings" - "github.com/odigos-io/odigos/common/envs/envOverwrite" + "github.com/odigos-io/odigos/common/envOverwrite" "sigs.k8s.io/controller-runtime/pkg/client" odigosv1 "github.com/odigos-io/odigos/api/odigos/v1alpha1" diff --git a/k8sutils/pkg/envoverwrite/origenv.go b/k8sutils/pkg/envoverwrite/origenv.go index 58364ce12..b6329dff8 100644 --- a/k8sutils/pkg/envoverwrite/origenv.go +++ b/k8sutils/pkg/envoverwrite/origenv.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/odigos-io/odigos/common/consts" - "github.com/odigos-io/odigos/common/envs/envOverwrite" + "github.com/odigos-io/odigos/common/envOverwrite" "sigs.k8s.io/controller-runtime/pkg/client" ) diff --git a/odiglet/pkg/instrumentation/instrumentlang/java.go b/odiglet/pkg/instrumentation/instrumentlang/java.go index b60a3c2b9..ac5b027ee 100644 --- a/odiglet/pkg/instrumentation/instrumentlang/java.go +++ b/odiglet/pkg/instrumentation/instrumentlang/java.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/odigos-io/odigos/common" - "github.com/odigos-io/odigos/common/envs/envOverwrite" + "github.com/odigos-io/odigos/common/envOverwrite" "github.com/odigos-io/odigos/odiglet/pkg/env" "github.com/odigos-io/odigos/odiglet/pkg/instrumentation/consts" "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1" diff --git a/odiglet/pkg/instrumentation/instrumentlang/nodejs.go b/odiglet/pkg/instrumentation/instrumentlang/nodejs.go index d09c8d501..0ba032b08 100644 --- a/odiglet/pkg/instrumentation/instrumentlang/nodejs.go +++ b/odiglet/pkg/instrumentation/instrumentlang/nodejs.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/odigos-io/odigos/common" - "github.com/odigos-io/odigos/common/envs/envOverwrite" + "github.com/odigos-io/odigos/common/envOverwrite" "github.com/odigos-io/odigos/odiglet/pkg/env" "github.com/odigos-io/odigos/odiglet/pkg/instrumentation/consts" "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1" diff --git a/odiglet/pkg/instrumentation/instrumentlang/python.go b/odiglet/pkg/instrumentation/instrumentlang/python.go index f87cd0766..8c6eec05d 100644 --- a/odiglet/pkg/instrumentation/instrumentlang/python.go +++ b/odiglet/pkg/instrumentation/instrumentlang/python.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/odigos-io/odigos/common" - "github.com/odigos-io/odigos/common/envs/envOverwrite" + "github.com/odigos-io/odigos/common/envOverwrite" "github.com/odigos-io/odigos/odiglet/pkg/env" "github.com/odigos-io/odigos/odiglet/pkg/instrumentation/consts" "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1" diff --git a/common/envs/detailedEnvs.go b/procdiscovery/pkg/inspectors/detailsEnvs.go similarity index 52% rename from common/envs/detailedEnvs.go rename to procdiscovery/pkg/inspectors/detailsEnvs.go index c957c36ed..dad570405 100644 --- a/common/envs/detailedEnvs.go +++ b/procdiscovery/pkg/inspectors/detailsEnvs.go @@ -1,10 +1,8 @@ -package envs +package inspectors const NodeVersionConst = "NODE_VERSION" const PythonVersionConst = "PYTHON_VERSION" +const JavaVersionConst = "JAVA_VERSION" // EnvDetailsSeparatorMap is a map of environment variables and their separators -var EnvDetailsSeparatorMap = map[string]string{ - NodeVersionConst: " ", - PythonVersionConst: ":", -} +var EnvDetailsSeparatorMap = []string{NodeVersionConst, PythonVersionConst, JavaVersionConst} diff --git a/procdiscovery/pkg/inspectors/golang/golang.go b/procdiscovery/pkg/inspectors/golang/golang.go index 387e2539a..da6823339 100644 --- a/procdiscovery/pkg/inspectors/golang/golang.go +++ b/procdiscovery/pkg/inspectors/golang/golang.go @@ -13,11 +13,12 @@ type GolangInspector struct{} func (g *GolangInspector) Inspect(p *process.Details) (common.ProgramLanguageDetails, bool) { var programLanguageDetails common.ProgramLanguageDetails file := fmt.Sprintf("/proc/%d/exe", p.ProcessID) - _, err := buildinfo.ReadFile(file) + buildInfo, err := buildinfo.ReadFile(file) if err != nil { return programLanguageDetails, false } programLanguageDetails.Language = common.GoProgrammingLanguage + programLanguageDetails.RuntimeVersion = buildInfo.GoVersion return programLanguageDetails, true } diff --git a/procdiscovery/pkg/inspectors/java/java.go b/procdiscovery/pkg/inspectors/java/java.go index 9d43358ec..d4814407f 100644 --- a/procdiscovery/pkg/inspectors/java/java.go +++ b/procdiscovery/pkg/inspectors/java/java.go @@ -11,11 +11,14 @@ type JavaInspector struct{} const processName = "java" -func (j *JavaInspector) Inspect(p *process.Details) (common.ProgramLanguageDetails, bool) { +func (j *JavaInspector) Inspect(process *process.Details) (common.ProgramLanguageDetails, bool) { var programLanguageDetails common.ProgramLanguageDetails - if strings.Contains(p.ExeName, processName) || strings.Contains(p.CmdLine, processName) { + if strings.Contains(process.ExeName, processName) || strings.Contains(process.CmdLine, processName) { programLanguageDetails.Language = common.JavaProgrammingLanguage + if value, exists := process.Environments.DetailedEnvs[process.PythonVersionConst]; exists { + programLanguageDetails.RuntimeVersion = value + } return programLanguageDetails, true } diff --git a/procdiscovery/pkg/inspectors/nodejs/nodejs.go b/procdiscovery/pkg/inspectors/nodejs/nodejs.go index 0c0ee02dd..3e25b43ec 100644 --- a/procdiscovery/pkg/inspectors/nodejs/nodejs.go +++ b/procdiscovery/pkg/inspectors/nodejs/nodejs.go @@ -1,7 +1,6 @@ package nodejs import ( - "github.com/odigos-io/odigos/common/envs" "strings" "github.com/odigos-io/odigos/common" @@ -17,8 +16,8 @@ func (n *NodejsInspector) Inspect(process *process.Details) (common.ProgramLangu if strings.Contains(process.ExeName, nodeProcessName) || strings.Contains(process.CmdLine, nodeProcessName) { programLanguageDetails.Language = common.JavascriptProgrammingLanguage - if value, exists := process.Environments.DetailedEnvs[envs.NodeVersionConst]; exists { - programLanguageDetails.Version = value + if value, exists := process.Environments.DetailedEnvs[process.NodeVersionConst]; exists { + programLanguageDetails.RuntimeVersion = value } return programLanguageDetails, true diff --git a/procdiscovery/pkg/inspectors/python/python.go b/procdiscovery/pkg/inspectors/python/python.go index f8d2cc54a..0e3313c13 100644 --- a/procdiscovery/pkg/inspectors/python/python.go +++ b/procdiscovery/pkg/inspectors/python/python.go @@ -1,7 +1,6 @@ package python import ( - "github.com/odigos-io/odigos/common/envs" "strings" "github.com/odigos-io/odigos/common" @@ -16,8 +15,8 @@ func (p *PythonInspector) Inspect(process *process.Details) (common.ProgramLangu var programLanguageDetails common.ProgramLanguageDetails if strings.Contains(process.ExeName, pythonProcessName) || strings.Contains(process.CmdLine, pythonProcessName) { programLanguageDetails.Language = common.PythonProgrammingLanguage - if value, exists := process.Environments.DetailedEnvs[envs.PythonVersionConst]; exists { - programLanguageDetails.Version = value + if value, exists := process.Environments.DetailedEnvs[process.JavaVersionConst]; exists { + programLanguageDetails.RuntimeVersion = value } return programLanguageDetails, true diff --git a/procdiscovery/pkg/process/process.go b/procdiscovery/pkg/process/process.go index 042a852f5..b5bca47ff 100644 --- a/procdiscovery/pkg/process/process.go +++ b/procdiscovery/pkg/process/process.go @@ -3,12 +3,12 @@ package process import ( "bufio" "fmt" - "github.com/odigos-io/odigos/common/envs" + "github.com/odigos-io/odigos/procdiscovery/pkg/inspectors" "io" "os" "strings" - "github.com/odigos-io/odigos/common/envs/envOverwrite" + "github.com/odigos-io/odigos/common/envOverwrite" ) type Details struct { @@ -142,8 +142,10 @@ func getRelevantEnvVars(pid int) *ProcessEnvs { overWriteEnvsResult[envParts[0]] = envParts[1] } - if _, ok := envs.EnvDetailsSeparatorMap[envParts[0]]; ok { - detailedEnvsResult[envParts[0]] = envParts[1] + for _, env := range inspectors.EnvDetailsSeparatorMap { + if env == envParts[0] { + detailedEnvsResult[envParts[0]] = envParts[1] + } } } From 8de57633c9cdb03d5fee6979281b9b9605357b85 Mon Sep 17 00:00:00 2001 From: yodigos Date: Thu, 8 Aug 2024 14:10:18 +0300 Subject: [PATCH 06/15] Update Application CRD --- .../odigos.io_instrumentedapplications.yaml | 2 ++ .../v1alpha1/runtimedetailsbycontainer.go | 9 ++++++++ .../v1alpha1/instrumentedapplication_types.go | 23 ++++++++++--------- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/api/config/crd/bases/odigos.io_instrumentedapplications.yaml b/api/config/crd/bases/odigos.io_instrumentedapplications.yaml index 35fdec10f..9baa06012 100644 --- a/api/config/crd/bases/odigos.io_instrumentedapplications.yaml +++ b/api/config/crd/bases/odigos.io_instrumentedapplications.yaml @@ -110,6 +110,8 @@ spec: - unknown - ignored type: string + version: + type: string required: - containerName - language diff --git a/api/generated/odigos/applyconfiguration/odigos/v1alpha1/runtimedetailsbycontainer.go b/api/generated/odigos/applyconfiguration/odigos/v1alpha1/runtimedetailsbycontainer.go index 5a78388c2..9dc89438f 100644 --- a/api/generated/odigos/applyconfiguration/odigos/v1alpha1/runtimedetailsbycontainer.go +++ b/api/generated/odigos/applyconfiguration/odigos/v1alpha1/runtimedetailsbycontainer.go @@ -26,6 +26,7 @@ import ( type RuntimeDetailsByContainerApplyConfiguration struct { ContainerName *string `json:"containerName,omitempty"` Language *common.ProgrammingLanguage `json:"language,omitempty"` + Version *string `json:"version,omitempty"` EnvVars []EnvVarApplyConfiguration `json:"envVars,omitempty"` } @@ -51,6 +52,14 @@ func (b *RuntimeDetailsByContainerApplyConfiguration) WithLanguage(value common. return b } +// WithVersion sets the Version field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Version field is set to the value of the last call. +func (b *RuntimeDetailsByContainerApplyConfiguration) WithVersion(value string) *RuntimeDetailsByContainerApplyConfiguration { + b.Version = &value + return b +} + // WithEnvVars adds the given value to the EnvVars field in the declarative configuration // and returns the receiver, so that objects can be build by chaining "With" function invocations. // If called multiple times, values provided by each call will be appended to the EnvVars field. diff --git a/api/odigos/v1alpha1/instrumentedapplication_types.go b/api/odigos/v1alpha1/instrumentedapplication_types.go index 674f8e4d4..30b978020 100644 --- a/api/odigos/v1alpha1/instrumentedapplication_types.go +++ b/api/odigos/v1alpha1/instrumentedapplication_types.go @@ -21,41 +21,42 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -//+kubebuilder:object:generate=true +// +kubebuilder:object:generate=true type ConfigOption struct { - OptionKey string `json:"optionKey"` + OptionKey string `json:"optionKey"` SpanKind common.SpanKind `json:"spanKind"` } -//+kubebuilder:object:generate=true +// +kubebuilder:object:generate=true type InstrumentationLibraryOptions struct { - LibraryName string `json:"libraryName"` - Options []ConfigOption `json:"options"` + LibraryName string `json:"libraryName"` + Options []ConfigOption `json:"options"` } -//+kubebuilder:object:generate=true +// +kubebuilder:object:generate=true type EnvVar struct { Name string `json:"name"` Value string `json:"value"` } -//+kubebuilder:object:generate=true +// +kubebuilder:object:generate=true type RuntimeDetailsByContainer struct { - ContainerName string `json:"containerName"` + ContainerName string `json:"containerName"` Language common.ProgrammingLanguage `json:"language"` - EnvVars []EnvVar `json:"envVars,omitempty"` + Version string `json:"version,omitempty"` + EnvVars []EnvVar `json:"envVars,omitempty"` } // +kubebuilder:object:generate=true type OptionByContainer struct { - ContainerName string `json:"containerName"` + ContainerName string `json:"containerName"` InstrumentationLibraries []InstrumentationLibraryOptions `json:"instrumentationsLibraries"` } // InstrumentedApplicationSpec defines the desired state of InstrumentedApplication type InstrumentedApplicationSpec struct { RuntimeDetails []RuntimeDetailsByContainer `json:"runtimeDetails,omitempty"` - Options []OptionByContainer `json:"options,omitempty"` + Options []OptionByContainer `json:"options,omitempty"` } // InstrumentedApplicationStatus defines the observed state of InstrumentedApplication From 1a4ced3eab8c44caa734341deb901989a5c2c3bb Mon Sep 17 00:00:00 2001 From: yodigos Date: Thu, 8 Aug 2024 15:22:42 +0300 Subject: [PATCH 07/15] Added Version --- Makefile | 5 +++++ odiglet/pkg/kube/runtime_details/inspection.go | 1 + 2 files changed, 6 insertions(+) diff --git a/Makefile b/Makefile index 254883859..c4fd3cb92 100644 --- a/Makefile +++ b/Makefile @@ -194,3 +194,8 @@ cli-install: @echo "Installing odigos from source. version: $(ODIGOS_CLI_VERSION)" go run -tags=embed_manifests ./cli install --version $(ODIGOS_CLI_VERSION) + +.PHONY: cli-upgrade +cli-upgrade: + @echo "Installing odigos from source. version: $(ODIGOS_CLI_VERSION)" + go run -tags=embed_manifests ./cli upgrade --version $(ODIGOS_CLI_VERSION) --yes \ No newline at end of file diff --git a/odiglet/pkg/kube/runtime_details/inspection.go b/odiglet/pkg/kube/runtime_details/inspection.go index 65e9315f6..24b054ad1 100644 --- a/odiglet/pkg/kube/runtime_details/inspection.go +++ b/odiglet/pkg/kube/runtime_details/inspection.go @@ -124,6 +124,7 @@ func runtimeInspection(pods []corev1.Pod, ignoredContainers []string) ([]odigosv resultsMap[container.Name] = odigosv1.RuntimeDetailsByContainer{ ContainerName: container.Name, Language: programLanguageDetails.Language, + Version: programLanguageDetails.Version, EnvVars: envs, } } From ff4be5e577537142d23390040aa1ad26b3074640 Mon Sep 17 00:00:00 2001 From: yodigos Date: Thu, 8 Aug 2024 17:11:30 +0300 Subject: [PATCH 08/15] Added Version --- .../odigos.io_instrumentedapplications.yaml | 2 +- .../odigos/v1alpha1/runtimedetailsbycontainer.go | 16 ++++++++-------- .../v1alpha1/instrumentedapplication_types.go | 8 ++++---- odiglet/pkg/kube/runtime_details/inspection.go | 8 ++++---- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/api/config/crd/bases/odigos.io_instrumentedapplications.yaml b/api/config/crd/bases/odigos.io_instrumentedapplications.yaml index 9baa06012..ef69bab68 100644 --- a/api/config/crd/bases/odigos.io_instrumentedapplications.yaml +++ b/api/config/crd/bases/odigos.io_instrumentedapplications.yaml @@ -110,7 +110,7 @@ spec: - unknown - ignored type: string - version: + runtimeVersion: type: string required: - containerName diff --git a/api/generated/odigos/applyconfiguration/odigos/v1alpha1/runtimedetailsbycontainer.go b/api/generated/odigos/applyconfiguration/odigos/v1alpha1/runtimedetailsbycontainer.go index 9dc89438f..017462743 100644 --- a/api/generated/odigos/applyconfiguration/odigos/v1alpha1/runtimedetailsbycontainer.go +++ b/api/generated/odigos/applyconfiguration/odigos/v1alpha1/runtimedetailsbycontainer.go @@ -24,10 +24,10 @@ import ( // RuntimeDetailsByContainerApplyConfiguration represents an declarative configuration of the RuntimeDetailsByContainer type for use // with apply. type RuntimeDetailsByContainerApplyConfiguration struct { - ContainerName *string `json:"containerName,omitempty"` - Language *common.ProgrammingLanguage `json:"language,omitempty"` - Version *string `json:"version,omitempty"` - EnvVars []EnvVarApplyConfiguration `json:"envVars,omitempty"` + ContainerName *string `json:"containerName,omitempty"` + Language *common.ProgrammingLanguage `json:"language,omitempty"` + RuntimeVersion *string `json:"runtimeVersion,omitempty"` + EnvVars []EnvVarApplyConfiguration `json:"envVars,omitempty"` } // RuntimeDetailsByContainerApplyConfiguration constructs an declarative configuration of the RuntimeDetailsByContainer type for use with @@ -52,11 +52,11 @@ func (b *RuntimeDetailsByContainerApplyConfiguration) WithLanguage(value common. return b } -// WithVersion sets the Version field in the declarative configuration to the given value +// WithRuntimeVersion sets the RuntimeVersion field in the declarative configuration to the given value // and returns the receiver, so that objects can be built by chaining "With" function invocations. -// If called multiple times, the Version field is set to the value of the last call. -func (b *RuntimeDetailsByContainerApplyConfiguration) WithVersion(value string) *RuntimeDetailsByContainerApplyConfiguration { - b.Version = &value +// If called multiple times, the RuntimeVersion field is set to the value of the last call. +func (b *RuntimeDetailsByContainerApplyConfiguration) WithRuntimeVersion(value string) *RuntimeDetailsByContainerApplyConfiguration { + b.RuntimeVersion = &value return b } diff --git a/api/odigos/v1alpha1/instrumentedapplication_types.go b/api/odigos/v1alpha1/instrumentedapplication_types.go index 30b978020..2548dcddf 100644 --- a/api/odigos/v1alpha1/instrumentedapplication_types.go +++ b/api/odigos/v1alpha1/instrumentedapplication_types.go @@ -41,10 +41,10 @@ type EnvVar struct { // +kubebuilder:object:generate=true type RuntimeDetailsByContainer struct { - ContainerName string `json:"containerName"` - Language common.ProgrammingLanguage `json:"language"` - Version string `json:"version,omitempty"` - EnvVars []EnvVar `json:"envVars,omitempty"` + ContainerName string `json:"containerName"` + Language common.ProgrammingLanguage `json:"language"` + RuntimeVersion string `json:"runtimeVersion,omitempty"` + EnvVars []EnvVar `json:"envVars,omitempty"` } // +kubebuilder:object:generate=true diff --git a/odiglet/pkg/kube/runtime_details/inspection.go b/odiglet/pkg/kube/runtime_details/inspection.go index 24b054ad1..c6bb14679 100644 --- a/odiglet/pkg/kube/runtime_details/inspection.go +++ b/odiglet/pkg/kube/runtime_details/inspection.go @@ -122,10 +122,10 @@ func runtimeInspection(pods []corev1.Pod, ignoredContainers []string) ([]odigosv } resultsMap[container.Name] = odigosv1.RuntimeDetailsByContainer{ - ContainerName: container.Name, - Language: programLanguageDetails.Language, - Version: programLanguageDetails.Version, - EnvVars: envs, + ContainerName: container.Name, + Language: programLanguageDetails.Language, + RuntimeVersion: programLanguageDetails.RuntimeVersion, + EnvVars: envs, } } } From d987d66f5276775b195e9798a768402731ae90d8 Mon Sep 17 00:00:00 2001 From: yodigos Date: Thu, 8 Aug 2024 18:18:28 +0300 Subject: [PATCH 09/15] Added Version --- procdiscovery/pkg/inspectors/detailsEnvs.go | 8 -------- procdiscovery/pkg/inspectors/java/java.go | 6 +++--- procdiscovery/pkg/inspectors/nodejs/nodejs.go | 6 +++--- procdiscovery/pkg/inspectors/python/python.go | 6 +++--- procdiscovery/pkg/process/process.go | 10 ++++++++-- 5 files changed, 17 insertions(+), 19 deletions(-) delete mode 100644 procdiscovery/pkg/inspectors/detailsEnvs.go diff --git a/procdiscovery/pkg/inspectors/detailsEnvs.go b/procdiscovery/pkg/inspectors/detailsEnvs.go deleted file mode 100644 index dad570405..000000000 --- a/procdiscovery/pkg/inspectors/detailsEnvs.go +++ /dev/null @@ -1,8 +0,0 @@ -package inspectors - -const NodeVersionConst = "NODE_VERSION" -const PythonVersionConst = "PYTHON_VERSION" -const JavaVersionConst = "JAVA_VERSION" - -// EnvDetailsSeparatorMap is a map of environment variables and their separators -var EnvDetailsSeparatorMap = []string{NodeVersionConst, PythonVersionConst, JavaVersionConst} diff --git a/procdiscovery/pkg/inspectors/java/java.go b/procdiscovery/pkg/inspectors/java/java.go index d4814407f..53301ac99 100644 --- a/procdiscovery/pkg/inspectors/java/java.go +++ b/procdiscovery/pkg/inspectors/java/java.go @@ -11,12 +11,12 @@ type JavaInspector struct{} const processName = "java" -func (j *JavaInspector) Inspect(process *process.Details) (common.ProgramLanguageDetails, bool) { +func (j *JavaInspector) Inspect(proc *process.Details) (common.ProgramLanguageDetails, bool) { var programLanguageDetails common.ProgramLanguageDetails - if strings.Contains(process.ExeName, processName) || strings.Contains(process.CmdLine, processName) { + if strings.Contains(proc.ExeName, processName) || strings.Contains(proc.CmdLine, processName) { programLanguageDetails.Language = common.JavaProgrammingLanguage - if value, exists := process.Environments.DetailedEnvs[process.PythonVersionConst]; exists { + if value, exists := proc.Environments.DetailedEnvs[process.JavaVersionConst]; exists { programLanguageDetails.RuntimeVersion = value } return programLanguageDetails, true diff --git a/procdiscovery/pkg/inspectors/nodejs/nodejs.go b/procdiscovery/pkg/inspectors/nodejs/nodejs.go index 3e25b43ec..ba246aaa0 100644 --- a/procdiscovery/pkg/inspectors/nodejs/nodejs.go +++ b/procdiscovery/pkg/inspectors/nodejs/nodejs.go @@ -11,12 +11,12 @@ type NodejsInspector struct{} const nodeProcessName = "node" -func (n *NodejsInspector) Inspect(process *process.Details) (common.ProgramLanguageDetails, bool) { +func (n *NodejsInspector) Inspect(proc *process.Details) (common.ProgramLanguageDetails, bool) { var programLanguageDetails common.ProgramLanguageDetails - if strings.Contains(process.ExeName, nodeProcessName) || strings.Contains(process.CmdLine, nodeProcessName) { + if strings.Contains(proc.ExeName, nodeProcessName) || strings.Contains(proc.CmdLine, nodeProcessName) { programLanguageDetails.Language = common.JavascriptProgrammingLanguage - if value, exists := process.Environments.DetailedEnvs[process.NodeVersionConst]; exists { + if value, exists := proc.Environments.DetailedEnvs[process.NodeVersionConst]; exists { programLanguageDetails.RuntimeVersion = value } diff --git a/procdiscovery/pkg/inspectors/python/python.go b/procdiscovery/pkg/inspectors/python/python.go index 0e3313c13..f4cf91337 100644 --- a/procdiscovery/pkg/inspectors/python/python.go +++ b/procdiscovery/pkg/inspectors/python/python.go @@ -11,11 +11,11 @@ type PythonInspector struct{} const pythonProcessName = "python" -func (p *PythonInspector) Inspect(process *process.Details) (common.ProgramLanguageDetails, bool) { +func (p *PythonInspector) Inspect(proc *process.Details) (common.ProgramLanguageDetails, bool) { var programLanguageDetails common.ProgramLanguageDetails - if strings.Contains(process.ExeName, pythonProcessName) || strings.Contains(process.CmdLine, pythonProcessName) { + if strings.Contains(proc.ExeName, pythonProcessName) || strings.Contains(proc.CmdLine, pythonProcessName) { programLanguageDetails.Language = common.PythonProgrammingLanguage - if value, exists := process.Environments.DetailedEnvs[process.JavaVersionConst]; exists { + if value, exists := proc.Environments.DetailedEnvs[process.JavaVersionConst]; exists { programLanguageDetails.RuntimeVersion = value } diff --git a/procdiscovery/pkg/process/process.go b/procdiscovery/pkg/process/process.go index b5bca47ff..058956c39 100644 --- a/procdiscovery/pkg/process/process.go +++ b/procdiscovery/pkg/process/process.go @@ -3,7 +3,6 @@ package process import ( "bufio" "fmt" - "github.com/odigos-io/odigos/procdiscovery/pkg/inspectors" "io" "os" "strings" @@ -11,6 +10,13 @@ import ( "github.com/odigos-io/odigos/common/envOverwrite" ) +const NodeVersionConst = "NODE_VERSION" +const PythonVersionConst = "PYTHON_VERSION" +const JavaVersionConst = "JAVA_VERSION" + +// envDetailsSeparatorMap is a map of environment variables and their separators +var envDetailsSeparatorMap = []string{NodeVersionConst, PythonVersionConst, JavaVersionConst} + type Details struct { ProcessID int ExeName string @@ -142,7 +148,7 @@ func getRelevantEnvVars(pid int) *ProcessEnvs { overWriteEnvsResult[envParts[0]] = envParts[1] } - for _, env := range inspectors.EnvDetailsSeparatorMap { + for _, env := range envDetailsSeparatorMap { if env == envParts[0] { detailedEnvsResult[envParts[0]] = envParts[1] } From 7849c64811fb9b9512d6b9fd4daf68fd6d7d1f68 Mon Sep 17 00:00:00 2001 From: yodigos Date: Thu, 8 Aug 2024 18:28:08 +0300 Subject: [PATCH 10/15] Added Version --- procdiscovery/pkg/inspectors/python/python.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/procdiscovery/pkg/inspectors/python/python.go b/procdiscovery/pkg/inspectors/python/python.go index f4cf91337..d291eb4f4 100644 --- a/procdiscovery/pkg/inspectors/python/python.go +++ b/procdiscovery/pkg/inspectors/python/python.go @@ -15,7 +15,7 @@ func (p *PythonInspector) Inspect(proc *process.Details) (common.ProgramLanguage var programLanguageDetails common.ProgramLanguageDetails if strings.Contains(proc.ExeName, pythonProcessName) || strings.Contains(proc.CmdLine, pythonProcessName) { programLanguageDetails.Language = common.PythonProgrammingLanguage - if value, exists := proc.Environments.DetailedEnvs[process.JavaVersionConst]; exists { + if value, exists := proc.Environments.DetailedEnvs[process.PythonVersionConst]; exists { programLanguageDetails.RuntimeVersion = value } From 134efc9a7183db5c64ade63c1986ef5f7dceaf3c Mon Sep 17 00:00:00 2001 From: yodigos Date: Sun, 11 Aug 2024 12:55:27 +0300 Subject: [PATCH 11/15] Fix nil problems --- procdiscovery/pkg/inspectors/golang/golang.go | 5 ++++- procdiscovery/pkg/inspectors/java/java.go | 7 +++++-- procdiscovery/pkg/inspectors/nodejs/nodejs.go | 6 ++++-- procdiscovery/pkg/inspectors/python/python.go | 6 ++++-- procdiscovery/pkg/process/process.go | 11 +++++------ 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/procdiscovery/pkg/inspectors/golang/golang.go b/procdiscovery/pkg/inspectors/golang/golang.go index da6823339..3bc04d421 100644 --- a/procdiscovery/pkg/inspectors/golang/golang.go +++ b/procdiscovery/pkg/inspectors/golang/golang.go @@ -17,8 +17,11 @@ func (g *GolangInspector) Inspect(p *process.Details) (common.ProgramLanguageDet if err != nil { return programLanguageDetails, false } + programLanguageDetails.Language = common.GoProgrammingLanguage - programLanguageDetails.RuntimeVersion = buildInfo.GoVersion + if buildInfo != nil { + programLanguageDetails.RuntimeVersion = buildInfo.GoVersion + } return programLanguageDetails, true } diff --git a/procdiscovery/pkg/inspectors/java/java.go b/procdiscovery/pkg/inspectors/java/java.go index 53301ac99..99dccb058 100644 --- a/procdiscovery/pkg/inspectors/java/java.go +++ b/procdiscovery/pkg/inspectors/java/java.go @@ -16,9 +16,12 @@ func (j *JavaInspector) Inspect(proc *process.Details) (common.ProgramLanguageDe if strings.Contains(proc.ExeName, processName) || strings.Contains(proc.CmdLine, processName) { programLanguageDetails.Language = common.JavaProgrammingLanguage - if value, exists := proc.Environments.DetailedEnvs[process.JavaVersionConst]; exists { - programLanguageDetails.RuntimeVersion = value + if proc.Environments != nil { + if value, exists := proc.Environments.DetailedEnvs[process.JavaVersionConst]; exists { + programLanguageDetails.RuntimeVersion = value + } } + return programLanguageDetails, true } diff --git a/procdiscovery/pkg/inspectors/nodejs/nodejs.go b/procdiscovery/pkg/inspectors/nodejs/nodejs.go index ba246aaa0..09b37b0a2 100644 --- a/procdiscovery/pkg/inspectors/nodejs/nodejs.go +++ b/procdiscovery/pkg/inspectors/nodejs/nodejs.go @@ -16,8 +16,10 @@ func (n *NodejsInspector) Inspect(proc *process.Details) (common.ProgramLanguage if strings.Contains(proc.ExeName, nodeProcessName) || strings.Contains(proc.CmdLine, nodeProcessName) { programLanguageDetails.Language = common.JavascriptProgrammingLanguage - if value, exists := proc.Environments.DetailedEnvs[process.NodeVersionConst]; exists { - programLanguageDetails.RuntimeVersion = value + if proc.Environments != nil { + if value, exists := proc.Environments.DetailedEnvs[process.NodeVersionConst]; exists { + programLanguageDetails.RuntimeVersion = value + } } return programLanguageDetails, true diff --git a/procdiscovery/pkg/inspectors/python/python.go b/procdiscovery/pkg/inspectors/python/python.go index d291eb4f4..91fd8ad37 100644 --- a/procdiscovery/pkg/inspectors/python/python.go +++ b/procdiscovery/pkg/inspectors/python/python.go @@ -15,8 +15,10 @@ func (p *PythonInspector) Inspect(proc *process.Details) (common.ProgramLanguage var programLanguageDetails common.ProgramLanguageDetails if strings.Contains(proc.ExeName, pythonProcessName) || strings.Contains(proc.CmdLine, pythonProcessName) { programLanguageDetails.Language = common.PythonProgrammingLanguage - if value, exists := proc.Environments.DetailedEnvs[process.PythonVersionConst]; exists { - programLanguageDetails.RuntimeVersion = value + if proc.Environments != nil { + if value, exists := proc.Environments.DetailedEnvs[process.PythonVersionConst]; exists { + programLanguageDetails.RuntimeVersion = value + } } return programLanguageDetails, true diff --git a/procdiscovery/pkg/process/process.go b/procdiscovery/pkg/process/process.go index 058956c39..1a0b762d8 100644 --- a/procdiscovery/pkg/process/process.go +++ b/procdiscovery/pkg/process/process.go @@ -14,8 +14,8 @@ const NodeVersionConst = "NODE_VERSION" const PythonVersionConst = "PYTHON_VERSION" const JavaVersionConst = "JAVA_VERSION" -// envDetailsSeparatorMap is a map of environment variables and their separators -var envDetailsSeparatorMap = []string{NodeVersionConst, PythonVersionConst, JavaVersionConst} +// envDetailsMap is a map of environment variables and their separators +var envDetailsMap = map[string]struct{}{NodeVersionConst: {}, PythonVersionConst: {}, JavaVersionConst: {}} type Details struct { ProcessID int @@ -148,11 +148,10 @@ func getRelevantEnvVars(pid int) *ProcessEnvs { overWriteEnvsResult[envParts[0]] = envParts[1] } - for _, env := range envDetailsSeparatorMap { - if env == envParts[0] { - detailedEnvsResult[envParts[0]] = envParts[1] - } + if _, ok := envDetailsMap[envParts[0]]; ok { + detailedEnvsResult[envParts[0]] = envParts[1] } + } envs := &ProcessEnvs{ From 3c1f6ae2bce896292750e8e72d4fc55444bd5e25 Mon Sep 17 00:00:00 2001 From: yodigos Date: Sun, 11 Aug 2024 13:31:13 +0300 Subject: [PATCH 12/15] Fix nil problems --- odiglet/pkg/kube/runtime_details/inspection.go | 10 ++++++---- procdiscovery/pkg/process/process.go | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/odiglet/pkg/kube/runtime_details/inspection.go b/odiglet/pkg/kube/runtime_details/inspection.go index c6bb14679..6e4b78952 100644 --- a/odiglet/pkg/kube/runtime_details/inspection.go +++ b/odiglet/pkg/kube/runtime_details/inspection.go @@ -113,11 +113,13 @@ func runtimeInspection(pods []corev1.Pod, ignoredContainers []string) ([]odigosv if len(processes) > 1 { log.Logger.V(0).Info("multiple processes found in pod container, only taking the first one with detected language into account", "pod", pod.Name, "container", container.Name, "namespace", pod.Namespace) } - // Convert map to slice for k8s format - envs = make([]odigosv1.EnvVar, 0, len(inspectProc.Environments.OverwriteEnvs)) - for envName, envValue := range inspectProc.Environments.OverwriteEnvs { - envs = append(envs, odigosv1.EnvVar{Name: envName, Value: envValue}) + // Convert map to slice for k8s format + if inspectProc.Environments != nil { + envs = make([]odigosv1.EnvVar, 0, len(inspectProc.Environments.DetailedEnvs)) + for envName, envValue := range inspectProc.Environments.OverwriteEnvs { + envs = append(envs, odigosv1.EnvVar{Name: envName, Value: envValue}) + } } } diff --git a/procdiscovery/pkg/process/process.go b/procdiscovery/pkg/process/process.go index 1a0b762d8..6f1b4a440 100644 --- a/procdiscovery/pkg/process/process.go +++ b/procdiscovery/pkg/process/process.go @@ -26,7 +26,7 @@ type Details struct { type ProcessEnvs struct { DetailedEnvs map[string]string - // OverwriteEnvs only contains the environment variables that we are interested in + // OverwriteEnvs only contains environment variables that Odigos is using for auto-instrumentation and may need to be overwritten OverwriteEnvs map[string]string } From 06bda358f49e79ad3a5f03d44ee82ae106b3b7fb Mon Sep 17 00:00:00 2001 From: yodigos Date: Sun, 11 Aug 2024 15:02:39 +0300 Subject: [PATCH 13/15] Fix nil problems --- .../pkg/kube/runtime_details/inspection.go | 8 +++----- procdiscovery/pkg/inspectors/java/java.go | 6 ++---- procdiscovery/pkg/inspectors/nodejs/nodejs.go | 6 ++---- procdiscovery/pkg/inspectors/python/python.go | 6 ++---- procdiscovery/pkg/process/process.go | 20 ++++++++++++++----- 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/odiglet/pkg/kube/runtime_details/inspection.go b/odiglet/pkg/kube/runtime_details/inspection.go index 6e4b78952..bbfb80428 100644 --- a/odiglet/pkg/kube/runtime_details/inspection.go +++ b/odiglet/pkg/kube/runtime_details/inspection.go @@ -115,11 +115,9 @@ func runtimeInspection(pods []corev1.Pod, ignoredContainers []string) ([]odigosv } // Convert map to slice for k8s format - if inspectProc.Environments != nil { - envs = make([]odigosv1.EnvVar, 0, len(inspectProc.Environments.DetailedEnvs)) - for envName, envValue := range inspectProc.Environments.OverwriteEnvs { - envs = append(envs, odigosv1.EnvVar{Name: envName, Value: envValue}) - } + envs = make([]odigosv1.EnvVar, 0, len(inspectProc.Environments.DetailedEnvs)) + for envName, envValue := range inspectProc.Environments.OverwriteEnvs { + envs = append(envs, odigosv1.EnvVar{Name: envName, Value: envValue}) } } diff --git a/procdiscovery/pkg/inspectors/java/java.go b/procdiscovery/pkg/inspectors/java/java.go index 99dccb058..8a275a3ff 100644 --- a/procdiscovery/pkg/inspectors/java/java.go +++ b/procdiscovery/pkg/inspectors/java/java.go @@ -16,10 +16,8 @@ func (j *JavaInspector) Inspect(proc *process.Details) (common.ProgramLanguageDe if strings.Contains(proc.ExeName, processName) || strings.Contains(proc.CmdLine, processName) { programLanguageDetails.Language = common.JavaProgrammingLanguage - if proc.Environments != nil { - if value, exists := proc.Environments.DetailedEnvs[process.JavaVersionConst]; exists { - programLanguageDetails.RuntimeVersion = value - } + if value, exists := proc.GetDetailedEnvsValue(process.JavaVersionConst); exists { + programLanguageDetails.RuntimeVersion = value } return programLanguageDetails, true diff --git a/procdiscovery/pkg/inspectors/nodejs/nodejs.go b/procdiscovery/pkg/inspectors/nodejs/nodejs.go index 09b37b0a2..378617a94 100644 --- a/procdiscovery/pkg/inspectors/nodejs/nodejs.go +++ b/procdiscovery/pkg/inspectors/nodejs/nodejs.go @@ -16,10 +16,8 @@ func (n *NodejsInspector) Inspect(proc *process.Details) (common.ProgramLanguage if strings.Contains(proc.ExeName, nodeProcessName) || strings.Contains(proc.CmdLine, nodeProcessName) { programLanguageDetails.Language = common.JavascriptProgrammingLanguage - if proc.Environments != nil { - if value, exists := proc.Environments.DetailedEnvs[process.NodeVersionConst]; exists { - programLanguageDetails.RuntimeVersion = value - } + if value, exists := proc.GetDetailedEnvsValue(process.NodeVersionConst); exists { + programLanguageDetails.RuntimeVersion = value } return programLanguageDetails, true diff --git a/procdiscovery/pkg/inspectors/python/python.go b/procdiscovery/pkg/inspectors/python/python.go index 91fd8ad37..dcdad063a 100644 --- a/procdiscovery/pkg/inspectors/python/python.go +++ b/procdiscovery/pkg/inspectors/python/python.go @@ -15,10 +15,8 @@ func (p *PythonInspector) Inspect(proc *process.Details) (common.ProgramLanguage var programLanguageDetails common.ProgramLanguageDetails if strings.Contains(proc.ExeName, pythonProcessName) || strings.Contains(proc.CmdLine, pythonProcessName) { programLanguageDetails.Language = common.PythonProgrammingLanguage - if proc.Environments != nil { - if value, exists := proc.Environments.DetailedEnvs[process.PythonVersionConst]; exists { - programLanguageDetails.RuntimeVersion = value - } + if value, exists := proc.GetDetailedEnvsValue(process.PythonVersionConst); exists { + programLanguageDetails.RuntimeVersion = value } return programLanguageDetails, true diff --git a/procdiscovery/pkg/process/process.go b/procdiscovery/pkg/process/process.go index 6f1b4a440..95184e874 100644 --- a/procdiscovery/pkg/process/process.go +++ b/procdiscovery/pkg/process/process.go @@ -21,7 +21,7 @@ type Details struct { ProcessID int ExeName string CmdLine string - Environments *ProcessEnvs + Environments ProcessEnvs } type ProcessEnvs struct { @@ -30,6 +30,16 @@ type ProcessEnvs struct { OverwriteEnvs map[string]string } +func (d *Details) GetDetailedEnvsValue(key string) (string, bool) { + value, exists := d.Environments.DetailedEnvs[key] + return value, exists +} + +func (d *Details) GetOverwriteEnvsValue(key string) (string, bool) { + value, exists := d.Environments.OverwriteEnvs[key] + return value, exists +} + // Find all processes in the system. // The function accepts a predicate function that can be used to filter the results. func FindAllProcesses(predicate func(string) bool) ([]Details, error) { @@ -107,13 +117,13 @@ func getCommandLine(pid int) string { } } -func getRelevantEnvVars(pid int) *ProcessEnvs { +func getRelevantEnvVars(pid int) ProcessEnvs { envFileName := fmt.Sprintf("/proc/%d/environ", pid) fileContent, err := os.ReadFile(envFileName) if err != nil { // TODO: if we fail to read the environment variables, we should probably return an error // which will cause the process to be skipped and not instrumented? - return nil + return ProcessEnvs{} } r := bufio.NewReader(strings.NewReader(string(fileContent))) @@ -134,7 +144,7 @@ func getRelevantEnvVars(pid int) *ProcessEnvs { if err == io.EOF { break } else if err != nil { - return nil + return ProcessEnvs{} } str = strings.TrimRight(str, "\x00") @@ -154,7 +164,7 @@ func getRelevantEnvVars(pid int) *ProcessEnvs { } - envs := &ProcessEnvs{ + envs := ProcessEnvs{ OverwriteEnvs: overWriteEnvsResult, DetailedEnvs: detailedEnvsResult, } From 0e8f27f1bd947e8bb430d0b739f9c1e3ec636297 Mon Sep 17 00:00:00 2001 From: yodigos Date: Sun, 11 Aug 2024 15:18:56 +0300 Subject: [PATCH 14/15] Fix nil problems --- tests/e2e/helm-chart/assert-runtime-detected.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/e2e/helm-chart/assert-runtime-detected.yaml b/tests/e2e/helm-chart/assert-runtime-detected.yaml index f0894f78a..dfc26e8a2 100644 --- a/tests/e2e/helm-chart/assert-runtime-detected.yaml +++ b/tests/e2e/helm-chart/assert-runtime-detected.yaml @@ -13,6 +13,7 @@ spec: runtimeDetails: - containerName: coupon language: javascript + runtimeVersion: 18.3.0 --- apiVersion: odigos.io/v1alpha1 kind: InstrumentedApplication @@ -29,6 +30,7 @@ spec: runtimeDetails: - containerName: frontend language: java + runtimeVersion: jdk-17.0.11+9 --- apiVersion: odigos.io/v1alpha1 kind: InstrumentedApplication @@ -45,6 +47,7 @@ spec: runtimeDetails: - containerName: inventory language: python + runtimeVersion: 3.11.9 --- apiVersion: odigos.io/v1alpha1 kind: InstrumentedApplication @@ -61,6 +64,7 @@ spec: runtimeDetails: - containerName: membership language: go + runtimeVersion: go1.21.4 --- apiVersion: odigos.io/v1alpha1 kind: InstrumentedApplication From 97a649abe2ea41114acb8aa07ed0a8e74dace5d7 Mon Sep 17 00:00:00 2001 From: yodigos Date: Sun, 11 Aug 2024 15:46:38 +0300 Subject: [PATCH 15/15] Fix nil problems --- helm/odigos/templates/crds/instrumentedapplications.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/helm/odigos/templates/crds/instrumentedapplications.yaml b/helm/odigos/templates/crds/instrumentedapplications.yaml index 626f00e6d..fe1a215eb 100644 --- a/helm/odigos/templates/crds/instrumentedapplications.yaml +++ b/helm/odigos/templates/crds/instrumentedapplications.yaml @@ -112,6 +112,8 @@ spec: - unknown - ignored type: string + runtimeVersion: + type: string required: - containerName - language