@@ -4,6 +4,7 @@ import com.sun.net.httpserver.HttpServer
44import mu.KotlinLogging
55import org.strykeforce.healthcheck.HealthCheckCommand
66import java.io.OutputStream
7+ import java.lang.Exception
78import java.net.InetSocketAddress
89
910private val logger = KotlinLogging .logger {}
@@ -26,14 +27,21 @@ class ReportServer(private val healthCheck: RobotHealthCheck) {
2627 }
2728
2829 createContext(" /data" ) { httpExchange ->
29- val jsonVisitor = JsonVisitor ()
30- jsonVisitor.visit(healthCheck)
3130
3231 httpExchange.responseHeaders.let { headers ->
3332 headers[" Content-Type" ] = " application/json"
3433 }
3534 httpExchange.sendResponseHeaders(200 , 0 )
36- httpExchange.responseBody.use { jsonVisitor.sendHealthCheck(it) }
35+
36+ httpExchange.responseBody.use {
37+ try {
38+ val jsonVisitor = JsonVisitor (it)
39+ jsonVisitor.visit(healthCheck)
40+ } catch (e: Exception ) {
41+ logger.error(e) { " error creating healthcheck JSON report" }
42+ }
43+ }
44+
3745 }
3846
3947 start()
@@ -43,7 +51,9 @@ class ReportServer(private val healthCheck: RobotHealthCheck) {
4351
4452}
4553
46- class JsonVisitor : HealthCheckVisitor {
54+ class JsonVisitor (outputStream : OutputStream ) : HealthCheckVisitor {
55+
56+ private val writer = outputStream.bufferedWriter()
4757
4858 private val meta = mapOf (
4959 " case" to StringBuilder (),
@@ -55,27 +65,26 @@ class JsonVisitor : HealthCheckVisitor {
5565 " duration" to StringBuilder (),
5666 )
5767
58- private val data = mutableMapOf (
59- " msec_elapsed" to StringBuilder (),
60- " talon" to StringBuilder (),
61- " case" to StringBuilder (),
62- " voltage" to StringBuilder (),
63- " position" to StringBuilder (),
64- " speed" to StringBuilder (),
65- " supply_current" to StringBuilder (),
66- " stator_current" to StringBuilder (),
67- )
6868
6969 private var name = " "
7070
7171 private var metaIndex = 0
7272 private var index = 0
73+ private var isFirst = true
74+
7375 override fun visit (healthCheck : RobotHealthCheck ) {
76+ writer.write(" {\" data\" :[" )
7477 healthCheck.healthChecks.forEach { it.accept(this ) }
7578
76- // remove trailing commas, grr json
7779 meta.values.forEach { it.deleteCharAt(it.lastIndex) }
78- data.values.forEach { it.deleteCharAt(it.lastIndex) }
80+
81+ writer.write(" ],\" meta\" :{" )
82+ for ((i, key) in meta.keys.withIndex()) {
83+ writer.write(" \" $key \" :{${meta[key]} }" )
84+ if (i < meta.size - 1 ) writer.write(" ," )
85+ }
86+ writer.write(" }}" )
87+ writer.flush()
7988 }
8089
8190 override fun visit (healthCheck : SubsystemHealthCheck ) {
@@ -99,6 +108,17 @@ class JsonVisitor : HealthCheckVisitor {
99108 meta.getValue(" duration" ).append(" \" ${metaIndex} \" :${healthCheck.duration} ," )
100109 metaIndex++
101110
111+ val data = mapOf (
112+ " msec_elapsed" to StringBuilder (),
113+ " talon" to StringBuilder (),
114+ " case" to StringBuilder (),
115+ " voltage" to StringBuilder (),
116+ " position" to StringBuilder (),
117+ " speed" to StringBuilder (),
118+ " supply_current" to StringBuilder (),
119+ " stator_current" to StringBuilder (),
120+ )
121+
102122 healthCheck.data.forEach { healthCheckData ->
103123 healthCheckData.timestamp.forEachIndexed { i, v ->
104124 data.getValue(" msec_elapsed" ).append(" \" ${index + i} \" :$v ," )
@@ -112,24 +132,20 @@ class JsonVisitor : HealthCheckVisitor {
112132 }
113133 index + = healthCheckData.timestamp.size
114134 }
115- }
116-
117- fun sendHealthCheck (os : OutputStream ) {
118- val writer = os.writer()
119135
120- writer.write(" {\" meta\" :{" )
121- for ((i, key) in meta.keys.withIndex()) {
122- writer.write(" \" $key \" :{${meta[key]} }" )
123- if (i < meta.size - 1 ) writer.write(" ," )
136+ data.values.forEach { if (it.lastIndex > 0 ) it.deleteCharAt(it.lastIndex) }
137+ if (isFirst) {
138+ writer.write(" {" )
139+ isFirst = false
140+ } else {
141+ writer.write(" ,{" )
124142 }
125143
126- writer.write(" },\" data\" :{" )
127144 for ((i, key) in data.keys.withIndex()) {
128145 writer.write(" \" $key \" :{${data[key]} }" )
129146 if (i < data.size - 1 ) writer.write(" ," )
130147 }
131-
132- writer.write(" }}" )
133- writer.flush()
148+ writer.write(" }" )
134149 }
150+
135151}
0 commit comments