in atlas-eval/src/main/scala/com/netflix/atlas/eval/model/LwcMessages.scala [233:320]
private def encodeBatchImpl(msgs: Seq[AnyRef], out: OutputStream): Unit = {
try {
val gen = Json.newSmileGenerator(out)
try {
gen.writeStartArray()
msgs.foreach {
case msg: LwcExpression =>
gen.writeNumber(Expression)
gen.writeString(msg.expression)
if (msg.exprType != ExprType.TIME_SERIES)
gen.writeString(msg.exprType.name())
gen.writeNumber(msg.step)
case msg: LwcSubscription =>
gen.writeNumber(Subscription)
gen.writeString(msg.expression)
gen.writeStartArray()
msg.metrics.foreach { m =>
gen.writeString(m.id)
gen.writeString(m.expression)
gen.writeNumber(m.step)
}
gen.writeEndArray()
case msg: LwcSubscriptionV2 =>
gen.writeNumber(SubscriptionV2)
gen.writeString(msg.expression)
gen.writeString(msg.exprType.name())
gen.writeStartArray()
msg.subExprs.foreach { s =>
gen.writeString(s.id)
gen.writeString(s.expression)
gen.writeNumber(s.step)
}
gen.writeEndArray()
case msg: LwcDatapoint if msg.samples.isEmpty =>
gen.writeNumber(Datapoint)
gen.writeNumber(msg.timestamp)
gen.writeString(msg.id)
// Should already be sorted, but convert if needed to ensure we can rely on
// the order. It will be a noop if already a SortedTagMap.
val tags = SortedTagMap(msg.tags)
gen.writeNumber(tags.size)
tags.foreachEntry { (k, v) =>
gen.writeString(k)
gen.writeString(v)
}
gen.writeNumber(msg.value)
case msg: LwcDatapoint =>
gen.writeNumber(DatapointV2)
gen.writeNumber(msg.timestamp)
gen.writeString(msg.id)
// Should already be sorted, but convert if needed to ensure we can rely on
// the order. It will be a noop if already a SortedTagMap.
val tags = SortedTagMap(msg.tags)
gen.writeNumber(tags.size)
tags.foreachEntry { (k, v) =>
gen.writeString(k)
gen.writeString(v)
}
gen.writeNumber(msg.value)
Json.encode(gen, msg.samples)
case msg: LwcDiagnosticMessage =>
gen.writeNumber(LwcDiagnostic)
gen.writeString(msg.id)
gen.writeString(msg.message.typeName)
gen.writeString(msg.message.message)
case msg: DiagnosticMessage =>
gen.writeNumber(Diagnostic)
gen.writeString(msg.typeName)
gen.writeString(msg.message)
case msg: LwcHeartbeat =>
gen.writeNumber(Heartbeat)
gen.writeNumber(msg.timestamp)
gen.writeNumber(msg.step)
case msg: LwcEvent =>
gen.writeNumber(Event)
gen.writeString(msg.id)
mapper.writeTree(gen, msg.payload)
case msg =>
throw new MatchError(s"$msg")
}
gen.writeEndArray()
} finally {
gen.close()
}
} finally {
out.close()
}
}