20#include <unordered_map>
29namespace kcenon {
namespace monitoring {
32class trace_exporter_interface;
57 std::chrono::system_clock::time_point
end_time;
61 std::unordered_map<std::string, std::string>
tags;
62 std::unordered_map<std::string, std::string>
baggage;
77 return end_time != std::chrono::system_clock::time_point{};
85 duration = std::chrono::duration_cast<std::chrono::microseconds>(
100 std::unordered_map<std::string, std::string>
baggage;
115 if (header.length() < 55) {
117 "Invalid traceparent header length");
124 size_t dash1 = header.find(
'-', pos);
125 size_t dash2 = header.find(
'-', dash1 + 1);
126 size_t dash3 = header.find(
'-', dash2 + 1);
128 if (dash1 == std::string::npos || dash2 == std::string::npos || dash3 == std::string::npos) {
130 "Invalid traceparent header format");
134 ctx.
trace_id = header.substr(dash1 + 1, dash2 - dash1 - 1);
135 ctx.
span_id = header.substr(dash2 + 1, dash3 - dash2 - 1);
138 return common::ok(ctx);
216 const std::
string& operation_name,
217 const std::
string& service_name = "monitoring_system"
225 const std::
string& operation_name
233 const std::
string& operation_name
259 template<typename Carrier>
262 if (!context.trace_state.empty()) {
263 carrier[
"tracestate"] = context.trace_state;
266 for (
const auto& [key, value] : context.baggage) {
267 carrier[
"baggage-" + key] = value;
274 template<
typename Carrier>
276 auto traceparent_it = carrier.find(
"traceparent");
277 if (traceparent_it == carrier.end()) {
279 "Traceparent not found in carrier").to_common_error());
283 if (ctx_result.is_err()) {
284 return common::Result<trace_context>::err(ctx_result.error());
287 auto ctx = ctx_result.value();
290 auto tracestate_it = carrier.find(
"tracestate");
291 if (tracestate_it != carrier.end()) {
292 ctx.trace_state = tracestate_it->second;
296 for (
const auto& [key, value] : carrier) {
297 if (key.find(
"baggage-") == 0) {
298 ctx.baggage[key.substr(8)] = value;
308 common::Result<std::vector<trace_span>>
get_trace(
const std::string& trace_id)
const;
381 other.tracer_ =
nullptr;
385 if (
this != &
other) {
391 other.tracer_ =
nullptr;
410#define TRACE_SPAN(operation_name) \
411 auto _span_result = kcenon::monitoring::global_tracer().start_span(operation_name); \
412 kcenon::monitoring::scoped_span _scoped_span( \
413 _span_result.is_ok() ? _span_result.value() : nullptr, \
414 &kcenon::monitoring::global_tracer() \
417#define TRACE_CHILD_SPAN(parent, operation_name) \
418 auto _child_span_result = kcenon::monitoring::global_tracer().start_child_span(parent, operation_name); \
419 kcenon::monitoring::scoped_span _child_scoped_span( \
420 _child_span_result.is_ok() ? _child_span_result.value() : nullptr, \
421 &kcenon::monitoring::global_tracer() \
Distributed tracer for managing spans and traces.
distributed_tracer & operator=(const distributed_tracer &)=delete
std::shared_ptr< trace_span > get_current_span() const
Get current active span for this thread.
std::unordered_map< std::string, std::size_t > get_export_stats() const
Get export statistics.
std::shared_ptr< trace_exporter_interface > get_exporter() const
Get the current trace exporter.
common::Result< std::shared_ptr< trace_span > > start_span_from_context(const trace_context &context, const std::string &operation_name)
Start a span from trace context (for incoming requests)
common::Result< trace_context > extract_context_from_carrier(const Carrier &carrier)
Extract trace context from carrier.
std::unique_ptr< tracer_impl > impl_
void configure_export(const trace_export_settings &settings)
Configure export settings.
distributed_tracer(const distributed_tracer &)=delete
trace_export_settings get_export_settings() const
Get current export settings.
trace_context extract_context(const trace_span &span) const
Extract trace context for propagation.
common::Result< bool > export_spans(std::vector< trace_span > spans)
Export spans to external system.
void inject_context(const trace_context &context, Carrier &carrier)
Inject trace context into carrier (e.g., HTTP headers)
common::Result< std::vector< trace_span > > get_trace(const std::string &trace_id) const
Get all spans for a trace.
void set_exporter(std::shared_ptr< trace_exporter_interface > exporter)
Set the trace exporter for span export.
distributed_tracer(distributed_tracer &&) noexcept
common::VoidResult flush()
Manually flush all pending spans to exporter.
void set_current_span(std::shared_ptr< trace_span > span)
Set current active span for this thread.
common::Result< std::shared_ptr< trace_span > > start_span(const std::string &operation_name, const std::string &service_name="monitoring_system")
Start a new root span.
common::Result< bool > finish_span(std::shared_ptr< trace_span > span)
Finish a span.
common::Result< std::shared_ptr< trace_span > > start_child_span(const trace_span &parent, const std::string &operation_name)
Start a child span.
Scoped span for RAII-style span management.
distributed_tracer * tracer_
scoped_span(const scoped_span &)=delete
const trace_span * operator->() const
std::shared_ptr< trace_span > span_
scoped_span(scoped_span &&other) noexcept
scoped_span & operator=(const scoped_span &)=delete
const trace_span & operator*() const
scoped_span & operator=(scoped_span &&other) noexcept
trace_span * operator->()
scoped_span(std::shared_ptr< trace_span > span, distributed_tracer *tracer)
Span builder for creating new spans.
span_builder & with_baggage(const std::string &key, const std::string &value)
span_builder & with_trace_id(const std::string &id)
span_builder & with_parent(const std::string &parent_id)
span_builder & with_tag(const std::string &key, const std::string &value)
span_builder & with_service(const std::string &name)
span_builder & with_operation(const std::string &name)
static std::string generate_correlation_id()
Generate a unique correlation ID.
static std::string generate_request_id()
Generate a unique request ID.
Monitoring system specific error codes.
distributed_tracer & global_tracer()
Global tracer instance.
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.
Trace context for propagation across service boundaries.
std::string to_w3c_traceparent() const
Serialize to W3C Trace Context format.
std::unordered_map< std::string, std::string > baggage
static common::Result< trace_context > from_w3c_traceparent(const std::string &header)
Parse from W3C Trace Context format.
Configuration settings for trace export behavior.
std::size_t max_queue_size
Maximum spans in queue before dropping.
bool export_on_finish
Export when batch is full.
std::chrono::milliseconds flush_interval
Interval for automatic flush.
std::size_t batch_size
Number of spans to batch before export.
Trace span representing a unit of work in distributed tracing.
std::string parent_span_id
void calculate_duration()
Calculate duration if span is finished.
std::unordered_map< std::string, std::string > tags
std::unordered_map< std::string, std::string > baggage
std::chrono::system_clock::time_point end_time
std::chrono::microseconds duration
std::string operation_name
bool is_finished() const
Check if span has finished.
std::chrono::system_clock::time_point start_time
std::string status_message
Thread-local context management for request tracking and distributed tracing.