in server/src/main/scala/com/twitter/server/handler/ProfileResourceHandler.scala [18:51]
def apply(req: Request): Future[Response] = {
val uri = Uri.fromRequest(req)
val params = uri.params.foldLeft(Params(10.seconds, 100)) {
case (parameters, ("seconds", pauseVal)) =>
parameters.copy(pause = pauseVal.toInt.seconds)
case (parameters, ("hz", hz)) =>
parameters.copy(frequency = hz.toInt)
case (parameters, _) =>
parameters
}
log.info(
s"[${req.uri}] collecting CPU profile ($which) for ${params.pause} seconds at ${params.frequency}Hz"
)
CpuProfile.recordInThread(params.pause, params.frequency, which) transform {
case Return(prof) =>
// Write out the profile verbatim. It's a pprof "raw" profile.
val bos = new ByteArrayOutputStream
prof.writeGoogleProfile(bos)
newResponse(
contentType = "pprof/raw",
content = Buf.ByteArray.Owned(bos.toByteArray)
)
case Throw(exc) =>
newResponse(
status = Status.InternalServerError,
contentType = "text/plain;charset=UTF-8",
content = Buf.Utf8(exc.toString)
)
}
}