AppyDynamics and New Relic work by inserting an "agent" inside your Mendix app's JVM. It then has the ability to report information about the JVM to a central monitoring database.
A free option would be to use JMX to read data about your app. An app like VisualVM can connect to a running JVM and read basic stats. Then with a plugin it can also read "managed beans", which can provide info about the Mendix app. This article talks about creating/exposing those beans using the Core API, but actually I think a number of them were added in 7.16. So I think you'd get a lot out of the box by just hooking up VisualVM with the MBeans browser plugin to a Mendix app. (Disclaimer: I have not tested this myself!)
Another option to build a basic tool would be to pull the data exposed by the admin port: https://docs.mendix.com/refguide/monitoring-mendix-runtime. You could build a dashboard (with Mendix even) that hits those rest endpoints on demand or on a scheduled basis, and retrieves app statistics. I don't think you'd get quite as much data as using JMX, but it would be pretty easy to build.