I cobbled this together to run on multiply servers via CMS. It is simpler and more trustworthy than alerts from monitoring-software.
--JobFailures.sql
SELECT
J.name,
H.FailedAt,
H.Message
FROM
msdb.dbo.sysjobs AS J
CROSS APPLY (
SELECT TOP(1)
FailedAt = msdb.dbo.agent_datetime(T.run_date, T.run_time),
Message = T.message
FROM
msdb.dbo.sysjobhistory AS T
WHERE
T.job_id = J.job_id
AND
T.run_status = 0 -- failed
AND
msdb.dbo.agent_datetime(T.run_date, T.run_time) > getdate()-1 -- in the last 24 hrs
-- msdb.dbo.agent_datetime(T.run_date, T.run_time) > getdate()-3 -- covering the weekend
ORDER BY
T.instance_id) H
Original code from here …
https://stackoverflow.com/questions/54215008/sql-agent-job-last-run-status