From a98b7e25d009db7e08ebbf189d2b0ab8cb058e24 Mon Sep 17 00:00:00 2001 From: Pedro Nasser Date: Mon, 12 Sep 2016 11:46:21 -0300 Subject: [PATCH] metric logger --- api/runner/metrics.go | 31 ++++++++++++++----------------- api/runner/runner.go | 23 +++++++++++++++-------- api/runner/runner_test.go | 4 ++-- api/server/helpers.go | 2 +- main.go | 3 ++- 5 files changed, 34 insertions(+), 29 deletions(-) diff --git a/api/runner/metrics.go b/api/runner/metrics.go index 2d34a65bb..72fadd0a5 100644 --- a/api/runner/metrics.go +++ b/api/runner/metrics.go @@ -1,27 +1,24 @@ package runner import ( - "time" - "github.com/Sirupsen/logrus" titancommon "github.com/iron-io/titan/common" "golang.org/x/net/context" ) -func LogMetric(ctx context.Context, name string, metricType string, value interface{}) { +type Logger interface { + Log(context.Context, map[string]interface{}) +} + +type Metric map[string]interface{} + +func NewMetricLogger() *MetricLogger { + return &MetricLogger{} +} + +type MetricLogger struct{} + +func (l *MetricLogger) Log(ctx context.Context, metric map[string]interface{}) { log := titancommon.Logger(ctx) - log.WithFields(logrus.Fields{ - "metric": name, "type": metricType, "value": value}).Info() -} - -func LogMetricGauge(ctx context.Context, name string, value int) { - LogMetric(ctx, name, "gauge", value) -} - -func LogMetricCount(ctx context.Context, name string, value int) { - LogMetric(ctx, name, "count", value) -} - -func LogMetricTime(ctx context.Context, name string, time time.Duration) { - LogMetric(ctx, name, "time", time) + log.WithFields(logrus.Fields(metric)).Info() } diff --git a/api/runner/runner.go b/api/runner/runner.go index 5030f3f46..b79257d89 100644 --- a/api/runner/runner.go +++ b/api/runner/runner.go @@ -36,6 +36,7 @@ type Config struct { type Runner struct { driver drivers.Driver taskQueue chan *containerTask + ml Logger } var ( @@ -45,7 +46,7 @@ var ( WaitMemoryTimeout = 10 * time.Second ) -func New() (*Runner, error) { +func New(metricLogger Logger) (*Runner, error) { // TODO: Is this really required for Titan's driver? // Can we remove it? env := common.NewEnvironment(func(e *common.Environment) {}) @@ -59,6 +60,7 @@ func New() (*Runner, error) { r := &Runner{ driver: driver, taskQueue: make(chan *containerTask, 100), + ml: metricLogger, } go r.queueHandler() @@ -93,11 +95,11 @@ func (r *Runner) queueHandler() { } metricBaseName := fmt.Sprintf("run.%s.", task.cfg.AppName) - LogMetricTime(task.ctx, (metricBaseName + "waittime"), waitTime) + r.ml.Log(task.ctx, Metric{"name": (metricBaseName + "waittime"), "type": "time", "value": waitTime}) if timedOut { // Send to a signal to this task saying it cannot run - LogMetricCount(task.ctx, (metricBaseName + "timeout"), 1) + r.ml.Log(task.ctx, Metric{"name": (metricBaseName + "timeout"), "type": "count", "value": 1}) task.canRun <- false continue } @@ -118,7 +120,7 @@ func (r *Runner) Run(ctx context.Context, cfg *Config) (drivers.RunResult, error } metricBaseName := fmt.Sprintf("run.%s.", cfg.AppName) - LogMetricCount(ctx, (metricBaseName + "requests"), 1) + r.ml.Log(ctx, Metric{"name": (metricBaseName + "requests"), "type": "count", "value": 1}) closer, err := r.driver.Prepare(ctx, ctask) if err != nil { @@ -133,7 +135,7 @@ func (r *Runner) Run(ctx context.Context, cfg *Config) (drivers.RunResult, error case r.taskQueue <- ctask: default: // If queue is full, return error - LogMetricCount(ctx, "queue.full", 1) + r.ml.Log(ctx, Metric{"name": "queue.full", "type": "count", "value": 1}) return nil, ErrFullQueue } @@ -142,6 +144,8 @@ func (r *Runner) Run(ctx context.Context, cfg *Config) (drivers.RunResult, error // This task timed out, not available memory return nil, ErrTimeOutNoMemory } + } else { + r.ml.Log(ctx, Metric{"name": (metricBaseName + "waittime"), "type": "time", "value": 0}) } metricStart := time.Now() @@ -151,13 +155,13 @@ func (r *Runner) Run(ctx context.Context, cfg *Config) (drivers.RunResult, error } if result.Status() == "success" { - LogMetricCount(ctx, (metricBaseName + "succeeded"), 1) + r.ml.Log(ctx, Metric{"name": (metricBaseName + "succeeded"), "type": "count", "value": 1}) } else { - LogMetricCount(ctx, (metricBaseName + "error"), 1) + r.ml.Log(ctx, Metric{"name": (metricBaseName + "error"), "type": "count", "value": 1}) } metricElapsed := time.Since(metricStart) - LogMetricTime(ctx, (metricBaseName + "time"), metricElapsed) + r.ml.Log(ctx, Metric{"name": (metricBaseName + "time"), "type": "time", "value": metricElapsed}) return result, nil } @@ -188,6 +192,9 @@ func selectDriver(driver string, env *common.Environment, conf *driverscommon.Co func dynamicSizing(reqMem uint64) int { const tooBig = 322122547200 // #300GB or 0, biggest aws instance is 244GB + if reqMem == 0 { + reqMem = 128 + } availableMemory, err := checkCgroup() if err != nil { diff --git a/api/runner/runner_test.go b/api/runner/runner_test.go index 6f47df260..45b9858e6 100644 --- a/api/runner/runner_test.go +++ b/api/runner/runner_test.go @@ -11,7 +11,7 @@ import ( ) func TestRunnerHello(t *testing.T) { - runner, err := New() + runner, err := New(NewMetricLogger()) if err != nil { t.Fatalf("Test error during New() - %s", err) } @@ -60,7 +60,7 @@ func TestRunnerHello(t *testing.T) { } func TestRunnerError(t *testing.T) { - runner, err := New() + runner, err := New(NewMetricLogger()) if err != nil { t.Fatalf("Test error during New() - %s", err) } diff --git a/api/server/helpers.go b/api/server/helpers.go index 561c6f9a1..863f4748b 100644 --- a/api/server/helpers.go +++ b/api/server/helpers.go @@ -49,7 +49,7 @@ func testRouter() *gin.Engine { } func testRunner(t *testing.T) *runner.Runner { - r, err := runner.New() + r, err := runner.New(runner.NewMetricLogger()) if err != nil { t.Fatal("Test: failed to create new runner") } diff --git a/main.go b/main.go index 3969aee38..f396ff858 100644 --- a/main.go +++ b/main.go @@ -20,7 +20,8 @@ func main() { log.WithError(err).Fatalln("Invalid DB url.") } - runner, err := runner.New() + metricLogger := runner.NewMetricLogger() + runner, err := runner.New(metricLogger) if err != nil { log.WithError(err).Fatalln("Failed to create a runner") }