diff --git a/spectator/registry.h b/spectator/registry.h index 3edc25f..9a8e50d 100644 --- a/spectator/registry.h +++ b/spectator/registry.h @@ -69,6 +69,10 @@ struct single_table_state { return get_or_create(std::move(id)); } + auto get_gauge_ttl(IdPtr id, unsigned int ttl_seconds) { + return get_or_create(std::move(id), ttl_seconds); + } + auto get_max_gauge(IdPtr id) { return get_or_create(std::move(id)); } @@ -168,6 +172,14 @@ class base_registry { auto GetGauge(absl::string_view name, Tags tags = {}) { return GetGauge(Id::of(name, std::move(tags))); } + + auto GetGaugeTTL(const IdPtr& id, unsigned int ttl_seconds) { + return state_.get_gauge_ttl(final_id(id), ttl_seconds); + } + + auto GetGaugeTTL(absl::string_view name, unsigned int ttl_seconds, Tags tags = {}) { + return GetGaugeTTL(Id::of(name, std::move(tags)), ttl_seconds); + } auto GetMaxGauge(const IdPtr& id) { return state_.get_max_gauge(final_id(id)); @@ -284,6 +296,10 @@ struct stateless { return std::make_shared(std::move(id), publisher.get()); } + auto get_gauge_ttl(IdPtr id, unsigned int ttl_seconds) { + return std::make_shared(std::move(id), publisher.get(), ttl_seconds); + } + auto get_max_gauge(IdPtr id) { return std::make_shared(std::move(id), publisher.get()); } diff --git a/spectator/stateless_meters.h b/spectator/stateless_meters.h index 6a4aa3f..fdad8e9 100644 --- a/spectator/stateless_meters.h +++ b/spectator/stateless_meters.h @@ -137,10 +137,10 @@ class DistributionSummary : public StatelessMeter { template class Gauge : public StatelessMeter { public: - Gauge(IdPtr id, Pub* publisher, unsigned int ttl = 0) + Gauge(IdPtr id, Pub* publisher, unsigned int ttl_seconds = 0) : StatelessMeter(std::move(id), publisher) { - if (ttl > 0) { - type_str_ = "g," + std::to_string(ttl); + if (ttl_seconds > 0) { + type_str_ = "g," + std::to_string(ttl_seconds); } } void Set(double value) noexcept { this->send(value); } diff --git a/spectator/statelessregistry_test.cc b/spectator/statelessregistry_test.cc index 62283f8..c161bbd 100644 --- a/spectator/statelessregistry_test.cc +++ b/spectator/statelessregistry_test.cc @@ -61,9 +61,14 @@ TEST(StatelessRegistry, Gauge) { TestStatelessRegistry r; auto g = r.GetGauge("foo"); auto g2 = r.GetGauge("bar", {{"id", "2"}}); + auto g3 = r.GetGaugeTTL("baz", 1); + auto g4 = r.GetGaugeTTL("quux", 2, {{"id", "2"}}); g->Set(100); g2->Set(101); - std::vector expected = {"g:foo:100", "g:bar,id=2:101"}; + g3->Set(102); + g4->Set(103); + std::vector expected = {"g:foo:100", "g:bar,id=2:101", + "g,1:baz:102", "g,2:quux,id=2:103"}; EXPECT_EQ(r.SentMessages(), expected); }