Merge remote-tracking branch 'origin/topic/neverlord/hide-caf'

* origin/topic/neverlord/hide-caf:
  Fix GCC builds and string output for Broker errors
  Update to latest Broker without public CAF dep
This commit is contained in:
Robin Sommer 2022-02-07 16:24:06 +01:00
commit 5f1f005142
No known key found for this signature in database
GPG key ID: 6BEDA4DA6B8B23E3
34 changed files with 393 additions and 1066 deletions

View file

@ -1,3 +1,11 @@
5.0.0-dev.97 | 2022-02-07 16:24:06 +0100
* Update to latest Broker without public CAF dependencies. (Dominik
Charousset, Corelight)
* Fix GCC builds and string output for Broker errors (Dominik
Charousset, Corelight)
5.0.0-dev.94 | 2022-02-07 08:14:47 -0700 5.0.0-dev.94 | 2022-02-07 08:14:47 -0700
* String/StringVal: Replace char*/string constructors with string_view (Tim Wojtulewicz, Corelight) * String/StringVal: Replace char*/string constructors with string_view (Tim Wojtulewicz, Corelight)

View file

@ -331,36 +331,15 @@ if ( PYTHON_VERSION_STRING VERSION_LESS ${ZEEK_PYTHON_MIN} )
message(FATAL_ERROR "Python ${ZEEK_PYTHON_MIN} or greater is required.") message(FATAL_ERROR "Python ${ZEEK_PYTHON_MIN} or greater is required.")
endif () endif ()
if ( CAF_ROOT OR BROKER_ROOT_DIR )
# TODO: drop < 3.12 compatibility check when raising the minimum CMake version
if ( CAF_ROOT AND CMAKE_VERSION VERSION_LESS 3.12 )
find_package(CAF ${CAF_VERSION_MIN_REQUIRED} REQUIRED
COMPONENTS openssl test io core
PATHS "${CAF_ROOT}")
else ()
find_package(CAF ${CAF_VERSION_MIN_REQUIRED} REQUIRED
COMPONENTS openssl test io core)
endif ()
message(STATUS "Using system CAF version ${CAF_VERSION}")
# TODO: drop these legacy variables and simply use the targets consistently
set(CAF_LIBRARIES CAF::core CAF::io CAF::openssl CACHE INTERNAL "")
set(caf_dirs "")
foreach (caf_lib IN LISTS CAF_LIBRARIES ITEMS CAF::test)
get_target_property(dirs ${caf_lib} INTERFACE_INCLUDE_DIRECTORIES)
if ( dirs )
list(APPEND caf_dirs ${dirs})
endif ()
endforeach ()
list(REMOVE_DUPLICATES caf_dirs)
list(GET caf_dirs 0 caf_dir)
set(CAF_INCLUDE_DIRS "${caf_dirs}" CACHE INTERNAL "")
endif ()
add_subdirectory(auxil/paraglob) add_subdirectory(auxil/paraglob)
set(zeekdeps ${zeekdeps} paraglob) set(zeekdeps ${zeekdeps} paraglob)
if ( BROKER_ROOT_DIR ) if ( Broker_ROOT )
find_package(Broker REQUIRED) find_package(Broker REQUIRED PATHS "${Broker_ROOT}")
set(zeekdeps ${zeekdeps} ${BROKER_LIBRARY})
set(broker_includes ${BROKER_INCLUDE_DIR})
elseif ( BROKER_ROOT_DIR )
find_package(Broker REQUIRED PATHS "${BROKER_ROOT_DIR}")
set(zeekdeps ${zeekdeps} ${BROKER_LIBRARY}) set(zeekdeps ${zeekdeps} ${BROKER_LIBRARY})
set(broker_includes ${BROKER_INCLUDE_DIR}) set(broker_includes ${BROKER_INCLUDE_DIR})
else () else ()
@ -385,11 +364,6 @@ else ()
set(broker_includes ${CMAKE_CURRENT_SOURCE_DIR}/auxil/broker/include ${CMAKE_CURRENT_BINARY_DIR}/auxil/broker/include) set(broker_includes ${CMAKE_CURRENT_SOURCE_DIR}/auxil/broker/include ${CMAKE_CURRENT_BINARY_DIR}/auxil/broker/include)
endif () endif ()
# CAF_LIBRARIES and CAF_INCLUDE_DIRS are defined either by calling
# find_package(CAF) or by calling add_subdirectory(auxil/broker). In either case,
# we have to care about CAF here because Broker headers can pull in CAF
# headers.
set(zeekdeps ${zeekdeps} ${CAF_LIBRARIES})
include_directories(BEFORE include_directories(BEFORE
${PCAP_INCLUDE_DIR} ${PCAP_INCLUDE_DIR}
${BIND_INCLUDE_DIR} ${BIND_INCLUDE_DIR}
@ -462,7 +436,7 @@ endif ()
# Any headers that are possibly bundled in the Zeek source-tree and that are supposed # Any headers that are possibly bundled in the Zeek source-tree and that are supposed
# to have priority over any pre-existing/system-wide headers need to appear early in # to have priority over any pre-existing/system-wide headers need to appear early in
# compiler search path. # compiler search path.
include_directories(BEFORE ${broker_includes} ${CAF_INCLUDE_DIRS}) include_directories(BEFORE ${broker_includes})
include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/auxil/highwayhash) include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/auxil/highwayhash)
include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/auxil/paraglob/include) include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/auxil/paraglob/include)
include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/auxil/rapidjson/include) include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/auxil/rapidjson/include)
@ -522,12 +496,6 @@ execute_process(COMMAND "${CMAKE_COMMAND}" -E create_symlink
"." "."
"${CMAKE_CURRENT_BINARY_DIR}/zeek") "${CMAKE_CURRENT_BINARY_DIR}/zeek")
if ( CAF_ROOT )
set(ZEEK_CONFIG_CAF_ROOT_DIR ${CAF_ROOT})
else ()
set(ZEEK_CONFIG_CAF_ROOT_DIR ${ZEEK_ROOT_DIR})
endif ()
if ( BinPAC_ROOT_DIR ) if ( BinPAC_ROOT_DIR )
set(ZEEK_CONFIG_BINPAC_ROOT_DIR ${BinPAC_ROOT_DIR}) set(ZEEK_CONFIG_BINPAC_ROOT_DIR ${BinPAC_ROOT_DIR})
else () else ()

View file

@ -1 +1 @@
5.0.0-dev.94 5.0.0-dev.97

@ -1 +1 @@
Subproject commit 41c524f172aa357422f1ccf7e806b448d5def08e Subproject commit 8493e1734c639ea9b3c66547ba26ebea972e102b

View file

@ -18,16 +18,11 @@
#include "zeek/ZeekArgs.h" #include "zeek/ZeekArgs.h"
#include "zeek/ZeekList.h" #include "zeek/ZeekList.h"
namespace caf
{
template <class> class expected;
}
namespace broker namespace broker
{ {
class data; class data;
using vector = std::vector<data>; using vector = std::vector<data>;
using caf::expected; template <class> class expected;
} }
namespace zeek namespace zeek

View file

@ -33,7 +33,7 @@ inline bool get_vector_idx(const V& v, unsigned int i, D* dst)
if ( i >= v.size() ) if ( i >= v.size() )
return false; return false;
auto x = caf::get_if<S>(&v[i]); auto x = broker::get_if<S>(&v[i]);
if ( ! x ) if ( ! x )
return false; return false;
@ -81,12 +81,12 @@ broker::expected<broker::data> OpaqueVal::Serialize() const
OpaqueValPtr OpaqueVal::Unserialize(const broker::data& data) OpaqueValPtr OpaqueVal::Unserialize(const broker::data& data)
{ {
auto v = caf::get_if<broker::vector>(&data); auto v = broker::get_if<broker::vector>(&data);
if ( ! (v && v->size() == 2) ) if ( ! (v && v->size() == 2) )
return nullptr; return nullptr;
auto type = caf::get_if<std::string>(&(*v)[0]); auto type = broker::get_if<std::string>(&(*v)[0]);
if ( ! type ) if ( ! type )
return nullptr; return nullptr;
@ -118,17 +118,17 @@ broker::expected<broker::data> OpaqueVal::SerializeType(const TypePtr& t)
TypePtr OpaqueVal::UnserializeType(const broker::data& data) TypePtr OpaqueVal::UnserializeType(const broker::data& data)
{ {
auto v = caf::get_if<broker::vector>(&data); auto v = broker::get_if<broker::vector>(&data);
if ( ! (v && v->size() == 2) ) if ( ! (v && v->size() == 2) )
return nullptr; return nullptr;
auto by_name = caf::get_if<bool>(&(*v)[0]); auto by_name = broker::get_if<bool>(&(*v)[0]);
if ( ! by_name ) if ( ! by_name )
return nullptr; return nullptr;
if ( *by_name ) if ( *by_name )
{ {
auto name = caf::get_if<std::string>(&(*v)[1]); auto name = broker::get_if<std::string>(&(*v)[1]);
if ( ! name ) if ( ! name )
return nullptr; return nullptr;
@ -142,7 +142,7 @@ TypePtr OpaqueVal::UnserializeType(const broker::data& data)
return id->GetType(); return id->GetType();
} }
auto tag = caf::get_if<uint64_t>(&(*v)[1]); auto tag = broker::get_if<uint64_t>(&(*v)[1]);
if ( ! tag ) if ( ! tag )
return nullptr; return nullptr;
@ -295,11 +295,11 @@ broker::expected<broker::data> MD5Val::DoSerialize() const
bool MD5Val::DoUnserialize(const broker::data& data) bool MD5Val::DoUnserialize(const broker::data& data)
{ {
auto d = caf::get_if<broker::vector>(&data); auto d = broker::get_if<broker::vector>(&data);
if ( ! d ) if ( ! d )
return false; return false;
auto valid = caf::get_if<bool>(&(*d)[0]); auto valid = broker::get_if<bool>(&(*d)[0]);
if ( ! valid ) if ( ! valid )
return false; return false;
@ -312,7 +312,7 @@ bool MD5Val::DoUnserialize(const broker::data& data)
if ( (*d).size() != 2 ) if ( (*d).size() != 2 )
return false; return false;
auto s = caf::get_if<std::string>(&(*d)[1]); auto s = broker::get_if<std::string>(&(*d)[1]);
if ( ! s ) if ( ! s )
return false; return false;
@ -385,11 +385,11 @@ broker::expected<broker::data> SHA1Val::DoSerialize() const
bool SHA1Val::DoUnserialize(const broker::data& data) bool SHA1Val::DoUnserialize(const broker::data& data)
{ {
auto d = caf::get_if<broker::vector>(&data); auto d = broker::get_if<broker::vector>(&data);
if ( ! d ) if ( ! d )
return false; return false;
auto valid = caf::get_if<bool>(&(*d)[0]); auto valid = broker::get_if<bool>(&(*d)[0]);
if ( ! valid ) if ( ! valid )
return false; return false;
@ -402,7 +402,7 @@ bool SHA1Val::DoUnserialize(const broker::data& data)
if ( (*d).size() != 2 ) if ( (*d).size() != 2 )
return false; return false;
auto s = caf::get_if<std::string>(&(*d)[1]); auto s = broker::get_if<std::string>(&(*d)[1]);
if ( ! s ) if ( ! s )
return false; return false;
@ -475,11 +475,11 @@ broker::expected<broker::data> SHA256Val::DoSerialize() const
bool SHA256Val::DoUnserialize(const broker::data& data) bool SHA256Val::DoUnserialize(const broker::data& data)
{ {
auto d = caf::get_if<broker::vector>(&data); auto d = broker::get_if<broker::vector>(&data);
if ( ! d ) if ( ! d )
return false; return false;
auto valid = caf::get_if<bool>(&(*d)[0]); auto valid = broker::get_if<bool>(&(*d)[0]);
if ( ! valid ) if ( ! valid )
return false; return false;
@ -492,7 +492,7 @@ bool SHA256Val::DoUnserialize(const broker::data& data)
if ( (*d).size() != 2 ) if ( (*d).size() != 2 )
return false; return false;
auto s = caf::get_if<std::string>(&(*d)[1]); auto s = broker::get_if<std::string>(&(*d)[1]);
if ( ! s ) if ( ! s )
return false; return false;
@ -546,7 +546,7 @@ broker::expected<broker::data> EntropyVal::DoSerialize() const
bool EntropyVal::DoUnserialize(const broker::data& data) bool EntropyVal::DoUnserialize(const broker::data& data)
{ {
auto d = caf::get_if<broker::vector>(&data); auto d = broker::get_if<broker::vector>(&data);
if ( ! d ) if ( ! d )
return false; return false;
@ -728,12 +728,12 @@ broker::expected<broker::data> BloomFilterVal::DoSerialize() const
bool BloomFilterVal::DoUnserialize(const broker::data& data) bool BloomFilterVal::DoUnserialize(const broker::data& data)
{ {
auto v = caf::get_if<broker::vector>(&data); auto v = broker::get_if<broker::vector>(&data);
if ( ! (v && v->size() == 2) ) if ( ! (v && v->size() == 2) )
return false; return false;
auto no_type = caf::get_if<broker::none>(&(*v)[0]); auto no_type = broker::get_if<broker::none>(&(*v)[0]);
if ( ! no_type ) if ( ! no_type )
{ {
auto t = UnserializeType((*v)[0]); auto t = UnserializeType((*v)[0]);
@ -822,12 +822,12 @@ broker::expected<broker::data> CardinalityVal::DoSerialize() const
bool CardinalityVal::DoUnserialize(const broker::data& data) bool CardinalityVal::DoUnserialize(const broker::data& data)
{ {
auto v = caf::get_if<broker::vector>(&data); auto v = broker::get_if<broker::vector>(&data);
if ( ! (v && v->size() == 2) ) if ( ! (v && v->size() == 2) )
return false; return false;
auto no_type = caf::get_if<broker::none>(&(*v)[0]); auto no_type = broker::get_if<broker::none>(&(*v)[0]);
if ( ! no_type ) if ( ! no_type )
{ {
auto t = UnserializeType((*v)[0]); auto t = UnserializeType((*v)[0]);
@ -879,7 +879,7 @@ broker::expected<broker::data> ParaglobVal::DoSerialize() const
bool ParaglobVal::DoUnserialize(const broker::data& data) bool ParaglobVal::DoUnserialize(const broker::data& data)
{ {
auto d = caf::get_if<broker::vector>(&data); auto d = broker::get_if<broker::vector>(&data);
if ( ! d ) if ( ! d )
return false; return false;

View file

@ -2143,15 +2143,7 @@ void TableVal::SendToStore(const Val* index, const TableEntryVal* new_entry_val,
case ELEMENT_NEW: case ELEMENT_NEW:
case ELEMENT_CHANGED: case ELEMENT_CHANGED:
{ {
#ifndef __clang__ std::optional<broker::timespan> expiry;
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
#endif
broker::optional<broker::timespan> expiry;
#ifndef __clang__
#pragma GCC diagnostic pop
#endif
auto expire_time = GetExpireTime(); auto expire_time = GetExpireTime();
if ( expire_time == 0 ) if ( expire_time == 0 )
// Entry is set to immediately expire. Let's not forward it. // Entry is set to immediately expire. Let's not forward it.

View file

@ -226,7 +226,7 @@ struct val_converter
{ {
const auto& expected_index_types = tt->GetIndices()->GetTypes(); const auto& expected_index_types = tt->GetIndices()->GetTypes();
broker::vector composite_key; broker::vector composite_key;
auto indices = caf::get_if<broker::vector>(&item); auto indices = get_if<broker::vector>(&item);
if ( indices ) if ( indices )
{ {
@ -281,7 +281,7 @@ struct val_converter
{ {
const auto& expected_index_types = tt->GetIndices()->GetTypes(); const auto& expected_index_types = tt->GetIndices()->GetTypes();
broker::vector composite_key; broker::vector composite_key;
auto indices = caf::get_if<broker::vector>(&item.first); auto indices = get_if<broker::vector>(&item.first);
if ( indices ) if ( indices )
{ {
@ -446,7 +446,7 @@ struct val_converter
if ( idx >= a.size() ) if ( idx >= a.size() )
return nullptr; return nullptr;
if ( caf::get_if<broker::none>(&a[idx]) != nullptr ) if ( get_if<broker::none>(&a[idx]) != nullptr )
{ {
rval->Remove(i); rval->Remove(i);
++idx; ++idx;
@ -469,8 +469,8 @@ struct val_converter
if ( a.size() != 2 ) if ( a.size() != 2 )
return nullptr; return nullptr;
auto exact_text = caf::get_if<std::string>(&a[0]); auto exact_text = get_if<std::string>(&a[0]);
auto anywhere_text = caf::get_if<std::string>(&a[1]); auto anywhere_text = get_if<std::string>(&a[1]);
if ( ! exact_text || ! anywhere_text ) if ( ! exact_text || ! anywhere_text )
return nullptr; return nullptr;
@ -606,7 +606,7 @@ struct type_checker
for ( const auto& item : a ) for ( const auto& item : a )
{ {
const auto& expected_index_types = tt->GetIndices()->GetTypes(); const auto& expected_index_types = tt->GetIndices()->GetTypes();
auto indices = caf::get_if<broker::vector>(&item); auto indices = get_if<broker::vector>(&item);
vector<const broker::data*> indices_to_check; vector<const broker::data*> indices_to_check;
if ( indices ) if ( indices )
@ -663,7 +663,7 @@ struct type_checker
for ( auto& item : a ) for ( auto& item : a )
{ {
const auto& expected_index_types = tt->GetIndices()->GetTypes(); const auto& expected_index_types = tt->GetIndices()->GetTypes();
auto indices = caf::get_if<broker::vector>(&item.first); auto indices = get_if<broker::vector>(&item.first);
vector<const broker::data*> indices_to_check; vector<const broker::data*> indices_to_check;
if ( indices ) if ( indices )
@ -765,7 +765,7 @@ struct type_checker
if ( idx >= a.size() ) if ( idx >= a.size() )
return false; return false;
if ( caf::get_if<broker::none>(&a[idx]) != nullptr ) if ( get_if<broker::none>(&a[idx]) != nullptr )
{ {
++idx; ++idx;
continue; continue;
@ -784,8 +784,8 @@ struct type_checker
if ( a.size() != 2 ) if ( a.size() != 2 )
return false; return false;
auto exact_text = caf::get_if<std::string>(&a[0]); auto exact_text = get_if<std::string>(&a[0]);
auto anywhere_text = caf::get_if<std::string>(&a[1]); auto anywhere_text = get_if<std::string>(&a[1]);
if ( ! exact_text || ! anywhere_text ) if ( ! exact_text || ! anywhere_text )
return false; return false;
@ -820,7 +820,7 @@ static bool data_type_check(const broker::data& d, Type* t)
if ( t->Tag() == TYPE_ANY ) if ( t->Tag() == TYPE_ANY )
return true; return true;
return caf::visit(type_checker{t}, d); return visit(type_checker{t}, d);
} }
ValPtr data_to_val(broker::data d, Type* type) ValPtr data_to_val(broker::data d, Type* type)
@ -828,7 +828,7 @@ ValPtr data_to_val(broker::data d, Type* type)
if ( type->Tag() == TYPE_ANY ) if ( type->Tag() == TYPE_ANY )
return make_data_val(move(d)); return make_data_val(move(d));
return caf::visit(val_converter{type}, std::move(d)); return visit(val_converter{type}, d);
} }
broker::expected<broker::data> val_to_data(const Val* v) broker::expected<broker::data> val_to_data(const Val* v)
@ -961,7 +961,7 @@ broker::expected<broker::data> val_to_data(const Val* v)
key = move(composite_key); key = move(composite_key);
if ( is_set ) if ( is_set )
caf::get<broker::set>(rval).emplace(move(key)); get<broker::set>(rval).emplace(move(key));
else else
{ {
auto val = val_to_data(entry->GetVal().get()); auto val = val_to_data(entry->GetVal().get());
@ -969,7 +969,7 @@ broker::expected<broker::data> val_to_data(const Val* v)
if ( ! val ) if ( ! val )
return broker::ec::invalid_data; return broker::ec::invalid_data;
caf::get<broker::table>(rval).emplace(move(key), move(*val)); get<broker::table>(rval).emplace(move(key), move(*val));
} }
} }
@ -1180,7 +1180,7 @@ struct data_type_getter
EnumValPtr get_data_type(RecordVal* v, zeek::detail::Frame* frame) EnumValPtr get_data_type(RecordVal* v, zeek::detail::Frame* frame)
{ {
return caf::visit(data_type_getter{}, opaque_field_to_data(v, frame)); return visit(data_type_getter{}, opaque_field_to_data(v, frame));
} }
broker::data& opaque_field_to_data(RecordVal* v, zeek::detail::Frame* f) broker::data& opaque_field_to_data(RecordVal* v, zeek::detail::Frame* f)
@ -1240,11 +1240,11 @@ broker::expected<broker::data> SetIterator::DoSerialize() const
bool SetIterator::DoUnserialize(const broker::data& data) bool SetIterator::DoUnserialize(const broker::data& data)
{ {
auto v = caf::get_if<broker::vector>(&data); auto v = get_if<broker::vector>(&data);
if ( ! (v && v->size() == 2) ) if ( ! (v && v->size() == 2) )
return false; return false;
auto x = caf::get_if<broker::set>(&(*v)[0]); auto x = get_if<broker::set>(&(*v)[0]);
// We set the iterator by finding the element it used to point to. // We set the iterator by finding the element it used to point to.
// This is not perfect, as there's no guarantee that the restored // This is not perfect, as there's no guarantee that the restored
@ -1267,11 +1267,11 @@ broker::expected<broker::data> TableIterator::DoSerialize() const
bool TableIterator::DoUnserialize(const broker::data& data) bool TableIterator::DoUnserialize(const broker::data& data)
{ {
auto v = caf::get_if<broker::vector>(&data); auto v = get_if<broker::vector>(&data);
if ( ! (v && v->size() == 2) ) if ( ! (v && v->size() == 2) )
return false; return false;
auto x = caf::get_if<broker::table>(&(*v)[0]); auto x = get_if<broker::table>(&(*v)[0]);
// We set the iterator by finding the element it used to point to. // We set the iterator by finding the element it used to point to.
// This is not perfect, as there's no guarantee that the restored // This is not perfect, as there's no guarantee that the restored
@ -1295,12 +1295,12 @@ broker::expected<broker::data> VectorIterator::DoSerialize() const
bool VectorIterator::DoUnserialize(const broker::data& data) bool VectorIterator::DoUnserialize(const broker::data& data)
{ {
auto v = caf::get_if<broker::vector>(&data); auto v = get_if<broker::vector>(&data);
if ( ! (v && v->size() == 2) ) if ( ! (v && v->size() == 2) )
return false; return false;
auto x = caf::get_if<broker::vector>(&(*v)[0]); auto x = get_if<broker::vector>(&(*v)[0]);
auto y = caf::get_if<broker::integer>(&(*v)[1]); auto y = get_if<broker::integer>(&(*v)[1]);
if ( ! (x && y) ) if ( ! (x && y) )
return false; return false;
@ -1320,12 +1320,12 @@ broker::expected<broker::data> RecordIterator::DoSerialize() const
bool RecordIterator::DoUnserialize(const broker::data& data) bool RecordIterator::DoUnserialize(const broker::data& data)
{ {
auto v = caf::get_if<broker::vector>(&data); auto v = get_if<broker::vector>(&data);
if ( ! (v && v->size() == 2) ) if ( ! (v && v->size() == 2) )
return false; return false;
auto x = caf::get_if<broker::vector>(&(*v)[0]); auto x = get_if<broker::vector>(&(*v)[0]);
auto y = caf::get_if<broker::integer>(&(*v)[1]); auto y = get_if<broker::integer>(&(*v)[1]);
if ( ! (x && y) ) if ( ! (x && y) )
return false; return false;
@ -1352,25 +1352,24 @@ broker::data threading_field_to_data(const threading::Field* f)
threading::Field* data_to_threading_field(broker::data d) threading::Field* data_to_threading_field(broker::data d)
{ {
if ( ! caf::holds_alternative<broker::vector>(d) ) if ( ! holds_alternative<broker::vector>(d) )
return nullptr; return nullptr;
auto& v = caf::get<broker::vector>(d); auto& v = get<broker::vector>(d);
auto name = caf::get_if<std::string>(&v[0]); auto name = get_if<std::string>(&v[0]);
auto secondary = v[1]; auto secondary = v[1];
auto type = caf::get_if<broker::count>(&v[2]); auto type = get_if<broker::count>(&v[2]);
auto subtype = caf::get_if<broker::count>(&v[3]); auto subtype = get_if<broker::count>(&v[3]);
auto optional = caf::get_if<broker::boolean>(&v[4]); auto optional = get_if<broker::boolean>(&v[4]);
if ( ! (name && type && subtype && optional) ) if ( ! (name && type && subtype && optional) )
return nullptr; return nullptr;
if ( secondary != broker::nil && ! caf::holds_alternative<std::string>(secondary) ) if ( secondary != broker::nil && ! holds_alternative<std::string>(secondary) )
return nullptr; return nullptr;
return new threading::Field( return new threading::Field(
name->c_str(), name->c_str(), secondary != broker::nil ? get<std::string>(secondary).c_str() : nullptr,
secondary != broker::nil ? caf::get<std::string>(secondary).c_str() : nullptr,
static_cast<TypeTag>(*type), static_cast<TypeTag>(*subtype), *optional); static_cast<TypeTag>(*type), static_cast<TypeTag>(*subtype), *optional);
} }

View file

@ -5,6 +5,8 @@
#include "zeek/OpaqueVal.h" #include "zeek/OpaqueVal.h"
#include "zeek/Reporter.h" #include "zeek/Reporter.h"
#include "broker/data.hh"
namespace zeek namespace zeek
{ {
@ -181,10 +183,10 @@ broker::data& opaque_field_to_data(zeek::RecordVal* v, zeek::detail::Frame* f);
template <typename T> template <typename T>
T& require_data_type(broker::data& d, zeek::TypeTag tag, zeek::detail::Frame* f) T& require_data_type(broker::data& d, zeek::TypeTag tag, zeek::detail::Frame* f)
{ {
auto ptr = caf::get_if<T>(&d); auto ptr = broker::get_if<T>(&d);
if ( ! ptr ) if ( ! ptr )
zeek::reporter->RuntimeError(f->GetCallLocation(), "data is of type '%s' not of type '%s'", zeek::reporter->RuntimeError(f->GetCallLocation(), "data is of type '%s' not of type '%s'",
caf::visit(type_name_getter{tag}, d), zeek::type_name(tag)); visit(type_name_getter{tag}, d), zeek::type_name(tag));
return *ptr; return *ptr;
} }

View file

@ -1,6 +1,7 @@
#include "zeek/broker/Manager.h" #include "zeek/broker/Manager.h"
#include <broker/broker.hh> #include <broker/broker.hh>
#include <broker/configuration.hh>
#include <broker/zeek.hh> #include <broker/zeek.hh>
#include <unistd.h> #include <unistd.h>
#include <cstdio> #include <cstdio>
@ -27,6 +28,58 @@
using namespace std; using namespace std;
namespace
{
void print_escaped(std::string& buf, std::string_view str)
{
buf.push_back('"');
for ( auto c : str )
{
switch ( c )
{
default:
buf.push_back(c);
break;
case '\\':
buf.push_back('\\');
buf.push_back('\\');
break;
case '\b':
buf.push_back('\\');
buf.push_back('b');
break;
case '\f':
buf.push_back('\\');
buf.push_back('f');
break;
case '\n':
buf.push_back('\\');
buf.push_back('n');
break;
case '\r':
buf.push_back('\\');
buf.push_back('r');
break;
case '\t':
buf.push_back('\\');
buf.push_back('t');
break;
case '\v':
buf.push_back('\\');
buf.push_back('v');
break;
case '"':
buf.push_back('\\');
buf.push_back('"');
break;
}
}
buf.push_back('"');
}
} // namespace
namespace zeek::Broker namespace zeek::Broker
{ {
@ -90,10 +143,10 @@ namespace
struct opt_mapping struct opt_mapping
{ {
broker::configuration* cfg; broker::configuration* cfg;
std::string_view broker_name; std::string broker_name;
const char* zeek_name; const char* zeek_name;
template <class T> auto broker_read() { return caf::get_as<T>(*cfg, broker_name); } template <class T> auto broker_read() { return broker::get_as<T>(*cfg, broker_name); }
template <class T> auto broker_write(T&& val) { cfg->set(broker_name, std::forward<T>(val)); } template <class T> auto broker_write(T&& val) { cfg->set(broker_name, std::forward<T>(val)); }
@ -107,23 +160,10 @@ struct opt_mapping
} // namespace } // namespace
class BrokerConfig : public broker::configuration
{
public:
BrokerConfig(broker::broker_options options) : broker::configuration(options)
{
openssl_cafile = get_option("Broker::ssl_cafile")->AsString()->CheckString();
openssl_capath = get_option("Broker::ssl_capath")->AsString()->CheckString();
openssl_certificate = get_option("Broker::ssl_certificate")->AsString()->CheckString();
openssl_key = get_option("Broker::ssl_keyfile")->AsString()->CheckString();
openssl_passphrase = get_option("Broker::ssl_passphrase")->AsString()->CheckString();
}
};
class BrokerState class BrokerState
{ {
public: public:
BrokerState(BrokerConfig config, size_t congestion_queue_size) BrokerState(broker::configuration config, size_t congestion_queue_size)
: endpoint(std::move(config)), : endpoint(std::move(config)),
subscriber(endpoint.make_subscriber({broker::topic::statuses(), broker::topic::errors()}, subscriber(endpoint.make_subscriber({broker::topic::statuses(), broker::topic::errors()},
congestion_queue_size)) congestion_queue_size))
@ -238,7 +278,13 @@ void Manager::InitPostScript()
options.forward = get_option("Broker::forward_messages")->AsBool(); options.forward = get_option("Broker::forward_messages")->AsBool();
options.use_real_time = use_real_time; options.use_real_time = use_real_time;
BrokerConfig config{std::move(options)}; broker::configuration config{std::move(options)};
config.openssl_cafile(get_option("Broker::ssl_cafile")->AsString()->CheckString());
config.openssl_capath(get_option("Broker::ssl_capath")->AsString()->CheckString());
config.openssl_certificate(get_option("Broker::ssl_certificate")->AsString()->CheckString());
config.openssl_key(get_option("Broker::ssl_keyfile")->AsString()->CheckString());
config.openssl_passphrase(get_option("Broker::ssl_passphrase")->AsString()->CheckString());
auto scheduler_policy = get_option("Broker::scheduler_policy")->AsString()->CheckString(); auto scheduler_policy = get_option("Broker::scheduler_policy")->AsString()->CheckString();
@ -257,11 +303,11 @@ void Manager::InitPostScript()
config.set("caf.scheduler.max-threads", get_option("Broker::max_threads")->AsCount()); config.set("caf.scheduler.max-threads", get_option("Broker::max_threads")->AsCount());
config.set("caf.work-stealing.moderate-sleep-duration", config.set("caf.work-stealing.moderate-sleep-duration",
caf::timespan(static_cast<unsigned>( broker::timespan(static_cast<unsigned>(
get_option("Broker::moderate_sleep")->AsInterval() * 1e9))); get_option("Broker::moderate_sleep")->AsInterval() * 1e9)));
config.set("caf.work-stealing.relaxed-sleep-duration", config.set("caf.work-stealing.relaxed-sleep-duration",
caf::timespan( broker::timespan(
static_cast<unsigned>(get_option("Broker::relaxed_sleep")->AsInterval() * 1e9))); static_cast<unsigned>(get_option("Broker::relaxed_sleep")->AsInterval() * 1e9)));
config.set("caf.work-stealing.aggressive-poll-attempts", config.set("caf.work-stealing.aggressive-poll-attempts",
@ -363,6 +409,8 @@ void Manager::InitPostScript()
bstate->subscriber.add_topic(broker::topic::store_events(), true); bstate->subscriber.add_topic(broker::topic::store_events(), true);
telemetry_mgr->InitPostBrokerSetup(bstate->endpoint);
InitializeBrokerStoreForwarding(); InitializeBrokerStoreForwarding();
} }
@ -1030,7 +1078,7 @@ void Manager::DispatchMessage(const broker::topic& topic, broker::data msg)
if ( ! batch.valid() ) if ( ! batch.valid() )
{ {
reporter->Warning("received invalid broker Batch: %s", reporter->Warning("received invalid broker Batch: %s",
broker::to_string(batch).data()); broker::to_string(batch.as_data()).data());
return; return;
} }
@ -1376,7 +1424,8 @@ bool Manager::ProcessLogCreate(broker::zeek::LogCreate lc)
DBG_LOG(DBG_BROKER, "Received log-create: %s", RenderMessage(lc.as_data()).c_str()); DBG_LOG(DBG_BROKER, "Received log-create: %s", RenderMessage(lc.as_data()).c_str());
if ( ! lc.valid() ) if ( ! lc.valid() )
{ {
reporter->Warning("received invalid broker LogCreate: %s", broker::to_string(lc).data()); reporter->Warning("received invalid broker LogCreate: %s",
broker::to_string(lc.as_data()).data());
return false; return false;
} }
@ -1402,7 +1451,7 @@ bool Manager::ProcessLogCreate(broker::zeek::LogCreate lc)
} }
// Get log fields. // Get log fields.
auto fields_data = caf::get_if<broker::vector>(&lc.fields_data()); auto fields_data = get_if<broker::vector>(&lc.fields_data());
if ( ! fields_data ) if ( ! fields_data )
{ {
@ -1442,7 +1491,8 @@ bool Manager::ProcessLogWrite(broker::zeek::LogWrite lw)
if ( ! lw.valid() ) if ( ! lw.valid() )
{ {
reporter->Warning("received invalid broker LogWrite: %s", broker::to_string(lw).data()); reporter->Warning("received invalid broker LogWrite: %s",
broker::to_string(lw.as_data()).data());
return false; return false;
} }
@ -1467,7 +1517,7 @@ bool Manager::ProcessLogWrite(broker::zeek::LogWrite lw)
return false; return false;
} }
auto path = caf::get_if<std::string>(&lw.path()); auto path = get_if<std::string>(&lw.path());
if ( ! path ) if ( ! path )
{ {
@ -1476,7 +1526,7 @@ bool Manager::ProcessLogWrite(broker::zeek::LogWrite lw)
return false; return false;
} }
auto serial_data = caf::get_if<std::string>(&lw.serial_data()); auto serial_data = get_if<std::string>(&lw.serial_data());
if ( ! serial_data ) if ( ! serial_data )
{ {
@ -1531,7 +1581,7 @@ bool Manager::ProcessIdentifierUpdate(broker::zeek::IdentifierUpdate iu)
if ( ! iu.valid() ) if ( ! iu.valid() )
{ {
reporter->Warning("received invalid broker IdentifierUpdate: %s", reporter->Warning("received invalid broker IdentifierUpdate: %s",
broker::to_string(iu).data()); broker::to_string(iu.as_data()).data());
return false; return false;
} }
@ -1655,12 +1705,12 @@ void Manager::ProcessError(broker::error_view err)
if ( auto ctx = err.context() ) if ( auto ctx = err.context() )
{ {
msg += '('; msg += '(';
msg += to_string(ctx->node); msg += broker::to_string(ctx->node);
msg += ", "; msg += ", ";
msg += caf::deep_to_string(ctx->network); msg += broker::to_string(ctx->network);
msg += ", "; msg += ", ";
if ( auto what = err.message() ) if ( auto what = err.message() )
msg += caf::deep_to_string(*what); print_escaped(msg, *what);
else else
msg += R"_("")_"; msg += R"_("")_";
msg += ')'; msg += ')';
@ -1783,7 +1833,7 @@ void Manager::BrokerStoreToZeekTable(const std::string& name, const detail::Stor
if ( ! keys ) if ( ! keys )
return; return;
auto set = caf::get_if<broker::set>(&(keys->get_data())); auto set = get_if<broker::set>(&(keys->get_data()));
auto table = handle->forward_to; auto table = handle->forward_to;
const auto& its = table->GetType()->AsTableType()->GetIndexTypes(); const auto& its = table->GetType()->AsTableType()->GetIndexTypes();
bool is_set = table->GetType()->IsSet(); bool is_set = table->GetType()->IsSet();
@ -1982,53 +2032,4 @@ void Manager::SetMetricsExportPrefixes(std::vector<std::string> filter)
bstate->endpoint.metrics_exporter().set_prefixes(std::move(filter)); bstate->endpoint.metrics_exporter().set_prefixes(std::move(filter));
} }
std::unique_ptr<telemetry::Manager> Manager::NewTelemetryManager()
{
// The telemetry Manager actually only has a dependency on the actor system,
// not to the Broker Manager. By having the telemetry Manager hold on to a
// shared_ptr to our Broker state, we make sure the Broker endpoint, which
// owns the CAF actor system, lives for as long as necessary. This also
// makes sure that the Broker Manager may even get destroyed before the
// telemetry Manager.
struct TM final : public telemetry::Manager
{
using MetricRegistryPtr = std::unique_ptr<caf::telemetry::metric_registry>;
static auto getPimpl(BrokerState& st)
{
auto registry = std::addressof(st.endpoint.system().metrics());
return reinterpret_cast<telemetry::Manager::Impl*>(registry);
}
static auto getPimpl(MetricRegistryPtr& ptr)
{
return reinterpret_cast<telemetry::Manager::Impl*>(ptr.get());
}
explicit TM(Broker::Manager* parent, MetricRegistryPtr ptr)
: telemetry::Manager(getPimpl(ptr)), parent(parent), tmp(std::move(ptr))
{
assert(tmp != nullptr);
assert(parent != nullptr);
}
void InitPostScript() override
{
assert(parent->bstate != nullptr);
ptr = parent->bstate;
auto registry = std::addressof(ptr->endpoint.system().metrics());
registry->merge(*tmp);
tmp.reset();
pimpl = reinterpret_cast<telemetry::Manager::Impl*>(registry);
}
Broker::Manager* parent;
MetricRegistryPtr tmp;
std::shared_ptr<BrokerState> ptr;
};
auto tmp = std::make_unique<caf::telemetry::metric_registry>();
return std::make_unique<TM>(this, std::move(tmp));
}
} // namespace zeek::Broker } // namespace zeek::Broker

View file

@ -396,11 +396,6 @@ public:
*/ */
void SetMetricsExportPrefixes(std::vector<std::string> filter); void SetMetricsExportPrefixes(std::vector<std::string> filter);
/**
* Allocates a new manager for telemetry data.
*/
std::unique_ptr<telemetry::Manager> NewTelemetryManager();
private: private:
void DispatchMessage(const broker::topic& topic, broker::data msg); void DispatchMessage(const broker::topic& topic, broker::data msg);
// Process events used for Broker store backed zeek tables // Process events used for Broker store backed zeek tables

View file

@ -52,9 +52,9 @@ inline RecordValPtr query_result(RecordValPtr data)
* @param e: expire interval as double; 0 if no expiry * @param e: expire interval as double; 0 if no expiry
* @return expire interval in Broker format * @return expire interval in Broker format
*/ */
static broker::optional<broker::timespan> convert_expiry(double e) static std::optional<broker::timespan> convert_expiry(double e)
{ {
broker::optional<broker::timespan> ts; std::optional<broker::timespan> ts;
if ( e ) if ( e )
{ {

View file

@ -471,7 +471,7 @@ function Broker::__record_lookup%(r: Broker::Data, idx: count%): Broker::Data
auto& v = zeek::Broker::detail::require_data_type<broker::vector>(r->AsRecordVal(), auto& v = zeek::Broker::detail::require_data_type<broker::vector>(r->AsRecordVal(),
zeek::TYPE_RECORD, frame); zeek::TYPE_RECORD, frame);
if ( idx >= v.size() || caf::get_if<broker::none>(&v[idx]) ) if ( idx >= v.size() || broker::get_if<broker::none>(&v[idx]) )
return zeek::make_intrusive<zeek::RecordVal>(zeek::BifType::Record::Broker::Data); return zeek::make_intrusive<zeek::RecordVal>(zeek::BifType::Record::Broker::Data);
return zeek::Broker::detail::make_data_val(v[idx]); return zeek::Broker::detail::make_data_val(v[idx]);
@ -510,7 +510,7 @@ function Broker::__record_iterator_value%(it: opaque of Broker::RecordIterator%)
return rval; return rval;
} }
if ( caf::get_if<broker::none>(&(*ri->it)) ) if ( broker::get_if<broker::none>(&(*ri->it)) )
return rval; // field isn't set return rval; // field isn't set
rval->Assign(0, zeek::make_intrusive<zeek::Broker::detail::DataVal>(*ri->it)); rval->Assign(0, zeek::make_intrusive<zeek::Broker::detail::DataVal>(*ri->it));

View file

@ -623,7 +623,7 @@ broker::expected<broker::data> X509Val::DoSerialize() const
bool X509Val::DoUnserialize(const broker::data& data) bool X509Val::DoUnserialize(const broker::data& data)
{ {
auto s = caf::get_if<std::string>(&data); auto s = broker::get_if<std::string>(&data);
if ( ! s ) if ( ! s )
return false; return false;

View file

@ -100,16 +100,16 @@ broker::data WriterBackend::WriterInfo::ToBroker() const
bool WriterBackend::WriterInfo::FromBroker(broker::data d) bool WriterBackend::WriterInfo::FromBroker(broker::data d)
{ {
if ( ! caf::holds_alternative<broker::vector>(d) ) if ( ! broker::is<broker::vector>(d) )
return false; return false;
auto v = caf::get<broker::vector>(d); auto v = broker::get<broker::vector>(d);
auto bpath = caf::get_if<std::string>(&v[0]); auto bpath = broker::get_if<std::string>(&v[0]);
auto brotation_base = caf::get_if<double>(&v[1]); auto brotation_base = broker::get_if<double>(&v[1]);
auto brotation_interval = caf::get_if<double>(&v[2]); auto brotation_interval = broker::get_if<double>(&v[2]);
auto bnetwork_time = caf::get_if<double>(&v[3]); auto bnetwork_time = broker::get_if<double>(&v[3]);
auto bconfig = caf::get_if<broker::table>(&v[4]); auto bconfig = broker::get_if<broker::table>(&v[4]);
auto bppf = caf::get_if<std::string>(&v[5]); auto bppf = broker::get_if<std::string>(&v[5]);
if ( ! (bpath && brotation_base && brotation_interval && bnetwork_time && bconfig && bppf) ) if ( ! (bpath && brotation_base && brotation_interval && bnetwork_time && bconfig && bppf) )
return false; return false;
@ -122,8 +122,8 @@ bool WriterBackend::WriterInfo::FromBroker(broker::data d)
for ( auto i : *bconfig ) for ( auto i : *bconfig )
{ {
auto k = caf::get_if<std::string>(&i.first); auto k = broker::get_if<std::string>(&i.first);
auto v = caf::get_if<std::string>(&i.second); auto v = broker::get_if<std::string>(&i.second);
if ( ! (k && v) ) if ( ! (k && v) )
return false; return false;

View file

@ -5,6 +5,7 @@
#include <broker/data.hh> #include <broker/data.hh>
#include <openssl/sha.h> #include <openssl/sha.h>
#include <cassert> #include <cassert>
#include <cstring>
#include <limits> #include <limits>
#include "zeek/digest.h" #include "zeek/digest.h"
@ -512,12 +513,12 @@ broker::expected<broker::data> BitVector::Serialize() const
std::unique_ptr<BitVector> BitVector::Unserialize(const broker::data& data) std::unique_ptr<BitVector> BitVector::Unserialize(const broker::data& data)
{ {
auto v = caf::get_if<broker::vector>(&data); auto v = broker::get_if<broker::vector>(&data);
if ( ! (v && v->size() >= 2) ) if ( ! (v && v->size() >= 2) )
return nullptr; return nullptr;
auto num_bits = caf::get_if<uint64_t>(&(*v)[0]); auto num_bits = broker::get_if<uint64_t>(&(*v)[0]);
auto size = caf::get_if<uint64_t>(&(*v)[1]); auto size = broker::get_if<uint64_t>(&(*v)[1]);
if ( ! (num_bits && size) ) if ( ! (num_bits && size) )
return nullptr; return nullptr;
@ -530,7 +531,7 @@ std::unique_ptr<BitVector> BitVector::Unserialize(const broker::data& data)
for ( size_t i = 0; i < *size; ++i ) for ( size_t i = 0; i < *size; ++i )
{ {
auto x = caf::get_if<uint64_t>(&(*v)[2 + i]); auto x = broker::get_if<uint64_t>(&(*v)[2 + i]);
if ( ! x ) if ( ! x )
return nullptr; return nullptr;

View file

@ -46,12 +46,12 @@ broker::expected<broker::data> BloomFilter::Serialize() const
std::unique_ptr<BloomFilter> BloomFilter::Unserialize(const broker::data& data) std::unique_ptr<BloomFilter> BloomFilter::Unserialize(const broker::data& data)
{ {
auto v = caf::get_if<broker::vector>(&data); auto v = broker::get_if<broker::vector>(&data);
if ( ! (v && v->size() == 3) ) if ( ! (v && v->size() == 3) )
return nullptr; return nullptr;
auto type = caf::get_if<uint64_t>(&(*v)[0]); auto type = broker::get_if<uint64_t>(&(*v)[0]);
if ( ! type ) if ( ! type )
return nullptr; return nullptr;

View file

@ -212,13 +212,13 @@ broker::expected<broker::data> CardinalityCounter::Serialize() const
std::unique_ptr<CardinalityCounter> CardinalityCounter::Unserialize(const broker::data& data) std::unique_ptr<CardinalityCounter> CardinalityCounter::Unserialize(const broker::data& data)
{ {
auto v = caf::get_if<broker::vector>(&data); auto v = broker::get_if<broker::vector>(&data);
if ( ! (v && v->size() >= 3) ) if ( ! (v && v->size() >= 3) )
return nullptr; return nullptr;
auto m = caf::get_if<uint64_t>(&(*v)[0]); auto m = broker::get_if<uint64_t>(&(*v)[0]);
auto V = caf::get_if<uint64_t>(&(*v)[1]); auto V = broker::get_if<uint64_t>(&(*v)[1]);
auto alpha_m = caf::get_if<double>(&(*v)[2]); auto alpha_m = broker::get_if<double>(&(*v)[2]);
if ( ! (m && V && alpha_m) ) if ( ! (m && V && alpha_m) )
return nullptr; return nullptr;
@ -233,7 +233,7 @@ std::unique_ptr<CardinalityCounter> CardinalityCounter::Unserialize(const broker
for ( size_t i = 0; i < *m; ++i ) for ( size_t i = 0; i < *m; ++i )
{ {
auto x = caf::get_if<uint64_t>(&(*v)[3 + i]); auto x = broker::get_if<uint64_t>(&(*v)[3 + i]);
if ( ! x ) if ( ! x )
return nullptr; return nullptr;

View file

@ -169,11 +169,11 @@ broker::expected<broker::data> CounterVector::Serialize() const
std::unique_ptr<CounterVector> CounterVector::Unserialize(const broker::data& data) std::unique_ptr<CounterVector> CounterVector::Unserialize(const broker::data& data)
{ {
auto v = caf::get_if<broker::vector>(&data); auto v = broker::get_if<broker::vector>(&data);
if ( ! (v && v->size() >= 2) ) if ( ! (v && v->size() >= 2) )
return nullptr; return nullptr;
auto width = caf::get_if<uint64_t>(&(*v)[0]); auto width = broker::get_if<uint64_t>(&(*v)[0]);
auto bits = BitVector::Unserialize((*v)[1]); auto bits = BitVector::Unserialize((*v)[1]);
if ( ! (width && bits) ) if ( ! (width && bits) )

View file

@ -60,15 +60,15 @@ broker::expected<broker::data> Hasher::Serialize() const
std::unique_ptr<Hasher> Hasher::Unserialize(const broker::data& data) std::unique_ptr<Hasher> Hasher::Unserialize(const broker::data& data)
{ {
auto v = caf::get_if<broker::vector>(&data); auto v = broker::get_if<broker::vector>(&data);
if ( ! (v && v->size() == 4) ) if ( ! (v && v->size() == 4) )
return nullptr; return nullptr;
auto type = caf::get_if<uint64_t>(&(*v)[0]); auto type = broker::get_if<uint64_t>(&(*v)[0]);
auto k = caf::get_if<uint64_t>(&(*v)[1]); auto k = broker::get_if<uint64_t>(&(*v)[1]);
auto h1 = caf::get_if<uint64_t>(&(*v)[2]); auto h1 = broker::get_if<uint64_t>(&(*v)[2]);
auto h2 = caf::get_if<uint64_t>(&(*v)[3]); auto h2 = broker::get_if<uint64_t>(&(*v)[3]);
if ( ! (type && k && h1 && h2) ) if ( ! (type && k && h1 && h2) )
return nullptr; return nullptr;

View file

@ -447,14 +447,14 @@ broker::expected<broker::data> TopkVal::DoSerialize() const
bool TopkVal::DoUnserialize(const broker::data& data) bool TopkVal::DoUnserialize(const broker::data& data)
{ {
auto v = caf::get_if<broker::vector>(&data); auto v = broker::get_if<broker::vector>(&data);
if ( ! (v && v->size() >= 4) ) if ( ! (v && v->size() >= 4) )
return false; return false;
auto size_ = caf::get_if<uint64_t>(&(*v)[0]); auto size_ = broker::get_if<uint64_t>(&(*v)[0]);
auto numElements_ = caf::get_if<uint64_t>(&(*v)[1]); auto numElements_ = broker::get_if<uint64_t>(&(*v)[1]);
auto pruned_ = caf::get_if<bool>(&(*v)[2]); auto pruned_ = broker::get_if<bool>(&(*v)[2]);
if ( ! (size_ && numElements_ && pruned_) ) if ( ! (size_ && numElements_ && pruned_) )
return false; return false;
@ -463,7 +463,7 @@ bool TopkVal::DoUnserialize(const broker::data& data)
numElements = *numElements_; numElements = *numElements_;
pruned = *pruned_; pruned = *pruned_;
auto no_type = caf::get_if<broker::none>(&(*v)[3]); auto no_type = broker::get_if<broker::none>(&(*v)[3]);
if ( ! no_type ) if ( ! no_type )
{ {
auto t = UnserializeType((*v)[3]); auto t = UnserializeType((*v)[3]);
@ -479,8 +479,8 @@ bool TopkVal::DoUnserialize(const broker::data& data)
while ( i < numElements ) while ( i < numElements )
{ {
auto elements_count = caf::get_if<uint64_t>(&(*v)[idx++]); auto elements_count = broker::get_if<uint64_t>(&(*v)[idx++]);
auto count = caf::get_if<uint64_t>(&(*v)[idx++]); auto count = broker::get_if<uint64_t>(&(*v)[idx++]);
if ( ! (elements_count && count) ) if ( ! (elements_count && count) )
return false; return false;
@ -491,7 +491,7 @@ bool TopkVal::DoUnserialize(const broker::data& data)
for ( uint64_t j = 0; j < *elements_count; j++ ) for ( uint64_t j = 0; j < *elements_count; j++ )
{ {
auto epsilon = caf::get_if<uint64_t>(&(*v)[idx++]); auto epsilon = broker::get_if<uint64_t>(&(*v)[idx++]);
auto val = Broker::detail::data_to_val((*v)[idx++], type.get()); auto val = Broker::detail::data_to_val((*v)[idx++], type.get());
if ( ! (epsilon && val) ) if ( ! (epsilon && val) )

View file

@ -6,11 +6,7 @@ include_directories(BEFORE
) )
set(telemetry_SRCS set(telemetry_SRCS
Counter.cc
Gauge.cc
Histogram.cc
Manager.cc Manager.cc
MetricFamily.cc
) )
bif_target(telemetry.bif) bif_target(telemetry.bif)

View file

@ -1,77 +0,0 @@
// See the file "COPYING" in the main distribution directory for copyright.
#include "zeek/telemetry/Counter.h"
#include "zeek/telemetry/Detail.h"
#include "caf/telemetry/counter.hpp"
#include "caf/telemetry/metric_family.hpp"
#include "caf/telemetry/metric_family_impl.hpp"
namespace zeek::telemetry
{
// -- IntCounter ---------------------------------------------------------------
void IntCounter::Inc() noexcept
{
deref(pimpl).inc();
}
void IntCounter::Inc(int64_t amount) noexcept
{
deref(pimpl).inc(amount);
}
int64_t IntCounter::operator++() noexcept
{
return ++deref(pimpl);
}
int64_t IntCounter::Value() const noexcept
{
return deref(pimpl).value();
}
IntCounterFamily::IntCounterFamily(Impl* ptr) : MetricFamily(upcast(ptr)) { }
IntCounter IntCounterFamily::GetOrAdd(Span<const LabelView> labels)
{
return with_native_labels(labels,
[this](auto nativeLabels)
{
auto hdl = opaque(deref(this, pimpl).get_or_add(nativeLabels));
return IntCounter{hdl};
});
}
// -- DblCounter ---------------------------------------------------------------
void DblCounter::Inc() noexcept
{
deref(pimpl).inc();
}
void DblCounter::Inc(double amount) noexcept
{
deref(pimpl).inc(amount);
}
double DblCounter::Value() const noexcept
{
return deref(pimpl).value();
}
DblCounterFamily::DblCounterFamily(Impl* ptr) : MetricFamily(upcast(ptr)) { }
DblCounter DblCounterFamily::GetOrAdd(Span<const LabelView> labels)
{
return with_native_labels(labels,
[this](auto nativeLabels)
{
auto hdl = opaque(deref(this, pimpl).get_or_add(nativeLabels));
return DblCounter{hdl};
});
}
} // namespace zeek::telemetry

View file

@ -9,6 +9,8 @@
#include "zeek/Span.h" #include "zeek/Span.h"
#include "zeek/telemetry/MetricFamily.h" #include "zeek/telemetry/MetricFamily.h"
#include "broker/telemetry/fwd.hh"
namespace zeek::telemetry namespace zeek::telemetry
{ {
@ -24,8 +26,6 @@ class IntCounter
public: public:
friend class IntCounterFamily; friend class IntCounterFamily;
struct Impl;
static inline const char* OpaqueName = "IntCounterMetricVal"; static inline const char* OpaqueName = "IntCounterMetricVal";
IntCounter() = delete; IntCounter() = delete;
@ -35,34 +35,36 @@ public:
/** /**
* Increments the value by 1. * Increments the value by 1.
*/ */
void Inc() noexcept; void Inc() noexcept { broker::telemetry::inc(hdl); }
/** /**
* Increments the value by @p amount. * Increments the value by @p amount.
* @pre `amount >= 0` * @pre `amount >= 0`
*/ */
void Inc(int64_t amount) noexcept; void Inc(int64_t amount) noexcept { broker::telemetry::inc(hdl, amount); }
/** /**
* Increments the value by 1. * Increments the value by 1.
* @return The new value. * @return The new value.
*/ */
int64_t operator++() noexcept; int64_t operator++() noexcept { return broker::telemetry::inc(hdl); }
/** /**
* @return The current value. * @return The current value.
*/ */
int64_t Value() const noexcept; int64_t Value() const noexcept { return broker::telemetry::value(hdl); }
/** /**
* @return Whether @c this and @p other refer to the same counter. * @return Whether @c this and @p other refer to the same counter.
*/ */
constexpr bool IsSameAs(IntCounter other) const noexcept { return pimpl == other.pimpl; } constexpr bool IsSameAs(IntCounter other) const noexcept { return hdl == other.hdl; }
private: private:
explicit IntCounter(Impl* ptr) noexcept : pimpl(ptr) { } using Handle = broker::telemetry::int_counter_hdl*;
Impl* pimpl; explicit IntCounter(Handle hdl) noexcept : hdl(hdl) { }
Handle hdl;
}; };
/** /**
@ -89,8 +91,6 @@ class IntCounterFamily : public MetricFamily
public: public:
friend class Manager; friend class Manager;
class Impl;
static inline const char* OpaqueName = "IntCounterMetricFamilyVal"; static inline const char* OpaqueName = "IntCounterMetricFamilyVal";
using InstanceType = IntCounter; using InstanceType = IntCounter;
@ -102,7 +102,10 @@ public:
* Returns the metrics handle for given labels, creating a new instance * Returns the metrics handle for given labels, creating a new instance
* lazily if necessary. * lazily if necessary.
*/ */
IntCounter GetOrAdd(Span<const LabelView> labels); IntCounter GetOrAdd(Span<const LabelView> labels)
{
return IntCounter{int_counter_get_or_add(hdl, labels)};
}
/** /**
* @copydoc GetOrAdd * @copydoc GetOrAdd
@ -113,7 +116,9 @@ public:
} }
private: private:
explicit IntCounterFamily(Impl* ptr); using Handle = broker::telemetry::int_counter_family_hdl*;
explicit IntCounterFamily(Handle hdl) : MetricFamily(upcast(hdl)) { }
}; };
/** /**
@ -125,8 +130,6 @@ class DblCounter
public: public:
friend class DblCounterFamily; friend class DblCounterFamily;
struct Impl;
static inline const char* OpaqueName = "DblCounterMetricVal"; static inline const char* OpaqueName = "DblCounterMetricVal";
DblCounter() = delete; DblCounter() = delete;
@ -136,28 +139,30 @@ public:
/** /**
* Increments the value by 1. * Increments the value by 1.
*/ */
void Inc() noexcept; void Inc() noexcept { broker::telemetry::inc(hdl); }
/** /**
* Increments the value by @p amount. * Increments the value by @p amount.
* @pre `amount >= 0` * @pre `amount >= 0`
*/ */
void Inc(double amount) noexcept; void Inc(double amount) noexcept { broker::telemetry::inc(hdl, amount); }
/** /**
* @return The current value. * @return The current value.
*/ */
double Value() const noexcept; double Value() const noexcept { return broker::telemetry::value(hdl); }
/** /**
* @return Whether @c this and @p other refer to the same counter. * @return Whether @c this and @p other refer to the same counter.
*/ */
constexpr bool IsSameAs(DblCounter other) const noexcept { return pimpl == other.pimpl; } constexpr bool IsSameAs(DblCounter other) const noexcept { return hdl == other.hdl; }
private: private:
explicit DblCounter(Impl* ptr) noexcept : pimpl(ptr) { } using Handle = broker::telemetry::dbl_counter_hdl*;
Impl* pimpl; explicit DblCounter(Handle hdl) noexcept : hdl(hdl) { }
Handle hdl;
}; };
/** /**
@ -184,8 +189,6 @@ class DblCounterFamily : public MetricFamily
public: public:
friend class Manager; friend class Manager;
class Impl;
static inline const char* OpaqueName = "DblCounterMetricFamilyVal"; static inline const char* OpaqueName = "DblCounterMetricFamilyVal";
using InstanceType = DblCounter; using InstanceType = DblCounter;
@ -197,7 +200,10 @@ public:
* Returns the metrics handle for given labels, creating a new instance * Returns the metrics handle for given labels, creating a new instance
* lazily if necessary. * lazily if necessary.
*/ */
DblCounter GetOrAdd(Span<const LabelView> labels); DblCounter GetOrAdd(Span<const LabelView> labels)
{
return DblCounter{dbl_counter_get_or_add(hdl, labels)};
}
/** /**
* @copydoc GetOrAdd * @copydoc GetOrAdd
@ -208,7 +214,9 @@ public:
} }
private: private:
explicit DblCounterFamily(Impl* ptr); using Handle = broker::telemetry::dbl_counter_family_hdl*;
explicit DblCounterFamily(Handle hdl) : MetricFamily(upcast(hdl)) { }
}; };
namespace detail namespace detail

View file

@ -1,259 +0,0 @@
// See the file "COPYING" in the main distribution directory for copyright.
// This header contains private implementation details for telemetry classes
// and should not get included outside of .cc files.
#pragma once
#include <cstdint>
#include <initializer_list>
#include <type_traits>
#include "zeek/Span.h"
#include "zeek/telemetry/Counter.h"
#include "zeek/telemetry/Gauge.h"
#include "zeek/telemetry/Histogram.h"
#include "zeek/telemetry/Manager.h"
#include "zeek/telemetry/MetricFamily.h"
#include "caf/telemetry/label_view.hpp"
#include "caf/telemetry/metric_family.hpp"
namespace zeek::telemetry
{
// -- traits for converting between opaque handles and native pointers ---------
/**
* This trait must provide the member types @c Native for referring to the CAF
* type, @c Opaque for referring to the @c Impl type. For instance types such as
* @c IntCounter, the trait must also provide the member type @c NativeFamily.
*/
template <class T> struct PimplTrait;
template <> struct PimplTrait<IntCounter::Impl>
{
using Native = caf::telemetry::int_counter;
using Oqaque = IntCounter::Impl;
using NativeFamily = caf::telemetry::metric_family_impl<Native>;
};
template <> struct PimplTrait<caf::telemetry::int_counter> : PimplTrait<IntCounter::Impl>
{
};
template <> struct PimplTrait<IntCounterFamily::Impl>
{
using Native = typename PimplTrait<IntCounter::Impl>::NativeFamily;
using Oqaque = IntCounterFamily::Impl;
};
template <>
struct PimplTrait<typename PimplTrait<IntCounter::Impl>::NativeFamily>
: PimplTrait<IntCounterFamily::Impl>
{
};
template <> struct PimplTrait<DblCounter::Impl>
{
using Native = caf::telemetry::dbl_counter;
using Oqaque = DblCounter::Impl;
using NativeFamily = caf::telemetry::metric_family_impl<Native>;
};
template <> struct PimplTrait<caf::telemetry::dbl_counter> : PimplTrait<DblCounter::Impl>
{
};
template <> struct PimplTrait<DblCounterFamily::Impl>
{
using Native = typename PimplTrait<DblCounter::Impl>::NativeFamily;
using Oqaque = DblCounterFamily::Impl;
};
template <>
struct PimplTrait<typename PimplTrait<DblCounter::Impl>::NativeFamily>
: PimplTrait<DblCounterFamily::Impl>
{
};
template <> struct PimplTrait<IntGauge::Impl>
{
using Native = caf::telemetry::int_gauge;
using Oqaque = IntGauge::Impl;
using NativeFamily = caf::telemetry::metric_family_impl<Native>;
};
template <> struct PimplTrait<caf::telemetry::int_gauge> : PimplTrait<IntGauge::Impl>
{
};
template <> struct PimplTrait<IntGaugeFamily::Impl>
{
using Native = typename PimplTrait<IntGauge::Impl>::NativeFamily;
using Oqaque = IntGaugeFamily::Impl;
};
template <>
struct PimplTrait<typename PimplTrait<IntGauge::Impl>::NativeFamily>
: PimplTrait<IntGaugeFamily::Impl>
{
};
template <> struct PimplTrait<DblGauge::Impl>
{
using Native = caf::telemetry::dbl_gauge;
using Oqaque = DblGauge::Impl;
using NativeFamily = caf::telemetry::metric_family_impl<Native>;
};
template <> struct PimplTrait<caf::telemetry::dbl_gauge> : PimplTrait<DblGauge::Impl>
{
};
template <> struct PimplTrait<DblGaugeFamily::Impl>
{
using Native = typename PimplTrait<DblGauge::Impl>::NativeFamily;
using Oqaque = DblGaugeFamily::Impl;
};
template <>
struct PimplTrait<typename PimplTrait<DblGauge::Impl>::NativeFamily>
: PimplTrait<DblGaugeFamily::Impl>
{
};
template <> struct PimplTrait<IntHistogram::Impl>
{
using Native = caf::telemetry::int_histogram;
using Oqaque = IntHistogram::Impl;
using NativeFamily = caf::telemetry::metric_family_impl<Native>;
};
template <> struct PimplTrait<caf::telemetry::int_histogram> : PimplTrait<IntHistogram::Impl>
{
};
template <> struct PimplTrait<IntHistogramFamily::Impl>
{
using Native = typename PimplTrait<IntHistogram::Impl>::NativeFamily;
using Oqaque = IntHistogramFamily::Impl;
};
template <>
struct PimplTrait<typename PimplTrait<IntHistogram::Impl>::NativeFamily>
: PimplTrait<IntHistogramFamily::Impl>
{
};
template <> struct PimplTrait<DblHistogram::Impl>
{
using Native = caf::telemetry::dbl_histogram;
using Oqaque = DblHistogram::Impl;
using NativeFamily = caf::telemetry::metric_family_impl<Native>;
};
template <> struct PimplTrait<caf::telemetry::dbl_histogram> : PimplTrait<DblHistogram::Impl>
{
};
template <> struct PimplTrait<DblHistogramFamily::Impl>
{
using Native = typename PimplTrait<DblHistogram::Impl>::NativeFamily;
using Oqaque = DblHistogramFamily::Impl;
};
template <>
struct PimplTrait<typename PimplTrait<DblHistogram::Impl>::NativeFamily>
: PimplTrait<DblHistogramFamily::Impl>
{
};
template <> struct PimplTrait<Manager::Impl>
{
using Native = caf::telemetry::metric_registry;
using Oqaque = Manager::Impl;
};
template <>
struct PimplTrait<typename PimplTrait<Manager::Impl>::Native> : PimplTrait<Manager::Impl>
{
};
// -- free functions -----------------------------------------------------------
template <class T, class NativeType = typename PimplTrait<T>::Native> auto& deref(T* ptr)
{
return *reinterpret_cast<NativeType*>(ptr);
}
template <class Family> auto& deref(Family*, MetricFamily::Impl* ptr)
{
using InstanceType = typename Family::InstanceType;
using ImplType = typename InstanceType::Impl;
using NativeType = typename PimplTrait<ImplType>::NativeFamily;
return *reinterpret_cast<NativeType*>(ptr);
}
template <class T, class OpaqueType = typename PimplTrait<T>::Oqaque> auto opaque(T* ptr)
{
return reinterpret_cast<OpaqueType*>(ptr);
}
template <class Family> auto opaque(const Family*, MetricFamily::Impl* ptr)
{
using InstanceType = typename Family::InstanceType;
using ImplType = typename InstanceType::Impl;
using OpaqueType = typename PimplTrait<ImplType>::NativeFamily;
return reinterpret_cast<OpaqueType*>(ptr);
}
template <class T, class Native = typename PimplTrait<T>::Native> auto upcast(T* ptr)
{
auto native = reinterpret_cast<Native*>(ptr);
auto base_ptr = static_cast<caf::telemetry::metric_family*>(native);
return reinterpret_cast<MetricFamily::Impl*>(base_ptr);
}
template <class F> auto with_native_labels(Span<const LabelView> xs, F continuation)
{
namespace ct = caf::telemetry;
if ( xs.size() <= 10 )
{
ct::label_view buf[10] = {
{{}, {}}, {{}, {}}, {{}, {}}, {{}, {}}, {{}, {}},
{{}, {}}, {{}, {}}, {{}, {}}, {{}, {}}, {{}, {}},
};
for ( size_t index = 0; index < xs.size(); ++index )
buf[index] = ct::label_view{xs[index].first, xs[index].second};
return continuation(Span{buf, xs.size()});
}
else
{
std::vector<ct::label_view> buf;
for ( auto x : xs )
buf.emplace_back(x.first, x.second);
return continuation(Span{buf});
}
}
template <class F> auto with_native_labels(Span<const std::string_view> xs, F continuation)
{
if ( xs.size() <= 10 )
{
caf::string_view buf[10];
for ( size_t index = 0; index < xs.size(); ++index )
buf[index] = xs[index];
return continuation(Span{buf, xs.size()});
}
else
{
std::vector<caf::string_view> buf;
for ( auto x : xs )
buf.emplace_back(x);
return continuation(Span{buf});
}
}
} // namespace zeek::telemetry

View file

@ -1,102 +0,0 @@
// See the file "COPYING" in the main distribution directory for copyright.
#include "zeek/telemetry/Gauge.h"
#include "zeek/telemetry/Detail.h"
#include "caf/telemetry/gauge.hpp"
#include "caf/telemetry/metric_family.hpp"
#include "caf/telemetry/metric_family_impl.hpp"
namespace zeek::telemetry
{
// -- IntGauge ---------------------------------------------------------------
void IntGauge::Inc() noexcept
{
deref(pimpl).inc();
}
void IntGauge::Inc(int64_t amount) noexcept
{
deref(pimpl).inc(amount);
}
void IntGauge::Dec() noexcept
{
deref(pimpl).dec();
}
void IntGauge::Dec(int64_t amount) noexcept
{
deref(pimpl).dec(amount);
}
int64_t IntGauge::operator++() noexcept
{
return ++deref(pimpl);
}
int64_t IntGauge::operator--() noexcept
{
return --deref(pimpl);
}
int64_t IntGauge::Value() const noexcept
{
return deref(pimpl).value();
}
IntGaugeFamily::IntGaugeFamily(Impl* ptr) : MetricFamily(upcast(ptr)) { }
IntGauge IntGaugeFamily::GetOrAdd(Span<const LabelView> labels)
{
return with_native_labels(labels,
[this](auto nativeLabels)
{
auto hdl = opaque(deref(this, pimpl).get_or_add(nativeLabels));
return IntGauge{hdl};
});
}
// -- DblGauge ---------------------------------------------------------------
void DblGauge::Inc() noexcept
{
deref(pimpl).inc();
}
void DblGauge::Inc(double amount) noexcept
{
deref(pimpl).inc(amount);
}
void DblGauge::Dec() noexcept
{
deref(pimpl).dec();
}
void DblGauge::Dec(double amount) noexcept
{
deref(pimpl).dec(amount);
}
double DblGauge::Value() const noexcept
{
return deref(pimpl).value();
}
DblGaugeFamily::DblGaugeFamily(Impl* ptr) : MetricFamily(upcast(ptr)) { }
DblGauge DblGaugeFamily::GetOrAdd(Span<const LabelView> labels)
{
return with_native_labels(labels,
[this](auto nativeLabels)
{
auto hdl = opaque(deref(this, pimpl).get_or_add(nativeLabels));
return DblGauge{hdl};
});
}
} // namespace zeek::telemetry

View file

@ -9,6 +9,8 @@
#include "zeek/Span.h" #include "zeek/Span.h"
#include "zeek/telemetry/MetricFamily.h" #include "zeek/telemetry/MetricFamily.h"
#include "broker/telemetry/fwd.hh"
namespace zeek::telemetry namespace zeek::telemetry
{ {
@ -17,7 +19,7 @@ class IntGaugeFamily;
class Manager; class Manager;
/** /**
* A handle to a metric that represents an integer value. Gauges are less * A handle to a metric that represents an integer value. Gauges are more
* permissive than counters and also allow decrementing the value. * permissive than counters and also allow decrementing the value.
*/ */
class IntGauge class IntGauge
@ -25,8 +27,6 @@ class IntGauge
public: public:
friend class IntGaugeFamily; friend class IntGaugeFamily;
struct Impl;
static inline const char* OpaqueName = "IntGaugeMetricVal"; static inline const char* OpaqueName = "IntGaugeMetricVal";
IntGauge() = delete; IntGauge() = delete;
@ -36,49 +36,51 @@ public:
/** /**
* Increments the value by 1. * Increments the value by 1.
*/ */
void Inc() noexcept; void Inc() noexcept { broker::telemetry::inc(hdl); }
/** /**
* Increments the value by @p amount. * Increments the value by @p amount.
*/ */
void Inc(int64_t amount) noexcept; void Inc(int64_t amount) noexcept { broker::telemetry::inc(hdl, amount); }
/** /**
* Increments the value by 1. * Increments the value by 1.
* @return The new value. * @return The new value.
*/ */
int64_t operator++() noexcept; int64_t operator++() noexcept { return broker::telemetry::inc(hdl); }
/** /**
* Decrements the value by 1. * Decrements the value by 1.
*/ */
void Dec() noexcept; void Dec() noexcept { broker::telemetry::dec(hdl); }
/** /**
* Decrements the value by @p amount. * Decrements the value by @p amount.
*/ */
void Dec(int64_t amount) noexcept; void Dec(int64_t amount) noexcept { broker::telemetry::dec(hdl, amount); }
/** /**
* Decrements the value by 1. * Decrements the value by 1.
* @return The new value. * @return The new value.
*/ */
int64_t operator--() noexcept; int64_t operator--() noexcept { return broker::telemetry::dec(hdl); }
/** /**
* @return The current value. * @return The current value.
*/ */
int64_t Value() const noexcept; int64_t Value() const noexcept { return broker::telemetry::value(hdl); }
/** /**
* @return Whether @c this and @p other refer to the same counter. * @return Whether @c this and @p other refer to the same counter.
*/ */
constexpr bool IsSameAs(IntGauge other) const noexcept { return pimpl == other.pimpl; } constexpr bool IsSameAs(IntGauge other) const noexcept { return hdl == other.hdl; }
private: private:
explicit IntGauge(Impl* ptr) noexcept : pimpl(ptr) { } using Handle = broker::telemetry::int_gauge_hdl*;
Impl* pimpl; explicit IntGauge(Handle hdl) noexcept : hdl(hdl) { }
Handle hdl;
}; };
/** /**
@ -105,8 +107,6 @@ class IntGaugeFamily : public MetricFamily
public: public:
friend class Manager; friend class Manager;
class Impl;
static inline const char* OpaqueName = "IntGaugeMetricFamilyVal"; static inline const char* OpaqueName = "IntGaugeMetricFamilyVal";
using InstanceType = IntGauge; using InstanceType = IntGauge;
@ -118,7 +118,10 @@ public:
* Returns the metrics handle for given labels, creating a new instance * Returns the metrics handle for given labels, creating a new instance
* lazily if necessary. * lazily if necessary.
*/ */
IntGauge GetOrAdd(Span<const LabelView> labels); IntGauge GetOrAdd(Span<const LabelView> labels)
{
return IntGauge{int_gauge_get_or_add(hdl, labels)};
}
/** /**
* @copydoc GetOrAdd * @copydoc GetOrAdd
@ -129,21 +132,20 @@ public:
} }
private: private:
explicit IntGaugeFamily(Impl* ptr); using Handle = broker::telemetry::int_gauge_family_hdl*;
explicit IntGaugeFamily(Handle hdl) : MetricFamily(upcast(hdl)) { }
}; };
/** /**
* A handle to a metric that represents a floating point value. Gauges are less * A handle to a metric that represents a floating point value. Gauges are more
* permissive than counters and also allow decrementing the value. * permissive than counters and also allow decrementing the value.
* up.
*/ */
class DblGauge class DblGauge
{ {
public: public:
friend class DblGaugeFamily; friend class DblGaugeFamily;
struct Impl;
static inline const char* OpaqueName = "DblGaugeMetricVal"; static inline const char* OpaqueName = "DblGaugeMetricVal";
DblGauge() = delete; DblGauge() = delete;
@ -153,37 +155,39 @@ public:
/** /**
* Increments the value by 1. * Increments the value by 1.
*/ */
void Inc() noexcept; void Inc() noexcept { broker::telemetry::inc(hdl); }
/** /**
* Increments the value by @p amount. * Increments the value by @p amount.
*/ */
void Inc(double amount) noexcept; void Inc(double amount) noexcept { broker::telemetry::inc(hdl, amount); }
/** /**
* Increments the value by 1. * Increments the value by 1.
*/ */
void Dec() noexcept; void Dec() noexcept { broker::telemetry::dec(hdl); }
/** /**
* Increments the value by @p amount. * Increments the value by @p amount.
*/ */
void Dec(double amount) noexcept; void Dec(double amount) noexcept { broker::telemetry::dec(hdl, amount); }
/** /**
* @return The current value. * @return The current value.
*/ */
double Value() const noexcept; double Value() const noexcept { return broker::telemetry::value(hdl); }
/** /**
* @return Whether @c this and @p other refer to the same counter. * @return Whether @c this and @p other refer to the same counter.
*/ */
constexpr bool IsSameAs(DblGauge other) const noexcept { return pimpl == other.pimpl; } constexpr bool IsSameAs(DblGauge other) const noexcept { return hdl == other.hdl; }
private: private:
explicit DblGauge(Impl* ptr) noexcept : pimpl(ptr) { } using Handle = broker::telemetry::dbl_gauge_hdl*;
Impl* pimpl; explicit DblGauge(Handle hdl) noexcept : hdl(hdl) { }
Handle hdl;
}; };
/** /**
@ -210,8 +214,6 @@ class DblGaugeFamily : public MetricFamily
public: public:
friend class Manager; friend class Manager;
class Impl;
static inline const char* OpaqueName = "DblGaugeMetricFamilyVal"; static inline const char* OpaqueName = "DblGaugeMetricFamilyVal";
using InstanceType = DblGauge; using InstanceType = DblGauge;
@ -223,7 +225,10 @@ public:
* Returns the metrics handle for given labels, creating a new instance * Returns the metrics handle for given labels, creating a new instance
* lazily if necessary. * lazily if necessary.
*/ */
DblGauge GetOrAdd(Span<const LabelView> labels); DblGauge GetOrAdd(Span<const LabelView> labels)
{
return DblGauge{dbl_gauge_get_or_add(hdl, labels)};
}
/** /**
* @copydoc GetOrAdd * @copydoc GetOrAdd
@ -234,7 +239,9 @@ public:
} }
private: private:
explicit DblGaugeFamily(Impl* ptr); using Handle = broker::telemetry::dbl_gauge_family_hdl*;
explicit DblGaugeFamily(Handle hdl) : MetricFamily(upcast(hdl)) { }
}; };
namespace detail namespace detail

View file

@ -1,102 +0,0 @@
// See the file "COPYING" in the main distribution directory for copyright.
#include "zeek/telemetry/Histogram.h"
#include <cassert>
#include "zeek/telemetry/Detail.h"
#include "caf/telemetry/histogram.hpp"
#include "caf/telemetry/metric_family.hpp"
#include "caf/telemetry/metric_family_impl.hpp"
namespace zeek::telemetry
{
// -- IntHistogram ---------------------------------------------------------------
void IntHistogram::Observe(int64_t value) noexcept
{
deref(pimpl).observe(value);
}
int64_t IntHistogram::Sum() const noexcept
{
return deref(pimpl).sum();
}
size_t IntHistogram::NumBuckets() const noexcept
{
return deref(pimpl).buckets().size();
}
int64_t IntHistogram::CountAt(size_t index) const noexcept
{
auto xs = deref(pimpl).buckets();
assert(index < xs.size());
return xs[index].count.value();
}
int64_t IntHistogram::UpperBoundAt(size_t index) const noexcept
{
auto xs = deref(pimpl).buckets();
assert(index < xs.size());
return xs[index].upper_bound;
}
IntHistogramFamily::IntHistogramFamily(Impl* ptr) : MetricFamily(upcast(ptr)) { }
IntHistogram IntHistogramFamily::GetOrAdd(Span<const LabelView> labels)
{
return with_native_labels(labels,
[this](auto nativeLabels)
{
auto hdl = opaque(deref(this, pimpl).get_or_add(nativeLabels));
return IntHistogram{hdl};
});
}
// -- DblHistogram ---------------------------------------------------------------
void DblHistogram::Observe(double amount) noexcept
{
deref(pimpl).observe(amount);
}
double DblHistogram::Sum() const noexcept
{
return deref(pimpl).sum();
}
size_t DblHistogram::NumBuckets() const noexcept
{
return deref(pimpl).buckets().size();
}
int64_t DblHistogram::CountAt(size_t index) const noexcept
{
auto xs = deref(pimpl).buckets();
assert(index < xs.size());
return xs[index].count.value();
}
double DblHistogram::UpperBoundAt(size_t index) const noexcept
{
auto xs = deref(pimpl).buckets();
assert(index < xs.size());
return xs[index].upper_bound;
}
DblHistogramFamily::DblHistogramFamily(Impl* ptr) : MetricFamily(upcast(ptr)) { }
DblHistogram DblHistogramFamily::GetOrAdd(Span<const LabelView> labels)
{
return with_native_labels(labels,
[this](auto nativeLabels)
{
auto hdl = opaque(deref(this, pimpl).get_or_add(nativeLabels));
return DblHistogram{hdl};
});
}
} // namespace zeek::telemetry

View file

@ -9,6 +9,8 @@
#include "zeek/Span.h" #include "zeek/Span.h"
#include "zeek/telemetry/MetricFamily.h" #include "zeek/telemetry/MetricFamily.h"
#include "broker/telemetry/fwd.hh"
namespace zeek::telemetry namespace zeek::telemetry
{ {
@ -26,8 +28,6 @@ class IntHistogram
public: public:
friend class IntHistogramFamily; friend class IntHistogramFamily;
struct Impl;
static inline const char* OpaqueName = "IntHistogramMetricVal"; static inline const char* OpaqueName = "IntHistogramMetricVal";
IntHistogram() = delete; IntHistogram() = delete;
@ -38,31 +38,36 @@ public:
* Increments all buckets with an upper bound less than or equal to @p value * Increments all buckets with an upper bound less than or equal to @p value
* by one and adds @p value to the total sum of all observed values. * by one and adds @p value to the total sum of all observed values.
*/ */
void Observe(int64_t value) noexcept; void Observe(int64_t value) noexcept { return broker::telemetry::observe(hdl, value); }
/// @return The sum of all observed values. /// @return The sum of all observed values.
int64_t Sum() const noexcept; int64_t Sum() const noexcept { return broker::telemetry::sum(hdl); }
/// @return The number of buckets, including the implicit "infinite" bucket. /// @return The number of buckets, including the implicit "infinite" bucket.
size_t NumBuckets() const noexcept; size_t NumBuckets() const noexcept { return broker::telemetry::num_buckets(hdl); }
/// @return The number of observations in the bucket at @p index. /// @return The number of observations in the bucket at @p index.
/// @pre index < NumBuckets() /// @pre index < NumBuckets()
int64_t CountAt(size_t index) const noexcept; int64_t CountAt(size_t index) const noexcept { return broker::telemetry::count_at(hdl, index); }
/// @return The upper bound of the bucket at @p index. /// @return The upper bound of the bucket at @p index.
/// @pre index < NumBuckets() /// @pre index < NumBuckets()
int64_t UpperBoundAt(size_t index) const noexcept; int64_t UpperBoundAt(size_t index) const noexcept
{
return broker::telemetry::upper_bound_at(hdl, index);
}
/** /**
* @return Whether @c this and @p other refer to the same histogram. * @return Whether @c this and @p other refer to the same histogram.
*/ */
constexpr bool IsSameAs(IntHistogram other) const noexcept { return pimpl == other.pimpl; } constexpr bool IsSameAs(IntHistogram other) const noexcept { return hdl == other.hdl; }
private: private:
explicit IntHistogram(Impl* ptr) noexcept : pimpl(ptr) { } using Handle = broker::telemetry::int_histogram_hdl*;
Impl* pimpl; explicit IntHistogram(Handle hdl) noexcept : hdl(hdl) { }
Handle hdl;
}; };
/** /**
@ -88,8 +93,6 @@ class IntHistogramFamily : public MetricFamily
public: public:
friend class Manager; friend class Manager;
class Impl;
static inline const char* OpaqueName = "IntHistogramMetricFamilyVal"; static inline const char* OpaqueName = "IntHistogramMetricFamilyVal";
using InstanceType = IntHistogram; using InstanceType = IntHistogram;
@ -101,7 +104,10 @@ public:
* Returns the metrics handle for given labels, creating a new instance * Returns the metrics handle for given labels, creating a new instance
* lazily if necessary. * lazily if necessary.
*/ */
IntHistogram GetOrAdd(Span<const LabelView> labels); IntHistogram GetOrAdd(Span<const LabelView> labels)
{
return IntHistogram{int_histogram_get_or_add(hdl, labels)};
}
/** /**
* @copydoc GetOrAdd * @copydoc GetOrAdd
@ -112,7 +118,9 @@ public:
} }
private: private:
explicit IntHistogramFamily(Impl* ptr); using Handle = broker::telemetry::int_histogram_family_hdl*;
explicit IntHistogramFamily(Handle hdl) : MetricFamily(upcast(hdl)) { }
}; };
/** /**
@ -125,8 +133,6 @@ class DblHistogram
public: public:
friend class DblHistogramFamily; friend class DblHistogramFamily;
struct Impl;
static inline const char* OpaqueName = "DblHistogramMetricVal"; static inline const char* OpaqueName = "DblHistogramMetricVal";
DblHistogram() = delete; DblHistogram() = delete;
@ -137,31 +143,36 @@ public:
* Increments all buckets with an upper bound less than or equal to @p value * Increments all buckets with an upper bound less than or equal to @p value
* by one and adds @p value to the total sum of all observed values. * by one and adds @p value to the total sum of all observed values.
*/ */
void Observe(double value) noexcept; void Observe(double value) noexcept { broker::telemetry::observe(hdl, value); }
/// @return The sum of all observed values. /// @return The sum of all observed values.
double Sum() const noexcept; double Sum() const noexcept { return broker::telemetry::sum(hdl); }
/// @return The number of buckets, including the implicit "infinite" bucket. /// @return The number of buckets, including the implicit "infinite" bucket.
size_t NumBuckets() const noexcept; size_t NumBuckets() const noexcept { return broker::telemetry::num_buckets(hdl); }
/// @return The number of observations in the bucket at @p index. /// @return The number of observations in the bucket at @p index.
/// @pre index < NumBuckets() /// @pre index < NumBuckets()
int64_t CountAt(size_t index) const noexcept; int64_t CountAt(size_t index) const noexcept { return broker::telemetry::count_at(hdl, index); }
/// @return The upper bound of the bucket at @p index. /// @return The upper bound of the bucket at @p index.
/// @pre index < NumBuckets() /// @pre index < NumBuckets()
double UpperBoundAt(size_t index) const noexcept; double UpperBoundAt(size_t index) const noexcept
{
return broker::telemetry::upper_bound_at(hdl, index);
}
/** /**
* @return Whether @c this and @p other refer to the same histogram. * @return Whether @c this and @p other refer to the same histogram.
*/ */
constexpr bool IsSameAs(DblHistogram other) const noexcept { return pimpl == other.pimpl; } constexpr bool IsSameAs(DblHistogram other) const noexcept { return hdl == other.hdl; }
private: private:
explicit DblHistogram(Impl* ptr) noexcept : pimpl(ptr) { } using Handle = broker::telemetry::dbl_histogram_hdl*;
Impl* pimpl; explicit DblHistogram(Handle hdl) noexcept : hdl(hdl) { }
Handle hdl;
}; };
/** /**
@ -187,8 +198,6 @@ class DblHistogramFamily : public MetricFamily
public: public:
friend class Manager; friend class Manager;
class Impl;
static inline const char* OpaqueName = "DblHistogramMetricFamilyVal"; static inline const char* OpaqueName = "DblHistogramMetricFamilyVal";
using InstanceType = DblHistogram; using InstanceType = DblHistogram;
@ -200,7 +209,10 @@ public:
* Returns the metrics handle for given labels, creating a new instance * Returns the metrics handle for given labels, creating a new instance
* lazily if necessary. * lazily if necessary.
*/ */
DblHistogram GetOrAdd(Span<const LabelView> labels); DblHistogram GetOrAdd(Span<const LabelView> labels)
{
return DblHistogram{dbl_histogram_get_or_add(hdl, labels)};
}
/** /**
* @copydoc GetOrAdd * @copydoc GetOrAdd
@ -211,7 +223,9 @@ public:
} }
private: private:
explicit DblHistogramFamily(Impl* ptr); using Handle = broker::telemetry::dbl_histogram_family_hdl*;
explicit DblHistogramFamily(Handle hdl) : MetricFamily(upcast(hdl)) { }
}; };
namespace detail namespace detail

View file

@ -5,102 +5,37 @@
#include <thread> #include <thread>
#include "zeek/3rdparty/doctest.h" #include "zeek/3rdparty/doctest.h"
#include "zeek/telemetry/Detail.h" #include "zeek/broker/Manager.h"
#include "zeek/telemetry/Timer.h" #include "zeek/telemetry/Timer.h"
#include "caf/telemetry/metric_registry.hpp" #include "broker/telemetry/metric_registry.hh"
namespace
{
using NativeManager = broker::telemetry::metric_registry;
using NativeManagerImpl = broker::telemetry::metric_registry_impl;
using NativeManagerImplPtr = zeek::IntrusivePtr<NativeManagerImpl>;
}
namespace zeek::telemetry namespace zeek::telemetry
{ {
Manager::Manager()
{
auto reg = NativeManager::pre_init_instance();
NativeManagerImplPtr ptr{NewRef{}, reg.pimpl()};
pimpl.swap(ptr);
}
Manager::~Manager() { } Manager::~Manager() { }
void Manager::InitPostScript() { } void Manager::InitPostScript() { }
IntCounterFamily Manager::IntCounterFam(std::string_view prefix, std::string_view name, void Manager::InitPostBrokerSetup(broker::endpoint& ep)
Span<const std::string_view> labels,
std::string_view helptext, std::string_view unit,
bool is_sum)
{ {
return with_native_labels(labels, auto reg = NativeManager::merge(NativeManager{pimpl.get()}, ep);
[&, this](auto xs) NativeManagerImplPtr ptr{NewRef{}, reg.pimpl()};
{ pimpl.swap(ptr);
auto ptr = deref(pimpl).counter_family(prefix, name, xs, helptext,
unit, is_sum);
return IntCounterFamily{opaque(ptr)};
});
}
DblCounterFamily Manager::DblCounterFam(std::string_view prefix, std::string_view name,
Span<const std::string_view> labels,
std::string_view helptext, std::string_view unit,
bool is_sum)
{
return with_native_labels(labels,
[&, this](auto xs)
{
auto ptr = deref(pimpl).counter_family<double>(
prefix, name, xs, helptext, unit, is_sum);
return DblCounterFamily{opaque(ptr)};
});
}
IntGaugeFamily Manager::IntGaugeFam(std::string_view prefix, std::string_view name,
Span<const std::string_view> labels, std::string_view helptext,
std::string_view unit, bool is_sum)
{
return with_native_labels(labels,
[&, this](auto xs)
{
auto ptr = deref(pimpl).gauge_family(prefix, name, xs, helptext,
unit, is_sum);
return IntGaugeFamily{opaque(ptr)};
});
}
DblGaugeFamily Manager::DblGaugeFam(std::string_view prefix, std::string_view name,
Span<const std::string_view> labels, std::string_view helptext,
std::string_view unit, bool is_sum)
{
return with_native_labels(labels,
[&, this](auto xs)
{
auto ptr = deref(pimpl).gauge_family<double>(
prefix, name, xs, helptext, unit, is_sum);
return DblGaugeFamily{opaque(ptr)};
});
}
IntHistogramFamily Manager::IntHistoFam(std::string_view prefix, std::string_view name,
Span<const std::string_view> labels,
Span<const int64_t> ubounds, std::string_view helptext,
std::string_view unit, bool is_sum)
{
return with_native_labels(
labels,
[&, this](auto xs)
{
auto bounds = caf::span<const int64_t>{ubounds.data(), ubounds.size()};
auto ptr = deref(pimpl).histogram_family(prefix, name, xs, bounds, helptext, unit,
is_sum);
return IntHistogramFamily{opaque(ptr)};
});
}
DblHistogramFamily Manager::DblHistoFam(std::string_view prefix, std::string_view name,
Span<const std::string_view> labels,
Span<const double> ubounds, std::string_view helptext,
std::string_view unit, bool is_sum)
{
return with_native_labels(
labels,
[&, this](auto xs)
{
auto bounds = caf::span<const double>{ubounds.data(), ubounds.size()};
auto ptr = deref(pimpl).histogram_family<double>(prefix, name, xs, bounds, helptext,
unit, is_sum);
return DblHistogramFamily{opaque(ptr)};
});
} }
} // namespace zeek::telemetry } // namespace zeek::telemetry
@ -110,8 +45,6 @@ DblHistogramFamily Manager::DblHistoFam(std::string_view prefix, std::string_vie
using namespace std::literals; using namespace std::literals;
using namespace zeek::telemetry; using namespace zeek::telemetry;
using NativeManager = caf::telemetry::metric_registry;
namespace namespace
{ {
@ -129,8 +62,7 @@ SCENARIO("telemetry managers provide access to counter singletons")
{ {
GIVEN("a telemetry manager") GIVEN("a telemetry manager")
{ {
NativeManager native_mgr; Manager mgr;
Manager mgr{opaque(&native_mgr)};
WHEN("retrieving an IntCounter singleton") WHEN("retrieving an IntCounter singleton")
{ {
auto first = mgr.CounterSingleton("zeek", "int-count", "test"); auto first = mgr.CounterSingleton("zeek", "int-count", "test");
@ -184,8 +116,7 @@ SCENARIO("telemetry managers provide access to counter families")
{ {
GIVEN("a telemetry manager") GIVEN("a telemetry manager")
{ {
NativeManager native_mgr; Manager mgr;
Manager mgr{opaque(&native_mgr)};
WHEN("retrieving an IntCounter family") WHEN("retrieving an IntCounter family")
{ {
auto family = mgr.CounterFamily("zeek", "requests", {"method"}, "test", "1", true); auto family = mgr.CounterFamily("zeek", "requests", {"method"}, "test", "1", true);
@ -244,8 +175,7 @@ SCENARIO("telemetry managers provide access to gauge singletons")
{ {
GIVEN("a telemetry manager") GIVEN("a telemetry manager")
{ {
NativeManager native_mgr; Manager mgr;
Manager mgr{opaque(&native_mgr)};
WHEN("retrieving an IntGauge singleton") WHEN("retrieving an IntGauge singleton")
{ {
auto first = mgr.GaugeSingleton("zeek", "int-gauge", "test"); auto first = mgr.GaugeSingleton("zeek", "int-gauge", "test");
@ -309,8 +239,7 @@ SCENARIO("telemetry managers provide access to gauge families")
{ {
GIVEN("a telemetry manager") GIVEN("a telemetry manager")
{ {
NativeManager native_mgr; Manager mgr;
Manager mgr{opaque(&native_mgr)};
WHEN("retrieving an IntGauge family") WHEN("retrieving an IntGauge family")
{ {
auto family = mgr.GaugeFamily("zeek", "open-connections", {"protocol"}, "test"); auto family = mgr.GaugeFamily("zeek", "open-connections", {"protocol"}, "test");
@ -369,8 +298,7 @@ SCENARIO("telemetry managers provide access to histogram singletons")
{ {
GIVEN("a telemetry manager") GIVEN("a telemetry manager")
{ {
NativeManager native_mgr; Manager mgr;
Manager mgr{opaque(&native_mgr)};
WHEN("retrieving an IntHistogram singleton") WHEN("retrieving an IntHistogram singleton")
{ {
const auto max_int = std::numeric_limits<int64_t>::max(); const auto max_int = std::numeric_limits<int64_t>::max();
@ -456,8 +384,7 @@ SCENARIO("telemetry managers provide access to histogram families")
{ {
GIVEN("a telemetry manager") GIVEN("a telemetry manager")
{ {
NativeManager native_mgr; Manager mgr;
Manager mgr{opaque(&native_mgr)};
WHEN("retrieving an IntHistogram family") WHEN("retrieving an IntHistogram family")
{ {
int64_t buckets[] = {10, 20}; int64_t buckets[] = {10, 20};

View file

@ -7,11 +7,24 @@
#include <string_view> #include <string_view>
#include <vector> #include <vector>
#include "zeek/IntrusivePtr.h"
#include "zeek/Span.h" #include "zeek/Span.h"
#include "zeek/telemetry/Counter.h" #include "zeek/telemetry/Counter.h"
#include "zeek/telemetry/Gauge.h" #include "zeek/telemetry/Gauge.h"
#include "zeek/telemetry/Histogram.h" #include "zeek/telemetry/Histogram.h"
#include "broker/telemetry/fwd.hh"
namespace broker
{
class endpoint;
}
namespace zeek::Broker
{
class Manager;
}
namespace zeek::telemetry namespace zeek::telemetry
{ {
@ -21,9 +34,9 @@ namespace zeek::telemetry
class Manager class Manager
{ {
public: public:
class Impl; friend class Broker::Manager;
explicit Manager(Impl* ptr) : pimpl(ptr) { } Manager();
Manager(const Manager&) = delete; Manager(const Manager&) = delete;
@ -54,13 +67,15 @@ public:
{ {
if constexpr ( std::is_same<ValueType, int64_t>::value ) if constexpr ( std::is_same<ValueType, int64_t>::value )
{ {
return IntCounterFam(prefix, name, labels, helptext, unit, is_sum); auto fam = int_counter_fam(ptr(), prefix, name, labels, helptext, unit, is_sum);
return IntCounterFamily{fam};
} }
else else
{ {
static_assert(std::is_same<ValueType, double>::value, static_assert(std::is_same<ValueType, double>::value,
"metrics only support int64_t and double values"); "metrics only support int64_t and double values");
return DblCounterFam(prefix, name, labels, helptext, unit, is_sum); auto fam = dbl_counter_fam(ptr(), prefix, name, labels, helptext, unit, is_sum);
return DblCounterFamily{fam};
} }
} }
@ -148,13 +163,15 @@ public:
{ {
if constexpr ( std::is_same<ValueType, int64_t>::value ) if constexpr ( std::is_same<ValueType, int64_t>::value )
{ {
return IntGaugeFam(prefix, name, labels, helptext, unit, is_sum); auto fam = int_gauge_fam(ptr(), prefix, name, labels, helptext, unit, is_sum);
return IntGaugeFamily{fam};
} }
else else
{ {
static_assert(std::is_same<ValueType, double>::value, static_assert(std::is_same<ValueType, double>::value,
"metrics only support int64_t and double values"); "metrics only support int64_t and double values");
return DblGaugeFam(prefix, name, labels, helptext, unit, is_sum); auto fam = dbl_gauge_fam(ptr(), prefix, name, labels, helptext, unit, is_sum);
return DblGaugeFamily{fam};
} }
} }
@ -264,13 +281,17 @@ public:
{ {
if constexpr ( std::is_same<ValueType, int64_t>::value ) if constexpr ( std::is_same<ValueType, int64_t>::value )
{ {
return IntHistoFam(prefix, name, labels, default_upper_bounds, helptext, unit, is_sum); auto fam = int_histogram_fam(ptr(), prefix, name, labels, default_upper_bounds,
helptext, unit, is_sum);
return IntHistogramFamily{fam};
} }
else else
{ {
static_assert(std::is_same<ValueType, double>::value, static_assert(std::is_same<ValueType, double>::value,
"metrics only support int64_t and double values"); "metrics only support int64_t and double values");
return DblHistoFam(prefix, name, labels, default_upper_bounds, helptext, unit, is_sum); auto fam = dbl_histogram_fam(ptr(), prefix, name, labels, default_upper_bounds,
helptext, unit, is_sum);
return DblHistogramFamily{fam};
} }
} }
@ -368,30 +389,6 @@ public:
} }
protected: protected:
IntCounterFamily IntCounterFam(std::string_view prefix, std::string_view name,
Span<const std::string_view> labels, std::string_view helptext,
std::string_view unit, bool is_sum);
DblCounterFamily DblCounterFam(std::string_view prefix, std::string_view name,
Span<const std::string_view> labels, std::string_view helptext,
std::string_view unit, bool is_sum);
IntGaugeFamily IntGaugeFam(std::string_view prefix, std::string_view name,
Span<const std::string_view> labels, std::string_view helptext,
std::string_view unit, bool is_sum);
DblGaugeFamily DblGaugeFam(std::string_view prefix, std::string_view name,
Span<const std::string_view> labels, std::string_view helptext,
std::string_view unit, bool is_sum);
IntHistogramFamily IntHistoFam(std::string_view prefix, std::string_view name,
Span<const std::string_view> labels, Span<const int64_t> ubounds,
std::string_view helptext, std::string_view unit, bool is_sum);
DblHistogramFamily DblHistoFam(std::string_view prefix, std::string_view name,
Span<const std::string_view> labels, Span<const double> ubounds,
std::string_view helptext, std::string_view unit, bool is_sum);
template <class F> static void WithLabelNames(Span<const LabelView> xs, F continuation) template <class F> static void WithLabelNames(Span<const LabelView> xs, F continuation)
{ {
if ( xs.size() <= 10 ) if ( xs.size() <= 10 )
@ -410,7 +407,13 @@ protected:
} }
} }
Impl* pimpl; broker::telemetry::metric_registry_impl* ptr() { return pimpl.get(); }
// Connects all the dots after the Broker Manager constructed the endpoint
// for this Zeek instance. Called from Broker::Manager::InitPostScript().
void InitPostBrokerSetup(broker::endpoint&);
IntrusivePtr<broker::telemetry::metric_registry_impl> pimpl;
}; };
} // namespace zeek::telemetry } // namespace zeek::telemetry

View file

@ -1,54 +0,0 @@
// See the file "COPYING" in the main distribution directory for copyright.
#include "zeek/telemetry/MetricFamily.h"
#include "caf/telemetry/metric_family.hpp"
namespace zeek::telemetry
{
namespace
{
namespace ct = caf::telemetry;
using NativeMetricFamily = ct::metric_family;
auto& deref(MetricFamily::Impl* ptr)
{
return *reinterpret_cast<NativeMetricFamily*>(ptr);
}
} // namespace
std::string_view MetricFamily::Prefix() const noexcept
{
return deref(pimpl).prefix();
}
std::string_view MetricFamily::Name() const noexcept
{
return deref(pimpl).name();
}
Span<const std::string> MetricFamily::LabelNames() const noexcept
{
return deref(pimpl).label_names();
}
std::string_view MetricFamily::Helptext() const noexcept
{
return deref(pimpl).helptext();
}
std::string_view MetricFamily::Unit() const noexcept
{
return deref(pimpl).unit();
}
bool MetricFamily::IsSum() const noexcept
{
return deref(pimpl).is_sum();
}
} // namespace zeek::telemetry

View file

@ -8,6 +8,8 @@
#include "zeek/Span.h" #include "zeek/Span.h"
#include "broker/telemetry/metric_family.hh"
namespace zeek::telemetry namespace zeek::telemetry
{ {
@ -23,8 +25,6 @@ using LabelView = std::pair<std::string_view, std::string_view>;
class MetricFamily class MetricFamily
{ {
public: public:
struct Impl;
MetricFamily() = delete; MetricFamily() = delete;
MetricFamily(const MetricFamily&) noexcept = default; MetricFamily(const MetricFamily&) noexcept = default;
MetricFamily& operator=(const MetricFamily&) noexcept = default; MetricFamily& operator=(const MetricFamily&) noexcept = default;
@ -35,42 +35,47 @@ public:
* script, may use a prefix that represents the application/script * script, may use a prefix that represents the application/script
* or protocol (e.g. @c http) name. * or protocol (e.g. @c http) name.
*/ */
std::string_view Prefix() const noexcept; std::string_view Prefix() const noexcept { return broker::telemetry::prefix(hdl); }
/** /**
* @return The human-readable name of the metric, e.g., * @return The human-readable name of the metric, e.g.,
* @p open-connections. * @p open-connections.
*/ */
std::string_view Name() const noexcept; std::string_view Name() const noexcept { return broker::telemetry::name(hdl); }
/** /**
* @return The names for all label dimensions. * @return The names for all label dimensions.
*/ */
Span<const std::string> LabelNames() const noexcept; Span<const std::string> LabelNames() const noexcept
{
return broker::telemetry::label_names(hdl);
}
/** /**
* @return A short explanation of the metric. * @return A short explanation of the metric.
*/ */
std::string_view Helptext() const noexcept; std::string_view Helptext() const noexcept { return broker::telemetry::helptext(hdl); }
/** /**
* @return The unit of measurement, preferably a base unit such as * @return The unit of measurement, preferably a base unit such as
* @c bytes or @c seconds. Dimensionless counts return the * @c bytes or @c seconds. Dimensionless counts return the
* pseudo-unit @c 1. * pseudo-unit @c 1.
*/ */
std::string_view Unit() const noexcept; std::string_view Unit() const noexcept { return broker::telemetry::unit(hdl); }
/** /**
* @return Whether metrics of this family accumulate values, where only the * @return Whether metrics of this family accumulate values, where only the
* total value is of interest. For example, the total number of * total value is of interest. For example, the total number of
* HTTP requests. * HTTP requests.
*/ */
bool IsSum() const noexcept; bool IsSum() const noexcept { return broker::telemetry::is_sum(hdl); }
protected: protected:
explicit MetricFamily(Impl* ptr) : pimpl(ptr) { } using Handle = broker::telemetry::metric_family_hdl*;
Impl* pimpl; explicit MetricFamily(Handle hdl) : hdl(hdl) { }
Handle hdl;
}; };
} // namespace zeek::telemetry } // namespace zeek::telemetry

View file

@ -581,7 +581,7 @@ SetupResult setup(int argc, char** argv, Options* zopts)
file_mgr = new file_analysis::Manager(); file_mgr = new file_analysis::Manager();
auto broker_real_time = ! options.pcap_file && ! options.deterministic_mode; auto broker_real_time = ! options.pcap_file && ! options.deterministic_mode;
broker_mgr = new Broker::Manager(broker_real_time); broker_mgr = new Broker::Manager(broker_real_time);
telemetry_mgr = broker_mgr->NewTelemetryManager().release(); telemetry_mgr = new telemetry::Manager;
trigger_mgr = new trigger::Manager(); trigger_mgr = new trigger::Manager();
plugin_mgr->InitPreScript(); plugin_mgr->InitPreScript();