Use temp_arena for formatting instead of cached plan arena

This commit is contained in:
2025-09-03 13:23:58 -04:00
parent 54d06c654f
commit 6d480487da

View File

@@ -856,6 +856,10 @@ struct Metric {
Metric::LabelSets label_sets = Metric::build_label_sets(plan.arena);
// Use temporary arena for formatting static text (will be interned to
// global arena)
ArenaAllocator temp_arena(8192); // 8KB for temporary formatting
// Helper function to append an additional label to existing Prometheus
// format
auto append_label_to_format =
@@ -872,7 +876,7 @@ struct Metric {
if (base_format.empty()) {
// Create new format: {key="value"}
size_t required_size = 2 + key_value_size; // {}
char *buf = plan.arena.allocate<char>(required_size);
char *buf = temp_arena.allocate<char>(required_size);
char *p = buf;
*p++ = '{';
std::memcpy(p, key.data(), key.length());
@@ -905,7 +909,7 @@ struct Metric {
// Append to existing format: {existing,key="value"}
size_t required_size = base_format.length() + 1 +
key_value_size; // comma + key="value", replace }
char *buf = plan.arena.allocate<char>(required_size);
char *buf = temp_arena.allocate<char>(required_size);
char *p = buf;
// Copy everything except the closing }
std::memcpy(p, base_format.data(), base_format.length() - 1);
@@ -948,7 +952,7 @@ struct Metric {
for (const auto &[name, family] : get_counter_families()) {
// Add HELP line
auto help_line = format(
plan.arena, "%s# HELP %.*s %.*s\n# TYPE %.*s counter",
temp_arena, "%s# HELP %.*s %.*s\n# TYPE %.*s counter",
is_first_static ? "" : "\n", static_cast<int>(name.length()),
name.data(), static_cast<int>(family->help.length()),
family->help.data(), static_cast<int>(name.length()), name.data());
@@ -958,7 +962,7 @@ struct Metric {
for (const auto &[labels_key, callback] : family->callbacks) {
plan.instructions.push_back(CallCounterCallback{&callback});
auto static_text = format(
plan.arena, "%.*s\n%.*s%.*s ", static_cast<int>(help_line.size()),
temp_arena, "%.*s\n%.*s%.*s ", static_cast<int>(help_line.size()),
help_line.data(), static_cast<int>(name.length()), name.data(),
static_cast<int>(labels_key.prometheus_format.length()),
labels_key.prometheus_format.data());
@@ -972,7 +976,7 @@ struct Metric {
plan.instructions.push_back(
AggregateCounter{data.thread_states, data.global_state});
auto static_text = format(
plan.arena, "%.*s\n%.*s%.*s ", static_cast<int>(help_line.size()),
temp_arena, "%.*s\n%.*s%.*s ", static_cast<int>(help_line.size()),
help_line.data(), static_cast<int>(name.length()), name.data(),
static_cast<int>(data.labels_key.prometheus_format.length()),
data.labels_key.prometheus_format.data());
@@ -986,7 +990,7 @@ struct Metric {
for (const auto &[name, family] : get_gauge_families()) {
// Add HELP line
auto help_line = format(
plan.arena, "%s# HELP %.*s %.*s\n# TYPE %.*s gauge",
temp_arena, "%s# HELP %.*s %.*s\n# TYPE %.*s gauge",
is_first_static ? "" : "\n", static_cast<int>(name.length()),
name.data(), static_cast<int>(family->help.length()),
family->help.data(), static_cast<int>(name.length()), name.data());
@@ -996,7 +1000,7 @@ struct Metric {
for (const auto &[labels_key, callback] : family->callbacks) {
plan.instructions.push_back(CallGaugeCallback{&callback});
auto static_text = format(
plan.arena, "%.*s\n%.*s%.*s ", static_cast<int>(help_line.size()),
temp_arena, "%.*s\n%.*s%.*s ", static_cast<int>(help_line.size()),
help_line.data(), static_cast<int>(name.length()), name.data(),
static_cast<int>(labels_key.prometheus_format.length()),
labels_key.prometheus_format.data());
@@ -1009,7 +1013,7 @@ struct Metric {
for (const auto &data : family_data) {
plan.instructions.push_back(AggregateGauge{data.instance_state});
auto static_text = format(
plan.arena, "%.*s\n%.*s%.*s ", static_cast<int>(help_line.size()),
temp_arena, "%.*s\n%.*s%.*s ", static_cast<int>(help_line.size()),
help_line.data(), static_cast<int>(name.length()), name.data(),
static_cast<int>(data.labels_key.prometheus_format.length()),
data.labels_key.prometheus_format.data());
@@ -1022,7 +1026,7 @@ struct Metric {
size_t histogram_family_idx = 0;
for (const auto &[name, family] : get_histogram_families()) {
auto help_line = format(
plan.arena, "%s# HELP %.*s %.*s\n# TYPE %.*s histogram",
temp_arena, "%s# HELP %.*s %.*s\n# TYPE %.*s histogram",
is_first_static ? "" : "\n", static_cast<int>(name.length()),
name.data(), static_cast<int>(family->help.length()),
family->help.data(), static_cast<int>(name.length()), name.data());
@@ -1036,11 +1040,11 @@ struct Metric {
// Static text for explicit buckets
for (size_t i = 0; i < data.bucket_count; ++i) {
auto bucket_value = static_format(plan.arena, family->buckets[i]);
auto bucket_value = static_format(temp_arena, family->buckets[i]);
auto labels = append_label_to_format(
data.labels_key.prometheus_format, "le", bucket_value);
auto static_text =
format(plan.arena, "%.*s\n%.*s_bucket%.*s ",
format(temp_arena, "%.*s\n%.*s_bucket%.*s ",
static_cast<int>(help_line.size()), help_line.data(),
static_cast<int>(name.length()), name.data(),
static_cast<int>(labels.length()), labels.data());
@@ -1052,14 +1056,14 @@ struct Metric {
auto inf_labels = append_label_to_format(
data.labels_key.prometheus_format, "le", "+Inf");
auto inf_static_text =
format(plan.arena, "\n%.*s_bucket%.*s ",
format(temp_arena, "\n%.*s_bucket%.*s ",
static_cast<int>(name.length()), name.data(),
static_cast<int>(inf_labels.length()), inf_labels.data());
plan.static_text.push_back(intern_static_text(inf_static_text));
// Static text for sum
auto sum_static_text =
format(plan.arena, "\n%.*s_sum%.*s ",
format(temp_arena, "\n%.*s_sum%.*s ",
static_cast<int>(name.length()), name.data(),
static_cast<int>(data.labels_key.prometheus_format.length()),
data.labels_key.prometheus_format.data());
@@ -1067,7 +1071,7 @@ struct Metric {
// Static text for count
auto count_static_text =
format(plan.arena, "\n%.*s_count%.*s ",
format(temp_arena, "\n%.*s_count%.*s ",
static_cast<int>(name.length()), name.data(),
static_cast<int>(data.labels_key.prometheus_format.length()),
data.labels_key.prometheus_format.data());