@@ -2,6 +2,7 @@ package com.datadog.instrumentation.protobuf
22
33import com.datadog.instrumentation.protobuf.generated.Message.MyMessage
44import com.datadog.instrumentation.protobuf.generated.Message.OtherMessage
5+ import com.datadog.instrumentation.protobuf.generated.Message.RecursiveMessage
56import com.google.protobuf.InvalidProtocolBufferException
67import datadog.trace.agent.test.AgentTestRunner
78import datadog.trace.api.DDTags
@@ -16,17 +17,74 @@ class AbstractMessageInstrumentationTest extends AgentTestRunner {
1617 return true
1718 }
1819
19- String expectedSchema = " {\" components\" :{\" schemas\" :{\" com.datadog.instrumentation.protobuf.generated.MyMessage\" :{\" properties\" :{\" id\" :{\" extensions\" :{\" x-protobuf-number\" :\" 1\" },\" type\" :\" string\" },\" value\" :{\" extensions\" :{\" x-protobuf-number\" :\" 2\" },\" type\" :\" string\" },\" other_message\" :{\" extensions\" :{\" x-protobuf-number\" :\" 3\" },\" items\" :{\"\$ ref\" :\" #/components/schemas/com.datadog.instrumentation.protobuf.generated.OtherMessage\" },\" type\" :\" array\" }},\" type\" :\" object\" },\" com.datadog.instrumentation.protobuf.generated.OtherMessage\" :{\" properties\" :{\" name\" :{\" extensions\" :{\" x-protobuf-number\" :\" 1\" },\" type\" :\" string\" },\" age\" :{\" extensions\" :{\" x-protobuf-number\" :\" 2\" },\" format\" :\" int32\" ,\" type\" :\" integer\" }},\" type\" :\" object\" }}},\" openapi\" :\" 3.0.0\" }"
20- String expectedSchemaID = " 4690647329509494987"
20+ void " test extract protobuf schema on serialize & deserialize" () {
2121
22+ String expectedSchema = """ {
23+ "components":{
24+ "schemas":{
25+ "com.datadog.instrumentation.protobuf.generated.MyMessage":{
26+ "properties":{
27+ "id":{
28+ "extensions":{
29+ "x-protobuf-number":"1"
30+ },
31+ "type":"string"
32+ },
33+ "value":{
34+ "extensions":{
35+ "x-protobuf-number":"2"
36+ },
37+ "type":"string"
38+ },
39+ "other_message":{
40+ "extensions":{
41+ "x-protobuf-number":"3"
42+ },
43+ "items":{
44+ "\$ ref":"#/components/schemas/com.datadog.instrumentation.protobuf.generated.OtherMessage"
45+ },
46+ "type":"array"
47+ },
48+ "nested":{
49+ "\$ ref":"#/components/schemas/com.datadog.instrumentation.protobuf.generated.OtherMessage",
50+ "extensions":{
51+ "x-protobuf-number":"4"
52+ }
53+ }
54+ },
55+ "type":"object"
56+ },
57+ "com.datadog.instrumentation.protobuf.generated.OtherMessage":{
58+ "properties":{
59+ "name":{
60+ "extensions":{
61+ "x-protobuf-number":"1"
62+ },
63+ "type":"string"
64+ },
65+ "age":{
66+ "extensions":{
67+ "x-protobuf-number":"2"
68+ },
69+ "format":"int32",
70+ "type":"integer"
71+ }
72+ },
73+ "type":"object"
74+ }
75+ }
76+ },
77+ "openapi":"3.0.0"
78+ }"""
79+ expectedSchema = expectedSchema. replaceAll(" [ \n ]" , " " ) // the spaces are just here to make it readable
80+ String expectedSchemaID = " 2792908287829424040"
2281
23- void ' test extract protobuf schema on serialize & deserialize' () {
2482 setup :
2583 MyMessage message = MyMessage . newBuilder()
26- .setId(" 1" )
27- .setValue(" Hello from Protobuf!" )
28- .setNested(OtherMessage . newBuilder(). setName(" hello" ). setAge(10 ). build())
29- .build()
84+ .setId(" 1" )
85+ .setValue(" Hello from Protobuf!" )
86+ .setNested(OtherMessage . newBuilder(). setName(" hello" ). setAge(10 ). build())
87+ .build()
3088 when :
3189 var bytes
3290 runUnderTrace(" parent_serialize" ) {
@@ -81,12 +139,100 @@ class AbstractMessageInstrumentationTest extends AgentTestRunner {
81139 }
82140 }
83141
84- void ' test error when de-serializing' () {
142+ void " test extract protobuf schema with recursive message" () {
143+ String expectedSchema = """ {
144+ "components":{
145+ "schemas":{
146+ "com.datadog.instrumentation.protobuf.generated.RecursiveMessage":{
147+ "properties":{
148+ "value":{
149+ "extensions":{
150+ "x-protobuf-number":"1"
151+ },
152+ "format":"int32",
153+ "type":"integer"
154+ },
155+ "next":{
156+ "\$ ref":"#/components/schemas/com.datadog.instrumentation.protobuf.generated.RecursiveMessage",
157+ "extensions":{
158+ "x-protobuf-number":"2"
159+ }
160+ }
161+ },
162+ "type":"object"
163+ }
164+ }
165+ },
166+ "openapi":"3.0.0"
167+ }"""
168+ expectedSchema = expectedSchema. replaceAll(" [ \n ]" , " " ) // the spaces are just here to make it readable
169+ String expectedSchemaID = " 8377547842972884891"
170+
171+ setup :
172+ getTEST_DATA_STREAMS_MONITORING()
173+ RecursiveMessage message = RecursiveMessage . newBuilder()
174+ .setValue(12 )
175+ .build()
176+ when :
177+ byte [] bytes
178+ runUnderTrace(" parent_serialize" ) {
179+ AgentSpan span = activeSpan()
180+ span. setTag(DDTags . MANUAL_KEEP , true )
181+ bytes = message. toByteArray()
182+ }
183+ runUnderTrace(" parent_deserialize" ) {
184+ AgentSpan span = activeSpan()
185+ span. setTag(DDTags . MANUAL_KEEP , true )
186+ RecursiveMessage . parseFrom(bytes)
187+ }
188+ TEST_WRITER . waitForTraces(2 )
189+ then :
190+ assertTraces(2 , SORT_TRACES_BY_ID ) {
191+ trace(1 ) {
192+ span {
193+ hasServiceName()
194+ operationName " parent_serialize"
195+ resourceName " parent_serialize"
196+ errored false
197+ measured false
198+ tags {
199+ " $DDTags . SCHEMA_DEFINITION " expectedSchema
200+ " $DDTags . SCHEMA_WEIGHT " 1
201+ " $DDTags . SCHEMA_TYPE " " protobuf"
202+ " $DDTags . SCHEMA_NAME " " com.datadog.instrumentation.protobuf.generated.RecursiveMessage"
203+ " $DDTags . SCHEMA_OPERATION " " serialization"
204+ " $DDTags . SCHEMA_ID " expectedSchemaID
205+ defaultTags(false )
206+ }
207+ }
208+ }
209+ trace(1 ) {
210+ span {
211+ hasServiceName()
212+ operationName " parent_deserialize"
213+ resourceName " parent_deserialize"
214+ errored false
215+ measured false
216+ tags {
217+ " $DDTags . SCHEMA_DEFINITION " expectedSchema
218+ " $DDTags . SCHEMA_WEIGHT " 1
219+ " $DDTags . SCHEMA_TYPE " " protobuf"
220+ " $DDTags . SCHEMA_NAME " " com.datadog.instrumentation.protobuf.generated.RecursiveMessage"
221+ " $DDTags . SCHEMA_OPERATION " " deserialization"
222+ " $DDTags . SCHEMA_ID " expectedSchemaID
223+ defaultTags(false )
224+ }
225+ }
226+ }
227+ }
228+ }
229+
230+ void " test error when de-serializing" () {
85231 setup :
86232 MyMessage message = MyMessage . newBuilder()
87- .setId(" 1" )
88- .setValue(" Hello from Protobuf!" )
89- .build()
233+ .setId(" 1" )
234+ .setValue(" Hello from Protobuf!" )
235+ .build()
90236 when :
91237 runUnderTrace(" parent_deserialize" ) {
92238 AgentSpan span = activeSpan()
0 commit comments