A fact probably won't help in this case since it seems to be something that's happening as the service get restarted during the Puppet run and a fact will only tell you what's happening at the start of the run.
What you may need to do is to change the timeout and restart values of your service statements to account for these anomalies. Your restart statements could call a wrapper script that restarts the service but waits in the background until enough resources are free and your timeout could be set sufficiently high that the service resource would have time to execute.
If you happen to not have anything dependent on this service restarting (which is usually the case), you could even fire the service statement off into the background with your wrapper script and allow the Puppet run to continue unabated.
This is one of those extremely sticky issues that seems to be particularly rife in Java-land.
Thanks,
Trevor