Skip to content

Commit 1e8de02

Browse files
authored
[TEST] Multiple exports in OTLP HTTP exporters tests (open-telemetry#3771)
1 parent 69e62f7 commit 1e8de02

File tree

3 files changed

+274
-57
lines changed

3 files changed

+274
-57
lines changed

exporters/otlp/test/otlp_http_exporter_test.cc

Lines changed: 83 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -170,17 +170,34 @@ class OtlpHttpExporterTestPeer : public ::testing::Test
170170
auto no_send_client = std::static_pointer_cast<http_client::nosend::HttpClient>(client);
171171
auto mock_session =
172172
std::static_pointer_cast<http_client::nosend::Session>(no_send_client->session_);
173+
auto received_trace_id_counter = 0;
173174
EXPECT_CALL(*mock_session, SendRequest)
174-
.WillOnce(
175-
[&mock_session, report_trace_id](
175+
.WillRepeatedly(
176+
[&mock_session, report_trace_id, &received_trace_id_counter](
176177
const std::shared_ptr<opentelemetry::ext::http::client::EventHandler> &callback) {
177178
auto check_json =
178179
nlohmann::json::parse(mock_session->GetRequest()->body_, nullptr, false);
179-
auto resource_span = *check_json["resourceSpans"].begin();
180-
auto scope_span = *resource_span["scopeSpans"].begin();
180+
if (check_json["resourceSpans"].size() == 0)
181+
{
182+
return;
183+
}
184+
auto resource_span = *check_json["resourceSpans"].begin();
185+
if (resource_span["scopeSpans"].size() == 0)
186+
{
187+
return;
188+
}
189+
auto scope_span = *resource_span["scopeSpans"].begin();
190+
if (scope_span["spans"].size() == 0)
191+
{
192+
return;
193+
}
181194
auto span = *scope_span["spans"].begin();
182195
auto received_trace_id = span["traceId"].get<std::string>();
183-
EXPECT_EQ(received_trace_id, report_trace_id);
196+
if (received_trace_id != report_trace_id)
197+
{
198+
return;
199+
}
200+
++received_trace_id_counter;
184201

185202
auto custom_header = mock_session->GetRequest()->headers_.find("Custom-Header-Key");
186203
ASSERT_TRUE(custom_header != mock_session->GetRequest()->headers_.end());
@@ -205,6 +222,9 @@ class OtlpHttpExporterTestPeer : public ::testing::Test
205222
parent_span->End();
206223

207224
provider->ForceFlush();
225+
226+
// Exporting can be retried
227+
EXPECT_GE(received_trace_id_counter, 1);
208228
}
209229

210230
# ifdef ENABLE_ASYNC_EXPORT
@@ -262,17 +282,34 @@ class OtlpHttpExporterTestPeer : public ::testing::Test
262282
auto no_send_client = std::static_pointer_cast<http_client::nosend::HttpClient>(client);
263283
auto mock_session =
264284
std::static_pointer_cast<http_client::nosend::Session>(no_send_client->session_);
285+
auto received_trace_id_counter = 0;
265286
EXPECT_CALL(*mock_session, SendRequest)
266-
.WillOnce(
267-
[&mock_session, report_trace_id](
287+
.WillRepeatedly(
288+
[&mock_session, report_trace_id, &received_trace_id_counter](
268289
const std::shared_ptr<opentelemetry::ext::http::client::EventHandler> &callback) {
269290
auto check_json =
270291
nlohmann::json::parse(mock_session->GetRequest()->body_, nullptr, false);
271-
auto resource_span = *check_json["resourceSpans"].begin();
272-
auto scope_span = *resource_span["scopeSpans"].begin();
292+
if (check_json["resourceSpans"].size() == 0)
293+
{
294+
return;
295+
}
296+
auto resource_span = *check_json["resourceSpans"].begin();
297+
if (resource_span["scopeSpans"].size() == 0)
298+
{
299+
return;
300+
}
301+
auto scope_span = *resource_span["scopeSpans"].begin();
302+
if (scope_span["spans"].size() == 0)
303+
{
304+
return;
305+
}
273306
auto span = *scope_span["spans"].begin();
274307
auto received_trace_id = span["traceId"].get<std::string>();
275-
EXPECT_EQ(received_trace_id, report_trace_id);
308+
if (received_trace_id != report_trace_id)
309+
{
310+
return;
311+
}
312+
++received_trace_id_counter;
276313

277314
auto custom_header = mock_session->GetRequest()->headers_.find("Custom-Header-Key");
278315
ASSERT_TRUE(custom_header != mock_session->GetRequest()->headers_.end());
@@ -301,6 +338,9 @@ class OtlpHttpExporterTestPeer : public ::testing::Test
301338
parent_span->End();
302339

303340
provider->ForceFlush();
341+
342+
// Exporting can be retried
343+
EXPECT_GE(received_trace_id_counter, 1);
304344
}
305345
# endif
306346

@@ -357,17 +397,28 @@ class OtlpHttpExporterTestPeer : public ::testing::Test
357397
auto no_send_client = std::static_pointer_cast<http_client::nosend::HttpClient>(client);
358398
auto mock_session =
359399
std::static_pointer_cast<http_client::nosend::Session>(no_send_client->session_);
400+
auto received_trace_id_counter = 0;
360401
EXPECT_CALL(*mock_session, SendRequest)
361-
.WillOnce(
362-
[&mock_session, report_trace_id](
402+
.WillRepeatedly(
403+
[&mock_session, report_trace_id, &received_trace_id_counter](
363404
const std::shared_ptr<opentelemetry::ext::http::client::EventHandler> &callback) {
364405
opentelemetry::proto::collector::trace::v1::ExportTraceServiceRequest request_body;
365406
request_body.ParseFromArray(
366407
&mock_session->GetRequest()->body_[0],
367408
static_cast<int>(mock_session->GetRequest()->body_.size()));
409+
if (request_body.resource_spans_size() == 0 ||
410+
request_body.resource_spans(0).scope_spans_size() == 0 ||
411+
request_body.resource_spans(0).scope_spans(0).spans_size() == 0)
412+
{
413+
return;
414+
}
368415
auto received_trace_id =
369416
request_body.resource_spans(0).scope_spans(0).spans(0).trace_id();
370-
EXPECT_EQ(received_trace_id, report_trace_id);
417+
if (received_trace_id != report_trace_id)
418+
{
419+
return;
420+
}
421+
++received_trace_id_counter;
371422

372423
auto custom_header = mock_session->GetRequest()->headers_.find("Custom-Header-Key");
373424
ASSERT_TRUE(custom_header != mock_session->GetRequest()->headers_.end());
@@ -384,6 +435,9 @@ class OtlpHttpExporterTestPeer : public ::testing::Test
384435
parent_span->End();
385436

386437
provider->ForceFlush();
438+
439+
// Exporting can be retried
440+
EXPECT_GE(received_trace_id_counter, 1);
387441
}
388442

389443
# ifdef ENABLE_ASYNC_EXPORT
@@ -440,17 +494,28 @@ class OtlpHttpExporterTestPeer : public ::testing::Test
440494
auto no_send_client = std::static_pointer_cast<http_client::nosend::HttpClient>(client);
441495
auto mock_session =
442496
std::static_pointer_cast<http_client::nosend::Session>(no_send_client->session_);
497+
auto received_trace_id_counter = 0;
443498
EXPECT_CALL(*mock_session, SendRequest)
444-
.WillOnce(
445-
[&mock_session, report_trace_id](
499+
.WillRepeatedly(
500+
[&mock_session, report_trace_id, &received_trace_id_counter](
446501
const std::shared_ptr<opentelemetry::ext::http::client::EventHandler> &callback) {
447502
opentelemetry::proto::collector::trace::v1::ExportTraceServiceRequest request_body;
448503
request_body.ParseFromArray(
449504
&mock_session->GetRequest()->body_[0],
450505
static_cast<int>(mock_session->GetRequest()->body_.size()));
506+
if (request_body.resource_spans_size() == 0 ||
507+
request_body.resource_spans(0).scope_spans_size() == 0 ||
508+
request_body.resource_spans(0).scope_spans(0).spans_size() == 0)
509+
{
510+
return;
511+
}
451512
auto received_trace_id =
452513
request_body.resource_spans(0).scope_spans(0).spans(0).trace_id();
453-
EXPECT_EQ(received_trace_id, report_trace_id);
514+
if (received_trace_id != report_trace_id)
515+
{
516+
return;
517+
}
518+
++received_trace_id_counter;
454519

455520
auto custom_header = mock_session->GetRequest()->headers_.find("Custom-Header-Key");
456521
ASSERT_TRUE(custom_header != mock_session->GetRequest()->headers_.end());
@@ -472,6 +537,8 @@ class OtlpHttpExporterTestPeer : public ::testing::Test
472537
parent_span->End();
473538

474539
provider->ForceFlush();
540+
// Exporting can be retried
541+
EXPECT_GE(received_trace_id_counter, 1);
475542
}
476543
# endif
477544
};

exporters/otlp/test/otlp_http_log_record_exporter_test.cc

Lines changed: 81 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)