@@ -672,77 +672,109 @@ TELEMETRY_IMPLEMENTATION_TEST("Tracer telemetry API") {
672672 }
673673 }
674674 }
675+ }
675676
676- SECTION (" logs serialization" ) {
677- SECTION (" log level is correct" ) {
678- struct TestCase {
679- std::string_view name;
680- std::string input;
681- Optional<std::string> stacktrace;
682- std::function<void (Telemetry&, const std::string&,
683- const Optional<std::string>& stacktrace)>
684- apply;
685- std::string expected_log_level;
686- };
687-
688- auto test_case = GENERATE (values<TestCase>({
689- {
690- " warning log" ,
691- " This is a warning log!" ,
692- nullopt ,
693- [](Telemetry& telemetry, const std::string& input,
694- const Optional<std::string>&) {
695- telemetry.log_warning (input);
696- },
697- " WARNING" ,
698- },
699- {
700- " error log" ,
701- " This is an error log!" ,
702- nullopt ,
703- [](Telemetry& telemetry, const std::string& input,
704- const Optional<std::string>&) {
705- telemetry.log_error (input);
706- },
707- " ERROR" ,
708- },
709- {
710- " error log with stacktrace" ,
711- " This is an error log with a fake stacktrace!" ,
712- " error here\n then here\n finally here\n " ,
713- [](Telemetry& telemetry, const std::string& input,
714- Optional<std::string> stacktrace) {
715- telemetry.log_error (input, *stacktrace);
716- },
717- " ERROR" ,
718- },
719- }));
720-
721- CAPTURE (test_case.name );
677+ SECTION (" logs reporting" ) {
678+ SECTION (" log level is correct" ) {
679+ struct TestCase {
680+ std::string_view name;
681+ std::string input;
682+ Optional<std::string> stacktrace;
683+ std::function<void (Telemetry&, const std::string&,
684+ const Optional<std::string>& stacktrace)>
685+ apply;
686+ std::string expected_log_level;
687+ };
722688
723- client->clear ();
724- test_case.apply (telemetry, test_case.input , test_case.stacktrace );
725- scheduler->trigger_heartbeat ();
689+ auto test_case = GENERATE (values<TestCase>({
690+ {
691+ " warning log" ,
692+ " This is a warning log!" ,
693+ nullopt ,
694+ [](Telemetry& telemetry, const std::string& input,
695+ const Optional<std::string>&) {
696+ telemetry.log_warning (input);
697+ },
698+ " WARNING" ,
699+ },
700+ {
701+ " error log" ,
702+ " This is an error log!" ,
703+ nullopt ,
704+ [](Telemetry& telemetry, const std::string& input,
705+ const Optional<std::string>&) { telemetry.log_error (input); },
706+ " ERROR" ,
707+ },
708+ {
709+ " error log with stacktrace" ,
710+ " This is an error log with a fake stacktrace!" ,
711+ " error here\n then here\n finally here\n " ,
712+ [](Telemetry& telemetry, const std::string& input,
713+ Optional<std::string> stacktrace) {
714+ telemetry.log_error (input, *stacktrace);
715+ },
716+ " ERROR" ,
717+ },
718+ }));
726719
727- auto message_batch = nlohmann::json::parse (client->request_body );
728- REQUIRE (is_valid_telemetry_payload (message_batch));
729- REQUIRE (message_batch[" payload" ].size () == 2 );
720+ CAPTURE (test_case.name );
730721
731- auto logs_message = message_batch[" payload" ][1 ];
732- REQUIRE (logs_message[" request_type" ] == " logs" );
722+ client->clear ();
723+ test_case.apply (telemetry, test_case.input , test_case.stacktrace );
724+ scheduler->trigger_heartbeat ();
733725
734- auto logs_payload = logs_message[" payload" ][" logs" ];
735- REQUIRE (logs_payload.size () == 1 );
736- CHECK (logs_payload[0 ][" level" ] == test_case.expected_log_level );
737- CHECK (logs_payload[0 ][" message" ] == test_case.input );
738- CHECK (logs_payload[0 ].contains (" tracer_time" ));
726+ auto message_batch = nlohmann::json::parse (client->request_body );
727+ REQUIRE (is_valid_telemetry_payload (message_batch));
728+ REQUIRE (message_batch[" payload" ].size () == 2 );
739729
740- if (test_case.stacktrace ) {
741- CHECK (logs_payload[0 ][" stack_trace" ] == test_case.stacktrace );
742- } else {
743- CHECK (logs_payload[0 ].contains (" stack_trace" ) == false );
744- }
730+ auto logs_message = message_batch[" payload" ][1 ];
731+ REQUIRE (logs_message[" request_type" ] == " logs" );
732+
733+ auto logs_payload = logs_message[" payload" ][" logs" ];
734+ REQUIRE (logs_payload.size () == 1 );
735+ CHECK (logs_payload[0 ][" level" ] == test_case.expected_log_level );
736+ CHECK (logs_payload[0 ][" message" ] == test_case.input );
737+ CHECK (logs_payload[0 ][" tracer_time" ] == 1672484400 );
738+
739+ if (test_case.stacktrace ) {
740+ CHECK (logs_payload[0 ][" stack_trace" ] == test_case.stacktrace );
741+ } else {
742+ CHECK (logs_payload[0 ].contains (" stack_trace" ) == false );
743+ }
744+
745+ // Make sure the next heartbeat doesn't contains counters if no
746+ // datapoint has been incremented, decremented or set.
747+ client->clear ();
748+ scheduler->trigger_heartbeat ();
749+
750+ auto message_batch2 = nlohmann::json::parse (client->request_body );
751+ REQUIRE (is_valid_telemetry_payload (message_batch2) == true );
752+ REQUIRE (message_batch2[" payload" ].size () == 1 );
753+
754+ auto payload2 = message_batch[" payload" ][0 ];
755+ CHECK (payload2[" request_type" ] == " app-heartbeat" );
756+ }
757+
758+ SECTION (" dtor sends logs in `app-closing` message" ) {
759+ {
760+ Telemetry tmp_telemetry{*finalize_config (), logger, client,
761+ scheduler, *url, clock};
762+ tmp_telemetry.log_warning (" Be careful!" );
763+ client->clear ();
745764 }
765+
766+ auto message_batch = nlohmann::json::parse (client->request_body );
767+ REQUIRE (is_valid_telemetry_payload (message_batch));
768+ REQUIRE (message_batch[" payload" ].size () == 2 );
769+
770+ auto logs_message = message_batch[" payload" ][1 ];
771+ REQUIRE (logs_message[" request_type" ] == " logs" );
772+
773+ auto logs_payload = logs_message[" payload" ][" logs" ];
774+ REQUIRE (logs_payload.size () == 1 );
775+ CHECK (logs_payload[0 ][" level" ] == " WARNING" );
776+ CHECK (logs_payload[0 ][" message" ] == " Be careful!" );
777+ CHECK (logs_payload[0 ][" tracer_time" ] == 1672484400 );
746778 }
747779 }
748780}
0 commit comments