|
1 | 1 | #pragma once
|
2 | 2 |
|
3 |
| -#include <ydb-cpp-sdk/client/tracing/tracer.h> |
| 3 | +#include "tracer.h" |
| 4 | + |
4 | 5 | #include <opentelemetry/trace/tracer.h>
|
5 | 6 | #include <opentelemetry/trace/span.h>
|
6 |
| -#include <opentelemetry/common/attribute_value.h> |
| 7 | +#include <opentelemetry/trace/span_context.h> |
| 8 | +#include <opentelemetry/context/runtime_context.h> |
| 9 | +#include <opentelemetry/common/key_value_iterable_view.h> |
7 | 10 |
|
8 |
| -namespace NYdb::inline V3 { |
| 11 | +namespace NYdb { |
9 | 12 | namespace NTracing {
|
10 | 13 |
|
11 |
| - class TOpenTelemetrySpan : public ISpan { |
12 |
| - public: |
13 |
| - explicit TOpenTelemetrySpan(opentelemetry::nostd::shared_ptr<opentelemetry::trace::Span> span) |
14 |
| - : Span_(std::move(span)) {} |
| 14 | +class OpenTelemetrySpan : public ISpan { |
| 15 | +public: |
| 16 | + OpenTelemetrySpan(opentelemetry::trace::Span span, std::shared_ptr<TTraceContext> context) |
| 17 | + : span_(std::move(span)), context_(std::move(context)) {} |
| 18 | + |
| 19 | + void AddAttribute(const std::string& key, const std::string& value) override { |
| 20 | + span_.SetAttribute(key, value); |
| 21 | + } |
15 | 22 |
|
16 |
| - void AddAttribute(const std::string& key, const std::string& value) override { |
17 |
| - if (Span_) { |
18 |
| - Span_->SetAttribute(key, value); |
19 |
| - } |
| 23 | + void AddEvent(const std::string& name, const TAttributeMap& attributes = {}) override { |
| 24 | + // Преобразуем std::unordered_map в вектор KeyValue для OpenTelemetry |
| 25 | + std::vector<opentelemetry::common::KeyValue> otelAttributes; |
| 26 | + otelAttributes.reserve(attributes.size()); |
| 27 | + for (const auto& [k, v] : attributes) { |
| 28 | + otelAttributes.emplace_back(k, v); |
20 | 29 | }
|
| 30 | + span_.AddEvent(name, otelAttributes); |
| 31 | + } |
| 32 | + |
| 33 | + void SetStatus(bool isError, const std::string& description = "") override { |
| 34 | + span_.SetStatus(isError ? opentelemetry::trace::StatusCode::kError |
| 35 | + : opentelemetry::trace::StatusCode::kOk, |
| 36 | + description); |
| 37 | + } |
| 38 | + |
| 39 | + void End() override { |
| 40 | + span_.End(); |
| 41 | + } |
| 42 | + |
| 43 | + const TTraceContext& GetContext() const override { |
| 44 | + return *context_; |
| 45 | + } |
| 46 | + |
| 47 | +private: |
| 48 | + opentelemetry::trace::Span span_; |
| 49 | + std::shared_ptr<TTraceContext> context_; |
| 50 | +}; |
| 51 | + |
| 52 | + |
| 53 | +class OpenTelemetryTracer : public ITracer { |
| 54 | +public: |
| 55 | + explicit OpenTelemetryTracer(std::shared_ptr<opentelemetry::trace::Tracer> tracer) |
| 56 | + : tracer_(std::move(tracer)) {} |
21 | 57 |
|
22 |
| - void End() override { |
23 |
| - if (Span_) { |
24 |
| - Span_->End(); |
25 |
| - } |
| 58 | + std::unique_ptr<ISpan> StartSpan( |
| 59 | + const std::string& name, |
| 60 | + const TAttributeMap& attributes = {}, |
| 61 | + std::shared_ptr<TTraceContext> parentContext = nullptr |
| 62 | + ) override { |
| 63 | + opentelemetry::context::Context otelContext; |
| 64 | + |
| 65 | + if (parentContext) { |
| 66 | + auto traceId = opentelemetry::trace::TraceId::FromHex(parentContext->GetTraceId()); |
| 67 | + auto spanId = opentelemetry::trace::SpanId::FromHex(parentContext->GetSpanId()); |
| 68 | + |
| 69 | + auto spanContext = opentelemetry::trace::SpanContext::Create( |
| 70 | + traceId, |
| 71 | + spanId, |
| 72 | + opentelemetry::trace::TraceFlags::kIsSampled, |
| 73 | + false // remote |
| 74 | + ); |
| 75 | + |
| 76 | + otelContext = opentelemetry::context::Context{}.SetValue( |
| 77 | + opentelemetry::trace::kSpanKey, |
| 78 | + opentelemetry::trace::Span{spanContext}); |
26 | 79 | }
|
27 | 80 |
|
28 |
| - private: |
29 |
| - opentelemetry::nostd::shared_ptr<opentelemetry::trace::Span> Span_; |
30 |
| - }; |
31 |
| - |
32 |
| - class TOpenTelemetryTracer : public ITracer { |
33 |
| - public: |
34 |
| - explicit TOpenTelemetryTracer(opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> tracer) |
35 |
| - : Tracer_(std::move(tracer)) {} |
36 |
| - |
37 |
| - std::unique_ptr<ISpan> StartSpan(const std::string& name) override { |
38 |
| - if (!Tracer_) { |
39 |
| - return nullptr; |
40 |
| - } |
41 |
| - auto span = Tracer_->StartSpan(name); |
42 |
| - return std::make_unique<TOpenTelemetrySpan>(std::move(span)); |
| 81 | + auto span = tracer_->StartSpan(name, attributes, otelContext); |
| 82 | + |
| 83 | + auto context = parentContext ? parentContext->CreateChild() : TTraceContext::GenerateNew(); |
| 84 | + |
| 85 | + return std::make_unique<OpenTelemetrySpan>(std::move(span), std::move(context)); |
| 86 | + } |
| 87 | + |
| 88 | + std::shared_ptr<TTraceContext> GetCurrentContext() const override { |
| 89 | + auto currentSpan = opentelemetry::trace::GetCurrentSpan(); |
| 90 | + if (!currentSpan.IsValid()) { |
| 91 | + return nullptr; |
43 | 92 | }
|
| 93 | + auto spanContext = currentSpan.GetContext(); |
| 94 | + |
| 95 | + return std::make_shared<TTraceContext>( |
| 96 | + spanContext.trace_id().ToHex(), |
| 97 | + spanContext.span_id().ToHex(), |
| 98 | + spanContext.IsValid() ? spanContext.trace_id().ToHex() : ""); |
| 99 | + } |
44 | 100 |
|
45 |
| - private: |
46 |
| - opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> Tracer_; |
47 |
| - }; |
| 101 | +private: |
| 102 | + std::shared_ptr<opentelemetry::trace::Tracer> tracer_; |
| 103 | +}; |
48 | 104 |
|
49 | 105 | } // namespace NTracing
|
50 | 106 | } // namespace NYdb
|
0 commit comments