Separate Connection and Request lifetimes

This commit is contained in:
2025-09-14 15:04:37 -04:00
parent cf0c1b7cc2
commit 16c7ee0408
14 changed files with 519 additions and 381 deletions

View File

@@ -454,7 +454,7 @@ struct Metric {
Arena arena;
ThreadInit() {
// Register this thread's arena for memory tracking
std::unique_lock<std::mutex> _{mutex};
std::unique_lock _{mutex};
get_thread_arenas()[std::this_thread::get_id()] = &arena;
}
~ThreadInit() {
@@ -462,7 +462,7 @@ struct Metric {
// THREAD SAFETY: All operations below are protected by the global mutex,
// including writes to global accumulated state, preventing races with
// render thread
std::unique_lock<std::mutex> _{mutex};
std::unique_lock _{mutex};
// NOTE: registration_version increment is REQUIRED here because:
// - Cached render plan has pre-resolved pointers to thread-local state
// - When threads disappear, these pointers become invalid
@@ -501,7 +501,7 @@ struct Metric {
if (thread_it != family->per_thread_state.end()) {
for (auto &[labels_key, instance] : thread_it->second.instances) {
// Acquire lock to get consistent snapshot
std::lock_guard<std::mutex> lock(instance->mutex);
std::lock_guard lock(instance->mutex);
// Global accumulator should have been created when we made the
// histogram
@@ -592,7 +592,7 @@ struct Metric {
// Force thread_local initialization
(void)thread_init;
std::unique_lock<std::mutex> _{mutex};
std::unique_lock _{mutex};
++Metric::registration_version;
const LabelsKey &key = intern_labels(labels);
@@ -633,7 +633,7 @@ struct Metric {
static Gauge create_gauge_instance(
Family<Gauge> *family,
std::span<const std::pair<std::string_view, std::string_view>> labels) {
std::unique_lock<std::mutex> _{mutex};
std::unique_lock _{mutex};
++Metric::registration_version;
const LabelsKey &key = intern_labels(labels);
@@ -659,7 +659,7 @@ struct Metric {
// Force thread_local initialization
(void)thread_init;
std::unique_lock<std::mutex> _{mutex};
std::unique_lock _{mutex};
++Metric::registration_version;
const LabelsKey &key = intern_labels(labels);
@@ -1137,7 +1137,7 @@ struct Metric {
uint64_t observations_snapshot;
{
std::lock_guard<std::mutex> lock(instance->mutex);
std::lock_guard lock(instance->mutex);
for (size_t i = 0; i < instance->counts.size(); ++i) {
counts_snapshot[i] = instance->counts[i];
}
@@ -1423,7 +1423,7 @@ update_histogram_buckets_simd(std::span<const double> thresholds,
void Histogram::observe(double x) {
assert(p->thresholds.size() == p->counts.size());
std::lock_guard<std::mutex> lock(p->mutex);
std::lock_guard lock(p->mutex);
// Update bucket counts using SIMD
update_histogram_buckets_simd(p->thresholds, p->counts, x, 0);
@@ -1458,7 +1458,7 @@ Histogram Family<Histogram>::create(
Family<Counter> create_counter(std::string_view name, std::string_view help) {
validate_or_abort(is_valid_metric_name(name), "invalid counter name", name);
std::unique_lock<std::mutex> _{Metric::mutex};
std::unique_lock _{Metric::mutex};
++Metric::registration_version;
auto &global_arena = Metric::get_global_arena();
auto name_view = arena_copy_string(name, global_arena);
@@ -1480,7 +1480,7 @@ Family<Counter> create_counter(std::string_view name, std::string_view help) {
Family<Gauge> create_gauge(std::string_view name, std::string_view help) {
validate_or_abort(is_valid_metric_name(name), "invalid gauge name", name);
std::unique_lock<std::mutex> _{Metric::mutex};
std::unique_lock _{Metric::mutex};
++Metric::registration_version;
auto &global_arena = Metric::get_global_arena();
auto name_view = arena_copy_string(name, global_arena);
@@ -1504,7 +1504,7 @@ Family<Histogram> create_histogram(std::string_view name, std::string_view help,
std::span<const double> buckets) {
validate_or_abort(is_valid_metric_name(name), "invalid histogram name", name);
std::unique_lock<std::mutex> _{Metric::mutex};
std::unique_lock _{Metric::mutex};
++Metric::registration_version;
auto &global_arena = Metric::get_global_arena();
auto name_view = arena_copy_string(name, global_arena);
@@ -1693,7 +1693,7 @@ std::span<std::string_view> render(Arena &arena) {
// Hold lock throughout all phases to prevent registry changes
// THREAD SAFETY: Global mutex protects cached_plan initialization and access,
// prevents races during static member initialization at program startup
std::unique_lock<std::mutex> _{Metric::mutex};
std::unique_lock _{Metric::mutex};
// Call all registered collectors to update their metrics
for (const auto &collector : Metric::get_collectors()) {
@@ -1723,7 +1723,7 @@ template <>
void Family<Counter>::register_callback(
std::span<const std::pair<std::string_view, std::string_view>> labels,
MetricCallback<Counter> callback) {
std::unique_lock<std::mutex> _{Metric::mutex};
std::unique_lock _{Metric::mutex};
++Metric::registration_version;
const LabelsKey &key = Metric::intern_labels(labels);
@@ -1748,7 +1748,7 @@ template <>
void Family<Gauge>::register_callback(
std::span<const std::pair<std::string_view, std::string_view>> labels,
MetricCallback<Gauge> callback) {
std::unique_lock<std::mutex> _{Metric::mutex};
std::unique_lock _{Metric::mutex};
++Metric::registration_version;
const LabelsKey &key = Metric::intern_labels(labels);
@@ -1804,7 +1804,7 @@ void reset_metrics_for_testing() {
}
void register_collector(Ref<Collector> collector) {
std::unique_lock<std::mutex> _{Metric::mutex};
std::unique_lock _{Metric::mutex};
++Metric::registration_version;
Metric::get_collectors().push_back(std::move(collector));
}