From aa5d7f5a73e2a9b6a5eecfea7fd638440aa0cdd4 Mon Sep 17 00:00:00 2001 From: Arne Welzel Date: Mon, 27 Nov 2023 19:41:05 +0100 Subject: [PATCH] OpaqueVal: Register TelemetryVals, too Even if they are not serializable, OpaqueMgr::TypeID() is called during BuildJSON() for them and that previously just aborted. Closes #3473 --- src/OpaqueVal.cc | 12 +++++++++ src/OpaqueVal.h | 5 ++++ .../coverage.global-ids-to-json/.stderr | 1 + .../Baseline/scripts.base.utils.json/output | 4 +++ .../btest/coverage/global-ids-to-json.zeek | 8 ++++++ testing/btest/scripts/base/utils/json.test | 25 +++++++++++++++++++ 6 files changed, 55 insertions(+) create mode 100644 testing/btest/Baseline/coverage.global-ids-to-json/.stderr create mode 100644 testing/btest/coverage/global-ids-to-json.zeek diff --git a/src/OpaqueVal.cc b/src/OpaqueVal.cc index c700d014fc..19165990f4 100644 --- a/src/OpaqueVal.cc +++ b/src/OpaqueVal.cc @@ -1062,4 +1062,16 @@ TelemetryVal::TelemetryVal(telemetry::DblHistogram) : OpaqueVal(dbl_histogram_me TelemetryVal::TelemetryVal(telemetry::DblHistogramFamily) : OpaqueVal(dbl_histogram_metric_family_type) {} +IMPLEMENT_OPAQUE_VALUE(IntCounterMetricVal) +IMPLEMENT_OPAQUE_VALUE(IntCounterMetricFamilyVal) +IMPLEMENT_OPAQUE_VALUE(DblCounterMetricVal) +IMPLEMENT_OPAQUE_VALUE(DblCounterMetricFamilyVal) +IMPLEMENT_OPAQUE_VALUE(IntGaugeMetricVal) +IMPLEMENT_OPAQUE_VALUE(IntGaugeMetricFamilyVal) +IMPLEMENT_OPAQUE_VALUE(DblGaugeMetricVal) +IMPLEMENT_OPAQUE_VALUE(DblGaugeMetricFamilyVal) +IMPLEMENT_OPAQUE_VALUE(IntHistogramMetricVal) +IMPLEMENT_OPAQUE_VALUE(IntHistogramMetricFamilyVal) +IMPLEMENT_OPAQUE_VALUE(DblHistogramMetricVal) +IMPLEMENT_OPAQUE_VALUE(DblHistogramMetricFamilyVal) } // namespace zeek diff --git a/src/OpaqueVal.h b/src/OpaqueVal.h index 7ff0d1b37e..e6560ac50c 100644 --- a/src/OpaqueVal.h +++ b/src/OpaqueVal.h @@ -427,6 +427,11 @@ public: Handle GetHandle() const noexcept { return hdl; } + static zeek::OpaqueValPtr OpaqueInstantiate() { + reporter->Error("TelemetryValImpl::OpaqueInstantiate is unsupported"); + return nullptr; + } + protected: ValPtr DoClone(CloneState*) override { return make_intrusive(hdl); } diff --git a/testing/btest/Baseline/coverage.global-ids-to-json/.stderr b/testing/btest/Baseline/coverage.global-ids-to-json/.stderr new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/coverage.global-ids-to-json/.stderr @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Baseline/scripts.base.utils.json/output b/testing/btest/Baseline/scripts.base.utils.json/output index d5e4a4a38d..59766da08b 100644 --- a/testing/btest/Baseline/scripts.base.utils.json/output +++ b/testing/btest/Baseline/scripts.base.utils.json/output @@ -42,3 +42,7 @@ XXXXXXXXXX.XXXXXX {"10.1.1.1":[1,2],"10.2.2.2":[3,5]} {"1":{"s":"test"}} {"opaque_type":"TopkVal"} +{"_metric":{"opaque_type":"DblGaugeMetricVal"}} +{"_family":{"opaque_type":"DblGaugeMetricFamilyVal"},"_labels":["dim_1"]} +{"_metric":{"opaque_type":"DblCounterMetricVal"}} +{"_family":{"opaque_type":"DblCounterMetricFamilyVal"},"_labels":["dim_1"]} diff --git a/testing/btest/coverage/global-ids-to-json.zeek b/testing/btest/coverage/global-ids-to-json.zeek new file mode 100644 index 0000000000..6e45ca9960 --- /dev/null +++ b/testing/btest/coverage/global-ids-to-json.zeek @@ -0,0 +1,8 @@ +# @TEST-DOC: Ensure to_json(global_ids()) does not abort and do not expect any stderr output. +# @TEST-EXEC: unset ZEEK_ALLOW_INIT_ERRORS; zeek %INPUT +# @TEST-EXEC: btest-diff .stderr + +event zeek_init() + { + assert |to_json(global_ids())| > 0; + } diff --git a/testing/btest/scripts/base/utils/json.test b/testing/btest/scripts/base/utils/json.test index 0c2199a940..ad569bfb0f 100644 --- a/testing/btest/scripts/base/utils/json.test +++ b/testing/btest/scripts/base/utils/json.test @@ -5,6 +5,8 @@ # @TEST-EXEC: zeek -b %INPUT >output # @TEST-EXEC: btest-diff output +@load base/frameworks/telemetry + type color: enum { Red, White, Blue }; type myrec1: record { @@ -132,4 +134,27 @@ event zeek_init() # Opaque local o1: opaque of topk = topk_init(5); print to_json(o1); + + # Telemetry values wrapping opaque values. + local gauge_family = Telemetry::register_gauge_family([ + $prefix="btest", + $name="btest_testing_gauge", + $unit="1", + $help_text="Btest testing", + $labels=vector("dim_1"), + ]); + local gauge = Telemetry::gauge_with(gauge_family, vector("dim_1_value")); + print to_json(gauge); + print to_json(gauge_family); + + local counter_family = Telemetry::register_counter_family([ + $prefix="btest", + $name="btest_testing_counter", + $unit="1", + $help_text="Btest testing", + $labels=vector("dim_1"), + ]); + local counter = Telemetry::counter_with(counter_family, vector("dim_1_value")); + print to_json(counter); + print to_json(counter_family); }