Skip to content

Commit 57369c1

Browse files
authored
eval: support samples with message batches (#1730)
Update the compact batch format to support a V2 variant of the datapoint messages that includes samples.
1 parent bee62c2 commit 57369c1

File tree

3 files changed

+29
-2
lines changed

3 files changed

+29
-2
lines changed

atlas-eval/src/main/scala/com/netflix/atlas/eval/model/LwcMessages.scala

+23-1
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ object LwcMessages {
205205
private val Heartbeat = 5
206206
private val Event = 6
207207
private val SubscriptionV2 = 7
208+
private val DatapointV2 = 8
208209

209210
/**
210211
* Encode messages using Jackson's smile format into a ByteString.
@@ -262,7 +263,7 @@ object LwcMessages {
262263
gen.writeNumber(s.step)
263264
}
264265
gen.writeEndArray()
265-
case msg: LwcDatapoint =>
266+
case msg: LwcDatapoint if msg.samples.isEmpty =>
266267
gen.writeNumber(Datapoint)
267268
gen.writeNumber(msg.timestamp)
268269
gen.writeString(msg.id)
@@ -275,6 +276,20 @@ object LwcMessages {
275276
gen.writeString(v)
276277
}
277278
gen.writeNumber(msg.value)
279+
case msg: LwcDatapoint =>
280+
gen.writeNumber(DatapointV2)
281+
gen.writeNumber(msg.timestamp)
282+
gen.writeString(msg.id)
283+
// Should already be sorted, but convert if needed to ensure we can rely on
284+
// the order. It will be a noop if already a SortedTagMap.
285+
val tags = SortedTagMap(msg.tags)
286+
gen.writeNumber(tags.size)
287+
tags.foreachEntry { (k, v) =>
288+
gen.writeString(k)
289+
gen.writeString(v)
290+
}
291+
gen.writeNumber(msg.value)
292+
Json.encode(gen, msg.samples)
278293
case msg: LwcDiagnosticMessage =>
279294
gen.writeNumber(LwcDiagnostic)
280295
gen.writeString(msg.id)
@@ -355,6 +370,13 @@ object LwcMessages {
355370
val tags = parseTags(parser, parser.nextIntValue(0))
356371
val value = nextDouble(parser)
357372
builder += LwcDatapoint(timestamp, id, tags, value)
373+
case DatapointV2 =>
374+
val timestamp = parser.nextLongValue(-1L)
375+
val id = parser.nextTextValue()
376+
val tags = parseTags(parser, parser.nextIntValue(0))
377+
val value = nextDouble(parser)
378+
val samples = parseSamples(parser)
379+
builder += LwcDatapoint(timestamp, id, tags, value, samples)
358380
case LwcDiagnostic =>
359381
val id = parser.nextTextValue()
360382
val typeName = parser.nextTextValue()

atlas-eval/src/test/scala/com/netflix/atlas/eval/model/LwcMessagesSuite.scala

+5
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@ class LwcMessagesSuite extends FunSuite {
110110
val actual = LwcMessages.parse(Json.encode(input))
111111
val expected = input.copy(samples = Json.decode[List[List[JsonNode]]](Json.encode(samples)))
112112
assertEquals(actual, expected)
113+
114+
val encoded = LwcMessages.encodeBatch(List(input))
115+
val decoded = LwcMessages.parseBatch(encoded)
116+
assertEquals(decoded.size, 1)
117+
assertEquals(decoded.head, expected)
113118
}
114119

115120
test("datapoint, with samples empty") {

atlas-lwc-events/src/main/resources/reference.conf

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@ atlas.lwc.events {
2626
// Maximum size for a group by. Used to avoid OOM for group by with a high cardinality dimension.
2727
// If exceeded new groups will be dropped.
2828
max-groups = 10000
29-
}
29+
}

0 commit comments

Comments
 (0)