2
2
3
3
use anyhow:: Result ;
4
4
use ctor:: dtor;
5
- use integration_test_runner:: logs_asserter:: { read_logs_from_json, LogsAsserter } ;
6
5
use integration_test_runner:: test_utils;
7
6
use opentelemetry_otlp:: LogExporter ;
8
7
use opentelemetry_sdk:: logs:: LoggerProvider ;
9
8
use opentelemetry_sdk:: { logs as sdklogs, Resource } ;
10
9
use std:: fs:: File ;
11
- use std:: os :: unix :: fs :: MetadataExt ;
10
+ use std:: io :: Read ;
12
11
13
12
fn init_logs ( ) -> Result < sdklogs:: LoggerProvider > {
14
13
let exporter_builder = LogExporter :: builder ( ) ;
@@ -36,12 +35,23 @@ fn init_logs() -> Result<sdklogs::LoggerProvider> {
36
35
37
36
#[ cfg( test) ]
38
37
mod 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
+
39
46
use super :: * ;
40
47
use integration_test_runner:: logs_asserter:: { read_logs_from_json, LogsAsserter } ;
48
+ use integration_test_runner:: test_utils;
49
+ use opentelemetry_appender_tracing:: layer;
41
50
use opentelemetry_appender_tracing:: layer:: OpenTelemetryTracingBridge ;
42
51
use std:: { fs:: File , time:: Duration } ;
43
52
use tracing:: info;
44
53
use tracing_subscriber:: layer:: SubscriberExt ;
54
+ use uuid:: Uuid ;
45
55
46
56
#[ test]
47
57
#[ should_panic( expected = "assertion `left == right` failed: body does not match" ) ]
@@ -68,41 +78,50 @@ mod logtests {
68
78
}
69
79
70
80
#[ 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
+ }
75
91
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
+ }
80
97
98
+ async fn logs_batch_tokio_helper ( ) -> Result < ( ) > {
81
99
use crate :: { assert_logs_results, init_logs} ;
82
100
test_utils:: start_collector_container ( ) . await ?;
83
101
84
102
let logger_provider = init_logs ( ) . unwrap ( ) ;
85
- let layer = layer :: OpenTelemetryTracingBridge :: new ( & logger_provider) ;
103
+ let layer = OpenTelemetryTracingBridge :: new ( & logger_provider) ;
86
104
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 ( ) ;
87
107
{
88
108
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 ) ;
90
110
}
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" ) ?;
98
111
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 ( ) ) ?;
99
115
Ok ( ( ) )
100
116
}
101
117
102
- #[ ignore = "TODO: [Fix Me] Failing on CI. Needs to be investigated and resolved." ]
103
118
#[ test]
104
119
#[ cfg( any( feature = "tonic-client" , feature = "reqwest-blocking-client" ) ) ]
105
120
pub fn logs_batch_non_tokio_main ( ) -> Result < ( ) > {
121
+ logs_batch_non_tokio_helper ( )
122
+ }
123
+
124
+ fn logs_batch_non_tokio_helper ( ) -> Result < ( ) > {
106
125
// Initialize the logger provider inside a tokio runtime
107
126
// as this allows tonic client to capture the runtime,
108
127
// but actual export occurs from the dedicated std::thread
@@ -113,29 +132,28 @@ mod logtests {
113
132
test_utils:: start_collector_container ( ) . await ?;
114
133
init_logs ( )
115
134
} ) ?;
116
-
117
- info ! ( "LoggerProvider created" ) ;
118
- let layer = OpenTelemetryTracingBridge :: new ( & logger_provider) ;
135
+ let layer = layer:: OpenTelemetryTracingBridge :: new ( & logger_provider) ;
119
136
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 ( ) ;
120
139
{
121
140
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 ) ;
123
142
}
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" ) ?;
127
143
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 ( ) ) ?;
128
147
Ok ( ( ) )
129
148
}
130
149
}
131
150
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) ) ;
139
157
Ok ( ( ) )
140
158
}
141
159
0 commit comments