Bytes in and out can be counted by an enumeratee (ok, gunzip/inflate is applied to the request body before it goes to Play, but then no clients gzip/deflate request bodies that I'm aware of because it's impossible to know if the server supports it before you submit the request).  Netty dechunks, but this can be easily accounted for - calculate necessary digits to express chunk length in hex, then add that to the chunk length plus 4 for the CRLFs.  HTTP header length can be calculated accurately enough (might not account for possible additional spaces) from the header map.  Accurate timing yes (it may be very slightly later in recording the start of a request compared to the current impl, but then the current impl is also impacted by things such as GC pauses etc.  A request might come in, there's no guarantee as to when the selecting thread will notice, and there's no guarantee as to exactly when a worker thread will start working on it.  When we consider the request to have started is very arbitrary in this respect.)