@@ -2,6 +2,7 @@ package com.datadog.instrumentation.protobuf
2
2
3
3
import com.datadog.instrumentation.protobuf.generated.Message.MyMessage
4
4
import com.datadog.instrumentation.protobuf.generated.Message.OtherMessage
5
+ import com.datadog.instrumentation.protobuf.generated.Message.RecursiveMessage
5
6
import com.google.protobuf.InvalidProtocolBufferException
6
7
import datadog.trace.agent.test.AgentTestRunner
7
8
import datadog.trace.api.DDTags
@@ -16,17 +17,74 @@ class AbstractMessageInstrumentationTest extends AgentTestRunner {
16
17
return true
17
18
}
18
19
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" () {
21
21
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"
22
81
23
- void ' test extract protobuf schema on serialize & deserialize' () {
24
82
setup :
25
83
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()
30
88
when :
31
89
var bytes
32
90
runUnderTrace(" parent_serialize" ) {
@@ -81,12 +139,100 @@ class AbstractMessageInstrumentationTest extends AgentTestRunner {
81
139
}
82
140
}
83
141
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" () {
85
231
setup :
86
232
MyMessage message = MyMessage . newBuilder()
87
- .setId(" 1" )
88
- .setValue(" Hello from Protobuf!" )
89
- .build()
233
+ .setId(" 1" )
234
+ .setValue(" Hello from Protobuf!" )
235
+ .build()
90
236
when :
91
237
runUnderTrace(" parent_deserialize" ) {
92
238
AgentSpan span = activeSpan()
0 commit comments