private def encodeBatchImpl()

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