diff --git a/internal/environment/nomad_environment.go b/internal/environment/nomad_environment.go index 68e4575..9eadd3b 100644 --- a/internal/environment/nomad_environment.go +++ b/internal/environment/nomad_environment.go @@ -36,8 +36,8 @@ func NewNomadEnvironment(apiClient nomad.ExecutorAPI, jobHCL string) (*NomadEnvi return nil, fmt.Errorf("error parsing Nomad job: %w", err) } - return &NomadEnvironment{apiClient, jobHCL, job, - storage.NewMonitoredLocalStorage[runner.Runner](monitoring.MeasurementIdleRunnerNomad, nil)}, nil + return &NomadEnvironment{apiClient, jobHCL, job, storage.NewMonitoredLocalStorage[runner.Runner]( + monitoring.MeasurementIdleRunnerNomad, runner.MonitorRunnersEnvironmentID)}, nil } func NewNomadEnvironmentFromRequest( diff --git a/internal/environment/nomad_manager.go b/internal/environment/nomad_manager.go index 8fc6895..b72b6c4 100644 --- a/internal/environment/nomad_manager.go +++ b/internal/environment/nomad_manager.go @@ -3,6 +3,7 @@ package environment import ( _ "embed" "fmt" + nomadApi "github.com/hashicorp/nomad/api" "github.com/hashicorp/nomad/nomad/structs" "github.com/openHPI/poseidon/internal/nomad" "github.com/openHPI/poseidon/internal/runner" @@ -139,18 +140,24 @@ func (m *NomadEnvironmentManager) Load() error { jobLogger.Info("Couldn't find config task group in job, skipping ...") continue } - environment := &NomadEnvironment{ - apiClient: m.api, - jobHCL: templateEnvironmentJobHCL, - job: job, - idleRunners: storage.NewMonitoredLocalStorage[runner.Runner](monitoring.MeasurementIdleRunnerNomad, nil), - } + environment := newNomadEnvironmetFromJob(job, m.api) m.runnerManager.StoreEnvironment(environment) jobLogger.Info("Successfully recovered environment") } return nil } +// newNomadEnvironmetFromJob creates a Nomad environment from the passed Nomad job definition. +func newNomadEnvironmetFromJob(job *nomadApi.Job, apiClient nomad.ExecutorAPI) *NomadEnvironment { + return &NomadEnvironment{ + apiClient: apiClient, + jobHCL: templateEnvironmentJobHCL, + job: job, + idleRunners: storage.NewMonitoredLocalStorage[runner.Runner]( + monitoring.MeasurementIdleRunnerNomad, runner.MonitorRunnersEnvironmentID), + } +} + // loadTemplateEnvironmentJobHCL loads the template environment job HCL from the given path. // If the path is empty, the embedded default file is used. func loadTemplateEnvironmentJobHCL(path string) error { @@ -178,12 +185,7 @@ func fetchEnvironment(id dto.EnvironmentID, apiClient nomad.ExecutorAPI) (runner continue } if id == environmentID { - fetchedEnvironment = &NomadEnvironment{ - apiClient: apiClient, - jobHCL: templateEnvironmentJobHCL, - job: job, - idleRunners: storage.NewMonitoredLocalStorage[runner.Runner](monitoring.MeasurementIdleRunnerNomad, nil), - } + fetchedEnvironment = newNomadEnvironmetFromJob(job, apiClient) } } return fetchedEnvironment, nil diff --git a/internal/environment/nomad_manager_test.go b/internal/environment/nomad_manager_test.go index 5d53711..d6252ed 100644 --- a/internal/environment/nomad_manager_test.go +++ b/internal/environment/nomad_manager_test.go @@ -260,7 +260,9 @@ func TestNomadEnvironmentManager_List(t *testing.T) { environments, err = m.List(true) assert.NoError(t, err) assert.Equal(t, 1, len(environments)) - assert.Equal(t, fetchedEnvironment, environments[0]) + nomadEnvironment, ok := environments[0].(*NomadEnvironment) + assert.True(t, ok) + assert.Equal(t, fetchedEnvironment.job, nomadEnvironment.job) }) } diff --git a/internal/runner/abstract_manager.go b/internal/runner/abstract_manager.go index dd29282..83a54f4 100644 --- a/internal/runner/abstract_manager.go +++ b/internal/runner/abstract_manager.go @@ -3,9 +3,11 @@ package runner import ( "errors" "fmt" + "github.com/influxdata/influxdb-client-go/v2/api/write" "github.com/openHPI/poseidon/pkg/dto" "github.com/openHPI/poseidon/pkg/monitoring" "github.com/openHPI/poseidon/pkg/storage" + "strconv" ) var ErrNullObject = errors.New("functionality not available for the null object") @@ -24,7 +26,14 @@ func NewAbstractManager() *AbstractManager { return &AbstractManager{ environments: storage.NewMonitoredLocalStorage[ExecutionEnvironment]( monitoring.MeasurementEnvironments, monitorEnvironmentData), - usedRunners: storage.NewMonitoredLocalStorage[Runner](monitoring.MeasurementUsedRunner, nil), + usedRunners: storage.NewMonitoredLocalStorage[Runner](monitoring.MeasurementUsedRunner, MonitorRunnersEnvironmentID), + } +} + +// MonitorRunnersEnvironmentID passes the id of the environment e into the monitoring Point p. +func MonitorRunnersEnvironmentID(p *write.Point, e Runner, isDeletion bool) { + if !isDeletion && e != nil { + p.AddTag(monitoring.InfluxKeyEnvironmentID, strconv.Itoa(int(e.Environment()))) } }