123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- // Copyright The OpenTelemetry Authors
- // SPDX-License-Identifier: Apache-2.0
- #pragma once
- #include <cstdint>
- #include "opentelemetry/common/attribute_value.h"
- #include "opentelemetry/common/key_value_iterable_view.h"
- #include "opentelemetry/nostd/span.h"
- #include "opentelemetry/nostd/string_view.h"
- #include "opentelemetry/nostd/type_traits.h"
- #include "opentelemetry/trace/span_context.h"
- #include "opentelemetry/trace/span_context_kv_iterable.h"
- #include "opentelemetry/trace/span_context_kv_iterable_view.h"
- #include "opentelemetry/trace/span_metadata.h"
- #include "opentelemetry/version.h"
- OPENTELEMETRY_BEGIN_NAMESPACE
- namespace trace
- {
- class Tracer;
- /**
- * A Span represents a single operation within a Trace.
- *
- * Span attributes can be provided:
- * - at span creation time, using Tracer::StartSpan(),
- * - during the span lifetime, using Span::SetAttribute()
- *
- * Please note that head samplers,
- * in the SDK (@ref opentelemetry::sdk::trace::Sampler),
- * can only make sampling decisions based on data known
- * at span creation time.
- *
- * When attributes are known early, adding attributes
- * with @ref opentelemetry::trace::Tracer::StartSpan() is preferable.
- *
- * Attributes added or changed with Span::SetAttribute()
- * can not change a sampler decision.
- *
- * Likewise, links can be provided:
- * - at span creation time, using Tracer::StartSpan(),
- * - during the span lifetime, using Span::AddLink() or Span::AddLinks().
- *
- * When links are known early, adding links
- * with @ref opentelemetry::trace::Tracer::StartSpan() is preferable.
- *
- * Links added with Span::AddLink() or Span::AddLinks()
- * can not change a sampler decision.
- */
- class Span
- {
- public:
- // Note that Spans should be created using the Tracer class. Please refer to
- // tracer.h for documentation.
- Span() = default;
- // The Span destructor End()s the Span, if it hasn't been ended already.
- virtual ~Span() = default;
- // Not copiable or movable.
- Span(const Span &) = delete;
- Span(Span &&) = delete;
- Span &operator=(const Span &) = delete;
- Span &operator=(Span &&) = delete;
- /**
- * Sets an attribute on the Span (ABI).
- *
- * If the Span previously contained a mapping for the key,
- * the old value is replaced.
- *
- * See comments about sampling in @ref opentelemetry::trace::Span
- */
- virtual void SetAttribute(nostd::string_view key,
- const common::AttributeValue &value) noexcept = 0;
- // Adds an event to the Span.
- virtual void AddEvent(nostd::string_view name) noexcept = 0;
- // Adds an event to the Span, with a custom timestamp.
- virtual void AddEvent(nostd::string_view name, common::SystemTimestamp timestamp) noexcept = 0;
- // Adds an event to the Span, with a custom timestamp, and attributes.
- virtual void AddEvent(nostd::string_view name,
- common::SystemTimestamp timestamp,
- const common::KeyValueIterable &attributes) noexcept = 0;
- virtual void AddEvent(nostd::string_view name,
- const common::KeyValueIterable &attributes) noexcept
- {
- this->AddEvent(name, std::chrono::system_clock::now(), attributes);
- }
- template <class T,
- nostd::enable_if_t<common::detail::is_key_value_iterable<T>::value> * = nullptr>
- void AddEvent(nostd::string_view name,
- common::SystemTimestamp timestamp,
- const T &attributes) noexcept
- {
- this->AddEvent(name, timestamp, common::KeyValueIterableView<T>{attributes});
- }
- template <class T,
- nostd::enable_if_t<common::detail::is_key_value_iterable<T>::value> * = nullptr>
- void AddEvent(nostd::string_view name, const T &attributes) noexcept
- {
- this->AddEvent(name, common::KeyValueIterableView<T>{attributes});
- }
- void AddEvent(nostd::string_view name,
- common::SystemTimestamp timestamp,
- std::initializer_list<std::pair<nostd::string_view, common::AttributeValue>>
- attributes) noexcept
- {
- this->AddEvent(name, timestamp,
- nostd::span<const std::pair<nostd::string_view, common::AttributeValue>>{
- attributes.begin(), attributes.end()});
- }
- void AddEvent(nostd::string_view name,
- std::initializer_list<std::pair<nostd::string_view, common::AttributeValue>>
- attributes) noexcept
- {
- this->AddEvent(name, std::chrono::system_clock::now(),
- nostd::span<const std::pair<nostd::string_view, common::AttributeValue>>{
- attributes.begin(), attributes.end()});
- }
- #if OPENTELEMETRY_ABI_VERSION_NO >= 2
- /**
- * Add link (ABI).
- *
- * See comments about sampling in @ref opentelemetry::trace::Span
- *
- * @since ABI_VERSION 2
- */
- virtual void AddLink(const SpanContext &target,
- const common::KeyValueIterable &attrs) noexcept = 0;
- /**
- * Add links (ABI).
- *
- * See comments about sampling in @ref opentelemetry::trace::Span
- *
- * @since ABI_VERSION 2
- */
- virtual void AddLinks(const SpanContextKeyValueIterable &links) noexcept = 0;
- /**
- * Add link (API helper).
- *
- * See comments about sampling in @ref opentelemetry::trace::Span
- *
- * @since ABI_VERSION 2
- */
- template <class U,
- nostd::enable_if_t<common::detail::is_key_value_iterable<U>::value> * = nullptr>
- void AddLink(const SpanContext &target, const U &attrs)
- {
- common::KeyValueIterableView<U> view(attrs);
- this->AddLink(target, view);
- }
- /**
- * Add link (API helper).
- *
- * See comments about sampling in @ref opentelemetry::trace::Span
- *
- * @since ABI_VERSION 2
- */
- void AddLink(const SpanContext &target,
- std::initializer_list<std::pair<nostd::string_view, common::AttributeValue>> attrs)
- {
- /* Build a container from std::initializer_list. */
- nostd::span<const std::pair<nostd::string_view, common::AttributeValue>> container{
- attrs.begin(), attrs.end()};
- /* Build a view on the container. */
- common::KeyValueIterableView<
- nostd::span<const std::pair<nostd::string_view, common::AttributeValue>>>
- view(container);
- return this->AddLink(target, view);
- }
- /**
- * Add links (API helper).
- *
- * See comments about sampling in @ref opentelemetry::trace::Span
- *
- * @since ABI_VERSION 2
- */
- template <class U, nostd::enable_if_t<detail::is_span_context_kv_iterable<U>::value> * = nullptr>
- void AddLinks(const U &links)
- {
- SpanContextKeyValueIterableView<U> view(links);
- this->AddLinks(view);
- }
- /**
- * Add links (API helper).
- *
- * See comments about sampling in @ref opentelemetry::trace::Span
- *
- * @since ABI_VERSION 2
- */
- void AddLinks(
- std::initializer_list<
- std::pair<SpanContext,
- std::initializer_list<std::pair<nostd::string_view, common::AttributeValue>>>>
- links)
- {
- /* Build a container from std::initializer_list. */
- nostd::span<const std::pair<
- SpanContext, std::initializer_list<std::pair<nostd::string_view, common::AttributeValue>>>>
- container{links.begin(), links.end()};
- /* Build a view on the container. */
- SpanContextKeyValueIterableView<nostd::span<const std::pair<
- SpanContext, std::initializer_list<std::pair<nostd::string_view, common::AttributeValue>>>>>
- view(container);
- return this->AddLinks(view);
- }
- #endif /* OPENTELEMETRY_ABI_VERSION_NO */
- // Sets the status of the span. The default status is Unset. Only the value of
- // the last call will be
- // recorded, and implementations are free to ignore previous calls.
- virtual void SetStatus(StatusCode code, nostd::string_view description = "") noexcept = 0;
- // Updates the name of the Span. If used, this will override the name provided
- // during creation.
- virtual void UpdateName(nostd::string_view name) noexcept = 0;
- /**
- * Mark the end of the Span.
- * Only the timing of the first End call for a given Span will be recorded,
- * and implementations are free to ignore all further calls.
- * @param options can be used to manually define span properties like the end
- * timestamp
- */
- virtual void End(const trace::EndSpanOptions &options = {}) noexcept = 0;
- virtual trace::SpanContext GetContext() const noexcept = 0;
- // Returns true if this Span is recording tracing events (e.g. SetAttribute,
- // AddEvent).
- virtual bool IsRecording() const noexcept = 0;
- };
- } // namespace trace
- OPENTELEMETRY_END_NAMESPACE
|