77import io .micrometer .registry .otlp .OtlpMeterRegistry ;
88import io .opentelemetry .api .common .AttributeKey ;
99import io .opentelemetry .api .common .Attributes ;
10+ import io .opentelemetry .api .logs .Logger ;
1011import io .opentelemetry .api .trace .Span ;
1112import io .opentelemetry .api .trace .Tracer ;
13+ import io .opentelemetry .exporter .otlp .logs .OtlpGrpcLogRecordExporter ;
1214import io .opentelemetry .exporter .otlp .trace .OtlpGrpcSpanExporter ;
1315import io .opentelemetry .sdk .OpenTelemetrySdk ;
16+ import io .opentelemetry .sdk .logs .SdkLoggerProvider ;
17+ import io .opentelemetry .sdk .logs .export .SimpleLogRecordProcessor ;
1418import io .opentelemetry .sdk .resources .Resource ;
1519import io .opentelemetry .sdk .trace .SdkTracerProvider ;
1620import io .opentelemetry .sdk .trace .export .BatchSpanProcessor ;
1721import io .restassured .RestAssured ;
1822import io .restassured .response .Response ;
1923import org .awaitility .Awaitility ;
20- import org .junit .Test ;
24+ import org .junit .jupiter .api .AfterAll ;
25+ import org .junit .jupiter .api .BeforeAll ;
26+ import org .junit .jupiter .api .Test ;
2127import uk .org .webcompere .systemstubs .SystemStubs ;
2228
2329import java .time .Duration ;
2733
2834public class LgtmStackContainerTest {
2935
30- @ Test
31- public void shouldPublishMetricAndTrace () throws Exception {
32- try ( // container {
33- LgtmStackContainer lgtm = new LgtmStackContainer ("grafana/otel-lgtm:0.11.0" )
34- // }
35- ) {
36- lgtm .start ();
37-
38- String version = RestAssured
39- .get (String .format ("http://%s:%s/api/health" , lgtm .getHost (), lgtm .getMappedPort (3000 )))
40- .jsonPath ()
41- .get ("version" );
42- assertThat (version ).isEqualTo ("11.6.0" );
43-
44- generateTrace (lgtm );
45-
46- OtlpConfig otlpConfig = createOtlpConfig (lgtm );
47- MeterRegistry meterRegistry = SystemStubs
48- .withEnvironmentVariable ("OTEL_SERVICE_NAME" , "testcontainers" )
49- .execute (() -> new OtlpMeterRegistry (otlpConfig , Clock .SYSTEM ));
50- Counter .builder ("test.counter" ).register (meterRegistry ).increment (2 );
51-
52- Awaitility
53- .given ()
54- .pollInterval (Duration .ofSeconds (2 ))
55- .atMost (Duration .ofSeconds (5 ))
56- .ignoreExceptions ()
57- .untilAsserted (() -> {
58- Response response = RestAssured
59- .given ()
60- .queryParam ("query" , "test_counter_total{job=\" testcontainers\" }" )
61- .get (String .format ("%s/api/v1/query" , lgtm .getPrometheusHttpUrl ()))
62- .prettyPeek ()
63- .thenReturn ();
64- assertThat (response .getStatusCode ()).isEqualTo (200 );
65- assertThat (response .body ().jsonPath ().getList ("data.result[0].value" )).contains ("2" );
66- });
67-
68- Awaitility
69- .given ()
70- .pollInterval (Duration .ofSeconds (2 ))
71- .atMost (Duration .ofSeconds (5 ))
72- .ignoreExceptions ()
73- .untilAsserted (() -> {
74- Response response = RestAssured
75- .given ()
76- .get (String .format ("%s/api/search" , lgtm .getTempoUrl ()))
77- .prettyPeek ()
78- .thenReturn ();
79- assertThat (response .getStatusCode ()).isEqualTo (200 );
80- assertThat (response .body ().jsonPath ().getString ("traces[0].rootServiceName" ))
81- .isEqualTo ("test-service" );
82- });
83- }
84- }
36+ private static final LgtmStackContainer lgtm = new LgtmStackContainer ("grafana/otel-lgtm:0.11.1" );
37+
38+ private static OpenTelemetrySdk openTelemetry ;
8539
86- private void generateTrace (LgtmStackContainer lgtm ) {
87- OtlpGrpcSpanExporter exporter = OtlpGrpcSpanExporter
40+ @ BeforeAll
41+ static void setup () {
42+ lgtm .start ();
43+ OtlpGrpcSpanExporter spanExporter = OtlpGrpcSpanExporter
8844 .builder ()
8945 .setTimeout (Duration .ofSeconds (1 ))
90- .setEndpoint (lgtm .getOtlpGrpcUrl ())
46+ .setEndpoint (LgtmStackContainerTest .lgtm .getOtlpGrpcUrl ())
47+ .build ();
48+
49+ OtlpGrpcLogRecordExporter logExporter = OtlpGrpcLogRecordExporter
50+ .builder ()
51+ .setTimeout (Duration .ofSeconds (1 ))
52+ .setEndpoint (LgtmStackContainerTest .lgtm .getOtlpGrpcUrl ())
9153 .build ();
9254
9355 BatchSpanProcessor spanProcessor = BatchSpanProcessor
94- .builder (exporter )
56+ .builder (spanExporter )
9557 .setScheduleDelay (500 , TimeUnit .MILLISECONDS )
9658 .build ();
9759
@@ -101,13 +63,94 @@ private void generateTrace(LgtmStackContainer lgtm) {
10163 .setResource (Resource .create (Attributes .of (AttributeKey .stringKey ("service.name" ), "test-service" )))
10264 .build ();
10365
104- OpenTelemetrySdk openTelemetry = OpenTelemetrySdk .builder ().setTracerProvider (tracerProvider ).build ();
66+ SdkLoggerProvider loggerProvider = SdkLoggerProvider
67+ .builder ()
68+ .addLogRecordProcessor (SimpleLogRecordProcessor .create (logExporter ))
69+ .build ();
70+
71+ openTelemetry =
72+ OpenTelemetrySdk .builder ().setTracerProvider (tracerProvider ).setLoggerProvider (loggerProvider ).build ();
73+ }
74+
75+ @ AfterAll
76+ static void cleanup () {
77+ openTelemetry .shutdown ();
78+ lgtm .stop ();
79+ }
80+
81+ @ Test
82+ void shouldPublishMetric () throws Exception {
83+ String version = RestAssured
84+ .get (String .format ("http://%s:%s/api/health" , lgtm .getHost (), lgtm .getMappedPort (3000 )))
85+ .jsonPath ()
86+ .get ("version" );
87+ assertThat (version ).isEqualTo ("12.0.0" );
88+
89+ OtlpConfig otlpConfig = createOtlpConfig (lgtm );
90+ MeterRegistry meterRegistry = SystemStubs
91+ .withEnvironmentVariable ("OTEL_SERVICE_NAME" , "testcontainers" )
92+ .execute (() -> new OtlpMeterRegistry (otlpConfig , Clock .SYSTEM ));
93+ Counter .builder ("test.counter" ).register (meterRegistry ).increment (2 );
94+
95+ Awaitility
96+ .given ()
97+ .pollInterval (Duration .ofSeconds (2 ))
98+ .atMost (Duration .ofSeconds (5 ))
99+ .ignoreExceptions ()
100+ .untilAsserted (() -> {
101+ Response response = RestAssured
102+ .given ()
103+ .queryParam ("query" , "test_counter_total{job=\" testcontainers\" }" )
104+ .get (String .format ("%s/api/v1/query" , lgtm .getPrometheusHttpUrl ()))
105+ .prettyPeek ()
106+ .thenReturn ();
107+ assertThat (response .getStatusCode ()).isEqualTo (200 );
108+ assertThat (response .body ().jsonPath ().getList ("data.result[0].value" )).contains ("2" );
109+ });
110+ }
105111
112+ @ Test
113+ void shouldPublishLog () {
114+ Logger logger = openTelemetry .getSdkLoggerProvider ().loggerBuilder ("test" ).build ();
115+ logger .logRecordBuilder ().setBody ("Test log!" ).setAttribute (AttributeKey .stringKey ("job" ), "test-job" ).emit ();
116+
117+ Awaitility
118+ .given ()
119+ .pollInterval (Duration .ofSeconds (2 ))
120+ .atMost (Duration .ofSeconds (5 ))
121+ .ignoreExceptions ()
122+ .untilAsserted (() -> {
123+ Response response = RestAssured
124+ .given ()
125+ .queryParam ("query" , "{service_name=\" unknown_service:java\" }" )
126+ .get (String .format ("%s/loki/api/v1/query_range" , lgtm .getLokiUrl ()))
127+ .prettyPeek ()
128+ .thenReturn ();
129+ assertThat (response .getStatusCode ()).isEqualTo (200 );
130+ assertThat (response .body ().jsonPath ().getString ("data.result[0].values[0][1]" )).isEqualTo ("Test log!" );
131+ });
132+ }
133+
134+ @ Test
135+ void shouldPublishTrace () {
106136 Tracer tracer = openTelemetry .getTracer ("test" );
107137 Span span = tracer .spanBuilder ("test" ).startSpan ();
108138 span .end ();
109139
110- openTelemetry .shutdown ();
140+ Awaitility
141+ .given ()
142+ .pollInterval (Duration .ofSeconds (2 ))
143+ .atMost (Duration .ofSeconds (5 ))
144+ .ignoreExceptions ()
145+ .untilAsserted (() -> {
146+ Response response = RestAssured
147+ .given ()
148+ .get (String .format ("%s/api/search" , lgtm .getTempoUrl ()))
149+ .prettyPeek ()
150+ .thenReturn ();
151+ assertThat (response .getStatusCode ()).isEqualTo (200 );
152+ assertThat (response .body ().jsonPath ().getString ("traces[0].rootServiceName" )).isEqualTo ("test-service" );
153+ });
111154 }
112155
113156 private static OtlpConfig createOtlpConfig (LgtmStackContainer lgtm ) {
0 commit comments