From 136f596dc2741a52fcc7a6acc004f7ff0aab26d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Pa=C3=9F?= <22845248+mpass99@users.noreply.github.com> Date: Sun, 3 Apr 2022 18:07:08 +0200 Subject: [PATCH] Add aws environments to the statistics but only with the field usedRunners. --- internal/environment/abstract_manager.go | 10 +++++++++- internal/environment/aws_environment.go | 9 +++++---- internal/environment/aws_manager.go | 4 ---- internal/environment/nomad_manager.go | 4 ---- internal/runner/abstract_manager.go | 12 +++++++++++- internal/runner/aws_manager.go | 19 +++++++++++++++++++ internal/runner/nomad_manager.go | 10 +--------- 7 files changed, 45 insertions(+), 23 deletions(-) diff --git a/internal/environment/abstract_manager.go b/internal/environment/abstract_manager.go index ab9e7e3..fb85998 100644 --- a/internal/environment/abstract_manager.go +++ b/internal/environment/abstract_manager.go @@ -59,5 +59,13 @@ func (n *AbstractManager) Delete(id dto.EnvironmentID) (bool, error) { } func (n *AbstractManager) Statistics() map[dto.EnvironmentID]*dto.StatisticalExecutionEnvironmentData { - return map[dto.EnvironmentID]*dto.StatisticalExecutionEnvironmentData{} + if n.runnerManager == nil { + return map[dto.EnvironmentID]*dto.StatisticalExecutionEnvironmentData{} + } + + statistics := n.NextHandler().Statistics() + for k, v := range n.runnerManager.EnvironmentStatistics() { + statistics[k] = v + } + return statistics } diff --git a/internal/environment/aws_environment.go b/internal/environment/aws_environment.go index 96402f8..823d232 100644 --- a/internal/environment/aws_environment.go +++ b/internal/environment/aws_environment.go @@ -59,6 +59,11 @@ func (a *AWSEnvironment) Sample() (r runner.Runner, ok bool) { // The following methods are not supported at this moment. +// IdleRunnerCount is not supported as we have no information about the AWS managed prewarming pool. +func (a *AWSEnvironment) IdleRunnerCount() int { + return 0 +} + // PrewarmingPoolSize is neither supported nor required. It is handled transparently by AWS. func (a *AWSEnvironment) PrewarmingPoolSize() uint { return 0 @@ -111,7 +116,3 @@ func (a *AWSEnvironment) AddRunner(_ runner.Runner) { func (a *AWSEnvironment) DeleteRunner(_ string) { panic("not supported") } - -func (a *AWSEnvironment) IdleRunnerCount() int { - panic("not supported") -} diff --git a/internal/environment/aws_manager.go b/internal/environment/aws_manager.go index c593339..856011e 100644 --- a/internal/environment/aws_manager.go +++ b/internal/environment/aws_manager.go @@ -67,7 +67,3 @@ func isAWSEnvironment(request dto.ExecutionEnvironmentRequest) bool { } return false } - -func (a *AWSEnvironmentManager) Statistics() map[dto.EnvironmentID]*dto.StatisticalExecutionEnvironmentData { - return a.NextHandler().Statistics() -} diff --git a/internal/environment/nomad_manager.go b/internal/environment/nomad_manager.go index 427781d..183942f 100644 --- a/internal/environment/nomad_manager.go +++ b/internal/environment/nomad_manager.go @@ -120,10 +120,6 @@ func (m *NomadEnvironmentManager) CreateOrUpdate(id dto.EnvironmentID, request d return !isExistingEnvironment, nil } -func (m *NomadEnvironmentManager) Statistics() map[dto.EnvironmentID]*dto.StatisticalExecutionEnvironmentData { - return m.runnerManager.EnvironmentStatistics() -} - func (m *NomadEnvironmentManager) Load() error { templateJobs, err := m.api.LoadEnvironmentJobs() if err != nil { diff --git a/internal/runner/abstract_manager.go b/internal/runner/abstract_manager.go index 2cc701d..2411c00 100644 --- a/internal/runner/abstract_manager.go +++ b/internal/runner/abstract_manager.go @@ -58,7 +58,17 @@ func (n *AbstractManager) DeleteEnvironment(id dto.EnvironmentID) { } func (n *AbstractManager) EnvironmentStatistics() map[dto.EnvironmentID]*dto.StatisticalExecutionEnvironmentData { - return map[dto.EnvironmentID]*dto.StatisticalExecutionEnvironmentData{} + environments := make(map[dto.EnvironmentID]*dto.StatisticalExecutionEnvironmentData) + for _, e := range n.environments.List() { + environments[e.ID()] = &dto.StatisticalExecutionEnvironmentData{ + ID: int(e.ID()), + PrewarmingPoolSize: e.PrewarmingPoolSize(), + IdleRunners: uint(e.IdleRunnerCount()), + UsedRunners: 0, + } + } + + return environments } func (n *AbstractManager) Claim(_ dto.EnvironmentID, _ int) (Runner, error) { diff --git a/internal/runner/aws_manager.go b/internal/runner/aws_manager.go index d7889a3..5487779 100644 --- a/internal/runner/aws_manager.go +++ b/internal/runner/aws_manager.go @@ -45,3 +45,22 @@ func (a AWSRunnerManager) Return(r Runner) error { } return nil } + +// EnvironmentStatistics returns only the used runner for each environment as the prewarming is handled +// by AWS transparently. +func (a AWSRunnerManager) EnvironmentStatistics() map[dto.EnvironmentID]*dto.StatisticalExecutionEnvironmentData { + environments := a.AbstractManager.EnvironmentStatistics() + + for _, r := range a.usedRunners.List() { + workload, isAWSRunner := r.(*AWSFunctionWorkload) + if !isAWSRunner { + log.WithField("workload", workload).Error("Stored runners must be AWS runner") + continue + } + + environmentID := workload.environment.ID() + environments[environmentID].UsedRunners++ + } + + return environments +} diff --git a/internal/runner/nomad_manager.go b/internal/runner/nomad_manager.go index 5deae89..e971d41 100644 --- a/internal/runner/nomad_manager.go +++ b/internal/runner/nomad_manager.go @@ -35,15 +35,7 @@ func NewNomadRunnerManager(apiClient nomad.ExecutorAPI, ctx context.Context) *No } func (m *NomadRunnerManager) EnvironmentStatistics() map[dto.EnvironmentID]*dto.StatisticalExecutionEnvironmentData { - environments := make(map[dto.EnvironmentID]*dto.StatisticalExecutionEnvironmentData) - for _, e := range m.environments.List() { - environments[e.ID()] = &dto.StatisticalExecutionEnvironmentData{ - ID: int(e.ID()), - PrewarmingPoolSize: e.PrewarmingPoolSize(), - IdleRunners: uint(e.IdleRunnerCount()), - UsedRunners: 0, - } - } + environments := m.AbstractManager.EnvironmentStatistics() for _, r := range m.usedRunners.List() { id, err := nomad.EnvironmentIDFromRunnerID(r.ID())