in agent/src/main/kotlin/org/jetbrains/teamcity/sccache/SCCacheServer.kt [21:60]
fun reportStatistics(logger: BuildProgressLogger) {
// invoke 'sccache -s --stats-format json'
// parse json
// report statistics messages
val result = run(null, "--show-stats", "--stats-format", "json")
if (reportFailures(result, logger)) return
val statistics = ArrayList<BuildStatisticValue>()
try {
val json = Gson().fromJson(result.stdout, JsonObject::class.java)
val jsonStats = json.getAsJsonObject("stats")
for ((name, el) in jsonStats.entrySet()) {
if (el is JsonPrimitive) {
if (el.isNumber) {
statistics.add(BuildStatisticValue("sccache.${name}", el.asInt))
}
} else if (el is JsonObject) {
if (name.endsWith("_duration")) {
val secs = el.getAsJsonPrimitive("secs").asInt
val nanos = el.getAsJsonPrimitive("nanos").asInt
statistics.add(BuildStatisticValue("sccache.${name}_ms", secs * 1_000 + nanos / 1_000_000))
} else if (el.has("counts")) {
val counts = el.getAsJsonObject("counts")
// TODO: consider report separate languages
val sum = counts.entrySet().mapNotNull { it.value as? JsonPrimitive }.map { it.asInt }.sum()
statistics.add(BuildStatisticValue("sccache.${name}", sum))
}
}
}
} catch (e: Exception) {
logger.error("Failed to parse sccache json output")
logger.message("sccache output:\n" + result.stdout)
}
for (value in statistics) {
logger.message(value.asString())
}
}