Skip to content

Commit

Permalink
Refactor setting request sample rate
Browse files Browse the repository at this point in the history
  • Loading branch information
estringana committed Jan 4, 2024
1 parent e4f9b11 commit 67c6b7e
Show file tree
Hide file tree
Showing 6 changed files with 153 additions and 75 deletions.
2 changes: 0 additions & 2 deletions appsec/src/helper/client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -441,8 +441,6 @@ bool client::handle_command(network::request_shutdown::request &command)
auto sampler = service_->get_schema_sampler();
std::optional<sampler::scope> scope;
if (sampler) {
sampler->set_sampler_rate(
service_->get_service_config()->get_request_sample_rate());
scope = sampler->get();
if (scope.has_value()) {
parameter context_processor = parameter::map();
Expand Down
28 changes: 25 additions & 3 deletions appsec/src/helper/sampler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,16 @@
#include <mutex>
#include <optional>

#include "service_config.hpp"

namespace dds {
static const double min_rate = 0.0001;
class sampler {
public:
sampler(double sample_rate) : sample_rate_(sample_rate)
sampler(std::shared_ptr<service_config> service_config)
: service_config_(std::move(service_config))
{
set_sampler_rate(sample_rate);
set_sampler_rate(service_config_->get_request_sample_rate());
}
class scope {
public:
Expand Down Expand Up @@ -56,10 +59,20 @@ class sampler {

std::optional<scope> get()
{
if (service_config_->get_asm_enabled_status() ==
enable_asm_status::DISABLED) {
return std::nullopt;
}

const std::lock_guard<std::mutex> lock_guard(mtx_);

std::optional<scope> result = std::nullopt;

if (sample_rate_ !=
valid_sample_rate(service_config_->get_request_sample_rate())) {
set_sampler_rate(service_config_->get_request_sample_rate());
}

if (!concurrent_ && floor(request_ * sample_rate_) !=
floor((request_ + 1) * sample_rate_)) {
result = {scope{concurrent_}};
Expand All @@ -74,7 +87,7 @@ class sampler {
return result;
}

void set_sampler_rate(double sampler_rate)
static double valid_sample_rate(double sampler_rate)
{
// NOLINTBEGIN(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)
if (sampler_rate <= 0) {
Expand All @@ -86,6 +99,14 @@ class sampler {
}
// NOLINTEND(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)

return sampler_rate;
}

void set_sampler_rate(double sampler_rate)
{

sampler_rate = valid_sample_rate(sampler_rate);

if (sampler_rate == sample_rate_) {
return;
}
Expand All @@ -99,5 +120,6 @@ class sampler {
double sample_rate_{0};
std::atomic<bool> concurrent_{false};
std::mutex mtx_;
std::shared_ptr<service_config> service_config_;
};
} // namespace dds
2 changes: 1 addition & 1 deletion appsec/src/helper/service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ service::service(std::shared_ptr<engine> engine,
sample_rate = 0;
}

schema_sampler_ = std::make_shared<sampler>(sample_rate);
service_config_->set_request_sample_rate(sample_rate);
schema_sampler_ = std::make_shared<sampler>(service_config_);
}

service::ptr service::from_settings(service_identifier &&id,
Expand Down
3 changes: 0 additions & 3 deletions appsec/src/helper/service_config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,6 @@ struct service_config {
double get_request_sample_rate() { return request_sample_rate; }
void set_request_sample_rate(double sample_rate)
{
if (sample_rate < 0 || sample_rate > 1) {
return;
}
request_sample_rate = sample_rate;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -395,30 +395,6 @@ TEST(RemoteConfigAsmFeaturesListener, RequestSampleRateIsParsed)
}
}

TEST(RemoteConfigAsmFeaturesListener, RequestSampleRateLimits)
{
auto config_service = std::make_shared<service_config>();
remote_config::asm_features_listener listener(config_service, true, true);

{ // Over 1, sets default 0.1
try {
listener.on_update(get_config_with_sample_rate(2));
} catch (remote_config::error_applying_config &error) {
std::cout << error.what() << std::endl;
}
EXPECT_EQ(0.1, config_service->get_request_sample_rate());
}

{ // Below 0, sets default 0.1
try {
listener.on_update(get_config_with_sample_rate(-2));
} catch (remote_config::error_applying_config &error) {
std::cout << error.what() << std::endl;
}
EXPECT_EQ(0.1, config_service->get_request_sample_rate());
}
}

TEST(RemoteConfigAsmFeaturesListener, DynamicEnablementIsDisabled)
{
auto config_service = std::make_shared<service_config>();
Expand Down
Loading

0 comments on commit 67c6b7e

Please sign in to comment.