in src/main/kotlin/com/uber/nanoscope/Nanoscope.kt [151:192]
fun openTrace(file: File, sampleFile : File, stateFile : File) {
val adapter = Moshi.Builder().add(KotlinJsonAdapterFactory()).build().adapter(OpenHandler.TraceEvent::class.java)
val events = sortedSetOf<OpenHandler.Event>()
var nanotraceFile = file
file.bufferedReader().use {
if (it.readLine().startsWith("[")) {
// This appears to be a Chrome trace file so convert to a Nanoscope trace file before opening.
nanotraceFile = createTempFile("nanoscope", ".txt")
file.useLines { lines ->
lines
.filter { it != "[" && it != "]" && "{}" !in it}
.map { adapter.fromJson(it)!! }
.filter { it.ph == "X" }
.forEach {
val startUs = it.ts.toDouble()
val endUs = startUs + it.dur!!.toDouble()
val start = startUs * 1000
val end = endUs * 1000
val duration = end - start
events.add(OpenHandler.Event(it.name, start, true, duration))
events.add(OpenHandler.Event(it.name, end, false, duration))
}
}
nanotraceFile.printWriter().use { out ->
var firstTimestamp: Long? = null
events.forEach {
var timestamp = it.timestamp.toLong()
if (firstTimestamp == null) {
firstTimestamp = timestamp
println("first timestamp: $firstTimestamp")
}
timestamp -= firstTimestamp!!
out.println(if (it.start) "$timestamp:+${it.name}" else "$timestamp:POP")
}
}
}
}
displayTrace(nanotraceFile, sampleFile, stateFile)
}