fun reportStatistics()

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())
        }
    }