Skip to content

Commit 4fcbd5b

Browse files
committed
Improve Summarizer ergonomics
1 parent 99008f6 commit 4fcbd5b

File tree

6 files changed

+39
-22
lines changed

6 files changed

+39
-22
lines changed

libs/common/include/events/detail/summarizer.hpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,19 @@ class Summarizer {
3030
* Construct a Summarizer at time zero.
3131
*/
3232
Summarizer() = default;
33-
33+
3434
/**
3535
* Updates the summary with a feature event.
3636
* @param event Feature event.
3737
*/
3838
void Update(client::FeatureEventParams const& event);
3939

40+
/**
41+
* Marks the summary as finished at a given timestamp.
42+
* @param end_time End time of the summary.
43+
*/
44+
Summarizer& Finish(Time end_time);
45+
4046
/**
4147
* Returns true if the summary is empty.
4248
*/
@@ -47,6 +53,11 @@ class Summarizer {
4753
*/
4854
[[nodiscard]] Time start_time() const;
4955

56+
/**
57+
* Returns the summary's end time as specified using Finish.
58+
*/
59+
[[nodiscard]] Time end_time() const;
60+
5061
struct VariationSummary {
5162
public:
5263
explicit VariationSummary(Value value);
@@ -95,12 +106,8 @@ class Summarizer {
95106

96107
private:
97108
Time start_time_;
109+
Summarizer::Time end_time_;
98110
std::unordered_map<FlagKey, State> features_;
99111
};
100112

101-
struct Summary {
102-
Summarizer const& summarizer;
103-
Summarizer::Time end_time;
104-
};
105-
106113
} // namespace launchdarkly::events::detail

libs/common/include/serialization/events/json_events.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,5 @@ void tag_invoke(boost::json::value_from_tag const&,
4646
Summarizer::State const& state);
4747
void tag_invoke(boost::json::value_from_tag const&,
4848
boost::json::value& json_value,
49-
Summary const& summary);
49+
Summarizer const& summary);
5050
} // namespace launchdarkly::events::detail

libs/common/src/events/asio_event_processor.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,8 @@ AsioEventProcessor::MakeRequest() {
132132

133133
auto events = boost::json::value_from(outbox_.Consume());
134134

135-
if (!summarizer_.Empty()) {
136-
events.as_array().push_back(boost::json::value_from(
137-
Summary{summarizer_, std::chrono::system_clock::now()}));
135+
if (!summarizer_.Finish(std::chrono::system_clock::now()).Empty()) {
136+
events.as_array().push_back(boost::json::value_from(summarizer_));
138137
}
139138

140139
LD_LOG(logger_, LogLevel::kDebug)

libs/common/src/events/summarizer.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,19 @@ void Summarizer::Update(client::FeatureEventParams const& event) {
5353
summary_counter->second.Increment();
5454
}
5555

56+
Summarizer& Summarizer::Finish(Time end_time) {
57+
end_time_ = end_time;
58+
return *this;
59+
}
60+
5661
Summarizer::Time Summarizer::start_time() const {
5762
return start_time_;
5863
}
5964

65+
Summarizer::Time Summarizer::end_time() const {
66+
return end_time_;
67+
}
68+
6069
Summarizer::VariationKey::VariationKey(Version version,
6170
std::optional<VariationIndex> variation)
6271
: version(version), variation(variation) {}

libs/common/src/serialization/events/json_events.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,12 @@ void tag_invoke(boost::json::value_from_tag const& tag,
113113
}
114114
void tag_invoke(boost::json::value_from_tag const& tag,
115115
boost::json::value& json_value,
116-
Summary const& summary) {
116+
Summarizer const& summary) {
117117
auto& obj = json_value.emplace_object();
118118
obj.emplace("kind", "summary");
119119
obj.emplace("startDate",
120-
boost::json::value_from(Date{summary.summarizer.start_time()}));
121-
obj.emplace("endDate", boost::json::value_from(Date{summary.end_time}));
122-
obj.emplace("features",
123-
boost::json::value_from(summary.summarizer.features()));
120+
boost::json::value_from(Date{summary.start_time()}));
121+
obj.emplace("endDate", boost::json::value_from(Date{summary.end_time()}));
122+
obj.emplace("features", boost::json::value_from(summary.features()));
124123
}
125124
} // namespace launchdarkly::events::detail

libs/common/tests/event_processor_test.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,22 @@
1212

1313
using namespace launchdarkly::events::detail;
1414

15-
static std::chrono::system_clock::time_point ZeroTime() {
15+
static std::chrono::system_clock::time_point TimeZero() {
1616
return std::chrono::system_clock::time_point{};
1717
}
1818

19+
static std::chrono::system_clock::time_point Time1000() {
20+
return std::chrono::system_clock::from_time_t(1);
21+
}
22+
1923
TEST(SummarizerTests, IsEmptyOnConstruction) {
2024
Summarizer summarizer;
2125
ASSERT_TRUE(summarizer.Empty());
2226
}
2327

2428
TEST(SummarizerTests, DefaultConstructionUsesZeroStartTime) {
2529
Summarizer summarizer;
26-
ASSERT_EQ(summarizer.start_time(), ZeroTime());
30+
ASSERT_EQ(summarizer.start_time(), TimeZero());
2731
}
2832

2933
TEST(SummarizerTests, ExplicitStartTimeIsCorrect) {
@@ -45,7 +49,7 @@ TEST(SummarizerTests, SummaryCounterUpdates) {
4549
auto const feature_variation = 0;
4650

4751
auto const event = FeatureEventParams{
48-
ZeroTime(),
52+
TimeZero(),
4953
feature_key,
5054
context,
5155
EvaluationResult(
@@ -88,7 +92,7 @@ TEST(SummarizerTests, JsonSerialization) {
8892
auto const feature_variation = 0;
8993

9094
auto const event = FeatureEventParams{
91-
ZeroTime(),
95+
TimeZero(),
9296
feature_key,
9397
context,
9498
EvaluationResult(
@@ -105,10 +109,9 @@ TEST(SummarizerTests, JsonSerialization) {
105109
for (size_t i = 0; i < num_events; i++) {
106110
summarizer.Update(event);
107111
}
108-
109-
auto json = boost::json::value_from(Summary{summarizer, ZeroTime()});
112+
auto json = boost::json::value_from(summarizer.Finish(Time1000()));
110113
auto expected = boost::json::parse(
111-
R"({"kind":"summary","startDate":0,"endDate":0,"features":{"cat-food-amount":{"default":1E0,"contextKinds":["cat"],"counters":[{"version":1,"variation":0,"value":3E0,"count":10}]}}})");
114+
R"({"kind":"summary","startDate":0,"endDate":1000,"features":{"cat-food-amount":{"default":1E0,"contextKinds":["cat"],"counters":[{"version":1,"variation":0,"value":3E0,"count":10}]}}})");
112115
ASSERT_EQ(json, expected);
113116
}
114117

0 commit comments

Comments
 (0)