Skip to content

Commit 88690b0

Browse files
Update otel_tracer.h
1 parent b2f90e1 commit 88690b0

File tree

1 file changed

+89
-33
lines changed

1 file changed

+89
-33
lines changed
Lines changed: 89 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,106 @@
11
#pragma once
22

3-
#include <ydb-cpp-sdk/client/tracing/tracer.h>
3+
#include "tracer.h"
4+
45
#include <opentelemetry/trace/tracer.h>
56
#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>
710

8-
namespace NYdb::inline V3 {
11+
namespace NYdb {
912
namespace NTracing {
1013

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+
}
1522

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);
2029
}
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)) {}
2157

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});
2679
}
2780

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;
4392
}
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+
}
44100

45-
private:
46-
opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> Tracer_;
47-
};
101+
private:
102+
std::shared_ptr<opentelemetry::trace::Tracer> tracer_;
103+
};
48104

49105
} // namespace NTracing
50106
} // namespace NYdb

0 commit comments

Comments
 (0)