1
1
import datadog.smoketest.AbstractServerSmokeTest
2
+ import datadog.trace.agent.test.utils.PortUtils
2
3
import okhttp3.Request
3
4
import org.openjdk.jmc.common.item.IItemCollection
4
5
import org.openjdk.jmc.common.item.ItemFilters
@@ -13,6 +14,10 @@ import java.nio.file.Files
13
14
import java.nio.file.Path
14
15
import java.nio.file.SimpleFileVisitor
15
16
import java.nio.file.attribute.BasicFileAttributes
17
+ import java.util.concurrent.CompletableFuture
18
+ import java.util.concurrent.Executors
19
+ import java.util.concurrent.TimeUnit
20
+ import java.util.concurrent.TimeoutException
16
21
import java.util.concurrent.atomic.AtomicInteger
17
22
import java.util.concurrent.locks.LockSupport
18
23
@@ -21,6 +26,9 @@ class SpringBootNativeInstrumentationTest extends AbstractServerSmokeTest {
21
26
@TempDir
22
27
def testJfrDir
23
28
29
+ @Shared
30
+ def statsdPort = PortUtils . randomOpenPort()
31
+
24
32
@Override
25
33
ProcessBuilder createProcessBuilder () {
26
34
String springNativeExecutable = System . getProperty(' datadog.smoketest.spring.native.executable' )
@@ -39,7 +47,10 @@ class SpringBootNativeInstrumentationTest extends AbstractServerSmokeTest {
39
47
' -Ddd.profiling.upload.period=1' ,
40
48
' -Ddd.profiling.start-force-first=true' ,
41
49
" -Ddd.profiling.debug.dump_path=${ testJfrDir} " ,
42
- " -Ddd.integration.spring-boot.enabled=true"
50
+ " -Ddd.integration.spring-boot.enabled=true" ,
51
+ " -Ddd.trace.debug=true" ,
52
+ " -Ddd.jmxfetch.statsd.port=${ statsdPort} " ,
53
+ " -Ddd.jmxfetch.start-delay=0" ,
43
54
])
44
55
ProcessBuilder processBuilder = new ProcessBuilder (command)
45
56
processBuilder. directory(new File (buildDirectory))
@@ -66,8 +77,18 @@ class SpringBootNativeInstrumentationTest extends AbstractServerSmokeTest {
66
77
super . isErrorLog(log) || log. contains(" ClassNotFoundException" )
67
78
}
68
79
80
+ def setupSpec () {
81
+ try {
82
+ processTestLogLines { it. contains(" JMXFetch config: " ) }
83
+ } catch (TimeoutException toe) {
84
+ throw new AssertionError (" 'JMXFetch config: ' not found in logs. Make sure it's enabled." , toe)
85
+ }
86
+ }
87
+
69
88
def " check native instrumentation" () {
70
89
setup :
90
+ CompletableFuture<String > udpMessage = receiveUdpMessage(statsdPort, 1000 )
91
+
71
92
String url = " http://localhost:${ httpPort} /hello"
72
93
73
94
when :
@@ -87,6 +108,8 @@ class SpringBootNativeInstrumentationTest extends AbstractServerSmokeTest {
87
108
LockSupport . parkNanos(1_000_000)
88
109
}
89
110
countJfrs() > 0
111
+
112
+ udpMessage. get(1 , TimeUnit . SECONDS ) contains " service:smoke-test-java-app,version:99,env:smoketest"
90
113
}
91
114
92
115
int countJfrs () {
@@ -115,4 +138,20 @@ class SpringBootNativeInstrumentationTest extends AbstractServerSmokeTest {
115
138
})
116
139
return jfrCount. get()
117
140
}
141
+
142
+ CompletableFuture<String > receiveUdpMessage (int port , int bufferSize ) {
143
+ def future = new CompletableFuture<String > ()
144
+ Executors . newSingleThreadExecutor(). submit {
145
+ try (DatagramSocket socket = new DatagramSocket (port)) {
146
+ byte [] buffer = new byte [bufferSize]
147
+ DatagramPacket packet = new DatagramPacket (buffer, buffer. length)
148
+ socket. receive(packet)
149
+ def received = new String (packet. data, 0 , packet. length)
150
+ future. complete(received)
151
+ } catch (Exception e) {
152
+ future. completeExceptionally(e)
153
+ }
154
+ }
155
+ return future
156
+ }
118
157
}
0 commit comments