func (e *Executor) LaunchTask(driver executor.ExecutorDriver, task *mesos.TaskInfo) { Logger.Infof("[LaunchTask] %s", task) Config.Read(task) serializer := e.serializer(Config.Transform) producer, err := e.newProducer(serializer) //create producer before sending the running status if err != nil { Logger.Errorf("Failed to create producer: %s", err) os.Exit(1) } runStatus := &mesos.TaskStatus{ TaskId: task.GetTaskId(), State: mesos.TaskState_TASK_RUNNING.Enum(), } if _, err := driver.SendStatusUpdate(runStatus); err != nil { Logger.Errorf("Failed to send status update: %s", runStatus) os.Exit(1) //TODO not sure if we should exit in this case, but probably yes } go func() { //TODO configs should come from scheduler e.reporter = NewMetricsReporter(task.GetSlaveId().GetValue(), e.slaveInfo.GetHostname(), e.slaveInfo.GetPort(), Config.ReportingInterval, producer, Config.Topic, Config.Transform) e.reporter.Start() // finish task Logger.Infof("Finishing task %s", task.GetName()) finStatus := &mesos.TaskStatus{ TaskId: task.GetTaskId(), State: mesos.TaskState_TASK_FINISHED.Enum(), } if _, err := driver.SendStatusUpdate(finStatus); err != nil { Logger.Errorf("Failed to send status update: %s", finStatus) os.Exit(1) } Logger.Infof("Task %s has finished", task.GetName()) }() }