24#include <unordered_map>
30namespace kcenon {
namespace monitoring {
98 common::Result<std::string>
get_attribute(
const std::string& key)
const {
100 if (attr.key == key) {
101 return common::Result<std::string>::ok(attr.value);
105 "Attribute not found: " + key,
"monitoring_system").to_common_error());
152 return end_time != std::chrono::system_clock::time_point{};
157 return std::chrono::microseconds{0};
176 void add_attribute(
const std::string& key,
const std::string& attribute_value) {
177 attributes.emplace_back(key, attribute_value);
209 auto kind_it = span.
tags.find(
"span.kind");
210 if (kind_it != span.
tags.end()) {
215 auto error_it = span.
tags.find(
"error");
216 if (error_it != span.
tags.end() && error_it->second ==
"true") {
218 auto error_msg_it = span.
tags.find(
"error.message");
219 if (error_msg_it != span.
tags.end()) {
227 for (
const auto& [key, value] : span.
tags) {
229 if (key !=
"span.kind" && key !=
"error" && key !=
"error.message") {
234 return common::Result<otel_span_data>::ok(std::move(otel_span));
240 common::Result<std::vector<otel_span_data>>
convert_spans(
const std::vector<trace_span>& spans) {
241 std::vector<otel_span_data> otel_spans;
242 otel_spans.reserve(spans.size());
244 for (
const auto& span : spans) {
246 if (convert_result.is_err()) {
248 "Failed to convert span: " + convert_result.error().message).
to_common_error());
250 otel_spans.push_back(convert_result.value());
253 return common::Result<std::vector<otel_span_data>>
::ok(std::move(otel_spans));
289 std::vector<otel_metric_data> otel_metrics;
300 metric.add_attribute(tag_name, tag_value);
307 otel_metrics.push_back(std::move(
metric));
310 return common::Result<std::vector<otel_metric_data>>
::ok(std::move(otel_metrics));
317 std::vector<otel_metric_data> otel_metrics;
319 for (
const auto& [name, value] : data.
get_metrics()) {
327 for (
const auto& [tag_name, tag_value] : data.
get_tags()) {
328 metric.add_attribute(tag_name, tag_value);
331 otel_metrics.push_back(std::move(
metric));
334 return common::Result<std::vector<otel_metric_data>>
::ok(std::move(otel_metrics));
351 std::unordered_map<std::string, std::string>
headers;
358 "Exporter endpoint cannot be empty",
"monitoring_system").to_common_error());
362 "Invalid protocol: " +
protocol,
"monitoring_system").to_common_error());
364 if (
timeout <= std::chrono::milliseconds(0)) {
366 "Timeout must be positive",
"monitoring_system").to_common_error());
370 "Batch size must be positive",
"monitoring_system").to_common_error());
391 std::lock_guard<std::mutex> lock(
mutex_);
394 "Compatibility layer already initialized",
"monitoring_system").to_common_error());
405 std::lock_guard<std::mutex> lock(
mutex_);
422 common::VoidResult
export_spans(
const std::vector<trace_span>& spans) {
425 "Compatibility layer not initialized",
"monitoring_system").to_common_error());
429 if (convert_result.is_err()) {
431 "Failed to convert spans: " + convert_result.error().message).
to_common_error());
435 std::lock_guard<std::mutex> lock(
mutex_);
436 const auto& otel_spans = convert_result.value();
448 "Compatibility layer not initialized",
"monitoring_system").to_common_error());
452 if (convert_result.is_err()) {
454 "Failed to convert metrics: " + convert_result.error().message).
to_common_error());
458 std::lock_guard<std::mutex> lock(
mutex_);
459 const auto& otel_metrics = convert_result.value();
469 std::lock_guard<std::mutex> lock(
mutex_);
492 std::lock_guard<std::mutex> lock(
mutex_);
533 const std::string& service_version =
"1.0.0",
534 const std::string& service_namespace =
"") {
539 if (!service_namespace.empty()) {
540 resource.
add_attribute(
"service.namespace", service_namespace);
542 resource.
add_attribute(
"telemetry.sdk.name",
"monitoring_system");
552inline std::unique_ptr<opentelemetry_compatibility_layer>
554 return std::make_unique<opentelemetry_compatibility_layer>(resource);
560inline std::unique_ptr<opentelemetry_compatibility_layer>
562 const std::string& service_version =
"1.0.0") {
Main OpenTelemetry compatibility layer.
std::vector< otel_span_data > pending_spans_
const otel_resource & get_resource() const
Get resource information.
common::VoidResult initialize()
Initialize the compatibility layer.
common::VoidResult export_metrics(const monitoring_data &data)
Export metrics using OpenTelemetry format.
opentelemetry_tracer_adapter tracer_adapter_
std::vector< otel_metric_data > pending_metrics_
std::size_t metrics_exported_
std::chrono::system_clock::time_point last_export_
common::VoidResult flush()
Flush pending data to exporters.
std::size_t spans_exported_
compatibility_stats get_stats() const
opentelemetry_metrics_adapter metrics_adapter_
std::size_t export_errors_
common::VoidResult shutdown()
Shutdown the compatibility layer.
opentelemetry_compatibility_layer(const otel_resource &resource)
common::VoidResult export_spans(const std::vector< trace_span > &spans)
Export spans using OpenTelemetry format.
Adapter for converting monitoring system metrics to OpenTelemetry format.
common::Result< std::vector< otel_metric_data > > convert_metrics(const metrics_snapshot &snapshot)
Convert metrics snapshot to OpenTelemetry metric data.
opentelemetry_metrics_adapter(const otel_resource &resource)
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.
opentelemetry_tracer_adapter(const otel_resource &resource)
otel_span_kind parse_span_kind(const std::string &kind_str)
common::Result< otel_span_data > convert_span(const trace_span &span)
Convert internal span to OpenTelemetry span data.
common::Result< otel_span_context > create_context(const trace_context &context)
Create OpenTelemetry context from internal trace context.
common::Result< std::vector< otel_span_data > > convert_spans(const std::vector< trace_span > &spans)
Convert multiple spans to OpenTelemetry format.
Distributed tracing implementation for monitoring system.
Monitoring system specific error codes.
Interface for components that expose monitoring metrics.
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_type
OpenTelemetry resource types.
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.
otel_status_code
OpenTelemetry status codes.
otel_span_kind
OpenTelemetry span kinds.
Result pattern type definitions for monitoring system.
Extended error information with context.
common::error_info to_common_error() const
Convert to common_system error_info.
Represents a single metric value with metadata.
std::chrono::system_clock::time_point timestamp
std::unordered_map< std::string, std::string > tags
Basic metric structure for interface compatibility.
std::chrono::system_clock::time_point timestamp
std::variant< double, int64_t, std::string > value
Complete snapshot of metrics at a point in time.
std::vector< metric_value > metrics
Container for monitoring metrics from a component.
std::chrono::system_clock::time_point get_timestamp() const
Get the timestamp.
const tag_map & get_tags() const
Get all tags.
const metric_map & get_metrics() const
Get all metrics.
Get compatibility layer statistics.
std::size_t pending_metrics
std::size_t export_errors
std::size_t spans_exported
std::size_t metrics_exported
std::size_t pending_spans
std::chrono::system_clock::time_point last_export
Configuration for OpenTelemetry exporters.
std::string compression_type
common::VoidResult validate() const
std::chrono::milliseconds timeout
std::chrono::milliseconds export_interval
std::size_t max_batch_size
std::unordered_map< std::string, std::string > headers
OpenTelemetry attribute representation.
bool operator==(const otel_attribute &other) const
otel_attribute(const std::string &k, const std::string &v)
OpenTelemetry metric data representation.
void add_attribute(const std::string &key, const std::string &attribute_value)
std::vector< otel_attribute > attributes
std::chrono::system_clock::time_point timestamp
OpenTelemetry resource representation.
common::Result< std::string > get_attribute(const std::string &key) const
std::vector< otel_attribute > attributes
void add_attribute(const std::string &key, const std::string &value)
OpenTelemetry span context.
otel_span_context()=default
otel_span_context(const std::string &tid, const std::string &sid)
OpenTelemetry span data representation.
std::chrono::microseconds duration() const
otel_status_code status_code
std::chrono::system_clock::time_point start_time
otel_span_context parent_context
std::vector< std::string > events
void add_attribute(const std::string &key, const std::string &value)
std::string status_message
std::vector< otel_attribute > attributes
otel_span_context context
std::chrono::system_clock::time_point end_time
void add_event(const std::string &event)
Trace context for propagation across service boundaries.
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