Despite the existence of powerful formal languages for writing robot controllers, most existing functional modules are written using standard programming languages. The existence of such a code base raises critical challenges: 1. How to enable automated analysis, monitoring, and reuse of existing code given that reasoning directly about code fragments is impractical. 2. How to convey to users the expected level of performance of an autonomous robot? 3. Perhaps most crucial: how to quickly identify abnormal behavior of autonomous robots? This is a key impediment to the deployment of such platforms in open environments. We address these issues through the use of performance-level profiles (PLPs), a formal, yet intuitive, language for specifying the expected properties of functional modules, designed with the above aims in mind. PLPs are motivated by action specification languages, such as PDDL 2.1, but add novel elements important for robotic applications, such as update frequency, run-time statistics, progress measures, and trigger conditions, and take into account the different roles modules can play. PLPs have been used to support monitoring in two projects: an autonomous compact track loader, and a service robot. Additionally, we developed a number of tools for automated monitoring-code generation from PLPs.