|
4 | 4 | #ifdef _WIN32 |
5 | 5 |
|
6 | 6 | # include <gtest/gtest.h> |
| 7 | +# include <cstdint> |
7 | 8 | # include <map> |
8 | 9 | # include <string> |
9 | 10 | # include "opentelemetry//sdk/trace/sampler.h" |
@@ -580,6 +581,86 @@ TEST(ETWTracer, EndWithCustomTime) |
580 | 581 |
|
581 | 582 | } |
582 | 583 |
|
| 584 | +/** |
| 585 | + * Reads back the status fields the ETW exporter puts on the "Span" event at End. |
| 586 | + */ |
| 587 | +static void GetEmittedStatus(opentelemetry::trace::Span &span, uint32_t &code, std::string &message) |
| 588 | +{ |
| 589 | + exporter::etw::Properties evt; |
| 590 | + static_cast<exporter::etw::Span &>(span).UpdateStatus(evt); |
| 591 | + const exporter::etw::PropertyVariant &code_value = evt[ETW_FIELD_STATUSCODE]; |
| 592 | + const exporter::etw::PropertyVariant &message_value = evt[ETW_FIELD_STATUSMESSAGE]; |
| 593 | + code = nostd::get<uint32_t>(code_value); |
| 594 | + message = nostd::get<std::string>(message_value); |
| 595 | +} |
| 596 | + |
| 597 | +TEST(ETWTracer, SpanSetStatusOkIsFinal) |
| 598 | +{ |
| 599 | + exporter::etw::TracerProvider tp; |
| 600 | + auto tracer = tp.GetTracer("SpanSetStatus"); |
| 601 | + auto span = tracer->StartSpan("span 1"); |
| 602 | + span->SetStatus(opentelemetry::trace::StatusCode::kOk, ""); |
| 603 | + span->SetStatus(opentelemetry::trace::StatusCode::kError, "later error"); |
| 604 | + span->SetStatus(opentelemetry::trace::StatusCode::kUnset, ""); |
| 605 | + |
| 606 | + uint32_t code = 0; |
| 607 | + std::string message; |
| 608 | + GetEmittedStatus(*span, code, message); |
| 609 | + EXPECT_EQ(code, static_cast<uint32_t>(opentelemetry::trace::StatusCode::kOk)); |
| 610 | + EXPECT_EQ(message, ""); |
| 611 | + span->End(); |
| 612 | +} |
| 613 | + |
| 614 | +TEST(ETWTracer, SpanSetStatusUnsetIsIgnored) |
| 615 | +{ |
| 616 | + exporter::etw::TracerProvider tp; |
| 617 | + auto tracer = tp.GetTracer("SpanSetStatus"); |
| 618 | + auto span = tracer->StartSpan("span 1"); |
| 619 | + span->SetStatus(opentelemetry::trace::StatusCode::kError, "the real failure"); |
| 620 | + span->SetStatus(opentelemetry::trace::StatusCode::kUnset, ""); |
| 621 | + |
| 622 | + uint32_t code = 0; |
| 623 | + std::string message; |
| 624 | + GetEmittedStatus(*span, code, message); |
| 625 | + EXPECT_EQ(code, static_cast<uint32_t>(opentelemetry::trace::StatusCode::kError)); |
| 626 | + EXPECT_EQ(message, "the real failure"); |
| 627 | + span->End(); |
| 628 | +} |
| 629 | + |
| 630 | +TEST(ETWTracer, SpanSetStatusDescriptionIgnoredForOk) |
| 631 | +{ |
| 632 | + exporter::etw::TracerProvider tp; |
| 633 | + auto tracer = tp.GetTracer("SpanSetStatus"); |
| 634 | + auto span = tracer->StartSpan("span 1"); |
| 635 | + span->SetStatus(opentelemetry::trace::StatusCode::kError, "transient"); |
| 636 | + span->SetStatus(opentelemetry::trace::StatusCode::kOk, "ignored description"); |
| 637 | + |
| 638 | + uint32_t code = 0; |
| 639 | + std::string message; |
| 640 | + GetEmittedStatus(*span, code, message); |
| 641 | + EXPECT_EQ(code, static_cast<uint32_t>(opentelemetry::trace::StatusCode::kOk)); |
| 642 | + EXPECT_EQ(message, ""); |
| 643 | + span->End(); |
| 644 | +} |
| 645 | + |
| 646 | +TEST(ETWTracer, SpanSetStatusErrorKeepsDescription) |
| 647 | +{ |
| 648 | + exporter::etw::TracerProvider tp; |
| 649 | + auto tracer = tp.GetTracer("SpanSetStatus"); |
| 650 | + auto span = tracer->StartSpan("span 1"); |
| 651 | + // The description is not null terminated at its end, so a copy through data() alone overruns it. |
| 652 | + std::string description = "boomX"; |
| 653 | + span->SetStatus(opentelemetry::trace::StatusCode::kError, |
| 654 | + nostd::string_view(description.data(), 4)); |
| 655 | + |
| 656 | + uint32_t code = 0; |
| 657 | + std::string message; |
| 658 | + GetEmittedStatus(*span, code, message); |
| 659 | + EXPECT_EQ(code, static_cast<uint32_t>(opentelemetry::trace::StatusCode::kError)); |
| 660 | + EXPECT_EQ(message, "boom"); |
| 661 | + span->End(); |
| 662 | +} |
| 663 | + |
583 | 664 | TEST(ETWTracer, ConstructorInitializesToOpenState) |
584 | 665 | { |
585 | 666 | opentelemetry::exporter::etw::TracerProvider provider; |
|
0 commit comments