Coverage Report

Created: 2024-09-19 09:45

/proc/self/cwd/source/extensions/tracers/xray/reservoir.h
Line
Count
Source (jump to first uncovered line)
1
#pragma once
2
3
#include <chrono>
4
5
#include "envoy/common/time.h"
6
7
#include "source/common/common/lock_guard.h"
8
#include "source/common/common/thread.h"
9
10
namespace Envoy {
11
namespace Extensions {
12
namespace Tracers {
13
namespace XRay {
14
15
/**
16
 * Simple token-bucket algorithm that enables counting samples/traces used per second.
17
 */
18
class Reservoir {
19
public:
20
  /**
21
   * Creates a new reservoir that allows up to |traces_per_second| samples.
22
   */
23
0
  explicit Reservoir(uint32_t traces_per_second) : traces_per_second_(traces_per_second) {}
24
25
  Reservoir(const Reservoir& other)
26
      : traces_per_second_(other.traces_per_second_), used_(other.used_),
27
0
        time_point_(other.time_point_) {}
28
29
0
  Reservoir& operator=(const Reservoir& other) {
30
0
    if (this == &other) {
31
0
      return *this;
32
0
    }
33
0
    traces_per_second_ = other.traces_per_second_;
34
0
    used_ = other.used_;
35
0
    time_point_ = other.time_point_;
36
0
    return *this;
37
0
  }
38
39
  /**
40
   * Determines whether all samples have been used up for this particular second.
41
   * Every second, this reservoir starts over with a full bucket.
42
   *
43
   * @param now Used to compare against the last recorded time to determine if it's still within the
44
   * same second.
45
   */
46
0
  bool take(Envoy::MonotonicTime now) {
47
0
    Envoy::Thread::LockGuard lg(sync_);
48
0
    const auto diff = now - time_point_;
49
0
    if (diff > std::chrono::seconds(1)) {
50
0
      used_ = 0;
51
0
      time_point_ = now;
52
0
    }
53
54
0
    if (used_ >= traces_per_second_) {
55
0
      return false;
56
0
    }
57
58
0
    ++used_;
59
0
    return true;
60
0
  }
61
62
private:
63
  uint32_t traces_per_second_;
64
  uint32_t used_{0};
65
  Envoy::MonotonicTime time_point_;
66
  Envoy::Thread::MutexBasicLockable sync_;
67
};
68
69
} // namespace XRay
70
} // namespace Tracers
71
} // namespace Extensions
72
} // namespace Envoy