Use temp_arena for formatting instead of cached plan arena
This commit is contained in:
@@ -856,6 +856,10 @@ struct Metric {
|
|||||||
|
|
||||||
Metric::LabelSets label_sets = Metric::build_label_sets(plan.arena);
|
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
|
// Helper function to append an additional label to existing Prometheus
|
||||||
// format
|
// format
|
||||||
auto append_label_to_format =
|
auto append_label_to_format =
|
||||||
@@ -872,7 +876,7 @@ struct Metric {
|
|||||||
if (base_format.empty()) {
|
if (base_format.empty()) {
|
||||||
// Create new format: {key="value"}
|
// Create new format: {key="value"}
|
||||||
size_t required_size = 2 + key_value_size; // {}
|
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;
|
char *p = buf;
|
||||||
*p++ = '{';
|
*p++ = '{';
|
||||||
std::memcpy(p, key.data(), key.length());
|
std::memcpy(p, key.data(), key.length());
|
||||||
@@ -905,7 +909,7 @@ struct Metric {
|
|||||||
// Append to existing format: {existing,key="value"}
|
// Append to existing format: {existing,key="value"}
|
||||||
size_t required_size = base_format.length() + 1 +
|
size_t required_size = base_format.length() + 1 +
|
||||||
key_value_size; // comma + key="value", replace }
|
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;
|
char *p = buf;
|
||||||
// Copy everything except the closing }
|
// Copy everything except the closing }
|
||||||
std::memcpy(p, base_format.data(), base_format.length() - 1);
|
std::memcpy(p, base_format.data(), base_format.length() - 1);
|
||||||
@@ -948,7 +952,7 @@ struct Metric {
|
|||||||
for (const auto &[name, family] : get_counter_families()) {
|
for (const auto &[name, family] : get_counter_families()) {
|
||||||
// Add HELP line
|
// Add HELP line
|
||||||
auto help_line = format(
|
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()),
|
is_first_static ? "" : "\n", static_cast<int>(name.length()),
|
||||||
name.data(), static_cast<int>(family->help.length()),
|
name.data(), static_cast<int>(family->help.length()),
|
||||||
family->help.data(), static_cast<int>(name.length()), name.data());
|
family->help.data(), static_cast<int>(name.length()), name.data());
|
||||||
@@ -958,7 +962,7 @@ struct Metric {
|
|||||||
for (const auto &[labels_key, callback] : family->callbacks) {
|
for (const auto &[labels_key, callback] : family->callbacks) {
|
||||||
plan.instructions.push_back(CallCounterCallback{&callback});
|
plan.instructions.push_back(CallCounterCallback{&callback});
|
||||||
auto static_text = format(
|
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(),
|
help_line.data(), static_cast<int>(name.length()), name.data(),
|
||||||
static_cast<int>(labels_key.prometheus_format.length()),
|
static_cast<int>(labels_key.prometheus_format.length()),
|
||||||
labels_key.prometheus_format.data());
|
labels_key.prometheus_format.data());
|
||||||
@@ -972,7 +976,7 @@ struct Metric {
|
|||||||
plan.instructions.push_back(
|
plan.instructions.push_back(
|
||||||
AggregateCounter{data.thread_states, data.global_state});
|
AggregateCounter{data.thread_states, data.global_state});
|
||||||
auto static_text = format(
|
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(),
|
help_line.data(), static_cast<int>(name.length()), name.data(),
|
||||||
static_cast<int>(data.labels_key.prometheus_format.length()),
|
static_cast<int>(data.labels_key.prometheus_format.length()),
|
||||||
data.labels_key.prometheus_format.data());
|
data.labels_key.prometheus_format.data());
|
||||||
@@ -986,7 +990,7 @@ struct Metric {
|
|||||||
for (const auto &[name, family] : get_gauge_families()) {
|
for (const auto &[name, family] : get_gauge_families()) {
|
||||||
// Add HELP line
|
// Add HELP line
|
||||||
auto help_line = format(
|
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()),
|
is_first_static ? "" : "\n", static_cast<int>(name.length()),
|
||||||
name.data(), static_cast<int>(family->help.length()),
|
name.data(), static_cast<int>(family->help.length()),
|
||||||
family->help.data(), static_cast<int>(name.length()), name.data());
|
family->help.data(), static_cast<int>(name.length()), name.data());
|
||||||
@@ -996,7 +1000,7 @@ struct Metric {
|
|||||||
for (const auto &[labels_key, callback] : family->callbacks) {
|
for (const auto &[labels_key, callback] : family->callbacks) {
|
||||||
plan.instructions.push_back(CallGaugeCallback{&callback});
|
plan.instructions.push_back(CallGaugeCallback{&callback});
|
||||||
auto static_text = format(
|
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(),
|
help_line.data(), static_cast<int>(name.length()), name.data(),
|
||||||
static_cast<int>(labels_key.prometheus_format.length()),
|
static_cast<int>(labels_key.prometheus_format.length()),
|
||||||
labels_key.prometheus_format.data());
|
labels_key.prometheus_format.data());
|
||||||
@@ -1009,7 +1013,7 @@ struct Metric {
|
|||||||
for (const auto &data : family_data) {
|
for (const auto &data : family_data) {
|
||||||
plan.instructions.push_back(AggregateGauge{data.instance_state});
|
plan.instructions.push_back(AggregateGauge{data.instance_state});
|
||||||
auto static_text = format(
|
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(),
|
help_line.data(), static_cast<int>(name.length()), name.data(),
|
||||||
static_cast<int>(data.labels_key.prometheus_format.length()),
|
static_cast<int>(data.labels_key.prometheus_format.length()),
|
||||||
data.labels_key.prometheus_format.data());
|
data.labels_key.prometheus_format.data());
|
||||||
@@ -1022,7 +1026,7 @@ struct Metric {
|
|||||||
size_t histogram_family_idx = 0;
|
size_t histogram_family_idx = 0;
|
||||||
for (const auto &[name, family] : get_histogram_families()) {
|
for (const auto &[name, family] : get_histogram_families()) {
|
||||||
auto help_line = format(
|
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()),
|
is_first_static ? "" : "\n", static_cast<int>(name.length()),
|
||||||
name.data(), static_cast<int>(family->help.length()),
|
name.data(), static_cast<int>(family->help.length()),
|
||||||
family->help.data(), static_cast<int>(name.length()), name.data());
|
family->help.data(), static_cast<int>(name.length()), name.data());
|
||||||
@@ -1036,11 +1040,11 @@ struct Metric {
|
|||||||
|
|
||||||
// Static text for explicit buckets
|
// Static text for explicit buckets
|
||||||
for (size_t i = 0; i < data.bucket_count; ++i) {
|
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(
|
auto labels = append_label_to_format(
|
||||||
data.labels_key.prometheus_format, "le", bucket_value);
|
data.labels_key.prometheus_format, "le", bucket_value);
|
||||||
auto static_text =
|
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>(help_line.size()), help_line.data(),
|
||||||
static_cast<int>(name.length()), name.data(),
|
static_cast<int>(name.length()), name.data(),
|
||||||
static_cast<int>(labels.length()), labels.data());
|
static_cast<int>(labels.length()), labels.data());
|
||||||
@@ -1052,14 +1056,14 @@ struct Metric {
|
|||||||
auto inf_labels = append_label_to_format(
|
auto inf_labels = append_label_to_format(
|
||||||
data.labels_key.prometheus_format, "le", "+Inf");
|
data.labels_key.prometheus_format, "le", "+Inf");
|
||||||
auto inf_static_text =
|
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>(name.length()), name.data(),
|
||||||
static_cast<int>(inf_labels.length()), inf_labels.data());
|
static_cast<int>(inf_labels.length()), inf_labels.data());
|
||||||
plan.static_text.push_back(intern_static_text(inf_static_text));
|
plan.static_text.push_back(intern_static_text(inf_static_text));
|
||||||
|
|
||||||
// Static text for sum
|
// Static text for sum
|
||||||
auto sum_static_text =
|
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>(name.length()), name.data(),
|
||||||
static_cast<int>(data.labels_key.prometheus_format.length()),
|
static_cast<int>(data.labels_key.prometheus_format.length()),
|
||||||
data.labels_key.prometheus_format.data());
|
data.labels_key.prometheus_format.data());
|
||||||
@@ -1067,7 +1071,7 @@ struct Metric {
|
|||||||
|
|
||||||
// Static text for count
|
// Static text for count
|
||||||
auto count_static_text =
|
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>(name.length()), name.data(),
|
||||||
static_cast<int>(data.labels_key.prometheus_format.length()),
|
static_cast<int>(data.labels_key.prometheus_format.length()),
|
||||||
data.labels_key.prometheus_format.data());
|
data.labels_key.prometheus_format.data());
|
||||||
|
|||||||
Reference in New Issue
Block a user