ZeroTierOne/ext/opentelemetry-cpp-1.21.0/opentracing-shim/include/opentelemetry/opentracingshim/propagation.h
2025-07-11 10:37:21 -07:00

94 lines
2.9 KiB
C++

/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include "opentracing/propagation.h"
#include "opentracing/value.h"
#include "opentelemetry/baggage/baggage.h"
#include "opentelemetry/common/attribute_value.h"
#include "opentelemetry/context/propagation/text_map_propagator.h"
#include "opentelemetry/nostd/function_ref.h"
#include "opentelemetry/nostd/string_view.h"
OPENTELEMETRY_BEGIN_NAMESPACE
namespace opentracingshim
{
class CarrierWriterShim : public opentelemetry::context::propagation::TextMapCarrier
{
public:
CarrierWriterShim(const opentracing::TextMapWriter &writer) : writer_(writer) {}
virtual nostd::string_view Get(nostd::string_view) const noexcept override
{
return {}; // Not required for Opentracing writer
}
virtual void Set(nostd::string_view key, nostd::string_view value) noexcept override
{
writer_.Set(opentracing::string_view{key.data(), key.size()},
opentracing::string_view{value.data(), value.size()});
}
private:
const opentracing::TextMapWriter &writer_;
};
class CarrierReaderShim : public opentelemetry::context::propagation::TextMapCarrier
{
public:
CarrierReaderShim(const opentracing::TextMapReader &reader) : reader_(reader) {}
virtual nostd::string_view Get(nostd::string_view key) const noexcept override
{
nostd::string_view value;
// First try carrier.LookupKey since that can potentially be the fastest approach.
if (auto result = reader_.LookupKey(opentracing::string_view{key.data(), key.size()}))
{
value = nostd::string_view{result.value().data(), result.value().size()};
}
else // Fall back to iterating through all of the keys.
{
reader_.ForeachKey([key, &value](opentracing::string_view k,
opentracing::string_view v) -> opentracing::expected<void> {
if (key == nostd::string_view{k.data(), k.size()})
{
value = nostd::string_view{v.data(), v.size()};
// Found key, so bail out of the loop with a success error code.
return opentracing::make_unexpected(std::error_code{});
}
return opentracing::make_expected();
});
}
return value;
}
virtual void Set(nostd::string_view, nostd::string_view) noexcept override
{
// Not required for Opentracing reader
}
virtual bool Keys(nostd::function_ref<bool(nostd::string_view)> callback) const noexcept override
{
return reader_
.ForeachKey([&callback](opentracing::string_view key,
opentracing::string_view) -> opentracing::expected<void> {
return callback(nostd::string_view{key.data(), key.size()})
? opentracing::make_expected()
: opentracing::make_unexpected(std::error_code{});
})
.has_value();
}
private:
const opentracing::TextMapReader &reader_;
};
} // namespace opentracingshim
OPENTELEMETRY_END_NAMESPACE