@@ -158,20 +158,35 @@ class OtlpHttpLogRecordExporterTestPeer : public ::testing::Test
158158 auto no_send_client = std::static_pointer_cast<http_client::nosend::HttpClient>(client);
159159 auto mock_session =
160160 std::static_pointer_cast<http_client::nosend::Session>(no_send_client->session_ );
161+ auto received_record_counter = 0 ;
161162 EXPECT_CALL (*mock_session, SendRequest)
162- .WillOnce (
163- [&mock_session, report_trace_id, report_span_id](
163+ .WillRepeatedly (
164+ [&mock_session, report_trace_id, report_span_id, &received_record_counter ](
164165 const std::shared_ptr<opentelemetry::ext::http::client::EventHandler> &callback) {
165166 auto check_json =
166167 nlohmann::json::parse (mock_session->GetRequest ()->body_ , nullptr , false );
167- auto resource_logs = *check_json[" resourceLogs" ].begin ();
168- auto scope_logs = *resource_logs[" scopeLogs" ].begin ();
168+ if (check_json[" resourceLogs" ].size () == 0 )
169+ {
170+ return ;
171+ }
172+ auto resource_logs = *check_json[" resourceLogs" ].begin ();
173+ if (resource_logs[" scopeLogs" ].size () == 0 )
174+ {
175+ return ;
176+ }
177+ auto scope_logs = *resource_logs[" scopeLogs" ].begin ();
178+ if (scope_logs[" logRecords" ].size () == 0 )
179+ {
180+ return ;
181+ }
169182 auto scope = scope_logs[" scope" ];
170183 auto log = *scope_logs[" logRecords" ].begin ();
171184 auto received_trace_id = log[" traceId" ].get <std::string>();
172185 auto received_span_id = log[" spanId" ].get <std::string>();
173- EXPECT_EQ (received_trace_id, report_trace_id);
174- EXPECT_EQ (received_span_id, report_span_id);
186+ if (received_trace_id == report_trace_id && received_span_id == report_span_id)
187+ {
188+ ++received_record_counter;
189+ }
175190 EXPECT_EQ (" Log message" , log[" body" ][" stringValue" ].get <std::string>());
176191 EXPECT_LE (15 , log[" attributes" ].size ());
177192 auto custom_header = mock_session->GetRequest ()->headers_ .find (" Custom-Header-Key" );
@@ -224,6 +239,9 @@ class OtlpHttpLogRecordExporterTestPeer : public ::testing::Test
224239 std::chrono::system_clock::now ());
225240
226241 provider->ForceFlush ();
242+
243+ // Exporting can be retried
244+ EXPECT_GE (received_record_counter, 1 );
227245 }
228246
229247# ifdef ENABLE_ASYNC_EXPORT
@@ -276,26 +294,41 @@ class OtlpHttpLogRecordExporterTestPeer : public ::testing::Test
276294 auto no_send_client = std::static_pointer_cast<http_client::nosend::HttpClient>(client);
277295 auto mock_session =
278296 std::static_pointer_cast<http_client::nosend::Session>(no_send_client->session_ );
297+ auto received_record_counter = 0 ;
279298 EXPECT_CALL (*mock_session, SendRequest)
280- .WillOnce (
281- [&mock_session, report_trace_id, report_span_id](
299+ .WillRepeatedly (
300+ [&mock_session, report_trace_id, report_span_id, &received_record_counter ](
282301 const std::shared_ptr<opentelemetry::ext::http::client::EventHandler> &callback) {
283302 auto check_json =
284303 nlohmann::json::parse (mock_session->GetRequest ()->body_ , nullptr , false );
285- auto resource_logs = *check_json[" resourceLogs" ].begin ();
286- auto scope_logs = *resource_logs[" scopeLogs" ].begin ();
304+ if (check_json[" resourceLogs" ].size () == 0 )
305+ {
306+ return ;
307+ }
308+ auto resource_logs = *check_json[" resourceLogs" ].begin ();
309+ if (resource_logs[" scopeLogs" ].size () == 0 )
310+ {
311+ return ;
312+ }
313+ auto scope_logs = *resource_logs[" scopeLogs" ].begin ();
314+ if (scope_logs[" logRecords" ].size () == 0 )
315+ {
316+ return ;
317+ }
287318 auto schema_url = scope_logs[" schemaUrl" ].get <std::string>();
288319 auto scope = scope_logs[" scope" ];
289320 auto scope_name = scope[" name" ];
290321 auto scope_version = scope[" version" ];
291322 auto log = *scope_logs[" logRecords" ].begin ();
292323 auto received_trace_id = log[" traceId" ].get <std::string>();
293324 auto received_span_id = log[" spanId" ].get <std::string>();
325+ if (received_trace_id == report_trace_id && received_span_id == report_span_id)
326+ {
327+ ++received_record_counter;
328+ }
294329 EXPECT_EQ (schema_url, " https://opentelemetry.io/schemas/1.2.0" );
295330 EXPECT_EQ (scope_name, " opentelelemtry_library" );
296331 EXPECT_EQ (scope_version, " 1.2.0" );
297- EXPECT_EQ (received_trace_id, report_trace_id);
298- EXPECT_EQ (received_span_id, report_span_id);
299332 EXPECT_EQ (" Log message" , log[" body" ][" stringValue" ].get <std::string>());
300333 EXPECT_LE (15 , log[" attributes" ].size ());
301334 auto custom_header = mock_session->GetRequest ()->headers_ .find (" Custom-Header-Key" );
@@ -353,6 +386,9 @@ class OtlpHttpLogRecordExporterTestPeer : public ::testing::Test
353386 std::chrono::system_clock::now ());
354387
355388 provider->ForceFlush ();
389+
390+ // Exporting can be retried
391+ EXPECT_GE (received_record_counter, 1 );
356392 }
357393# endif
358394
@@ -399,21 +435,31 @@ class OtlpHttpLogRecordExporterTestPeer : public ::testing::Test
399435 auto no_send_client = std::static_pointer_cast<http_client::nosend::HttpClient>(client);
400436 auto mock_session =
401437 std::static_pointer_cast<http_client::nosend::Session>(no_send_client->session_ );
438+ auto received_record_counter = 0 ;
402439 EXPECT_CALL (*mock_session, SendRequest)
403- .WillOnce (
404- [&mock_session, report_trace_id, report_span_id](
440+ .WillRepeatedly (
441+ [&mock_session, report_trace_id, report_span_id, &received_record_counter ](
405442 const std::shared_ptr<opentelemetry::ext::http::client::EventHandler> &callback) {
406443 opentelemetry::proto::collector::logs::v1::ExportLogsServiceRequest request_body;
407444 request_body.ParseFromArray (
408445 &mock_session->GetRequest ()->body_ [0 ],
409446 static_cast <int >(mock_session->GetRequest ()->body_ .size ()));
447+ if (request_body.resource_logs_size () == 0 ||
448+ request_body.resource_logs (0 ).scope_logs_size () == 0 ||
449+ request_body.resource_logs (0 ).scope_logs (0 ).log_records_size () == 0 )
450+ {
451+ return ;
452+ }
410453 auto scope_log = request_body.resource_logs (0 ).scope_logs (0 );
411454 EXPECT_EQ (scope_log.schema_url (), " https://opentelemetry.io/schemas/1.2.0" );
412455 EXPECT_EQ (scope_log.scope ().name (), " opentelelemtry_library" );
413456 EXPECT_EQ (scope_log.scope ().version (), " 1.2.0" );
414457 const auto &received_log = scope_log.log_records (0 );
415- EXPECT_EQ (received_log.trace_id (), report_trace_id);
416- EXPECT_EQ (received_log.span_id (), report_span_id);
458+ if (received_log.trace_id () == report_trace_id &&
459+ received_log.span_id () == report_span_id)
460+ {
461+ ++received_record_counter;
462+ }
417463 EXPECT_EQ (" Log message" , received_log.body ().string_value ());
418464 EXPECT_LE (15 , received_log.attributes_size ());
419465 bool check_service_name = false ;
@@ -467,6 +513,9 @@ class OtlpHttpLogRecordExporterTestPeer : public ::testing::Test
467513 std::chrono::system_clock::now ());
468514
469515 provider->ForceFlush ();
516+
517+ // Exporting can be retried
518+ EXPECT_GE (received_record_counter, 1 );
470519 }
471520
472521# ifdef ENABLE_ASYNC_EXPORT
@@ -514,18 +563,28 @@ class OtlpHttpLogRecordExporterTestPeer : public ::testing::Test
514563 auto no_send_client = std::static_pointer_cast<http_client::nosend::HttpClient>(client);
515564 auto mock_session =
516565 std::static_pointer_cast<http_client::nosend::Session>(no_send_client->session_ );
566+ auto received_record_counter = 0 ;
517567 EXPECT_CALL (*mock_session, SendRequest)
518- .WillOnce (
519- [&mock_session, report_trace_id, report_span_id, schema_url](
568+ .WillRepeatedly (
569+ [&mock_session, report_trace_id, report_span_id, schema_url, &received_record_counter ](
520570 const std::shared_ptr<opentelemetry::ext::http::client::EventHandler> &callback) {
521571 opentelemetry::proto::collector::logs::v1::ExportLogsServiceRequest request_body;
522572 request_body.ParseFromArray (
523573 &mock_session->GetRequest ()->body_ [0 ],
524574 static_cast <int >(mock_session->GetRequest ()->body_ .size ()));
575+ if (request_body.resource_logs_size () == 0 ||
576+ request_body.resource_logs (0 ).scope_logs_size () == 0 ||
577+ request_body.resource_logs (0 ).scope_logs (0 ).log_records_size () == 0 )
578+ {
579+ return ;
580+ }
525581 auto &scope_log = request_body.resource_logs (0 ).scope_logs (0 );
526582 auto received_log = scope_log.log_records (0 );
527- EXPECT_EQ (received_log.trace_id (), report_trace_id);
528- EXPECT_EQ (received_log.span_id (), report_span_id);
583+ if (received_log.trace_id () == report_trace_id &&
584+ received_log.span_id () == report_span_id)
585+ {
586+ ++received_record_counter;
587+ }
529588 EXPECT_EQ (" Log message" , received_log.body ().string_value ());
530589 EXPECT_LE (15 , received_log.attributes_size ());
531590 bool check_service_name = false ;
@@ -586,6 +645,8 @@ class OtlpHttpLogRecordExporterTestPeer : public ::testing::Test
586645 std::chrono::system_clock::now ());
587646
588647 provider->ForceFlush ();
648+ // Exporting can be retried
649+ EXPECT_GE (received_record_counter, 1 );
589650 }
590651# endif
591652};
0 commit comments