22// SPDX-License-Identifier: Apache-2.0
33
44#include " opentelemetry/exporters/elasticsearch/es_log_record_exporter.h"
5- #include " opentelemetry/ext/http/server/http_server.h"
6- #include " opentelemetry/logs/provider.h"
5+ #include " opentelemetry/common/timestamp.h"
6+ #include " opentelemetry/exporters/elasticsearch/es_log_recordable.h"
7+ #include " opentelemetry/logs/severity.h"
8+ #include " opentelemetry/nostd/span.h"
9+ #include " opentelemetry/nostd/string_view.h"
10+ #include " opentelemetry/sdk/instrumentationscope/instrumentation_scope.h"
711#include " opentelemetry/sdk/logs/exporter.h"
8- #include " opentelemetry/sdk/logs/logger_provider.h"
9- #include " opentelemetry/sdk/logs/simple_log_record_processor.h"
12+ #include " opentelemetry/sdk/resource/resource.h"
1013
1114#include < gtest/gtest.h>
12- #include < iostream>
15+ #include < chrono>
16+ #include < string>
1317
1418namespace sdklogs = opentelemetry::sdk::logs;
1519namespace logs_api = opentelemetry::logs;
1620namespace nostd = opentelemetry::nostd;
1721namespace logs_exporter = opentelemetry::exporter::logs;
1822
19- TEST (ElasticsearchLogsExporterTests, Dummy)
20- {
21- // to enable linking
22- }
23-
24- #if 0
2523// Attempt to write a log to an invalid host/port, test that the Export() returns failure
26- TEST(ElasticsearchLogsExporterTests , InvalidEndpoint)
24+ TEST (DISABLED_ElasticsearchLogsExporterTests , InvalidEndpoint)
2725{
2826 // Create invalid connection options for the elasticsearch exporter
2927 logs_exporter::ElasticsearchExporterOptions options (" localhost" , -1 );
3028
3129 // Create an elasticsearch exporter
32- auto exporter =
33- std::unique_ptr<sdklogs::LogRecordExporter>( new logs_exporter::ElasticsearchLogRecordExporter(options));
30+ auto exporter = std::unique_ptr<sdklogs::LogRecordExporter>(
31+ new logs_exporter::ElasticsearchLogRecordExporter (options));
3432
3533 // Create a log record and send to the exporter
3634 auto record = exporter->MakeRecordable ();
3735 auto result = exporter->Export (nostd::span<std::unique_ptr<sdklogs::Recordable>>(&record, 1 ));
3836
3937 // Ensure the return value is failure
40- ASSERT_EQ(result, sdk::common::ExportResult::kFailure);
38+ ASSERT_EQ (result, opentelemetry:: sdk::common::ExportResult::kFailure );
4139}
4240
4341// Test that when the exporter is shutdown, any call to Export should return failure
44- TEST(ElasticsearchLogsExporterTests , Shutdown)
42+ TEST (DISABLED_ElasticsearchLogsExporterTests , Shutdown)
4543{
4644 // Create an elasticsearch exporter and immediately shut it down
47- auto exporter =
48- std::unique_ptr<sdklogs::LogRecordExporter>( new logs_exporter::ElasticsearchLogRecordExporter);
45+ auto exporter = std::unique_ptr<sdklogs::LogRecordExporter>(
46+ new logs_exporter::ElasticsearchLogRecordExporter);
4947 bool shutdownResult = exporter->Shutdown ();
5048 ASSERT_TRUE (shutdownResult);
5149
@@ -54,15 +52,15 @@ TEST(ElasticsearchLogsExporterTests, Shutdown)
5452 auto result = exporter->Export (nostd::span<std::unique_ptr<sdklogs::Recordable>>(&record, 1 ));
5553
5654 // Ensure the return value is failure
57- ASSERT_EQ(result, sdk::common::ExportResult::kFailure);
55+ ASSERT_EQ (result, opentelemetry:: sdk::common::ExportResult::kFailure );
5856}
5957
6058// Test the elasticsearch recordable object
61- TEST(ElasticsearchLogsExporterTests , RecordableCreation)
59+ TEST (DISABLED_ElasticsearchLogsExporterTests , RecordableCreation)
6260{
6361 // Create an elasticsearch exporter
64- auto exporter =
65- std::unique_ptr<sdklogs::LogRecordExporter>( new logs_exporter::ElasticsearchLogRecordExporter);
62+ auto exporter = std::unique_ptr<sdklogs::LogRecordExporter>(
63+ new logs_exporter::ElasticsearchLogRecordExporter);
6664
6765 // Create a recordable
6866 auto record = exporter->MakeRecordable ();
@@ -79,4 +77,52 @@ TEST(ElasticsearchLogsExporterTests, RecordableCreation)
7977
8078 exporter->Export (nostd::span<std::unique_ptr<sdklogs::Recordable>>(&record, 1 ));
8179}
82- #endif
80+
81+ TEST (ElasticsearchLogRecordableTests, BasicTests)
82+ {
83+ const auto severity = logs_api::Severity::kFatal ;
84+ const std::array<nostd::string_view, 2 > stringlist{
85+ {nostd::string_view (" string1" ), nostd::string_view (" string2" )}};
86+
87+ const std::int64_t expected_observed_ts = 1732063944999647774LL ;
88+ const std::string expected_timestamp (" 2024-11-20T00:52:24.999647Z" );
89+ const std::string expected_severity (
90+ opentelemetry::logs::SeverityNumToText[static_cast <std::size_t >(severity)]);
91+ const std::string expected_body (" Body of the log message" );
92+ const std::string expected_scope_name (" scope_name" );
93+ const bool expected_boolean = false ;
94+ const int expected_int = 1 ;
95+ const double expected_double = 2.0 ;
96+
97+ const nlohmann::json expected{
98+ {" @timestamp" , expected_timestamp},
99+ {" boolean" , expected_boolean},
100+ {" double" , expected_double},
101+ {" ecs" , {{" version" , " 8.11.0" }}},
102+ {" int" , expected_int},
103+ {" log" , {{" level" , expected_severity}, {" logger" , expected_scope_name}}},
104+ {" message" , expected_body},
105+ {" observedtimestamp" , expected_observed_ts},
106+ {" stringlist" , {stringlist[0 ], stringlist[1 ]}}};
107+
108+ const opentelemetry::common::SystemTimestamp now{std::chrono::nanoseconds (expected_observed_ts)};
109+
110+ const auto scope =
111+ opentelemetry::sdk::instrumentationscope::InstrumentationScope::Create (expected_scope_name);
112+
113+ opentelemetry::exporter::logs::ElasticSearchRecordable recordable;
114+ recordable.SetTimestamp (now);
115+ recordable.SetObservedTimestamp (now);
116+ recordable.SetSeverity (severity);
117+ recordable.SetBody (expected_body);
118+ recordable.SetInstrumentationScope (*scope);
119+
120+ recordable.SetAttribute (" boolean" , expected_boolean);
121+ recordable.SetAttribute (" int" , expected_int);
122+ recordable.SetAttribute (" double" , expected_double);
123+ recordable.SetAttribute (" stringlist" , stringlist);
124+
125+ const auto actual = recordable.GetJSON ();
126+
127+ EXPECT_EQ (actual, expected);
128+ }
0 commit comments