On
onStageCompleted
you should have also the failures and the info on why it failed with StageInfo.failureReason()
Check on the standard event log JSON if the logger stored that event, if it also does not have it, then it means your listener might have an issue.
If you are not really seeing the StageCompleted event anywhere ( not even on the event log), it probably means the failure was more than just a regular error and it had a major error/crash that aborted the execution of that stage in a way that no StageCompleted was ever sent.
Also bear in mind that there are specific listeners for SQL execution with fail/success events: QueryExecutionListener .