mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +00:00
EventHandler: Use telemetry framework for EventHandler.call_count
Put the IntCounter into a std::optional rather than initializing it at EventHandler construction time as that will currently expose a time series per event handler through the Prometheus API.
This commit is contained in:
parent
a40025b82d
commit
56a8b99965
4 changed files with 42 additions and 3 deletions
|
@ -9,6 +9,7 @@
|
||||||
#include "zeek/Var.h"
|
#include "zeek/Var.h"
|
||||||
#include "zeek/broker/Data.h"
|
#include "zeek/broker/Data.h"
|
||||||
#include "zeek/broker/Manager.h"
|
#include "zeek/broker/Manager.h"
|
||||||
|
#include "zeek/telemetry/Manager.h"
|
||||||
|
|
||||||
namespace zeek
|
namespace zeek
|
||||||
{
|
{
|
||||||
|
@ -53,7 +54,16 @@ void EventHandler::SetFunc(FuncPtr f)
|
||||||
|
|
||||||
void EventHandler::Call(Args* vl, bool no_remote)
|
void EventHandler::Call(Args* vl, bool no_remote)
|
||||||
{
|
{
|
||||||
call_count++;
|
if ( ! call_count )
|
||||||
|
{
|
||||||
|
static auto eh_invocations_family = telemetry_mgr->CounterFamily(
|
||||||
|
"zeek", "event-handler-invocations", {"name"},
|
||||||
|
"Number of times the given event handler was called", "1", true);
|
||||||
|
|
||||||
|
call_count = eh_invocations_family.GetOrAdd({{"name", name}});
|
||||||
|
}
|
||||||
|
|
||||||
|
call_count->Inc();
|
||||||
|
|
||||||
if ( new_event )
|
if ( new_event )
|
||||||
NewEvent(vl);
|
NewEvent(vl);
|
||||||
|
|
|
@ -2,12 +2,14 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
|
||||||
#include "zeek/Type.h"
|
#include "zeek/Type.h"
|
||||||
#include "zeek/ZeekArgs.h"
|
#include "zeek/ZeekArgs.h"
|
||||||
#include "zeek/ZeekList.h"
|
#include "zeek/ZeekList.h"
|
||||||
|
#include "zeek/telemetry/Counter.h"
|
||||||
|
|
||||||
namespace zeek
|
namespace zeek
|
||||||
{
|
{
|
||||||
|
@ -55,7 +57,7 @@ public:
|
||||||
}
|
}
|
||||||
bool GenerateAlways() const { return generate_always; }
|
bool GenerateAlways() const { return generate_always; }
|
||||||
|
|
||||||
uint64_t CallCount() const { return call_count; }
|
uint64_t CallCount() const { return call_count ? call_count->Value() : 0; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void NewEvent(zeek::Args* vl); // Raise new_event() meta event.
|
void NewEvent(zeek::Args* vl); // Raise new_event() meta event.
|
||||||
|
@ -67,7 +69,9 @@ private:
|
||||||
bool enabled;
|
bool enabled;
|
||||||
bool error_handler; // this handler reports error messages.
|
bool error_handler; // this handler reports error messages.
|
||||||
bool generate_always;
|
bool generate_always;
|
||||||
uint64_t call_count = 0;
|
|
||||||
|
// Initialize this lazy, so we don't expose metrics for 0 values.
|
||||||
|
std::optional<zeek::telemetry::IntCounter> call_count;
|
||||||
|
|
||||||
std::unordered_set<std::string> auto_publish;
|
std::unordered_set<std::string> auto_publish;
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
|
||||||
|
zeek, event-handler-invocations, [zeek_init], 1
|
||||||
|
zeek, event-handler-invocations, [connection_state_remove], 500
|
||||||
|
zeek, event-handler-invocations, [zeek_done], 1
|
|
@ -0,0 +1,21 @@
|
||||||
|
# @TEST-DOC: Query for zeek event-handler-invocations metrics counting number of times handlers were called.
|
||||||
|
|
||||||
|
# Note compilable to C++ due to globals being initialized to a record that
|
||||||
|
# has an opaque type as a field.
|
||||||
|
# @TEST-REQUIRES: test "${ZEEK_USE_CPP}" != "1"
|
||||||
|
# @TEST-EXEC: zcat <$TRACES/echo-connections.pcap.gz | zeek -b -Cr - %INPUT > out
|
||||||
|
# @TEST-EXEC: btest-diff out
|
||||||
|
# @TEST-EXEC-FAIL: test -f reporter.log
|
||||||
|
|
||||||
|
@load base/frameworks/telemetry
|
||||||
|
|
||||||
|
|
||||||
|
event zeek_done() &priority=-100
|
||||||
|
{
|
||||||
|
local ms = Telemetry::collect_metrics("zeek", "event-handler-invocations");
|
||||||
|
for ( _, m in ms )
|
||||||
|
{
|
||||||
|
if ( /zeek_.*|connection_.*/ in cat(m$labels))
|
||||||
|
print m$opts$prefix, m$opts$name, m$labels, m$count_value;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue