Skip to content

Commit a127300

Browse files
committed
Make tracing use the photon thread local
Also cleans up tracing a bit.
1 parent f156806 commit a127300

8 files changed

Lines changed: 126 additions & 113 deletions

File tree

src/bk_download.cpp

Lines changed: 13 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,13 @@ void BkDownload::switch_to_local_file() {
6262
}
6363

6464
bool BkDownload::download_done() {
65-
auto tracer = overlaybd_otel::get_tracer("overlaybd");
66-
auto parent_span = opentelemetry::trace::Tracer::GetCurrentSpan();
67-
opentelemetry::trace::StartSpanOptions options;
68-
options.parent = parent_span->GetContext();
69-
auto span = tracer->StartSpan("overlaybd.download.verify_and_commit", {}, {}, options);
65+
auto tracer = overlaybd_otel::GetTracer();
66+
auto span = tracer->StartSpan("download.verify_and_commit");
7067
auto scope = tracer->WithActiveSpan(span);
7168

7269
auto lfs = new_localfs_adaptor();
7370
if (!lfs) {
7471
span->SetAttribute("error", "failed_to_create_fs_adaptor");
75-
span->End();
7672
LOG_ERROR("new_localfs_adaptor() return NULL");
7773
return false;
7874
}
@@ -87,9 +83,7 @@ bool BkDownload::download_done() {
8783
// verify sha256
8884
photon::semaphore done;
8985
std::string shares;
90-
opentelemetry::trace::StartSpanOptions verify_options;
91-
verify_options.parent = opentelemetry::trace::Tracer::GetCurrentSpan()->GetContext();
92-
auto verify_span = tracer->StartSpan("sha256_verification", {}, {}, verify_options);
86+
auto verify_span = tracer->StartSpan("sha256_verification");
9387
auto verify_scope = tracer->WithActiveSpan(verify_span);
9488
verify_span->SetAttribute("expected_digest", digest);
9589

@@ -109,81 +103,47 @@ bool BkDownload::download_done() {
109103
span->SetAttribute("error", "checksum_mismatch");
110104
span->SetAttribute("expected_digest", digest);
111105
span->SetAttribute("actual_digest", shares);
112-
span->End();
113106
LOG_ERROR("verify checksum ` failed (expect: `, got: `)", old_name, digest, shares);
114107
force_download = true; // force redownload next time
115108
return false;
116109
}
117110

118-
opentelemetry::trace::StartSpanOptions rename_options;
119-
rename_options.parent = opentelemetry::trace::Tracer::GetCurrentSpan()->GetContext();
120-
auto rename_span = tracer->StartSpan("rename_to_commit", {}, {}, rename_options);
121-
auto rename_scope = tracer->WithActiveSpan(rename_span);
122111
int ret = lfs->rename(old_name.c_str(), new_name.c_str());
123-
rename_span->SetAttribute("success", ret == 0);
124-
125112
if (ret != 0) {
126113
span->SetAttribute("error", "rename_failed");
127-
span->End();
128114
LOG_ERRNO_RETURN(0, false, "rename(`,`) failed", old_name, new_name);
129115
}
130116

131117
span->SetAttribute("success", true);
132118
LOG_INFO("download verify done. rename(`,`) success", old_name, new_name);
133-
span->End();
134119
return true;
135120
}
136121

137122
bool BkDownload::download() {
138-
auto tracer = overlaybd_otel::get_tracer("overlaybd");
139-
// Get current span context from parent if it exists
140-
auto parent_span = opentelemetry::trace::Tracer::GetCurrentSpan();
141-
opentelemetry::trace::StartSpanOptions options;
142-
options.parent = parent_span->GetContext();
143-
auto span = tracer->StartSpan("overlaybd.download.lifecycle", {}, {}, options);
123+
auto tracer = overlaybd_otel::GetTracer();
124+
auto span = tracer->StartSpan("download");
144125
auto scope = tracer->WithActiveSpan(span);
145126

146-
span->SetAttribute("url", url);
127+
span->SetAttribute("original_url", url);
147128
span->SetAttribute("dir", dir);
148129
span->SetAttribute("file_size", file_size);
149130

150131
if (check_downloaded(dir)) {
151-
opentelemetry::trace::StartSpanOptions local_options;
152-
local_options.parent = opentelemetry::trace::Tracer::GetCurrentSpan()->GetContext();
153-
auto local_span = tracer->StartSpan("overlaybd.download.switch_to_local", {}, {}, local_options);
154-
auto local_scope = tracer->WithActiveSpan(local_span);
155132
switch_to_local_file();
156133
span->SetAttribute("from_cache", true);
157-
span->End();
134+
span->SetAttribute("success", true);
158135
return true;
159136
}
160137

161138
span->SetAttribute("from_cache", false);
162139
bool success = false;
163140
if (download_blob()) {
164-
opentelemetry::trace::StartSpanOptions verify_options;
165-
verify_options.parent = opentelemetry::trace::Tracer::GetCurrentSpan()->GetContext();
166-
auto verify_span = tracer->StartSpan("overlaybd.download.verify", {}, {}, verify_options);
167-
auto verify_scope = tracer->WithActiveSpan(verify_span);
168-
if (!download_done()) {
169-
verify_span->SetAttribute("success", false);
170-
span->SetAttribute("success", false);
171-
span->End();
172-
return false;
141+
if (download_done()) {
142+
switch_to_local_file();
143+
success = true;
173144
}
174-
verify_span->SetAttribute("success", true);
175-
verify_span->End();
176-
177-
opentelemetry::trace::StartSpanOptions switch_options;
178-
switch_options.parent = opentelemetry::trace::Tracer::GetCurrentSpan()->GetContext();
179-
auto switch_span = tracer->StartSpan("overlaybd.download.switch_to_local", {}, {}, switch_options);
180-
auto switch_scope = tracer->WithActiveSpan(switch_span);
181-
switch_to_local_file();
182-
success = true;
183145
}
184-
185146
span->SetAttribute("success", success);
186-
span->End();
187147
return success;
188148
}
189149

@@ -201,11 +161,8 @@ void BkDownload::unlock_file() {
201161
}
202162

203163
bool BkDownload::download_blob() {
204-
auto tracer = overlaybd_otel::get_tracer("overlaybd");
205-
auto parent_span = opentelemetry::trace::Tracer::GetCurrentSpan();
206-
opentelemetry::trace::StartSpanOptions options;
207-
options.parent = parent_span->GetContext();
208-
auto span = tracer->StartSpan("overlaybd.download.blob", {}, {}, options);
164+
auto tracer = overlaybd_otel::GetTracer();
165+
auto span = tracer->StartSpan("download.blob");
209166
auto scope = tracer->WithActiveSpan(span);
210167

211168
std::string dl_file_path = dir + "/" + DOWNLOAD_TMP_NAME;
@@ -230,7 +187,6 @@ bool BkDownload::download_blob() {
230187
auto dst = open_localfile_adaptor(dl_file_path.c_str(), O_RDWR | O_CREAT, 0644);
231188
if (dst == nullptr) {
232189
span->SetAttribute("error", "failed_to_open_dst");
233-
span->End();
234190
LOG_ERRNO_RETURN(0, false, "failed to open dst file `", dl_file_path.c_str());
235191
}
236192
DEFER(delete dst;);
@@ -243,7 +199,6 @@ bool BkDownload::download_blob() {
243199
::posix_memalign(&buff, ALIGNMENT, bs);
244200
if (buff == nullptr) {
245201
span->SetAttribute("error", "failed_to_allocate_buffer");
246-
span->End();
247202
LOG_ERRNO_RETURN(0, false, "failed to allocate buffer with ", VALUE(bs));
248203
}
249204
DEFER(free(buff));
@@ -256,7 +211,6 @@ bool BkDownload::download_blob() {
256211
while (offset < (ssize_t)file_size) {
257212
if (running != 1) {
258213
span->SetAttribute("error", "download_interrupted");
259-
span->End();
260214
LOG_INFO("image file exit when background downloading");
261215
return false;
262216
}
@@ -279,22 +233,15 @@ bool BkDownload::download_blob() {
279233
if (!(retry--)) {
280234
span->SetAttribute("error", "max_read_retries_exceeded");
281235
span->SetAttribute("failed_offset", offset);
282-
span->End();
283236
LOG_ERROR_RETURN(EIO, false, "failed to read at ", VALUE(offset), VALUE(count));
284237
}
285238
ssize_t rlen;
286239
{
287-
auto read_span = tracer->StartSpan("overlaybd.download.read_block");
288-
auto read_scope = tracer->WithActiveSpan(read_span);
289-
read_span->SetAttribute("offset", offset);
290-
read_span->SetAttribute("size", count);
291240
SCOPE_AUDIT("bk_download", AU_FILEOP(url, offset, rlen));
292241
rlen = src->pread(buff, bs, offset);
293242
if (rlen >= 0) {
294-
read_span->SetAttribute("bytes_read", rlen);
295243
total_bytes_read += rlen;
296244
}
297-
read_span->End();
298245
}
299246
if (rlen < 0) {
300247
retries++;
@@ -306,19 +253,12 @@ bool BkDownload::download_blob() {
306253
if (!(retry--)) {
307254
span->SetAttribute("error", "max_write_retries_exceeded");
308255
span->SetAttribute("failed_offset", offset);
309-
span->End();
310256
LOG_ERROR_RETURN(EIO, false, "failed to write at ", VALUE(offset), VALUE(count));
311257
}
312-
auto write_span = tracer->StartSpan("overlaybd.download.write_block");
313-
auto write_scope = tracer->WithActiveSpan(write_span);
314-
write_span->SetAttribute("offset", offset);
315-
write_span->SetAttribute("size", count);
316258
auto wlen = dst->pwrite(buff, count, offset);
317259
if (wlen >= 0) {
318-
write_span->SetAttribute("bytes_written", wlen);
319260
total_bytes_written += wlen;
320261
}
321-
write_span->End();
322262
// but once write lenth larger than read length treats as OK
323263
if (wlen < rlen) {
324264
retries++;
@@ -333,12 +273,11 @@ bool BkDownload::download_blob() {
333273
span->SetAttribute("total_retries", retries);
334274
span->SetAttribute("success", true);
335275
LOG_INFO("download blob done. (`)", dl_file_path);
336-
span->End();
337276
return true;
338277
}
339278

340279
void bk_download_proc(std::list<BKDL::BkDownload *> &dl_list, uint64_t delay_sec, int &running) {
341-
auto tracer = overlaybd_otel::get_tracer("overlaybd");
280+
auto tracer = overlaybd_otel::GetTracer();
342281
auto span = tracer->StartSpan("background_download_process");
343282
auto scope = tracer->WithActiveSpan(span);
344283

@@ -375,7 +314,6 @@ void bk_download_proc(std::list<BKDL::BkDownload *> &dl_list, uint64_t delay_sec
375314

376315
if (!dl_item->lock_file()) {
377316
dl_span->SetAttribute("status", "lock_failed");
378-
dl_span->End();
379317
dl_list.push_back(dl_item);
380318
continue;
381319
}
@@ -385,22 +323,19 @@ void bk_download_proc(std::list<BKDL::BkDownload *> &dl_list, uint64_t delay_sec
385323

386324
if (running != 1) {
387325
dl_span->SetAttribute("status", "interrupted");
388-
dl_span->End();
389326
LOG_WARN("image exited, background download exit...");
390327
delete dl_item;
391328
break;
392329
}
393330

394331
if (!succ && dl_item->try_cnt > 0) {
395332
dl_span->SetAttribute("status", "retry");
396-
dl_span->End();
397333
dl_list.push_back(dl_item);
398334
LOG_WARN("download failed, push back to download queue and retry `", dl_item->dir);
399335
continue;
400336
}
401337

402338
dl_span->SetAttribute("status", succ ? "success" : "failed");
403-
dl_span->End();
404339

405340
LOG_DEBUG("finish downloading or no retry any more: `, retry_cnt: `", dl_item->dir,
406341
dl_item->try_cnt);
@@ -417,7 +352,6 @@ void bk_download_proc(std::list<BKDL::BkDownload *> &dl_list, uint64_t delay_sec
417352
}
418353
}
419354
LOG_INFO("BACKGROUND DOWNLOAD THREAD EXIT.");
420-
span->End();
421355
}
422356

423357
} // namespace BKDL

src/overlaybd/otel/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
set(SOURCE_OTEL
22
tracer_common.cpp
3+
context_storage.cpp
34
)
45

56
include(FetchContent)
@@ -24,6 +25,7 @@ set_target_properties(otel_lib PROPERTIES LINKER_LANGUAGE CXX)
2425

2526
target_include_directories(otel_lib PUBLIC
2627
${CMAKE_CURRENT_SOURCE_DIR}
28+
${PHOTON_INCLUDE_DIR}
2729
${opentelemetry-cpp_SOURCE_DIR}/api/include
2830
${opentelemetry-cpp_SOURCE_DIR}/sdk/include
2931
${opentelemetry-cpp_SOURCE_DIR}/exporters/otlp/include
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include "context_storage.h"
2+
3+
#include <vector>
4+
5+
#include "photon/thread/thread-local.h"
6+
7+
using opentelemetry::context::Context;
8+
using opentelemetry::context::Token;
9+
10+
static std::vector<Context>& GetStack() {
11+
static photon::thread_local_ptr<std::vector<Context>> stack;
12+
return *stack;
13+
}
14+
15+
namespace overlaybd_otel {
16+
17+
Context LibPhotonContextStorage::GetCurrent() noexcept {
18+
std::vector<Context>& stack = GetStack();
19+
if (stack.empty()) {
20+
return Context();
21+
}
22+
return stack.back();
23+
}
24+
25+
bool LibPhotonContextStorage::Detach(Token &token) noexcept {
26+
std::vector<Context>& stack = GetStack();
27+
if (stack.empty()) {
28+
return false;
29+
}
30+
for (auto it = stack.rbegin(); it != stack.rend(); ++it) {
31+
if (token == *it) {
32+
stack.erase(std::prev(it.base()), stack.end());
33+
return true;
34+
}
35+
}
36+
return false;
37+
}
38+
39+
opentelemetry::nostd::unique_ptr<Token> LibPhotonContextStorage::Attach(const Context& context) noexcept {
40+
std::vector<Context>& stack = GetStack();
41+
stack.push_back(context);
42+
return CreateToken(context);
43+
}
44+
45+
} // overlaybd_otel
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#pragma once
2+
#include <iterator>
3+
#include <vector>
4+
5+
#include "opentelemetry/context/runtime_context.h"
6+
7+
namespace overlaybd_otel {
8+
9+
// ContextStorage implementation that uses photonlib's coroutine-aware thread local storage.
10+
class LibPhotonContextStorage : public opentelemetry::context::RuntimeContextStorage {
11+
public:
12+
LibPhotonContextStorage() noexcept = default;
13+
14+
opentelemetry::context::Context GetCurrent() noexcept override;
15+
16+
bool Detach(opentelemetry::context::Token &token) noexcept override;
17+
18+
opentelemetry::nostd::unique_ptr<opentelemetry::context::Token> Attach(const opentelemetry::context::Context& context) noexcept override;
19+
};
20+
21+
} // overlaybd_otel
Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,37 @@
1+
#include "opentelemetry/context/runtime_context.h"
12
#include "tracer_common.h"
3+
#include "context_storage.h"
24

35
namespace overlaybd_otel {
46

57
void InitTracer() {
6-
// Create OTLP HTTP exporter configuration
7-
opentelemetry::exporter::otlp::OtlpHttpExporterOptions opts;
8-
8+
// Install a libphoton coroutine-aware context storage implementation, which uses libphoton's thread-local implementation.
9+
opentelemetry::context::RuntimeContext::SetRuntimeContextStorage(
10+
opentelemetry::nostd::unique_ptr<opentelemetry::context::RuntimeContextStorage>(
11+
new LibPhotonContextStorage()));
12+
913
// Create OTLP/HTTP exporter using the factory
10-
auto exporter = opentelemetry::exporter::otlp::OtlpHttpExporterFactory::Create(opts);
11-
12-
opentelemetry::sdk::trace::BatchSpanProcessorOptions bspOpts{};
13-
auto processor =
14-
opentelemetry::sdk::trace::BatchSpanProcessorFactory::Create(std::move(exporter), bspOpts);
15-
16-
// Create a simple processor (we'll use simple instead of batch for now)
17-
// auto processor =
18-
// opentelemetry::sdk::trace::SimpleSpanProcessorFactory::Create(std::move(exporter));
1914
std::vector<std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>> processors;
20-
processors.push_back(std::move(processor));
15+
processors.push_back(
16+
opentelemetry::sdk::trace::BatchSpanProcessorFactory::Create(
17+
opentelemetry::exporter::otlp::OtlpHttpExporterFactory::Create(), {}));
2118

2219
// Default is an always-on sampler
23-
std::unique_ptr<opentelemetry::sdk::trace::TracerContext> context =
24-
opentelemetry::sdk::trace::TracerContextFactory::Create(std::move(processors));
2520
std::shared_ptr<opentelemetry::trace::TracerProvider> provider =
26-
opentelemetry::sdk::trace::TracerProviderFactory::Create(std::move(context));
21+
opentelemetry::sdk::trace::TracerProviderFactory::Create(
22+
opentelemetry::sdk::trace::TracerContextFactory::Create(std::move(processors)));
2723

2824
// Set the global trace provider
2925
opentelemetry::sdk::trace::Provider::SetTracerProvider(provider);
30-
31-
// // set global propagator
32-
// opentelemetry::context::propagation::GlobalTextMapPropagator::SetGlobalPropagator(
33-
// opentelemetry::nostd::shared_ptr<opentelemetry::context::propagation::TextMapPropagator>(
34-
// new opentelemetry::trace::propagation::HttpTraceContext()));
3526
}
3627

3728
void CleanupTracer() {
3829
std::shared_ptr<opentelemetry::trace::TracerProvider> none;
3930
opentelemetry::sdk::trace::Provider::SetTracerProvider(none);
4031
}
4132

42-
opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> get_tracer(std::string tracer_name) {
43-
auto provider = opentelemetry::trace::Provider::GetTracerProvider();
44-
return provider->GetTracer(tracer_name);
33+
opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> GetTracer(opentelemetry::nostd::string_view tracer_name) {
34+
return opentelemetry::trace::Provider::GetTracerProvider()->GetTracer(tracer_name);
4535
}
4636

4737
} // namespace overlaybd_otel

0 commit comments

Comments
 (0)