def construct_end_message(self):
app_count = self.dfk.task_count<EOL>site_count = len([x for x in self.dfk.config.executors if x.managed])<EOL>app_fails = len([t for t in self.dfk.tasks if<EOL>self.dfk.tasks[t]['<STR_LIT:status>'] in FINAL_FAILURE_STATES])<EOL>message = {'<STR_LIT>': self.uuid,<EOL>'<STR_LIT:end>': time.time(),<EOL>'<STR_LIT>': app_count,<EOL>'<STR_LIT>': site_count,<EOL>'<STR_LIT>': None,<EOL>'<STR_LIT>': app_fails,<EOL>'<STR_LIT:test>': self.test_mode,<EOL>}<EOL>return json.dumps(message)<EOL>
Collect the final run information at the time of DFK cleanup.

        Returns:
             - Message dict dumped as json string, ready for UDP