include_directories(SYSTEM src/blkin/blkin-lib)
endif(WITH_BLKIN)
-option(WITH_JAEGER "Enable jaegertracing and it's dependent libraries" ON)
+option(WITH_JAEGER "Enable jaegertracing and it's dependent libraries" OFF)
if(WITH_JAEGER)
set(HAVE_JAEGER TRUE)
endif()
%endif
%endif
%bcond_with seastar
-%bcond_without jaeger
+%bcond_with jaeger
%if 0%{?fedora} || 0%{?suse_version} >= 1500
# distros that ship cmd2 and/or colorama
%bcond_without cephfs_shell
endfunction()
function(build_opentelemetry)
- set(opentelemetry_SOURCE_DIR "${PROJECT_SOURCE_DIR}/src/opentelemetry-cpp")
+ set(opentelemetry_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/opentelemetry-cpp")
set(opentelemetry_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/opentelemetry-cpp")
set(opentelemetry_cpp_targets opentelemetry_trace opentelemetry_exporter_jaeger_trace)
set(opentelemetry_CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DWITH_JAEGER=ON
-DBUILD_TESTING=OFF
- -DCMAKE_BUILD_TYPE=Release
- -DWITH_EXAMPLES=OFF)
+ -DWITH_EXAMPLES=OFF
+ -DBoost_INCLUDE_DIR=${CMAKE_BINARY_DIR}/boost/include)
set(opentelemetry_libs
${opentelemetry_BINARY_DIR}/sdk/src/trace/libopentelemetry_trace.a
${opentelemetry_SOURCE_DIR}/exporters/jaeger/include/
${opentelemetry_SOURCE_DIR}/ext/include/
${opentelemetry_SOURCE_DIR}/sdk/include/)
+ include_directories(SYSTEM ${opentelemetry_include_dir})
# TODO: add target based propogation
set(opentelemetry_deps opentelemetry_trace opentelemetry_resources opentelemetry_common
opentelemetry_exporter_jaeger_trace http_client_curl
${opentelemetry_cpp_targets})
endif()
- if(WITH_SYSTEM_BOOST)
- list(APPEND opentelemetry_CMAKE_ARGS -DBOOST_ROOT=${BOOST_ROOT})
- else()
+ if(NOT WITH_SYSTEM_BOOST)
list(APPEND dependencies Boost)
- list(APPEND opentelemetry_CMAKE_ARGS -DBoost_INCLUDE_DIR=${CMAKE_BINARY_DIR}/boost/include)
endif()
include(ExternalProject)
# will do all linking and path setting fake include path for
# interface_include_directories since this happens at build time
- file(MAKE_DIRECTORY ${opentelemetry_include_dir})
+ file(MAKE_DIRECTORY
+ "${opentelemetry_BINARY_DIR}/opentelemetry-cpp/exporters/jaeger/include")
add_library(opentelemetry::libopentelemetry INTERFACE IMPORTED)
add_dependencies(opentelemetry::libopentelemetry opentelemetry-cpp)
set_target_properties(
opentelemetry::libopentelemetry
PROPERTIES
- INTERFACE_LINK_LIBRARIES "${opentelemetry_deps}"
- INTERFACE_INCLUDE_DIRECTORIES "${opentelemetry_include_dir}")
+ INTERFACE_LINK_LIBRARIES "${opentelemetry_deps}")
endfunction()
Uploaders: Ken Dreyer <kdreyer@redhat.com>,
Alfredo Deza <adeza@redhat.com>,
Build-Depends: automake,
- bison,
+ bison <pkg.ceph.jaeger>,
cmake (>= 3.10.2),
cpio,
cython3,
default-jdk,
dh-exec,
dh-python,
- flex,
+ flex <pkg.ceph.jaeger>,
git,
golang,
gperf,
libcap-ng-dev,
libcunit1-dev,
libcurl4-openssl-dev,
- libevent-dev,
+ libevent-dev <pkg.ceph.jaeger>,
libexpat1-dev,
libffi-dev [!amd64] <pkg.ceph.check>,
libfmt-dev (>= 6.1.2),
librdkafka-dev,
luarocks,
libthrift-dev (>= 0.13.0),
- libyaml-cpp-dev (>= 0.6),
+ libyaml-cpp-dev (>= 0.6) <pkg.ceph.crimson> <pkg.ceph.jaeger>,
libzstd-dev <pkg.ceph.check>,
libxmlsec1 <pkg.ceph.check>,
libxmlsec1-nss <pkg.ceph.check>,
libxmlsec1-openssl <pkg.ceph.check>,
libxmlsec1-dev <pkg.ceph.check>,
ninja-build,
- nlohmann-json3-dev,
+ nlohmann-json3-dev <pkg.ceph.jaeger>,
patch,
pkg-config,
prometheus <pkg.ceph.check>,
else
export CEPH_OSD_BASENAME = crimson-osd
endif
+ifeq ($(filter pkg.ceph.jaeger,$(DEB_BUILD_PROFILES)),)
+ extraopts += -DWITH_JAEGER=OFF
+else
+ extraopts += -DWITH_JAEGER=ON
+endif
ifneq ($(filter pkg.ceph.arrow,$(DEB_BUILD_PROFILES)),)
extraopts += -DWITH_SYSTEM_ARROW=ON
endif
-extraopts += -DWITH_JAEGER=ON
extraopts += -DWITH_SYSTEM_UTF8PROC=ON
extraopts += -DWITH_OCF=ON -DWITH_LTTNG=ON
extraopts += -DWITH_MGR_DASHBOARD_FRONTEND=OFF
-D WITH_MGR=YES \
-D WITH_RDMA=OFF \
-D WITH_SPDK=OFF \
- -D WITH_JAEGER=OFF \
2>&1 | tee cmake.log
echo -n "start building: "; date
shift
local for_make_check=$1
shift
+ local with_jaeger=$1
+ shift
local OUTFILE=$1
sed -e 's/@//g' < ceph.spec.in > $OUTFILE
# http://rpm.org/user_doc/conditional_builds.html
if $with_seastar; then
sed -i -e 's/%bcond_with seastar/%bcond_without seastar/g' $OUTFILE
fi
+ if $with_jaeger; then
+ sed -i -e 's/%bcond_with jaeger/%bcond_without jaeger/g' $OUTFILE
+ fi
if $with_zbd; then
sed -i -e 's/%bcond_with zbd/%bcond_without zbd/g' $OUTFILE
fi
grep -v babeltrace debian/control > $control
;;
esac
+ if $with_jaeger; then
+ sed -i -e 's/^# Jaeger[[:space:]]//g' $control
+ sed -i -e 's/^# Crimson libyaml-cpp-dev,/d' $control
+ fi
echo $control
}
exit
else
[ $WITH_SEASTAR ] && with_seastar=true || with_seastar=false
+ [ $WITH_JAEGER ] && with_jaeger=true || with_jaeger=false
[ $WITH_ZBD ] && with_zbd=true || with_zbd=false
[ $WITH_PMEM ] && with_pmem=true || with_pmem=false
[ $WITH_RADOSGW_MOTR ] && with_rgw_motr=true || with_rgw_motr=false
if $with_seastar; then
build_profiles+=",pkg.ceph.crimson"
fi
+ if $with_jaeger; then
+ build_profiles+=",pkg.ceph.jaeger"
+ fi
in_jenkins && cat <<EOF
CI_DEBUG: for_make_check=$for_make_check
fi
;;
esac
- munge_ceph_spec_in $with_seastar $with_zbd $for_make_check $DIR/ceph.spec
+ munge_ceph_spec_in $with_seastar $with_zbd $for_make_check $with_jaeger $DIR/ceph.spec
# for python3_pkgversion macro defined by python-srpm-macros, which is required by python3-devel
$SUDO dnf install -y python3-devel
$SUDO $builddepcmd $DIR/ceph.spec 2>&1 | tee $DIR/yum-builddep.out
echo "Using zypper to install dependencies"
zypp_install="zypper --gpg-auto-import-keys --non-interactive install --no-recommends"
$SUDO $zypp_install systemd-rpm-macros rpm-build || exit 1
- munge_ceph_spec_in $with_seastar false $for_make_check $DIR/ceph.spec
+ munge_ceph_spec_in $with_seastar false $for_make_check $with_jaeger $DIR/ceph.spec
$SUDO $zypp_install $(rpmspec -q --buildrequires $DIR/ceph.spec) || exit 1
;;
*)
find_package(thrift 0.13.0 REQUIRED)
include(BuildOpentelemetry)
build_opentelemetry()
- add_library(jaeger_base INTERFACE)
- target_link_libraries(jaeger_base INTERFACE opentelemetry::libopentelemetry
- thrift::libthrift)
- add_dependencies(common-objs jaeger_base)
- target_link_libraries(common-objs jaeger_base)
+ set(jaeger_base opentelemetry::libopentelemetry thrift::libthrift)
+ add_dependencies(common-objs ${jaeger_base})
+ target_link_libraries(common-objs ${jaeger_base})
endif()
CHECK_C_COMPILER_FLAG("-fvar-tracking-assignments" HAS_VTA)
endif()
if(WITH_JAEGER)
- list(APPEND ceph_common_deps jaeger_base)
+ list(APPEND ceph_common_deps ${jaeger_base})
endif()
if(WIN32)
add_library(common STATIC ${ceph_common_objs})
target_link_libraries(common ${ceph_common_deps})
-add_dependencies(common legacy-option-headers)
-if(WITH_JAEGER)
-add_dependencies(common jaeger_base)
-endif()
+add_dependencies(common legacy-option-headers ${jaeger_base})
if (WIN32)
# Statically building ceph-common on Windows fails. We're temporarily
if(ENABLE_COVERAGE)
target_link_libraries(ceph-common gcov)
endif(ENABLE_COVERAGE)
-
-add_dependencies(ceph-common legacy-option-headers)
-
-if(WITH_JAEGER)
-add_dependencies(ceph-common jaeger_base)
-endif()
-
+add_dependencies(ceph-common legacy-option-headers ${jaeger_base})
# appease dpkg-shlibdeps
set_target_properties(ceph-common PROPERTIES
SOVERSION 2
#include "tracer.h"
#ifdef HAVE_JAEGER
-#include "opentelemetry/sdk/trace/batch_span_processor.h"
-#include "opentelemetry/sdk/trace/tracer_provider.h"
-#include "opentelemetry/exporters/jaeger/jaeger_exporter.h"
+
namespace tracing {
const opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> Tracer::noop_tracer = opentelemetry::trace::Provider::GetTracerProvider()->GetTracer("no-op", OPENTELEMETRY_SDK_VERSION);
-const jspan Tracer::noop_span = noop_tracer->StartSpan("noop");
using bufferlist = ceph::buffer::list;
void Tracer::init(opentelemetry::nostd::string_view service_name) {
if (!tracer) {
- const opentelemetry::exporter::jaeger::JaegerExporterOptions exporter_options;
- const opentelemetry::sdk::trace::BatchSpanProcessorOptions processor_options;
+ const opentelemetry::exporter::jaeger::JaegerExporterOptions opts;
+ auto jaeger_exporter = std::unique_ptr<opentelemetry::sdk::trace::SpanExporter>(new opentelemetry::exporter::jaeger::JaegerExporter(opts));
+ auto processor = std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>(new opentelemetry::sdk::trace::SimpleSpanProcessor(std::move(jaeger_exporter)));
const auto jaeger_resource = opentelemetry::sdk::resource::Resource::Create(std::move(opentelemetry::sdk::resource::ResourceAttributes{{"service.name", service_name}}));
- auto jaeger_exporter = std::unique_ptr<opentelemetry::sdk::trace::SpanExporter>(new opentelemetry::exporter::jaeger::JaegerExporter(exporter_options));
- auto processor = std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>(new opentelemetry::sdk::trace::BatchSpanProcessor(std::move(jaeger_exporter), processor_options));
const auto provider = opentelemetry::nostd::shared_ptr<opentelemetry::trace::TracerProvider>(new opentelemetry::sdk::trace::TracerProvider(std::move(processor), jaeger_resource));
tracer = provider->GetTracer(service_name, OPENTELEMETRY_SDK_VERSION);
}
}
+void Tracer::shutdown() {
+ if (tracer) {
+ tracer->CloseWithMicroseconds(1);
+ }
+}
+
jspan Tracer::start_trace(opentelemetry::nostd::string_view trace_name) {
if (is_enabled()) {
return tracer->StartSpan(trace_name);
}
- return noop_span;
+ return noop_tracer->StartSpan(trace_name);
}
jspan Tracer::start_trace(opentelemetry::nostd::string_view trace_name, bool trace_is_enabled) {
jspan Tracer::add_span(opentelemetry::nostd::string_view span_name, const jspan& parent_span) {
if (is_enabled() && parent_span->IsRecording()) {
- opentelemetry::trace::StartSpanOptions span_opts;
- span_opts.parent = parent_span->GetContext();
- return tracer->StartSpan(span_name, span_opts);
+ const auto parent_ctx = parent_span->GetContext();
+ return add_span(span_name, parent_ctx);
}
- return noop_span;
+ return noop_tracer->StartSpan(span_name);
}
jspan Tracer::add_span(opentelemetry::nostd::string_view span_name, const jspan_context& parent_ctx) {
span_opts.parent = parent_ctx;
return tracer->StartSpan(span_name, span_opts);
}
- return noop_span;
+ return noop_tracer->StartSpan(span_name);
}
bool Tracer::is_enabled() const {
#include "include/buffer.h"
#ifdef HAVE_JAEGER
+
#include "opentelemetry/trace/provider.h"
+#include "opentelemetry/exporters/jaeger/jaeger_exporter.h"
+#include "opentelemetry/sdk/trace/simple_processor.h"
+#include "opentelemetry/sdk/trace/tracer_provider.h"
using jspan = opentelemetry::nostd::shared_ptr<opentelemetry::trace::Span>;
using jspan_context = opentelemetry::trace::SpanContext;
class Tracer {
private:
const static opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> noop_tracer;
- const static jspan noop_span;
opentelemetry::nostd::shared_ptr<opentelemetry::trace::Tracer> tracer;
public:
Tracer(opentelemetry::nostd::string_view service_name);
void init(opentelemetry::nostd::string_view service_name);
+ void shutdown();
bool is_enabled() const;
// creates and returns a new span with `trace_name`
#include <string_view>
+
class Value {
public:
template <typename T> Value(T val) {}
jspan add_span(std::string_view, const jspan&) { return {}; }
jspan add_span(std::string_view span_name, const jspan_context& parent_ctx) { return {}; }
void init(std::string_view service_name) {}
+ void shutdown() {}
};
inline void encode(const jspan_context& span, bufferlist& bl, uint64_t f=0) {}
inline void decode(jspan_context& span_ctx, ceph::buffer::list::const_iterator& bl) {}
Boost::random
json_spirit)
-set(crimson_common_public_deps crimson::cflags)
if(WITH_JAEGER)
- list(APPEND crimson_common_public_deps jaeger_base)
+ include_directories(SYSTEM ${CMAKE_BINARY_DIR}/external/include)
+ list(APPEND crimson_common_deps ${jaeger_base})
endif()
if(NOT WITH_SYSTEM_BOOST)
target_link_libraries(crimson-common
PUBLIC
- ${crimson_common_public_deps}
+ crimson::cflags
PRIVATE
crc32
${crimson_common_deps}
heap_profiler
fmt::fmt)
if(WITH_JAEGER)
- target_link_libraries(mon jaeger_base)
+ target_link_libraries(mon ${jaeger_base})
endif()
endif()
if(WITH_JAEGER)
- add_dependencies(os jaeger_base)
- target_link_libraries(os jaeger_base)
+ add_dependencies(os ${jaeger_base})
+ target_link_libraries(os ${jaeger_base})
endif()
target_link_libraries(os kv)
jspan span;
if (msg) {
msg->mark_event("sub_op_started");
+ span = tracing::osd::tracer.add_span(__func__, msg->osd_parent_span);
}
trace.event("handle_sub_write");
jspan span;
if (client_op) {
op->trace = client_op->pg_trace;
+ span = tracing::osd::tracer.add_span("ECBackend::submit_transaction", client_op->osd_parent_span);
}
dout(10) << __func__ << ": op " << *op << " starting" << dendl;
start_rmw(op, std::move(t));
messages.push_back(std::make_pair(i->osd, r));
}
}
+ jspan span;
+ if (op->client_op) {
+ span = tracing::osd::tracer.add_span("EC sub write", op->client_op->osd_parent_span);
+ }
if (!messages.empty()) {
get_parent()->send_message_osd_cluster(messages, get_osdmap_epoch());
utime_t duration = ceph_clock_now() - start_time_func;
dout(0) <<"Slow Shutdown duration:" << duration << " seconds" << dendl;
+ tracing::osd::tracer.shutdown();
return r;
}
void OSD::ms_fast_dispatch(Message *m)
{
+ auto dispatch_span = tracing::osd::tracer.start_trace(__func__);
FUNCTRACE(cct);
if (service.is_stopping()) {
m->put();
tracepoint(osd, ms_fast_dispatch, reqid.name._type,
reqid.name._num, reqid.tid, reqid.inc);
}
- op->osd_parent_span = tracing::osd::tracer.start_trace("op-request-created");
+ op->osd_parent_span = tracing::osd::tracer.add_span("op-request-created", dispatch_span);
if (m->trace)
op->osd_trace.init("osd op", &trace_endpoint, &m->trace);
op->pg_trace.event("do request");
}
+ [[maybe_unused]] auto span = tracing::osd::tracer.add_span(__func__, op->osd_parent_span);
// make sure we have a new enough map
auto p = waiting_for_map.find(op->get_source());
<< " flags " << ceph_osd_flag_string(m->get_flags())
<< dendl;
+ [[maybe_unused]] auto span = tracing::osd::tracer.add_span(__func__, op->osd_parent_span);
// missing object?
if (is_unreadable_object(head)) {
reqid.name._num, reqid.tid, reqid.inc);
}
+ [[maybe_unused]] auto span = tracing::osd::tracer.add_span(__func__, ctx->op->osd_parent_span);
int result = prepare_transaction(ctx);
dout(10) << "do_osd_op " << soid << " " << ops << dendl;
+ jspan span;
+ if (ctx->op) {
+ span = tracing::osd::tracer.add_span(__func__, ctx->op->osd_parent_span);
+ }
ctx->current_osd_subop_num = 0;
for (auto p = ops.begin(); p != ops.end(); ++p, ctx->current_osd_subop_num++, ctx->processed_subop_count++) {
OSDOp& osd_op = *p;
<< dendl;
utime_t now = ceph_clock_now();
+ jspan span;
+ if (ctx->op) {
+ span = tracing::osd::tracer.add_span(__func__, ctx->op->osd_parent_span);
+ }
// Drop the reference if deduped chunk is modified
if (ctx->new_obs.oi.is_dirty() &&
void PrimaryLogPG::eval_repop(RepGather *repop)
{
+ jspan span;
+ if (repop->op) {
+ span = tracing::osd::tracer.add_span(__func__, repop->op->osd_parent_span);
+ }
dout(10) << "eval_repop " << *repop
<< (repop->op && repop->op->get_req<MOSDOp>() ? "" : " (no op)") << dendl;
<< " o " << soid
<< dendl;
+ jspan span;
+ if (ctx->op) {
+ span = tracing::osd::tracer.add_span(__func__, ctx->op->osd_parent_span);
+ }
repop->v = ctx->at_version;
ceph_assert(insert_res.second);
InProgressOp &op = *insert_res.first->second;
+ jspan span;
+ if (orig_op) {
+ span = tracing::osd::tracer.add_span("ReplicatedBackend::submit_transaction", orig_op->osd_parent_span);
+ }
op.waiting_for_commit.insert(
parent->get_acting_recovery_backfill_shards().begin(),
<< " " << m->logbl.length()
<< dendl;
+ jspan span;
+ if (op) {
+ span = tracing::osd::tracer.add_span(__func__, op->osd_parent_span);
+ }
// sanity checks
ceph_assert(m->map_epoch >= get_info().history.same_interval_since);
PGRef& pg,
ThreadPool::TPHandle &handle)
{
+ [[maybe_unused]] auto span = tracing::osd::tracer.add_span("PGOpItem::run", op->osd_parent_span);
osd->dequeue_op(pg, op, handle);
pg->unlock();
}
endif()
if(WITH_JAEGER)
- add_dependencies(rgw_common jaeger_base)
- target_link_libraries(rgw_common PUBLIC jaeger_base)
+ add_dependencies(rgw_common ${jaeger_base})
+ target_link_libraries(rgw_common PUBLIC ${jaeger_base})
endif()
if(WITH_RADOSGW_DBSTORE)
derr << "ERROR: unable to initialize rgw tools" << dendl;
return -r;
}
- tracing::rgw::tracer.init("rgw");
+
rgw_init_resolver();
rgw::curl::setup_curl(fe_map);
rgw_http_client_init(g_ceph_context);
}
done:
- if (op && s->trace) {
+ if (op) {
s->trace->SetAttribute(tracing::rgw::RETURN, op->get_ret());
if (s->user) {
s->trace->SetAttribute(tracing::rgw::USER_ID, s->user->get_id().id);
namespace tracing {
namespace rgw {
+#ifdef HAVE_JAEGER
+thread_local tracing::Tracer tracer("rgw");
+#else // !HAVE_JAEGER
tracing::Tracer tracer;
+#endif
} // namespace rgw
} // namespace tracing
const auto REQUEST = "request";
const auto MULTIPART = "multipart_upload ";
+#ifdef HAVE_JAEGER
+extern thread_local tracing::Tracer tracer;
+#else
extern tracing::Tracer tracer;
+#endif
} // namespace rgw
} // namespace tracing
target_include_directories(dbstore_lib PUBLIC "${CMAKE_SOURCE_DIR}/src/rgw")
set(link_targets spawn)
if(WITH_JAEGER)
- list(APPEND link_targets jaeger_base)
+ list(APPEND link_targets ${jaeger_base})
endif()
target_link_libraries(dbstore_lib PUBLIC ${link_targets})
-D WITH_GSSAPI=OFF -D WITH_XFS=OFF \
-D WITH_FUSE=OFF -D WITH_DOKAN=ON \
-D WITH_BLUESTORE=OFF -D WITH_LEVELDB=OFF \
- -D WITH_LTTNG=OFF -D WITH_BABELTRACE=OFF -D WITH_JAEGER=OFF \
+ -D WITH_LTTNG=OFF -D WITH_BABELTRACE=OFF \
-D WITH_SYSTEM_BOOST=ON -D WITH_MGR=OFF -D WITH_KVS=OFF \
-D WITH_LIBCEPHFS=ON -D WITH_KRBD=OFF -D WITH_RADOSGW=OFF \
-D ENABLE_SHARED=$ENABLE_SHARED -D WITH_RBD=ON -D BUILD_GMOCK=ON \