#include <userver/tracing/span.hpp>
Measures the execution time of the current code block, links it with the parent tracing::Spans and stores that info in the log.
Logging of spans can be controlled at runtime via USERVER_NO_LOG_SPANS.
See Logging and Tracing for usage examples and more descriptions.
Public Member Functions | |
Span (TracerPtr tracer, std::string name, const Span *parent, ReferenceType reference_type, logging::Level log_level=logging::Level::kInfo, utils::impl::SourceLocation source_location=utils::impl::SourceLocation::Current()) | |
Span (std::string name, ReferenceType reference_type=ReferenceType::kChild, logging::Level log_level=logging::Level::kInfo, utils::impl::SourceLocation source_location=utils::impl::SourceLocation::Current()) | |
Span (Span &&other) noexcept | |
Span & | operator= (const Span &)=delete |
Span & | operator= (Span &&)=delete |
Span | CreateChild (std::string name) const |
Span | CreateFollower (std::string name) const |
ScopeTime | CreateScopeTime () |
Creates a tracing::ScopeTime attached to the span. | |
ScopeTime | CreateScopeTime (std::string name) |
Creates a tracing::ScopeTime attached to the Span and starts measuring execution time. Tag {scope_name}_time with elapsed time is added to result span. | |
ScopeTime::Duration | GetTotalDuration (const std::string &scope_name) const |
ScopeTime::DurationMillis | GetTotalElapsedTime (const std::string &scope_name) const |
void | AddTag (std::string key, logging::LogExtra::Value value) |
void | AddTagFrozen (std::string key, logging::LogExtra::Value value) |
void | AddNonInheritableTag (std::string key, logging::LogExtra::Value value) |
void | AddNonInheritableTags (const logging::LogExtra &) |
void | AddEvent (SpanEvent &&event) |
Add an event to Span. | |
void | AddEvent (std::string_view event_name) |
void | SetLogLevel (logging::Level log_level) |
Sets log level with which the current span itself is written into the tracing system. | |
logging::Level | GetLogLevel () const |
Returns level for tags logging. | |
void | SetLocalLogLevel (std::optional< logging::Level > log_level) |
Sets an additional cutoff for the logs written in the scope of this Span , and in nested scopes recursively. | |
std::optional< logging::Level > | GetLocalLogLevel () const |
Returns the local log level that disables logging of this span if it is set and greater than the main log level of the Span. | |
void | SetLink (std::string link) |
void | SetParentLink (std::string parent_link) |
Set parent_link - an ID . Can be called only once. | |
std::string | GetLink () const |
std::string | GetParentLink () const |
const std::string & | GetTraceId () const |
const std::string & | GetSpanId () const |
Identifies a specific span. It does not propagate. | |
const std::string & | GetParentId () const |
bool | ShouldLogDefault () const noexcept |
void | DetachFromCoroStack () |
void | AttachToCoroStack () |
std::chrono::system_clock::time_point | GetStartSystemTime () const |
Static Public Member Functions | |
static Span & | CurrentSpan () |
Returns the Span of the current task. | |
static Span * | CurrentSpanUnchecked () |
Returns nullptr if called in non-coroutine context or from a task with no alive Span; otherwise returns the Span of the current task. | |
static Span | MakeSpan (std::string name, std::string_view trace_id, std::string_view parent_span_id) |
static Span | MakeSpan (std::string name, std::string_view trace_id, std::string_view parent_span_id, std::string link) |
static Span | MakeRootSpan (std::string name, logging::Level log_level=logging::Level::kInfo) |
|
explicit |
Use default tracer and implicit coro local storage for parent identification, takes TraceID from the parent.
For extremely rare cases where a new Trace ID is required use tracing::Span::MakeSpan().
tracing::Span::AddNonInheritableTag | ( | std::string | key, |
logging::LogExtra::Value | value ) |
void tracing::Span::AddTag | ( | std::string | key, |
logging::LogExtra::Value | value ) |
Add a tag that is used on each logging in this Span and all future children.
void tracing::Span::AddTagFrozen | ( | std::string | key, |
logging::LogExtra::Value | value ) |
Add a tag that is used on each logging in this Span and all future children. It will not be possible to change its value.
void tracing::Span::AttachToCoroStack | ( | ) |
Attach the Span to current engine::Task so it is returned by CurrentSpan().
Span tracing::Span::CreateChild | ( | std::string | name | ) | const |
Create a child which can be used independently from the parent.
The child shares no state with its parent. If you need to run code in parallel, create a child span and use the child in a separate task.
ScopeTime tracing::Span::CreateScopeTime | ( | std::string | name | ) |
Creates a tracing::ScopeTime attached to the Span and starts measuring execution time. Tag {scope_name}_time
with elapsed time is added to result span.
name
parameter is expected to satisfy snake case. Otherwise, it is converted to snake case.
|
static |
Returns the Span of the current task.
Should not be called in non-coroutine context. Should not be called from a task with no alive Span.
Rule of thumb: it is safe to call it from a task created by utils::Async/utils::CriticalAsync/utils::PeriodicTask. If current task was created with an explicit engine::impl::*Async(), you have to create a Span beforehand.
void tracing::Span::DetachFromCoroStack | ( | ) |
Detach the Span from current engine::Task so it is not returned by CurrentSpan() any more.
std::string tracing::Span::GetLink | ( | ) | const |
Get link - a request ID within the service.
Propagates within a single service, but not from client to server. A new link is generated for the "root" request handling task
ScopeTime::Duration tracing::Span::GetTotalDuration | ( | const std::string & | scope_name | ) | const |
Returns total time elapsed for a certain scope of this span. If there is no record for the scope, returns 0.
ScopeTime::DurationMillis tracing::Span::GetTotalElapsedTime | ( | const std::string & | scope_name | ) | const |
Returns total time elapsed for a certain scope of this span. If there is no record for the scope, returns 0.
Prefer using Span::GetTotalDuration()
const std::string & tracing::Span::GetTraceId | ( | ) | const |
An ID of the request that does not change from service to service.
Propagates both to sub-spans within a single service, and from client to server
|
static |
Factory function for rare cases of creating a root Span that starts the trace_id chain, ignoring CurrentSpan
, if any. Useful in background jobs, periodics, distlock tasks, cron tasks, etc. The result of such jobs is not directly requested by anything.
name | Name of a new Span |
log_level | Log level for the span's own log record |
|
static |
|
static |
void tracing::Span::SetLink | ( | std::string | link | ) |
Set link - a request ID within a service. Can be called only once.
Propagates within a single service, but not from client to server. A new link is generated for the "root" request handling task
void tracing::Span::SetLocalLogLevel | ( | std::optional< logging::Level > | log_level | ) |
Sets an additional cutoff for the logs written in the scope of this Span
, and in nested scopes recursively.
For example, if the global log level is info
, and the current Span
has (own or inherited) local log level warning
, then all LOG_INFO
s within the current scope will be thrown away.
Currently, local log level cannot override the global log level of the logger. For example, if the global log level is info
, and the current Span
has (own or inherited) local log level debug
, then all LOG_DEBUG
s within the current scope will still be thrown away.
void tracing::Span::SetLogLevel | ( | logging::Level | log_level | ) |
Sets log level with which the current span itself is written into the tracing system.
If Span
's log level is less than the global logger's log level, then the span is not written out. In that case, nested logs are still written to the logging system as usual, inheriting trace_id
, link
, span_id
and inheritable tags of the current Span
object.
|
noexcept |
|
friend |