22
33use anyhow:: Result ;
44use ctor:: dtor;
5- use integration_test_runner:: logs_asserter:: { read_logs_from_json, LogsAsserter } ;
65use integration_test_runner:: test_utils;
76use opentelemetry_otlp:: LogExporter ;
87use opentelemetry_sdk:: logs:: LoggerProvider ;
98use opentelemetry_sdk:: { logs as sdklogs, Resource } ;
109use std:: fs:: File ;
11- use std:: os :: unix :: fs :: MetadataExt ;
10+ use std:: io :: Read ;
1211
1312fn init_logs ( ) -> Result < sdklogs:: LoggerProvider > {
1413 let exporter_builder = LogExporter :: builder ( ) ;
@@ -36,12 +35,23 @@ fn init_logs() -> Result<sdklogs::LoggerProvider> {
3635
3736#[ cfg( test) ]
3837mod logtests {
38+ // TODO: The tests in this mod works like below: Emit a log with a UUID,
39+ // then read the logs from the file and check if the UUID is present in the
40+ // logs. This makes it easy to validate with a single collector and its
41+ // output. This is a very simple test but good enough to validate that OTLP
42+ // Exporter did work! A more comprehensive test would be to validate the
43+ // entire Payload. The infra for it already exists (logs_asserter.rs), the
44+ // TODO here is to write a test that validates the entire payload.
45+
3946 use super :: * ;
4047 use integration_test_runner:: logs_asserter:: { read_logs_from_json, LogsAsserter } ;
48+ use integration_test_runner:: test_utils;
49+ use opentelemetry_appender_tracing:: layer;
4150 use opentelemetry_appender_tracing:: layer:: OpenTelemetryTracingBridge ;
4251 use std:: { fs:: File , time:: Duration } ;
4352 use tracing:: info;
4453 use tracing_subscriber:: layer:: SubscriberExt ;
54+ use uuid:: Uuid ;
4555
4656 #[ test]
4757 #[ should_panic( expected = "assertion `left == right` failed: body does not match" ) ]
@@ -68,41 +78,50 @@ mod logtests {
6878 }
6979
7080 #[ tokio:: test( flavor = "multi_thread" , worker_threads = 4 ) ]
71- #[ cfg( not( feature = "hyper-client" ) ) ]
72- #[ cfg( not( feature = "reqwest-client" ) ) ]
73- pub async fn test_logs ( ) -> Result < ( ) > {
74- // Make sure the container is running
81+ #[ cfg( any( feature = "tonic-client" , feature = "reqwest-blocking-client" ) ) ]
82+ pub async fn logs_batch_tokio_multi_thread ( ) -> Result < ( ) > {
83+ logs_batch_tokio_helper ( ) . await
84+ }
85+
86+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
87+ #[ cfg( any( feature = "tonic-client" , feature = "reqwest-blocking-client" ) ) ]
88+ pub async fn logs_batch_tokio_multi_with_one_worker ( ) -> Result < ( ) > {
89+ logs_batch_tokio_helper ( ) . await
90+ }
7591
76- use integration_test_runner:: test_utils;
77- use opentelemetry_appender_tracing:: layer;
78- use tracing:: info;
79- use tracing_subscriber:: layer:: SubscriberExt ;
92+ #[ tokio:: test( flavor = "current_thread" ) ]
93+ #[ cfg( any( feature = "tonic-client" , feature = "reqwest-blocking-client" ) ) ]
94+ pub async fn logs_batch_tokio_current ( ) -> Result < ( ) > {
95+ logs_batch_tokio_helper ( ) . await
96+ }
8097
98+ async fn logs_batch_tokio_helper ( ) -> Result < ( ) > {
8199 use crate :: { assert_logs_results, init_logs} ;
82100 test_utils:: start_collector_container ( ) . await ?;
83101
84102 let logger_provider = init_logs ( ) . unwrap ( ) ;
85- let layer = layer :: OpenTelemetryTracingBridge :: new ( & logger_provider) ;
103+ let layer = OpenTelemetryTracingBridge :: new ( & logger_provider) ;
86104 let subscriber = tracing_subscriber:: registry ( ) . with ( layer) ;
105+ // generate a random uuid and store it to expected guid
106+ let expected_uuid = Uuid :: new_v4 ( ) . to_string ( ) ;
87107 {
88108 let _guard = tracing:: subscriber:: set_default ( subscriber) ;
89- info ! ( target: "my-target" , "hello from {}. My price is {}." , "banana" , 2.99 ) ;
109+ info ! ( target: "my-target" , uuid = expected_uuid , "hello from {}. My price is {}." , "banana" , 2.99 ) ;
90110 }
91- // TODO: remove below wait before calling logger_provider.shutdown()
92- // tokio::time::sleep(Duration::from_secs(10)).await;
93- let _ = logger_provider. shutdown ( ) ;
94-
95- tokio:: time:: sleep ( Duration :: from_secs ( 10 ) ) . await ;
96-
97- assert_logs_results ( test_utils:: LOGS_FILE , "expected/logs.json" ) ?;
98111
112+ let _ = logger_provider. shutdown ( ) ;
113+ tokio:: time:: sleep ( Duration :: from_secs ( 5 ) ) . await ;
114+ assert_logs_results ( test_utils:: LOGS_FILE , expected_uuid. as_str ( ) ) ?;
99115 Ok ( ( ) )
100116 }
101117
102- #[ ignore = "TODO: [Fix Me] Failing on CI. Needs to be investigated and resolved." ]
103118 #[ test]
104119 #[ cfg( any( feature = "tonic-client" , feature = "reqwest-blocking-client" ) ) ]
105120 pub fn logs_batch_non_tokio_main ( ) -> Result < ( ) > {
121+ logs_batch_non_tokio_helper ( )
122+ }
123+
124+ fn logs_batch_non_tokio_helper ( ) -> Result < ( ) > {
106125 // Initialize the logger provider inside a tokio runtime
107126 // as this allows tonic client to capture the runtime,
108127 // but actual export occurs from the dedicated std::thread
@@ -113,29 +132,28 @@ mod logtests {
113132 test_utils:: start_collector_container ( ) . await ?;
114133 init_logs ( )
115134 } ) ?;
116-
117- info ! ( "LoggerProvider created" ) ;
118- let layer = OpenTelemetryTracingBridge :: new ( & logger_provider) ;
135+ let layer = layer:: OpenTelemetryTracingBridge :: new ( & logger_provider) ;
119136 let subscriber = tracing_subscriber:: registry ( ) . with ( layer) ;
137+ // generate a random uuid and store it to expected guid
138+ let expected_uuid = Uuid :: new_v4 ( ) . to_string ( ) ;
120139 {
121140 let _guard = tracing:: subscriber:: set_default ( subscriber) ;
122- info ! ( target: "my-target" , "hello from {}. My price is {}." , "banana" , 2.99 ) ;
141+ info ! ( target: "my-target" , uuid = expected_uuid , "hello from {}. My price is {}." , "banana" , 2.99 ) ;
123142 }
124- let _ = logger_provider. shutdown ( ) ;
125- // tokio::time::sleep(Duration::from_secs(10)).await;
126- assert_logs_results ( test_utils:: LOGS_FILE , "expected/logs.json" ) ?;
127143
144+ let _ = logger_provider. shutdown ( ) ;
145+ std:: thread:: sleep ( Duration :: from_secs ( 5 ) ) ;
146+ assert_logs_results ( test_utils:: LOGS_FILE , expected_uuid. as_str ( ) ) ?;
128147 Ok ( ( ) )
129148 }
130149}
131150
132- pub fn assert_logs_results ( result : & str , expected : & str ) -> Result < ( ) > {
133- let left = read_logs_from_json ( File :: open ( expected) ?) ?;
134- let right = read_logs_from_json ( File :: open ( result) ?) ?;
135-
136- LogsAsserter :: new ( left, right) . assert ( ) ;
137-
138- assert ! ( File :: open( result) . unwrap( ) . metadata( ) . unwrap( ) . size( ) > 0 ) ;
151+ pub fn assert_logs_results ( result : & str , expected_content : & str ) -> Result < ( ) > {
152+ let file = File :: open ( result) ?;
153+ let mut contents = String :: new ( ) ;
154+ let mut reader = std:: io:: BufReader :: new ( & file) ;
155+ reader. read_to_string ( & mut contents) ?;
156+ assert ! ( contents. contains( expected_content) ) ;
139157 Ok ( ( ) )
140158}
141159
0 commit comments