-
Notifications
You must be signed in to change notification settings - Fork 83
/
Copy pathtermination_predicate_impl.h
66 lines (54 loc) · 2.1 KB
/
termination_predicate_impl.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#pragma once
#include <chrono>
#include "envoy/common/time.h"
#include "envoy/stats/store.h"
#include "nighthawk/common/termination_predicate.h"
#include "external/envoy/source/common/common/assert.h"
namespace Nighthawk {
class TerminationPredicateBaseImpl : public TerminationPredicate {
public:
TerminationPredicate& link(TerminationPredicatePtr&& child) final {
RELEASE_ASSERT(linked_child_ == nullptr, "Linked child already set");
linked_child_ = std::move(child);
return *linked_child_;
}
TerminationPredicate& appendToChain(TerminationPredicatePtr&& child) final {
if (linked_child_ != nullptr) {
return linked_child_->appendToChain(std::move(child));
} else {
return link(std::move(child));
}
}
TerminationPredicate::Status evaluateChain() final;
private:
TerminationPredicatePtr linked_child_;
};
/**
* Predicate which indicates termination iff the passed in duration has expired.
* time tracking starts at the first call to evaluate().
*/
class DurationTerminationPredicateImpl : public TerminationPredicateBaseImpl {
public:
DurationTerminationPredicateImpl(Envoy::TimeSource& time_source,
std::chrono::microseconds duration,
const Envoy::MonotonicTime start)
: time_source_(time_source), start_(start), duration_(duration) {}
TerminationPredicate::Status evaluate() override;
private:
Envoy::TimeSource& time_source_;
const Envoy::MonotonicTime start_;
std::chrono::microseconds duration_;
};
class StatsCounterAbsoluteThresholdTerminationPredicateImpl : public TerminationPredicateBaseImpl {
public:
StatsCounterAbsoluteThresholdTerminationPredicateImpl(
Envoy::Stats::Counter& counter, uint64_t counter_limit,
TerminationPredicate::Status termination_status)
: counter_(counter), counter_limit_(counter_limit), termination_status_(termination_status) {}
TerminationPredicate::Status evaluate() override;
private:
Envoy::Stats::Counter& counter_;
const uint64_t counter_limit_;
const TerminationPredicate::Status termination_status_;
};
} // namespace Nighthawk