Skip to content

Commit 2040f71

Browse files
committed
Send rasp telemetry metrics
1 parent 96c3f9f commit 2040f71

File tree

4 files changed

+46
-3
lines changed

4 files changed

+46
-3
lines changed

appsec/src/helper/metrics.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ constexpr std::string_view waf_duration = "_dd.appsec.waf.duration";
102102
constexpr std::string_view rasp_duration = "_dd.appsec.rasp.duration";
103103
constexpr std::string_view rasp_rule_eval = "_dd.appsec.rasp.rule.eval";
104104
constexpr std::string_view rasp_timeout = "_dd.appsec.rasp.timeout";
105+
constexpr std::string_view telemetry_rasp_rule_eval = "appsec.rasp.rule.eval";
106+
constexpr std::string_view telemetry_rasp_rule_match = "appsec.rasp.rule.match";
107+
constexpr std::string_view telemetry_rasp_timeout = "appsec.rasp.timeout";
105108

106109
} // namespace dds::metrics
107110

appsec/src/helper/subscriber/waf.cpp

+22-2
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,11 @@ void instance::listener::call(
332332
const std::unique_ptr<ddwaf_result, decltype(&ddwaf_result_free)> scope(
333333
&res, ddwaf_result_free);
334334

335-
// NOLINTNEXTLINE
336-
total_runtime_ += res.total_runtime / 1000.0;
335+
if (rasp_rule ==
336+
"") { // RASP WAF call should not be counted on total_runtime_
337+
// NOLINTNEXTLINE
338+
total_runtime_ += res.total_runtime / 1000.0;
339+
}
337340
if (res.timeout) {
338341
waf_hit_timeout_ = true;
339342
}
@@ -352,6 +355,11 @@ void instance::listener::call(
352355
rasp_calls_++;
353356
if (res.timeout) {
354357
rasp_timeouts_ += 1;
358+
rasp_metrics_[rasp_rule].timeouts++;
359+
}
360+
rasp_metrics_[rasp_rule].evaluated++;
361+
if (code == DDWAF_MATCH) {
362+
rasp_metrics_[rasp_rule].matches++;
355363
}
356364
}
357365

@@ -419,6 +427,18 @@ void instance::listener::submit_metrics(
419427
msubmitter.submit_span_metric(
420428
metrics::rasp_timeout, rasp_timeouts_);
421429
}
430+
431+
for (auto rule : rasp_metrics_) {
432+
metrics::telemetry_tags tags;
433+
tags.add("rule_type", rule.first);
434+
tags.add("waf_version", ddwaf_get_version());
435+
msubmitter.submit_metric(
436+
metrics::telemetry_rasp_rule_eval, rule.second.evaluated, tags);
437+
msubmitter.submit_metric(
438+
metrics::telemetry_rasp_rule_match, rule.second.matches, tags);
439+
msubmitter.submit_metric(
440+
metrics::telemetry_rasp_timeout, rule.second.timeouts, tags);
441+
}
422442
}
423443

424444
for (const auto &[key, value] : derivatives_) {

appsec/src/helper/subscriber/waf.hpp

+8
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <spdlog/spdlog.h>
1616
#include <string>
1717
#include <string_view>
18+
#include <unordered_map>
1819

1920
namespace dds::waf {
2021

@@ -43,6 +44,13 @@ class instance : public dds::subscriber {
4344
void submit_metrics(metrics::telemetry_submitter &msubmitter) override;
4445

4546
protected:
47+
struct rasp_telemetry_metrics {
48+
unsigned evaluated = 0;
49+
unsigned matches = 0;
50+
unsigned timeouts = 0;
51+
};
52+
std::unordered_map<std::string, rasp_telemetry_metrics> rasp_metrics_ =
53+
{};
4654
ddwaf_context handle_{};
4755
std::chrono::microseconds waf_timeout_;
4856
double total_runtime_{0.0};

appsec/tests/helper/waf_test.cpp

+13-1
Original file line numberDiff line numberDiff line change
@@ -185,13 +185,25 @@ TEST(WafTest, ValidRunGood)
185185
metrics::telemetry_tags::from_string(
186186
std::string{"event_rules_version:1.2.3,waf_version:"} +
187187
ddwaf_get_version())));
188+
EXPECT_CALL(submitm, submit_metric("appsec.rasp.rule.eval"sv, 1,
189+
metrics::telemetry_tags::from_string(
190+
std::string{"rule_type:lfi,waf_version:"} +
191+
ddwaf_get_version())));
192+
EXPECT_CALL(submitm, submit_metric("appsec.rasp.rule.match"sv, 0,
193+
metrics::telemetry_tags::from_string(
194+
std::string{"rule_type:lfi,waf_version:"} +
195+
ddwaf_get_version())));
196+
EXPECT_CALL(submitm, submit_metric("appsec.rasp.timeout"sv, 0,
197+
metrics::telemetry_tags::from_string(
198+
std::string{"rule_type:lfi,waf_version:"} +
199+
ddwaf_get_version())));
188200
EXPECT_CALL(submitm, submit_span_metric(metrics::rasp_rule_eval, 1.0));
189201
EXPECT_CALL(submitm, submit_span_metric(metrics::waf_duration, _))
190202
.WillOnce(SaveArg<1>(&duration));
191203
EXPECT_CALL(submitm, submit_span_metric(metrics::rasp_duration, _))
192204
.WillOnce(SaveArg<1>(&rasp_duration));
193205
ctx->submit_metrics(submitm);
194-
EXPECT_GT(duration, 0.0);
206+
EXPECT_EQ(duration, 0.0);
195207
EXPECT_GT(rasp_duration, 0);
196208
}
197209
}

0 commit comments

Comments
 (0)