Skip to content

Commit cd0c3ad

Browse files
authored
Refactor failed heartbeats log (#1273)
* Refactored the log type check * Wrong check - reversed * Added nil check * Added tests, and fixed nil error
1 parent 4dd2716 commit cd0c3ad

File tree

2 files changed

+56
-6
lines changed

2 files changed

+56
-6
lines changed

internal/internal_task_handlers.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,18 +1495,23 @@ func (i *cadenceInvoker) heartbeatAndScheduleNextRun(details []byte) error {
14951495
i.Unlock()
14961496

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

15071502
return err
15081503
}
15091504

1505+
func (i *cadenceInvoker) logFailedHeartBeat(err error) {
1506+
// If the error is a canceled error do not log, as this is expected.
1507+
var canceledErr *CanceledError
1508+
1509+
// We need to check for nil as errors.As returns false for nil. Which would cause us to log on nil.
1510+
if err != nil && !errors.As(err, &canceledErr) {
1511+
i.logger.Error("Failed to send heartbeat", zap.Error(err), zap.String(tagWorkflowType, i.workflowType), zap.String(tagActivityType, i.activityType))
1512+
}
1513+
}
1514+
15101515
func (i *cadenceInvoker) internalHeartBeat(details []byte) (bool, error) {
15111516
isActivityCancelled := false
15121517
timeout := time.Duration(i.heartBeatTimeoutInSec) * time.Second

internal/internal_task_handlers_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1381,6 +1381,51 @@ func (t *TaskHandlersTestSuite) TestHeartBeat_Interleaved() {
13811381
time.Sleep(1 * time.Second)
13821382
}
13831383

1384+
func (t *TaskHandlersTestSuite) TestHeartBeatLogNil() {
1385+
core, obs := observer.New(zap.ErrorLevel)
1386+
logger := zap.New(core)
1387+
1388+
cadenceInv := &cadenceInvoker{
1389+
identity: "Test_Cadence_Invoker",
1390+
logger: logger,
1391+
}
1392+
1393+
cadenceInv.logFailedHeartBeat(nil)
1394+
1395+
t.Empty(obs.All())
1396+
}
1397+
1398+
func (t *TaskHandlersTestSuite) TestHeartBeatLogCanceledError() {
1399+
core, obs := observer.New(zap.ErrorLevel)
1400+
logger := zap.New(core)
1401+
1402+
cadenceInv := &cadenceInvoker{
1403+
identity: "Test_Cadence_Invoker",
1404+
logger: logger,
1405+
}
1406+
1407+
var workflowCompleatedErr CanceledError
1408+
cadenceInv.logFailedHeartBeat(&workflowCompleatedErr)
1409+
1410+
t.Empty(obs.All())
1411+
}
1412+
1413+
func (t *TaskHandlersTestSuite) TestHeartBeatLogNotCanceled() {
1414+
core, obs := observer.New(zap.ErrorLevel)
1415+
logger := zap.New(core)
1416+
1417+
cadenceInv := &cadenceInvoker{
1418+
identity: "Test_Cadence_Invoker",
1419+
logger: logger,
1420+
}
1421+
1422+
var workflowCompleatedErr s.WorkflowExecutionAlreadyCompletedError
1423+
cadenceInv.logFailedHeartBeat(&workflowCompleatedErr)
1424+
1425+
t.Len(obs.All(), 1)
1426+
t.Equal("Failed to send heartbeat", obs.All()[0].Message)
1427+
}
1428+
13841429
func (t *TaskHandlersTestSuite) TestHeartBeat_NilResponseWithError() {
13851430
mockCtrl := gomock.NewController(t.T())
13861431
mockService := workflowservicetest.NewMockClient(mockCtrl)

0 commit comments

Comments
 (0)