metric logger

This commit is contained in:
Pedro Nasser
2016-09-12 11:46:21 -03:00
parent 86b0ab3c9f
commit a98b7e25d0
5 changed files with 34 additions and 29 deletions

View File

@@ -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()
}

View File

@@ -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 {

View File

@@ -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)
}

View File

@@ -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")
}