diff --git a/src/Span.h b/src/Span.h index dc0680b5ab..586b8ae7dd 100644 --- a/src/Span.h +++ b/src/Span.h @@ -2,138 +2,11 @@ #pragma once -#include -#include -#include +#include namespace zeek { -/** - * Drop-in replacement for C++20's @c std::span with dynamic extent only: - * https://en.cppreference.com/w/cpp/container/span. After upgrading to C++20, - * this class may get replaced with a type alias instead and/or deprecated. - */ template -class Span { -public: - // -- member types --------------------------------------------------------- - - using element_type = T; - - using value_type = std::remove_cv_t; - - using index_type = size_t; - - using difference_type = ptrdiff_t; - - using pointer = T*; - - using const_pointer = const T*; - - using reference = T&; - - using const_reference = T&; - - using iterator = pointer; - - using const_iterator = const_pointer; - - using reverse_iterator = std::reverse_iterator; - - using const_reverse_iterator = std::reverse_iterator; - - // -- constructors, destructors, and assignment operators ------------------ - - constexpr Span() noexcept : memory_block(nullptr), num_elements(0) {} - - constexpr Span(pointer ptr, size_t size) : memory_block(ptr), num_elements(size) {} - - constexpr Span(pointer first, pointer last) - : memory_block(first), num_elements(static_cast(last - first)) {} - - template - constexpr Span(element_type (&arr)[Size]) noexcept : memory_block(arr), num_elements(Size) {} - - template - requires std::is_convertible_v - Span(Container& xs) noexcept : memory_block(xs.data()), num_elements(xs.size()) {} - - template - requires std::is_convertible_v - Span(const Container& xs) noexcept : memory_block(xs.data()), num_elements(xs.size()) {} - - constexpr Span(const Span&) noexcept = default; - - Span& operator=(const Span&) noexcept = default; - - // -- iterators ------------------------------------------------------------ - - constexpr iterator begin() const noexcept { return memory_block; } - - constexpr const_iterator cbegin() const noexcept { return memory_block; } - - constexpr iterator end() const noexcept { return begin() + num_elements; } - - constexpr const_iterator cend() const noexcept { return cbegin() + num_elements; } - - constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator{end()}; } - - constexpr const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator{end()}; } - - constexpr reverse_iterator rend() const noexcept { return reverse_iterator{begin()}; } - - constexpr const_reverse_iterator crend() const noexcept { return const_reverse_iterator{begin()}; } - - // -- element access ------------------------------------------------------- - - constexpr reference operator[](size_t index) const noexcept { return memory_block[index]; } - - constexpr reference front() const noexcept { return *memory_block; } - - constexpr reference back() const noexcept { return (*this)[num_elements - 1]; } - - // -- properties ----------------------------------------------------------- - - constexpr size_t size() const noexcept { return num_elements; } - - constexpr size_t size_bytes() const noexcept { return num_elements * sizeof(element_type); } - - constexpr bool empty() const noexcept { return num_elements == 0; } - - constexpr pointer data() const noexcept { return memory_block; } - - // -- subviews ------------------------------------------------------------- - - constexpr Span subspan(size_t offset, size_t count) const { return {memory_block + offset, count}; } - - constexpr Span subspan(size_t offset) const { return {memory_block + offset, num_elements - offset}; } - - constexpr Span first(size_t count) const { return {memory_block, count}; } - - constexpr Span last(size_t count) const { return subspan(num_elements - count, num_elements); } - -private: - // -- member variables ----------------------------------------------------- - - /// Points to the first element in the contiguous memory block. - pointer memory_block; - - /// Stores the number of elements in the contiguous memory block. - size_t num_elements; -}; - -// -- deduction guides --------------------------------------------------------- - -template -Span(T*, size_t) -> Span; - -template -Span(T (&)[N]) -> Span; - -template -Span(Container&) -> Span; - -template -Span(const Container&) -> Span; +using Span [[deprecated("Remove in v8.1: Use std::span instead")]] = std::span; } // namespace zeek diff --git a/src/broker/Manager.h b/src/broker/Manager.h index 6745f57d38..3b4afa7736 100644 --- a/src/broker/Manager.h +++ b/src/broker/Manager.h @@ -11,12 +11,12 @@ #include #include #include +#include #include #include #include #include "zeek/IntrusivePtr.h" -#include "zeek/Span.h" #include "zeek/broker/Data.h" #include "zeek/cluster/Backend.h" #include "zeek/iosource/IOSource.h" @@ -284,7 +284,7 @@ public: [[deprecated("Remove in v8.1: Use the ArgsSpan version instead")]] RecordVal* MakeEvent(ValPList* args, zeek::detail::Frame* frame); - using ArgsSpan = Span; + using ArgsSpan = std::span; /** * Create an `Event` record value from an event and its arguments. @@ -433,7 +433,7 @@ private: // // TODO: Move log buffering out of broker and implement. bool DoPublishLogWrites(const logging::detail::LogWriteHeader& header, - zeek::Span records) override { + std::span records) override { // Not implemented by broker. throw std::logic_error("not implemented"); } diff --git a/src/broker/messaging.bif b/src/broker/messaging.bif index 09f1b54aa5..93423c468b 100644 --- a/src/broker/messaging.bif +++ b/src/broker/messaging.bif @@ -3,15 +3,15 @@ %%{ #include +#include #include -#include "zeek/Span.h" #include "zeek/broker/Manager.h" #include "zeek/logging/Manager.h" namespace { -using ArgsSpan = zeek::Span; +using ArgsSpan = std::span; } diff --git a/src/cluster/Backend.cc b/src/cluster/Backend.cc index 3c51259e42..4a5f1d100d 100644 --- a/src/cluster/Backend.cc +++ b/src/cluster/Backend.cc @@ -4,6 +4,7 @@ #include #include +#include #include "zeek/Desc.h" #include "zeek/Event.h" @@ -196,7 +197,7 @@ bool Backend::DoPublishEvent(const std::string& topic, cluster::detail::Event& e // Default implementation doing log record serialization. bool Backend::DoPublishLogWrites(const zeek::logging::detail::LogWriteHeader& header, - zeek::Span records) { + std::span records) { byte_buffer buf; if ( ! log_serializer->SerializeLogWrite(buf, header, records) ) diff --git a/src/cluster/Backend.h b/src/cluster/Backend.h index f401c02b9d..df6d461fb9 100644 --- a/src/cluster/Backend.h +++ b/src/cluster/Backend.h @@ -6,12 +6,12 @@ #include #include +#include #include #include #include "zeek/Event.h" #include "zeek/EventHandler.h" -#include "zeek/Span.h" #include "zeek/Tag.h" #include "zeek/Val.h" #include "zeek/ZeekArgs.h" @@ -323,7 +323,7 @@ public: * @param records A span of logging::detail::LogRecords to be published. */ bool PublishLogWrites(const zeek::logging::detail::LogWriteHeader& header, - zeek::Span records) { + std::span records) { return DoPublishLogWrites(header, records); } @@ -531,7 +531,7 @@ private: * @return true if the message has been published successfully. */ virtual bool DoPublishLogWrites(const zeek::logging::detail::LogWriteHeader& header, - zeek::Span records); + std::span records); /** * Send out a serialized log batch. @@ -589,7 +589,7 @@ struct EventMessage { std::string format; byte_buffer payload; - auto payload_span() const { return Span(payload.data(), payload.size()); }; + auto payload_span() const { return std::span(payload.data(), payload.size()); }; }; /** @@ -599,7 +599,7 @@ struct LogMessage { std::string format; byte_buffer payload; - auto payload_span() const { return Span(payload.data(), payload.size()); }; + auto payload_span() const { return std::span(payload.data(), payload.size()); }; }; /** @@ -612,7 +612,7 @@ struct BackendMessage { int tag; byte_buffer payload; - auto payload_span() const { return Span(payload.data(), payload.size()); }; + auto payload_span() const { return std::span(payload.data(), payload.size()); }; }; using QueueMessage = std::variant; diff --git a/src/cluster/BifSupport.cc b/src/cluster/BifSupport.cc index 4122a50995..95b53190f5 100644 --- a/src/cluster/BifSupport.cc +++ b/src/cluster/BifSupport.cc @@ -2,6 +2,8 @@ #include "zeek/cluster/BifSupport.h" +#include + #include "zeek/Desc.h" #include "zeek/Event.h" #include "zeek/EventRegistry.h" @@ -30,7 +32,7 @@ std::optional to_cluster_event(const zeek::cluster for ( size_t i = 0; i < vargs->Size(); i++ ) args[i] = vargs->ValAt(i); - return backend->MakeClusterEvent(func, zeek::Span{args}); + return backend->MakeClusterEvent(func, std::span{args}); } } // namespace @@ -155,7 +157,7 @@ zeek::RecordValPtr make_endpoint_info(const std::string& id, const std::string& return ep_rec; } -zeek::VectorValPtr make_string_vec(zeek::Span strings) { +zeek::VectorValPtr make_string_vec(std::span strings) { static const auto string_vec_type = zeek::id::find_type("string_vec"); auto vec = zeek::make_intrusive(string_vec_type); vec->Reserve(strings.size()); diff --git a/src/cluster/BifSupport.h b/src/cluster/BifSupport.h index 064c3b4de9..7acd2a07e8 100644 --- a/src/cluster/BifSupport.h +++ b/src/cluster/BifSupport.h @@ -3,10 +3,10 @@ #pragma once #include +#include #include #include "zeek/IntrusivePtr.h" -#include "zeek/Span.h" #include "zeek/net_util.h" // Helpers for cluster.bif @@ -24,7 +24,7 @@ using VectorValPtr = IntrusivePtr; class Val; using ValPtr = IntrusivePtr; -using ArgsSpan = Span; +using ArgsSpan = std::span; namespace cluster::detail::bif { @@ -72,7 +72,7 @@ zeek::RecordValPtr make_endpoint_info(const std::string& id, const std::string& * * @return a VectorVal instance of type string_vec filled with strings. */ -zeek::VectorValPtr make_string_vec(zeek::Span strings); +zeek::VectorValPtr make_string_vec(std::span strings); } // namespace cluster::detail::bif diff --git a/src/cluster/Serializer.h b/src/cluster/Serializer.h index cc2402641b..5713c3d70d 100644 --- a/src/cluster/Serializer.h +++ b/src/cluster/Serializer.h @@ -5,9 +5,9 @@ #pragma once #include +#include #include -#include "zeek/Span.h" #include "zeek/logging/Types.h" namespace zeek::cluster { @@ -80,7 +80,7 @@ public: * @param records The actual log writes. */ virtual bool SerializeLogWrite(byte_buffer& buf, const logging::detail::LogWriteHeader& header, - zeek::Span records) = 0; + std::span records) = 0; /** * Unserialize log writes from a given byte buffer. diff --git a/src/cluster/Telemetry.cc b/src/cluster/Telemetry.cc index cdc2b422bc..c3e36ffc46 100644 --- a/src/cluster/Telemetry.cc +++ b/src/cluster/Telemetry.cc @@ -3,6 +3,7 @@ #include "zeek/cluster/Telemetry.h" #include +#include #include "zeek/Desc.h" #include "zeek/Expr.h" @@ -187,7 +188,7 @@ DebugTelemetry::DebugTelemetry(TopicNormalizer topic_normalizer, std::string_vie labels.emplace_back("script_location", ""); labels_view = to_label_view_vec(labels); - labels_view_no_location = zeek::Span{labels_view.data(), labels_view.size() - 1}; + labels_view_no_location = std::span{labels_view.data(), labels_view.size() - 1}; auto label_names = to_label_names_vec(labels); diff --git a/src/cluster/Telemetry.h b/src/cluster/Telemetry.h index 818dc5c7d4..23cfe7e1af 100644 --- a/src/cluster/Telemetry.h +++ b/src/cluster/Telemetry.h @@ -6,12 +6,12 @@ #include #include #include +#include #include #include #include #include "zeek/IntrusivePtr.h" -#include "zeek/Span.h" namespace zeek { @@ -175,7 +175,7 @@ private: std::vector size_bounds; LabelList labels; LabelViewList labels_view; - zeek::Span labels_view_no_location; + std::span labels_view_no_location; size_t topic_idx, handler_idx, script_location_idx; // Index of topic, handler and script_location labels in labels_view telemetry::HistogramFamilyPtr in, out; diff --git a/src/cluster/serializer/binary-serialization-format/Serializer.cc b/src/cluster/serializer/binary-serialization-format/Serializer.cc index 7d9ede592d..49691e38bf 100644 --- a/src/cluster/serializer/binary-serialization-format/Serializer.cc +++ b/src/cluster/serializer/binary-serialization-format/Serializer.cc @@ -3,6 +3,7 @@ #include "zeek/cluster/serializer/binary-serialization-format/Serializer.h" #include +#include #include "zeek/DebugLogger.h" #include "zeek/ID.h" @@ -27,7 +28,7 @@ extern Plugin plugin; bool detail::BinarySerializationFormatLogSerializer::SerializeLogWrite(byte_buffer& buf, const logging::detail::LogWriteHeader& header, - zeek::Span records) { + std::span records) { zeek::detail::BinarySerializationFormat fmt; SERIALIZER_DEBUG("Serializing stream=%s writer=%s filter=%s path=%s num_fields=%zu num_records=%zu", diff --git a/src/cluster/serializer/binary-serialization-format/Serializer.h b/src/cluster/serializer/binary-serialization-format/Serializer.h index 79640635e4..7e1d0437f7 100644 --- a/src/cluster/serializer/binary-serialization-format/Serializer.h +++ b/src/cluster/serializer/binary-serialization-format/Serializer.h @@ -3,6 +3,7 @@ #pragma once #include +#include #include "zeek/cluster/Serializer.h" #include "zeek/logging/Types.h" @@ -14,7 +15,7 @@ public: BinarySerializationFormatLogSerializer() : LogSerializer("zeek-bin-serializer") {} bool SerializeLogWrite(byte_buffer& buf, const logging::detail::LogWriteHeader& header, - zeek::Span records) override; + std::span records) override; std::optional UnserializeLogWrite(byte_buffer_span buf) override; }; diff --git a/src/logging/WriterBackend.cc b/src/logging/WriterBackend.cc index 70ab8591b4..84c37d1bdc 100644 --- a/src/logging/WriterBackend.cc +++ b/src/logging/WriterBackend.cc @@ -3,6 +3,7 @@ #include "zeek/logging/WriterBackend.h" #include +#include #include "zeek/logging/Manager.h" #include "zeek/logging/WriterFrontend.h" @@ -170,7 +171,7 @@ bool WriterBackend::Init(int arg_num_fields, const Field* const* arg_fields) { return true; } -bool WriterBackend::Write(int arg_num_fields, zeek::Span records) { +bool WriterBackend::Write(int arg_num_fields, std::span records) { // Double-check that the arguments match. If we get this from remote, // something might be mixed up. if ( num_fields != arg_num_fields ) { diff --git a/src/logging/WriterBackend.h b/src/logging/WriterBackend.h index 49cd8a713b..e67773ff64 100644 --- a/src/logging/WriterBackend.h +++ b/src/logging/WriterBackend.h @@ -4,7 +4,8 @@ #pragma once -#include "zeek/Span.h" +#include + #include "zeek/logging/Component.h" #include "zeek/logging/Types.h" #include "zeek/threading/MsgThread.h" @@ -154,7 +155,7 @@ public: * * @return False if an error occurred. */ - bool Write(int arg_num_fields, zeek::Span records); + bool Write(int arg_num_fields, std::span records); /** * Sets the buffering status for the writer, assuming the writer diff --git a/src/logging/WriterFrontend.cc b/src/logging/WriterFrontend.cc index 8a51c76724..c03f188145 100644 --- a/src/logging/WriterFrontend.cc +++ b/src/logging/WriterFrontend.cc @@ -2,8 +2,9 @@ #include "zeek/logging/WriterFrontend.h" +#include + #include "zeek/RunState.h" -#include "zeek/Span.h" #include "zeek/broker/Manager.h" #include "zeek/cluster/Backend.h" #include "zeek/logging/Manager.h" @@ -59,7 +60,7 @@ public: num_fields(num_fields), records(std::move(records)) {} - bool Process() override { return Object()->Write(num_fields, zeek::Span{records}); } + bool Process() override { return Object()->Write(num_fields, std::span{records}); } private: int num_fields; @@ -234,7 +235,7 @@ void WriterFrontend::FlushWriteBuffer() { // is used, push all the buffered log records to it now. const bool broker_is_cluster_backend = zeek::cluster::backend == zeek::broker_mgr; if ( remote && ! broker_is_cluster_backend ) - zeek::cluster::backend->PublishLogWrites(header, Span{records}); + zeek::cluster::backend->PublishLogWrites(header, std::span{records}); if ( backend ) backend->SendIn(new WriteMessage(backend, num_fields, std::move(records))); diff --git a/src/packet_analysis/Manager.cc b/src/packet_analysis/Manager.cc index 99d751ce5b..9994a5ca3f 100644 --- a/src/packet_analysis/Manager.cc +++ b/src/packet_analysis/Manager.cc @@ -2,6 +2,8 @@ #include "zeek/packet_analysis/Manager.h" +#include + #include "zeek/Event.h" #include "zeek/RunState.h" #include "zeek/Stats.h" @@ -251,8 +253,8 @@ void Manager::ReportUnknownProtocol(const std::string& analyzer, uint32_t protoc } } -std::vector> Manager::GetAnalyzerData(const AnalyzerPtr& analyzer) { - std::vector> result; +std::vector> Manager::GetAnalyzerData(const AnalyzerPtr& analyzer) { + std::vector> result; for ( const auto [sa, span] : analyzer_stack ) { if ( sa == analyzer.get() ) result.push_back(span); diff --git a/src/packet_analysis/Manager.h b/src/packet_analysis/Manager.h index 0b5cfc03b1..412859f981 100644 --- a/src/packet_analysis/Manager.h +++ b/src/packet_analysis/Manager.h @@ -2,6 +2,8 @@ #pragma once +#include + #include "zeek/PacketFilter.h" #include "zeek/Tag.h" #include "zeek/iosource/Packet.h" @@ -195,7 +197,7 @@ public: * * @returns An array of data spans. */ - std::vector> GetAnalyzerData(const AnalyzerPtr& analyzer); + std::vector> GetAnalyzerData(const AnalyzerPtr& analyzer); private: /** @@ -248,7 +250,7 @@ private: struct StackEntry { const Analyzer* analyzer; - zeek::Span data; // Start of this layer, limited by span's size. + std::span data; // Start of this layer, limited by span's size. }; std::vector analyzer_stack; diff --git a/src/packet_analysis/protocol/geneve/Geneve.cc b/src/packet_analysis/protocol/geneve/Geneve.cc index 182c6a775d..a658056dd6 100644 --- a/src/packet_analysis/protocol/geneve/Geneve.cc +++ b/src/packet_analysis/protocol/geneve/Geneve.cc @@ -2,13 +2,14 @@ #include "zeek/packet_analysis/protocol/geneve/Geneve.h" -#include "zeek/Span.h" +#include + #include "zeek/packet_analysis/protocol/geneve/events.bif.h" #include "zeek/packet_analysis/protocol/iptunnel/IPTunnel.h" using namespace zeek::packet_analysis::Geneve; -void zeek::packet_analysis::Geneve::detail::parse_options(zeek::Span data, detail::Callback cb) { +void zeek::packet_analysis::Geneve::detail::parse_options(std::span data, detail::Callback cb) { size_t remaining = data.size(); if ( remaining < 8 ) @@ -40,7 +41,7 @@ void zeek::packet_analysis::Geneve::detail::parse_options(zeek::Span #include +#include -#include "zeek/Span.h" #include "zeek/iosource/Packet.h" #include "zeek/packet_analysis/Analyzer.h" @@ -17,7 +17,7 @@ namespace detail { * Callback for parse_options(), passing the individual option pieces. */ using Callback = - std::function opt_data)>; + std::function opt_data)>; /** * Parse Geneve options from the header data. @@ -27,7 +27,7 @@ using Callback = * @param data The data span to treat as a Geneve header. * @param cb The callback to invoke with each parsed option. */ -void parse_options(zeek::Span data, Callback cb); +void parse_options(std::span data, Callback cb); } // namespace detail diff --git a/src/packet_analysis/protocol/geneve/functions.bif b/src/packet_analysis/protocol/geneve/functions.bif index 7ff017a910..2f12c1c242 100644 --- a/src/packet_analysis/protocol/geneve/functions.bif +++ b/src/packet_analysis/protocol/geneve/functions.bif @@ -1,6 +1,7 @@ module PacketAnalyzer::Geneve; %%{ +#include #include "zeek/packet_analysis/Manager.h" #include "zeek/packet_analysis/protocol/geneve/Geneve.h" %%} @@ -24,7 +25,7 @@ function get_options%(%): geneve_options_vec_vec for ( const auto& span : spans ) { auto v = zeek::make_intrusive(vtype); - auto cb = [&v](uint16_t opt_class, bool opt_critical, uint8_t opt_type, zeek::Span opt_data) -> void { + auto cb = [&v](uint16_t opt_class, bool opt_critical, uint8_t opt_type, std::span opt_data) -> void { auto rv = zeek::make_intrusive(rtype); rv->Assign(0, zeek::val_mgr->Count(opt_class)); rv->Assign(1, zeek::val_mgr->Bool(opt_critical)); diff --git a/src/telemetry/Counter.cc b/src/telemetry/Counter.cc index 7ba8532a56..7c73b218c5 100644 --- a/src/telemetry/Counter.cc +++ b/src/telemetry/Counter.cc @@ -3,6 +3,7 @@ #include "zeek/telemetry/Counter.h" #include +#include using namespace zeek::telemetry; @@ -16,7 +17,8 @@ double Counter::Value() const noexcept { return handle.Value(); } -std::shared_ptr CounterFamily::GetOrAdd(Span labels, detail::CollectCallbackPtr callback) { +std::shared_ptr CounterFamily::GetOrAdd(std::span labels, + detail::CollectCallbackPtr callback) { prometheus::Labels p_labels = detail::BuildPrometheusLabels(labels); auto check = [&](const std::shared_ptr& counter) { return counter->CompareLabels(p_labels); }; @@ -31,7 +33,7 @@ std::shared_ptr CounterFamily::GetOrAdd(Span labels, d std::shared_ptr CounterFamily::GetOrAdd(std::initializer_list labels, detail::CollectCallbackPtr callback) { - return GetOrAdd(Span{labels.begin(), labels.size()}, std::move(callback)); + return GetOrAdd(std::span{labels.begin(), labels.size()}, std::move(callback)); } void CounterFamily::RunCallbacks() { diff --git a/src/telemetry/Counter.h b/src/telemetry/Counter.h index e170874c93..370d546c3d 100644 --- a/src/telemetry/Counter.h +++ b/src/telemetry/Counter.h @@ -6,9 +6,9 @@ #include #include #include +#include #include "zeek/NetVar.h" // For BifEnum::Telemetry value -#include "zeek/Span.h" #include "zeek/telemetry/MetricFamily.h" #include "zeek/telemetry/Utils.h" @@ -84,14 +84,14 @@ class CounterFamily : public MetricFamily { public: static inline const char* OpaqueName = "CounterMetricFamilyVal"; - CounterFamily(prometheus::Family* family, Span labels) + CounterFamily(prometheus::Family* family, std::span labels) : MetricFamily(labels), family(family) {} /** * Returns the metrics handle for given labels, creating a new instance * lazily if necessary. */ - CounterPtr GetOrAdd(Span labels, detail::CollectCallbackPtr callback = nullptr); + CounterPtr GetOrAdd(std::span labels, detail::CollectCallbackPtr callback = nullptr); /** * @copydoc GetOrAdd diff --git a/src/telemetry/Gauge.cc b/src/telemetry/Gauge.cc index 488ac3711d..4e7bd7dc29 100644 --- a/src/telemetry/Gauge.cc +++ b/src/telemetry/Gauge.cc @@ -3,6 +3,7 @@ #include "zeek/telemetry/Gauge.h" #include +#include using namespace zeek::telemetry; @@ -17,7 +18,7 @@ double Gauge::Value() const noexcept { Gauge::Gauge(FamilyType* family, const prometheus::Labels& labels, detail::CollectCallbackPtr callback) noexcept : family(family), handle(family->Add(labels)), labels(labels), callback(std::move(callback)) {} -std::shared_ptr GaugeFamily::GetOrAdd(Span labels, detail::CollectCallbackPtr callback) { +std::shared_ptr GaugeFamily::GetOrAdd(std::span labels, detail::CollectCallbackPtr callback) { prometheus::Labels p_labels = detail::BuildPrometheusLabels(labels); auto check = [&](const std::shared_ptr& gauge) { return gauge->CompareLabels(p_labels); }; @@ -32,7 +33,7 @@ std::shared_ptr GaugeFamily::GetOrAdd(Span labels, detai std::shared_ptr GaugeFamily::GetOrAdd(std::initializer_list labels, detail::CollectCallbackPtr callback) { - return GetOrAdd(Span{labels.begin(), labels.size()}, std::move(callback)); + return GetOrAdd(std::span{labels.begin(), labels.size()}, std::move(callback)); } void GaugeFamily::RunCallbacks() { diff --git a/src/telemetry/Gauge.h b/src/telemetry/Gauge.h index abc1b9bd33..bb08d21ab8 100644 --- a/src/telemetry/Gauge.h +++ b/src/telemetry/Gauge.h @@ -7,9 +7,9 @@ #include #include #include +#include #include "zeek/NetVar.h" // For BifEnum::Telemetry value -#include "zeek/Span.h" #include "zeek/telemetry/MetricFamily.h" #include "zeek/telemetry/Utils.h" @@ -103,7 +103,7 @@ public: * Returns the metrics handle for given labels, creating a new instance * lazily if necessary. */ - GaugePtr GetOrAdd(Span labels, detail::CollectCallbackPtr callback = nullptr); + GaugePtr GetOrAdd(std::span labels, detail::CollectCallbackPtr callback = nullptr); /** * @copydoc GetOrAdd @@ -112,7 +112,7 @@ public: zeek_int_t MetricType() const noexcept override { return BifEnum::Telemetry::MetricType::GAUGE; } - GaugeFamily(prometheus::Family* family, Span labels) + GaugeFamily(prometheus::Family* family, std::span labels) : MetricFamily(labels), family(family) {} void RunCallbacks() override; diff --git a/src/telemetry/Histogram.cc b/src/telemetry/Histogram.cc index ce4b9e3fd2..014973d735 100644 --- a/src/telemetry/Histogram.cc +++ b/src/telemetry/Histogram.cc @@ -3,6 +3,7 @@ #include "zeek/telemetry/Histogram.h" #include +#include using namespace zeek::telemetry; @@ -15,7 +16,7 @@ Histogram::Histogram(FamilyType* family, const prometheus::Labels& labels, prometheus::Histogram::BucketBoundaries bounds) noexcept : handle(family->Add(labels, std::move(bounds))), labels(labels) {} -std::shared_ptr HistogramFamily::GetOrAdd(Span labels) { +std::shared_ptr HistogramFamily::GetOrAdd(std::span labels) { prometheus::Labels p_labels = detail::BuildPrometheusLabels(labels); auto check = [&](const std::shared_ptr& histo) { return histo->CompareLabels(p_labels); }; @@ -32,11 +33,11 @@ std::shared_ptr HistogramFamily::GetOrAdd(Span label * @copydoc GetOrAdd */ std::shared_ptr HistogramFamily::GetOrAdd(std::initializer_list labels) { - return GetOrAdd(Span{labels.begin(), labels.size()}); + return GetOrAdd(std::span{labels.begin(), labels.size()}); } -HistogramFamily::HistogramFamily(prometheus::Family* family, Span bounds, - Span labels) +HistogramFamily::HistogramFamily(prometheus::Family* family, std::span bounds, + std::span labels) : MetricFamily(labels), family(family) { std::ranges::copy(bounds, std::back_inserter(boundaries)); } diff --git a/src/telemetry/Histogram.h b/src/telemetry/Histogram.h index 8a13803e26..bb705a430a 100644 --- a/src/telemetry/Histogram.h +++ b/src/telemetry/Histogram.h @@ -6,9 +6,9 @@ #include #include #include +#include #include "zeek/NetVar.h" // For BifEnum::Telemetry values -#include "zeek/Span.h" #include "zeek/telemetry/MetricFamily.h" #include "zeek/telemetry/Utils.h" @@ -49,14 +49,14 @@ class HistogramFamily : public MetricFamily { public: static inline const char* OpaqueName = "HistogramMetricFamilyVal"; - HistogramFamily(prometheus::Family* family, Span bounds, - Span labels); + HistogramFamily(prometheus::Family* family, std::span bounds, + std::span labels); /** * Returns the metrics handle for given labels, creating a new instance * lazily if necessary. */ - HistogramPtr GetOrAdd(Span labels); + HistogramPtr GetOrAdd(std::span labels); /** * @copydoc GetOrAdd diff --git a/src/telemetry/Manager.cc b/src/telemetry/Manager.cc index 5c4d2fb1d8..92f730bdd3 100644 --- a/src/telemetry/Manager.cc +++ b/src/telemetry/Manager.cc @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "zeek/Func.h" @@ -502,7 +503,7 @@ void Manager::BuildClusterJson() { } CounterFamilyPtr Manager::CounterFamily(std::string_view prefix, std::string_view name, - Span labels, std::string_view helptext, + std::span labels, std::string_view helptext, std::string_view unit) { auto full_name = detail::BuildFullPrometheusName(prefix, name, unit, true); @@ -520,11 +521,11 @@ CounterFamilyPtr Manager::CounterFamily(std::string_view prefix, std::string_vie CounterFamilyPtr Manager::CounterFamily(std::string_view prefix, std::string_view name, std::initializer_list labels, std::string_view helptext, std::string_view unit) { - auto lbl_span = Span{labels.begin(), labels.size()}; + auto lbl_span = std::span{labels.begin(), labels.size()}; return CounterFamily(prefix, name, lbl_span, helptext, unit); } -CounterPtr Manager::CounterInstance(std::string_view prefix, std::string_view name, Span labels, +CounterPtr Manager::CounterInstance(std::string_view prefix, std::string_view name, std::span labels, std::string_view helptext, std::string_view unit, detail::CollectCallbackPtr callback) { return WithLabelNames(labels, [&, this](auto labelNames) { @@ -536,12 +537,12 @@ CounterPtr Manager::CounterInstance(std::string_view prefix, std::string_view na CounterPtr Manager::CounterInstance(std::string_view prefix, std::string_view name, std::initializer_list labels, std::string_view helptext, std::string_view unit, detail::CollectCallbackPtr callback) { - auto lbl_span = Span{labels.begin(), labels.size()}; + auto lbl_span = std::span{labels.begin(), labels.size()}; return CounterInstance(prefix, name, lbl_span, helptext, unit, std::move(callback)); } std::shared_ptr Manager::GaugeFamily(std::string_view prefix, std::string_view name, - Span labels, std::string_view helptext, + std::span labels, std::string_view helptext, std::string_view unit) { auto full_name = detail::BuildFullPrometheusName(prefix, name, unit, false); @@ -559,11 +560,11 @@ std::shared_ptr Manager::GaugeFamily(std::string_view prefix, std:: GaugeFamilyPtr Manager::GaugeFamily(std::string_view prefix, std::string_view name, std::initializer_list labels, std::string_view helptext, std::string_view unit) { - auto lbl_span = Span{labels.begin(), labels.size()}; + auto lbl_span = std::span{labels.begin(), labels.size()}; return GaugeFamily(prefix, name, lbl_span, helptext, unit); } -GaugePtr Manager::GaugeInstance(std::string_view prefix, std::string_view name, Span labels, +GaugePtr Manager::GaugeInstance(std::string_view prefix, std::string_view name, std::span labels, std::string_view helptext, std::string_view unit, detail::CollectCallbackPtr callback) { return WithLabelNames(labels, [&, this](auto labelNames) { auto family = GaugeFamily(prefix, name, labelNames, helptext, unit); @@ -573,12 +574,12 @@ GaugePtr Manager::GaugeInstance(std::string_view prefix, std::string_view name, GaugePtr Manager::GaugeInstance(std::string_view prefix, std::string_view name, std::initializer_list labels, std::string_view helptext, std::string_view unit, detail::CollectCallbackPtr callback) { - auto lbl_span = Span{labels.begin(), labels.size()}; + auto lbl_span = std::span{labels.begin(), labels.size()}; return GaugeInstance(prefix, name, lbl_span, helptext, unit, std::move(callback)); } HistogramFamilyPtr Manager::HistogramFamily(std::string_view prefix, std::string_view name, - Span labels, ConstSpan bounds, + std::span labels, std::span bounds, std::string_view helptext, std::string_view unit) { auto full_name = detail::BuildFullPrometheusName(prefix, name, unit); @@ -594,14 +595,16 @@ HistogramFamilyPtr Manager::HistogramFamily(std::string_view prefix, std::string } HistogramFamilyPtr Manager::HistogramFamily(std::string_view prefix, std::string_view name, - std::initializer_list labels, ConstSpan bounds, - std::string_view helptext, std::string_view unit) { - auto lbl_span = Span{labels.begin(), labels.size()}; + std::initializer_list labels, + std::span bounds, std::string_view helptext, + std::string_view unit) { + auto lbl_span = std::span{labels.begin(), labels.size()}; return HistogramFamily(prefix, name, lbl_span, bounds, helptext, unit); } -HistogramPtr Manager::HistogramInstance(std::string_view prefix, std::string_view name, Span labels, - ConstSpan bounds, std::string_view helptext, std::string_view unit) { +HistogramPtr Manager::HistogramInstance(std::string_view prefix, std::string_view name, + std::span labels, std::span bounds, + std::string_view helptext, std::string_view unit) { return WithLabelNames(labels, [&, this](auto labelNames) { auto family = HistogramFamily(prefix, name, labelNames, bounds, helptext, unit); return family->GetOrAdd(labels); @@ -611,8 +614,8 @@ HistogramPtr Manager::HistogramInstance(std::string_view prefix, std::string_vie HistogramPtr Manager::HistogramInstance(std::string_view prefix, std::string_view name, std::initializer_list labels, std::initializer_list bounds, std::string_view helptext, std::string_view unit) { - auto lbls = Span{labels.begin(), labels.size()}; - auto bounds_span = Span{bounds.begin(), bounds.size()}; + auto lbls = std::span{labels.begin(), labels.size()}; + auto bounds_span = std::span{bounds.begin(), bounds.size()}; return HistogramInstance(prefix, name, lbls, bounds_span, helptext, unit); } diff --git a/src/telemetry/Manager.h b/src/telemetry/Manager.h index a237af3940..f14a04a331 100644 --- a/src/telemetry/Manager.h +++ b/src/telemetry/Manager.h @@ -6,12 +6,12 @@ #include #include #include +#include #include #include #include "zeek/Flare.h" #include "zeek/IntrusivePtr.h" -#include "zeek/Span.h" #include "zeek/iosource/IOSource.h" #include "zeek/telemetry/Counter.h" #include "zeek/telemetry/Gauge.h" @@ -81,8 +81,9 @@ public: * @param helptext Short explanation of the metric. * @param unit Unit of measurement. */ - CounterFamilyPtr CounterFamily(std::string_view prefix, std::string_view name, Span labels, - std::string_view helptext, std::string_view unit = ""); + CounterFamilyPtr CounterFamily(std::string_view prefix, std::string_view name, + std::span labels, std::string_view helptext, + std::string_view unit = ""); /// @copydoc CounterFamily CounterFamilyPtr CounterFamily(std::string_view prefix, std::string_view name, @@ -100,7 +101,7 @@ public: * @param callback Passing a callback method will enable asynchronous mode. The callback method will be called * by the metrics subsystem whenever data is requested. */ - CounterPtr CounterInstance(std::string_view prefix, std::string_view name, Span labels, + CounterPtr CounterInstance(std::string_view prefix, std::string_view name, std::span labels, std::string_view helptext, std::string_view unit = "", detail::CollectCallbackPtr callback = nullptr); @@ -117,7 +118,7 @@ public: * @param helptext Short explanation of the metric. * @param unit Unit of measurement. */ - GaugeFamilyPtr GaugeFamily(std::string_view prefix, std::string_view name, Span labels, + GaugeFamilyPtr GaugeFamily(std::string_view prefix, std::string_view name, std::span labels, std::string_view helptext, std::string_view unit = ""); /// @copydoc GaugeFamily @@ -136,7 +137,7 @@ public: * @param callback Passing a callback method will enable asynchronous mode. The callback method will be called * by the metrics subsystem whenever data is requested. */ - GaugePtr GaugeInstance(std::string_view prefix, std::string_view name, Span labels, + GaugePtr GaugeInstance(std::string_view prefix, std::string_view name, std::span labels, std::string_view helptext, std::string_view unit = "", detail::CollectCallbackPtr callback = nullptr); @@ -145,17 +146,6 @@ public: std::string_view helptext, std::string_view unit = "", detail::CollectCallbackPtr callback = nullptr); - // Forces the compiler to use the type `Span` instead of trying to - // match parameters to a `span`. - template - struct ConstSpanOracle { - using Type = Span; - }; - - // Convenience alias to safe some typing. - template - using ConstSpan = typename ConstSpanOracle::Type; - /** * Returns a histogram metric family. Creates the family lazily if * necessary. @@ -175,12 +165,12 @@ public: * @p bounds via run-time configuration. */ HistogramFamilyPtr HistogramFamily(std::string_view prefix, std::string_view name, - Span labels, ConstSpan bounds, + std::span labels, std::span bounds, std::string_view helptext, std::string_view unit = ""); /// @copydoc HistogramFamily HistogramFamilyPtr HistogramFamily(std::string_view prefix, std::string_view name, - std::initializer_list labels, ConstSpan bounds, + std::initializer_list labels, std::span bounds, std::string_view helptext, std::string_view unit = ""); /** @@ -200,8 +190,9 @@ public: * different bucket settings. Users may also override * @p bounds via run-time configuration. */ - HistogramPtr HistogramInstance(std::string_view prefix, std::string_view name, Span labels, - ConstSpan bounds, std::string_view helptext, std::string_view unit = ""); + HistogramPtr HistogramInstance(std::string_view prefix, std::string_view name, std::span labels, + std::span bounds, std::string_view helptext, + std::string_view unit = ""); /// @copdoc HistogramInstance HistogramPtr HistogramInstance(std::string_view prefix, std::string_view name, @@ -229,20 +220,20 @@ public: protected: template - static auto WithLabelNames(Span xs, F continuation) { + static auto WithLabelNames(std::span xs, F continuation) { if ( xs.size() <= 10 ) { std::string_view buf[10]; for ( size_t index = 0; index < xs.size(); ++index ) buf[index] = xs[index].first; - return continuation(Span{buf, xs.size()}); + return continuation(std::span{buf, xs.size()}); } else { std::vector buf; for ( auto x : xs ) buf.emplace_back(x.first); - return continuation(Span{buf}); + return continuation(std::span{buf}); } } diff --git a/src/telemetry/MetricFamily.h b/src/telemetry/MetricFamily.h index aa2c8da339..04f24b0e81 100644 --- a/src/telemetry/MetricFamily.h +++ b/src/telemetry/MetricFamily.h @@ -2,10 +2,10 @@ #pragma once +#include #include #include -#include "zeek/Span.h" #include "zeek/util-types.h" namespace zeek::telemetry { @@ -25,7 +25,7 @@ public: virtual void RunCallbacks() = 0; protected: - MetricFamily(Span labels) { + MetricFamily(std::span labels) { for ( const auto& lbl : labels ) label_names.emplace_back(lbl); } diff --git a/src/telemetry/Utils.cc b/src/telemetry/Utils.cc index 8fe78a7bbf..cf842743e4 100644 --- a/src/telemetry/Utils.cc +++ b/src/telemetry/Utils.cc @@ -3,6 +3,7 @@ #include "zeek/telemetry/Utils.h" #include +#include #include "zeek/ID.h" #include "zeek/Reporter.h" @@ -42,7 +43,7 @@ std::string BuildFullPrometheusName(std::string_view prefix, std::string_view na return fn; } -prometheus::Labels BuildPrometheusLabels(Span labels) { +prometheus::Labels BuildPrometheusLabels(std::span labels) { prometheus::Labels p_labels; static std::string metrics_endpoint_label = diff --git a/src/telemetry/Utils.h b/src/telemetry/Utils.h index 0ce613151e..d4cc8b1ac6 100644 --- a/src/telemetry/Utils.h +++ b/src/telemetry/Utils.h @@ -4,10 +4,9 @@ #include #include +#include #include -#include "zeek/Span.h" - namespace zeek::telemetry { using LabelView = std::pair; @@ -18,7 +17,7 @@ namespace detail { * Builds a set of labels for prometheus based on a set of labels from * Zeek. This adds an 'endpoint' label if it's missing from the set. */ -prometheus::Labels BuildPrometheusLabels(Span labels); +prometheus::Labels BuildPrometheusLabels(std::span labels); /** * Builds a full metric name for Prometheus from prefix, name, and unit values. diff --git a/src/telemetry/telemetry_functions.bif b/src/telemetry/telemetry_functions.bif index d6497784d0..8672e864bb 100644 --- a/src/telemetry/telemetry_functions.bif +++ b/src/telemetry/telemetry_functions.bif @@ -4,6 +4,7 @@ module Telemetry; %%{ +#include #include "zeek/telemetry/Counter.h" #include "zeek/telemetry/Gauge.h" #include "zeek/telemetry/Histogram.h" @@ -64,8 +65,8 @@ std::vector sv_tbl(zeek::TableVal* xs) return result; } -bool labels_valid(zeek::Span labels, - zeek::Span label_names) +bool labels_valid(std::span labels, + std::span label_names) { auto key_in_label_names = [keys{label_names}](auto x) { diff --git a/src/util-types.h b/src/util-types.h index 8e2e40bea4..63f6f15cf1 100644 --- a/src/util-types.h +++ b/src/util-types.h @@ -3,10 +3,10 @@ #pragma once #include +#include #include #include "zeek/3rdparty/nonstd/expected.hpp" -#include "zeek/Span.h" // These two types are not namespaced intentionally. using zeek_int_t = int64_t; @@ -24,7 +24,7 @@ using unexpected = nonstd::unexpected; // Byte buffer types used by serialization code in storage and cluster. using byte_buffer = std::vector; -using byte_buffer_span = Span; +using byte_buffer_span = std::span; namespace util { namespace detail {