From 6b4382aac7596685c31e078ffaf404c1df196819 Mon Sep 17 00:00:00 2001 From: Omri Zeneva Date: Fri, 20 Aug 2021 19:19:26 +0300 Subject: [PATCH] common/tracer: tracer implementation was moved to common/ Signed-off-by: Omri Zeneva --- doc/dev/developer_guide/jaegertracing.rst | 17 +--- doc/index.rst | 1 + doc/jaegertracing/index.rst | 80 +++++++++++++++++ doc/jaegertracing/osd_jaeger.png | Bin 0 -> 117123 bytes doc/jaegertracing/rgw_jaeger.png | Bin 0 -> 131398 bytes src/CMakeLists.txt | 10 +-- src/common/options/global.yaml.in | 9 ++ src/common/options/rgw.yaml.in | 8 -- src/common/tracer.cc | 104 ++++++++-------------- src/common/tracer.h | 92 +++++++++++++++---- src/osd/CMakeLists.txt | 3 +- src/osd/ECBackend.cc | 30 +++---- src/osd/OSD.cc | 50 +++++------ src/osd/OpRequest.h | 16 +--- src/osd/PrimaryLogPG.cc | 58 +++++------- src/osd/ReplicatedBackend.cc | 16 ++-- src/osd/osd_tracer.cc | 12 +++ src/osd/osd_tracer.h | 13 +++ src/osd/scheduler/OpSchedulerItem.cc | 9 +- src/rgw/rgw_common.h | 2 +- src/rgw/rgw_op.cc | 8 +- src/rgw/rgw_process.cc | 20 ++--- src/rgw/rgw_tracer.cc | 58 +++--------- src/rgw/rgw_tracer.h | 83 ++--------------- 24 files changed, 339 insertions(+), 360 deletions(-) create mode 100644 doc/jaegertracing/index.rst create mode 100644 doc/jaegertracing/osd_jaeger.png create mode 100644 doc/jaegertracing/rgw_jaeger.png create mode 100644 src/osd/osd_tracer.cc create mode 100644 src/osd/osd_tracer.h diff --git a/doc/dev/developer_guide/jaegertracing.rst b/doc/dev/developer_guide/jaegertracing.rst index d70b72c385b8..73a48ad83c25 100644 --- a/doc/dev/developer_guide/jaegertracing.rst +++ b/doc/dev/developer_guide/jaegertracing.rst @@ -16,19 +16,8 @@ it across the distributed system. BASIC ARCHITECTURE AND TERMINOLOGY ---------------------------------- -* TRACE: A trace shows the data/execution path through a system. -* SPAN: A single unit of a trace, it is a data structure that stores - information like operation name, timestamps, ordering in a trace. -* JAEGER CLIENT: language-specific implementations of the OpenTracing API. -* JAEGER AGENT: a daemon that listens for spans sent over User Datagram Protocol. - The agent is meant to be placed on the same host as the instrumented - application. (acts like a sidecar listener) -* JAEGER COLLECTOR: Jaeger agent sends the spans to this daemon which then - stitches the spans together to form a trace(if enabled, also persists a database - for these traces) -* JAEGER QUERY AND CONSOLE FRONTEND: UI based frontend to checkout the jaeger - traces, navigate to http://localhost:16686 (if using default `all-in-one - docker `_ to access the Jaeger UI. +refer to the `Ceph Tracing documentation <../../../jaegertracing/#basic-architecture-and-terminology>`_ + HOW TO GET STARTED USING TRACING? --------------------------------- @@ -71,4 +60,4 @@ steps needed: $ bin/rados -p test bench 5 write --no-cleanup .. seealso:: - `using-jaeger-cpp-client-for-distributed-tracing-in-ceph `_ + `using-jaeger-cpp-client-for-distributed-tracing-in-ceph ` \ No newline at end of file diff --git a/doc/index.rst b/doc/index.rst index 62619726df78..cca7031cb8db 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -109,3 +109,4 @@ about Ceph, see our `Architecture`_ section. releases/index security/index Glossary + Tracing diff --git a/doc/jaegertracing/index.rst b/doc/jaegertracing/index.rst new file mode 100644 index 000000000000..7261337d3738 --- /dev/null +++ b/doc/jaegertracing/index.rst @@ -0,0 +1,80 @@ +JAEGER- DISTRIBUTED TRACING +=========================== + +Jaeger provides ready to use tracing services for distributed +systems and is becoming the widely used standard because of their simplicity and +standardization. + + +BASIC ARCHITECTURE AND TERMINOLOGY +---------------------------------- + +* TRACE: A trace shows the data/execution path through a system. +* SPAN: A single unit of a trace, it is a data structure that stores + information like operation name, timestamps, ordering in a trace. +* JAEGER CLIENT: language-specific implementations of the OpenTracing API. +* JAEGER AGENT: a daemon that listens for spans sent over User Datagram Protocol. + The agent is meant to be placed on the same host as the instrumented + application. (acts like a sidecar listener) +* JAEGER COLLECTOR: Jaeger agent sends the spans to this daemon which then + stitches the spans together to form a trace(if enabled, also persists a database + for these traces) +* JAEGER QUERY AND CONSOLE FRONTEND: UI based frontend to checkout the jaeger + traces, navigate to http://:16686 + + +read more about jaeger tracing:. + + https://medium.com/opentracing/take-opentracing-for-a-hotrod-ride-f6e3141f7941 + + +JAEGER DEPLOYMENT +----------------- + +there are couple of ways to deploy jaeger. +please refer to: + +`jaeger deployment `_ + +`jaeger performance tuning `_ + + +In addition, spans are being sent to local jaeger agent, so the jaeger agent must be running on each host (not in all-in-one mode). +otherwise, spans of hosts without active jaeger agent will be lost. + +HOW TO ENABLE TRACING IN CEPH +----------------------------- + +tracing in Ceph is disabled by default. +it could be enabled globally, or for each entity seperately (e.g. rgw). + + Enable tracing globally:: + + $ ceph config set global jaeger_tracing_enable true + + + Enable tracing for each entity:: + + $ ceph config set jaeger_tracing_enable true + + +TRACES IN RGW +------------- + +traces of RGW can be found under Service `rgw` in Jaeger Frontend. + +every user request is being traced. each trace contains tags for +`Operation name`, `User id`, `Object name` and `Bucket name`. + +there is also `Upload id` tag for Multipart upload operations. + +rgw service in Jaeger Frontend: + +.. image:: ./rgw_jaeger.png + :width: 400 + + +osd service in Jaeger Frontend: + +.. image:: ./osd_jaeger.png + :width: 400 diff --git a/doc/jaegertracing/osd_jaeger.png b/doc/jaegertracing/osd_jaeger.png new file mode 100644 index 0000000000000000000000000000000000000000..b881e1623cf72c2173df0c5f83d4bd5d803b460e GIT binary patch literal 117123 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