Details of the connection are available through the script hooks and status output, which I'll describe below. QoS is something you need to set up on your host OS and possibly interface with via a script that OpenVPN calls for client connections. Besides the script hook, QoS has nothing to do with OpenVPN and everything to do with your OS configuration.
On disconnect, env-vars are set that, among other things, contain bandwidth transferred in both directions. What you do with this data is up to you, but for a basic user logging example, see a github project component of mine at
this link. What you choose to do with this value is up to you (you could add it to a total of data transferred for the month and do extra accounting, store it in a log, or a SQL database, or LDAP, etc. This is for you to script and figure out.)
Stats of connections that are live can be viewed through the management interface (see --management in the manpage) by sending a `status` command, or by looking at the logs openvpn generates when given a SIGUSR2 signal. You could use this if you require polling the bandwidth used before disconnection.
As for QoS, you should read the
LARTC Howto, and specifically their
section on QoS. If you want
each client to have their own QoS setup, you will need to use the --client-connect and --client-disconnect scripts to dynamically add and remove qdiscs and filters depending on what you require. Note that netfilter can also classify directly, which can be easier to write rules for than dealing with the tc-filters syntax; you can read about qdisc classification with netfilter in its documentation for the CLASSIFY target.
In the tc documentation, check out the htb qdisc (tc-htb(8) manpage) as such a setup might be what you're looking for to set up a tree of rate quotas. Besides calling relevant tc and possibly iptables commands, none of this has much to do with OpenVPN directly, so reference the LARTC docs for details managing this part of the setup.