6#include <gtest/gtest.h>
34 EXPECT_EQ(resource.type, otel_resource_type::service);
36 auto service_name = resource.get_attribute(
"service.name");
37 ASSERT_TRUE(service_name.is_ok());
38 EXPECT_EQ(service_name.value(),
"test_service");
40 auto service_version = resource.get_attribute(
"service.version");
41 ASSERT_TRUE(service_version.is_ok());
42 EXPECT_EQ(service_version.value(),
"1.0.0");
44 auto service_namespace = resource.get_attribute(
"service.namespace");
45 ASSERT_TRUE(service_namespace.is_ok());
46 EXPECT_EQ(service_namespace.value(),
"test_namespace");
48 auto sdk_name = resource.get_attribute(
"telemetry.sdk.name");
49 ASSERT_TRUE(sdk_name.is_ok());
50 EXPECT_EQ(sdk_name.value(),
"monitoring_system");
55 EXPECT_EQ(attr.
key,
"test.key");
56 EXPECT_EQ(attr.
value,
"test.value");
59 EXPECT_EQ(attr, attr2);
62 EXPECT_NE(attr, attr3);
67 EXPECT_EQ(context.
trace_id,
"trace123");
68 EXPECT_EQ(context.
span_id,
"span456");
73 EXPECT_FALSE(invalid_context.
is_valid);
78 span.
name =
"test_operation";
79 span.
kind = otel_span_kind::server;
81 span.
start_time = std::chrono::system_clock::now();
84 EXPECT_EQ(span.
duration().count(), 0);
86 std::this_thread::sleep_for(std::chrono::milliseconds(1));
87 span.
end_time = std::chrono::system_clock::now();
90 EXPECT_GT(span.
duration().count(), 0);
96 EXPECT_EQ(span.
events.size(), 1);
97 EXPECT_EQ(span.
attributes[0].key,
"http.method");
104 metric.description =
"CPU usage percentage";
109 metric.add_attribute(
"host.name",
"server01");
110 metric.add_attribute(
"service.name",
"web_server");
114 EXPECT_EQ(
metric.attributes.size(), 2);
115 EXPECT_EQ(
metric.attributes[0].key,
"host.name");
124 internal_span.
trace_id =
"trace123";
125 internal_span.
span_id =
"span456";
127 internal_span.
start_time = std::chrono::system_clock::now();
129 internal_span.
tags[
"span.kind"] =
"client";
130 internal_span.
tags[
"db.statement"] =
"SELECT * FROM users";
131 internal_span.
tags[
"error"] =
"false";
134 ASSERT_TRUE(result.is_ok());
136 const auto& otel_span = result.value();
137 EXPECT_EQ(otel_span.name,
"database_query");
138 EXPECT_EQ(otel_span.context.trace_id,
"trace123");
139 EXPECT_EQ(otel_span.context.span_id,
"span456");
140 EXPECT_EQ(otel_span.parent_context.span_id,
"parent789");
141 EXPECT_EQ(otel_span.kind, otel_span_kind::client);
142 EXPECT_EQ(otel_span.status_code, otel_status_code::ok);
143 EXPECT_EQ(otel_span.attributes.size(), 1);
146 bool found_db_statement =
false;
147 for (
const auto& attr : otel_span.attributes) {
148 if (attr.key ==
"db.statement" && attr.value ==
"SELECT * FROM users") {
149 found_db_statement =
true;
153 EXPECT_TRUE(found_db_statement);
162 error_span.
span_id =
"span456";
163 error_span.
start_time = std::chrono::system_clock::now();
165 error_span.
tags[
"error"] =
"true";
166 error_span.
tags[
"error.message"] =
"Connection timeout";
169 ASSERT_TRUE(result.is_ok());
171 const auto& otel_span = result.value();
172 EXPECT_EQ(otel_span.status_code, otel_status_code::error);
173 EXPECT_EQ(otel_span.status_message,
"Connection timeout");
179 std::vector<trace_span> spans;
180 for (
int i = 0; i < 3; ++i) {
184 span.
span_id =
"span" + std::to_string(i);
185 span.
start_time = std::chrono::system_clock::now();
187 spans.push_back(span);
191 ASSERT_TRUE(result.is_ok());
193 const auto& otel_spans = result.value();
194 EXPECT_EQ(otel_spans.size(), 3);
196 for (
size_t i = 0; i < otel_spans.size(); ++i) {
197 EXPECT_EQ(otel_spans[i].name,
"operation_" + std::to_string(i));
198 EXPECT_EQ(otel_spans[i].context.span_id,
"span" + std::to_string(i));
208 data.
add_tag(
"environment",
"production");
209 data.
add_tag(
"region",
"us-west-2");
212 ASSERT_TRUE(result.is_ok());
214 const auto& otel_metrics = result.value();
215 EXPECT_EQ(otel_metrics.size(), 2);
218 bool found_cpu =
false;
219 for (
const auto&
metric : otel_metrics) {
225 bool found_env =
false;
226 for (
const auto& attr :
metric.attributes) {
227 if (attr.key ==
"environment" && attr.value ==
"production") {
232 EXPECT_TRUE(found_env);
235 EXPECT_TRUE(found_cpu);
239 EXPECT_TRUE(compatibility_layer);
241 auto init_result = compatibility_layer->initialize();
242 EXPECT_TRUE(init_result.is_ok());
245 auto double_init = compatibility_layer->initialize();
246 EXPECT_TRUE(double_init.is_err());
247 EXPECT_EQ(double_init.error().code,
static_cast<int>(monitoring_error_code::already_exists));
249 auto shutdown_result = compatibility_layer->shutdown();
250 EXPECT_TRUE(shutdown_result.is_ok());
254 auto init_result = compatibility_layer->initialize();
255 ASSERT_TRUE(init_result.is_ok());
257 std::vector<trace_span> spans;
262 span.
start_time = std::chrono::system_clock::now();
264 spans.push_back(span);
266 auto export_result = compatibility_layer->export_spans(spans);
267 EXPECT_TRUE(export_result.is_ok());
269 auto stats = compatibility_layer->get_stats();
270 EXPECT_EQ(stats.pending_spans, 1);
271 EXPECT_EQ(stats.pending_metrics, 0);
273 auto flush_result = compatibility_layer->flush();
274 EXPECT_TRUE(flush_result.is_ok());
276 stats = compatibility_layer->get_stats();
277 EXPECT_EQ(stats.pending_spans, 0);
281 auto init_result = compatibility_layer->initialize();
282 ASSERT_TRUE(init_result.is_ok());
286 data.
add_tag(
"test_tag",
"test_value");
288 auto export_result = compatibility_layer->export_metrics(data);
289 EXPECT_TRUE(export_result.is_ok());
291 auto stats = compatibility_layer->get_stats();
292 EXPECT_EQ(stats.pending_metrics, 1);
293 EXPECT_EQ(stats.pending_spans, 0);
295 auto flush_result = compatibility_layer->flush();
296 EXPECT_TRUE(flush_result.is_ok());
298 stats = compatibility_layer->get_stats();
299 EXPECT_EQ(stats.pending_metrics, 0);
303 std::vector<trace_span> spans;
305 spans.push_back(span);
307 auto export_result = compatibility_layer->export_spans(spans);
308 EXPECT_TRUE(export_result.is_err());
309 EXPECT_EQ(export_result.error().code,
static_cast<int>(monitoring_error_code::invalid_state));
312 auto metrics_export_result = compatibility_layer->export_metrics(data);
313 EXPECT_TRUE(metrics_export_result.is_err());
314 EXPECT_EQ(metrics_export_result.error().code,
static_cast<int>(monitoring_error_code::invalid_state));
318 const auto& layer_resource = compatibility_layer->get_resource();
319 EXPECT_EQ(layer_resource.type, otel_resource_type::service);
321 auto service_name = layer_resource.get_attribute(
"service.name");
322 EXPECT_TRUE(service_name.is_ok());
323 EXPECT_EQ(service_name.value(),
"test_service");
328 valid_config.
endpoint =
"http://localhost:4317";
330 valid_config.
timeout = std::chrono::milliseconds(5000);
333 auto validation = valid_config.
validate();
334 EXPECT_TRUE(validation.is_ok());
339 auto endpoint_validation = invalid_endpoint.
validate();
340 EXPECT_TRUE(endpoint_validation.is_err());
341 EXPECT_EQ(endpoint_validation.error().code,
static_cast<int>(monitoring_error_code::invalid_configuration));
345 invalid_protocol.
protocol =
"invalid";
346 auto protocol_validation = invalid_protocol.
validate();
347 EXPECT_TRUE(protocol_validation.is_err());
351 invalid_timeout.
timeout = std::chrono::milliseconds(0);
352 auto timeout_validation = invalid_timeout.
validate();
353 EXPECT_TRUE(timeout_validation.is_err());
358 auto batch_validation = invalid_batch.
validate();
359 EXPECT_TRUE(batch_validation.is_err());
365 EXPECT_EQ(service_resource.type, otel_resource_type::service);
367 auto name = service_resource.get_attribute(
"service.name");
368 EXPECT_TRUE(name.is_ok());
369 EXPECT_EQ(name.value(),
"my_service");
371 auto version = service_resource.get_attribute(
"service.version");
372 EXPECT_TRUE(version.is_ok());
373 EXPECT_EQ(version.value(),
"2.0.0");
377 EXPECT_TRUE(layer1 !=
nullptr);
380 EXPECT_TRUE(layer2 !=
nullptr);
382 const auto& layer2_resource = layer2->get_resource();
383 auto layer2_name = layer2_resource.get_attribute(
"service.name");
384 EXPECT_TRUE(layer2_name.is_ok());
385 EXPECT_EQ(layer2_name.value(),
"test_service");
std::unique_ptr< opentelemetry_compatibility_layer > compatibility_layer
Adapter for converting monitoring system metrics to OpenTelemetry format.
common::Result< std::vector< otel_metric_data > > convert_monitoring_data(const monitoring_data &data)
Convert monitoring data to OpenTelemetry metric data.
Adapter for converting monitoring system traces to OpenTelemetry format.
common::Result< otel_span_data > convert_span(const trace_span &span)
Convert internal span to OpenTelemetry span data.
common::Result< std::vector< otel_span_data > > convert_spans(const std::vector< trace_span > &spans)
Convert multiple spans to OpenTelemetry format.
Core monitoring system interface definitions.
std::unique_ptr< opentelemetry_compatibility_layer > create_opentelemetry_compatibility_layer(const otel_resource &resource)
Create OpenTelemetry compatibility layer.
otel_resource create_service_resource(const std::string &service_name, const std::string &service_version="1.0.0", const std::string &service_namespace="")
Create OpenTelemetry resource with service information.
OpenTelemetry compatibility layer for monitoring system integration.
Basic metric structure for interface compatibility.
std::chrono::system_clock::time_point timestamp
std::variant< double, int64_t, std::string > value
Container for monitoring metrics from a component.
void add_metric(const std::string &key, double value)
Add a numeric metric.
void add_tag(const std::string &key, const std::string &value)
Add a tag (string metadata)
Configuration for OpenTelemetry exporters.
common::VoidResult validate() const
std::chrono::milliseconds timeout
std::size_t max_batch_size
OpenTelemetry attribute representation.
OpenTelemetry metric data representation.
OpenTelemetry resource representation.
OpenTelemetry span context.
OpenTelemetry span data representation.
std::chrono::microseconds duration() const
otel_status_code status_code
std::chrono::system_clock::time_point start_time
std::vector< std::string > events
void add_attribute(const std::string &key, const std::string &value)
std::vector< otel_attribute > attributes
std::chrono::system_clock::time_point end_time
void add_event(const std::string &event)
Trace span representing a unit of work in distributed tracing.
std::string parent_span_id
std::unordered_map< std::string, std::string > tags
std::chrono::system_clock::time_point end_time
std::string operation_name
std::chrono::system_clock::time_point start_time
TEST_F(OpenTelemetryAdapterTest, ResourceCreation)