Skip to content

Commit

Permalink
Refactor failed heartbeats log (#1273)
Browse files Browse the repository at this point in the history
* Refactored the log type check

* Wrong check - reversed

* Added nil check

* Added tests, and fixed nil error
  • Loading branch information
jakobht authored Sep 21, 2023
1 parent 4dd2716 commit cd0c3ad
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 6 deletions.
17 changes: 11 additions & 6 deletions internal/internal_task_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -1495,18 +1495,23 @@ func (i *cadenceInvoker) heartbeatAndScheduleNextRun(details []byte) error {
i.Unlock()

// Log the error outside the lock.
if err != nil {
// If the error is a canceled error do not log, as this is expected.
if _, ok := err.(*CanceledError); !ok {
i.logger.Error("Failed to send heartbeat", zap.Error(err), zap.String(tagWorkflowType, i.workflowType), zap.String(tagActivityType, i.activityType))
}
}
i.logFailedHeartBeat(err)
}()
}

return err
}

func (i *cadenceInvoker) logFailedHeartBeat(err error) {
// If the error is a canceled error do not log, as this is expected.
var canceledErr *CanceledError

// We need to check for nil as errors.As returns false for nil. Which would cause us to log on nil.
if err != nil && !errors.As(err, &canceledErr) {
i.logger.Error("Failed to send heartbeat", zap.Error(err), zap.String(tagWorkflowType, i.workflowType), zap.String(tagActivityType, i.activityType))
}
}

func (i *cadenceInvoker) internalHeartBeat(details []byte) (bool, error) {
isActivityCancelled := false
timeout := time.Duration(i.heartBeatTimeoutInSec) * time.Second
Expand Down
45 changes: 45 additions & 0 deletions internal/internal_task_handlers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1381,6 +1381,51 @@ func (t *TaskHandlersTestSuite) TestHeartBeat_Interleaved() {
time.Sleep(1 * time.Second)
}

func (t *TaskHandlersTestSuite) TestHeartBeatLogNil() {
core, obs := observer.New(zap.ErrorLevel)
logger := zap.New(core)

cadenceInv := &cadenceInvoker{
identity: "Test_Cadence_Invoker",
logger: logger,
}

cadenceInv.logFailedHeartBeat(nil)

t.Empty(obs.All())
}

func (t *TaskHandlersTestSuite) TestHeartBeatLogCanceledError() {
core, obs := observer.New(zap.ErrorLevel)
logger := zap.New(core)

cadenceInv := &cadenceInvoker{
identity: "Test_Cadence_Invoker",
logger: logger,
}

var workflowCompleatedErr CanceledError
cadenceInv.logFailedHeartBeat(&workflowCompleatedErr)

t.Empty(obs.All())
}

func (t *TaskHandlersTestSuite) TestHeartBeatLogNotCanceled() {
core, obs := observer.New(zap.ErrorLevel)
logger := zap.New(core)

cadenceInv := &cadenceInvoker{
identity: "Test_Cadence_Invoker",
logger: logger,
}

var workflowCompleatedErr s.WorkflowExecutionAlreadyCompletedError
cadenceInv.logFailedHeartBeat(&workflowCompleatedErr)

t.Len(obs.All(), 1)
t.Equal("Failed to send heartbeat", obs.All()[0].Message)
}

func (t *TaskHandlersTestSuite) TestHeartBeat_NilResponseWithError() {
mockCtrl := gomock.NewController(t.T())
mockService := workflowservicetest.NewMockClient(mockCtrl)
Expand Down

0 comments on commit cd0c3ad

Please sign in to comment.