From 72d1274a5ff1042b7018a6b659a6efb4bccc5e29 Mon Sep 17 00:00:00 2001 From: Dominik Werder Date: Thu, 17 Apr 2025 15:58:44 +0200 Subject: [PATCH] Support value --- Cargo.toml | 2 +- src/make_metrics.rs | 11 +++++- src/make_metrics/codegen.rs | 73 +++++++++++++++++++++++++++++++++++-- 3 files changed, 80 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 74b913b..cae60d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mettrics-macros" -version = "0.0.6" +version = "0.0.7" description = "Macros for mettrics crate." authors = ["Dominik Werder "] license = "GPL-3.0-only" diff --git a/src/make_metrics.rs b/src/make_metrics.rs index 5cbf2a6..f00c7f6 100644 --- a/src/make_metrics.rs +++ b/src/make_metrics.rs @@ -312,6 +312,7 @@ impl syn::parse::Parse for ComposeModItem { struct MetricsModItem { struct_name: String, counter_names: Vec, + value_names: Vec, histolog2_names: Vec, compose_mods: Vec, } @@ -322,6 +323,7 @@ impl syn::parse::Parse for MetricsModItem { fn parse(inp: ParseStream) -> syn::Result { let mut struct_name = None; let mut counter_names = Vec::new(); + let mut value_names = Vec::new(); let mut histolog2_names = Vec::new(); let mut compose_mods = Vec::new(); log(&format!("MetricsModItem inp 1 {:?}", inp)); @@ -371,13 +373,19 @@ impl syn::parse::Parse for MetricsModItem { let s = var.ident.to_string(); counter_names.push(s); } + } else if idn == "values" { + for var in vars { + let s = var.ident.to_string(); + value_names.push(s); + } } else if idn == "histolog2s" { for var in vars { let s = var.ident.to_string(); histolog2_names.push(s); } } else { - let e = inp.error(format!("expect enum `counters` or `histolog2s`")); + let e = inp + .error(format!("expect enum `counters`, `values` or `histolog2s`")); return Err(e); } } @@ -391,6 +399,7 @@ impl syn::parse::Parse for MetricsModItem { let ret = Self { struct_name: struct_name.expect("type StructName"), counter_names, + value_names, histolog2_names, compose_mods, }; diff --git a/src/make_metrics/codegen.rs b/src/make_metrics/codegen.rs index 56edf13..a50956f 100644 --- a/src/make_metrics/codegen.rs +++ b/src/make_metrics/codegen.rs @@ -33,20 +33,17 @@ impl MetricsDecl { #[derive(Debug, serde::Serialize)] pub struct #struct_name { #(#fields_counters_decl)* - // #(#fields_compose_decl)* } impl #struct_name { pub fn new() -> Self { Self { #(#fields_counters_init)* - // #(#fields_compose_init)* } } pub fn ingest(&mut self, inp: #inp_struct_name) { #(#ingest_counters)* - // #(#ingest_compose)* } } }; @@ -159,6 +156,11 @@ impl MetricsDecl { .iter() .map(|x| syn::Ident::new(x, Span::call_site())) .map(|x| quote::quote! { #x: CounterU32, }); + let field_decl_values = metrics + .value_names + .iter() + .map(|x| syn::Ident::new(&x, Span::call_site())) + .map(|x| quote::quote! { #x: ValueU32, }); let field_decl_histolog2s = metrics .histolog2_names .iter() @@ -175,6 +177,7 @@ impl MetricsDecl { #[derive(Debug, serde::Serialize)] pub struct #struct_name { #(#field_decl_counters)* + #(#field_decl_values)* #(#field_decl_histolog2s)* #(#field_decl_composes)* } @@ -185,6 +188,11 @@ impl MetricsDecl { .iter() .map(|x| syn::Ident::new(x, Span::call_site())) .map(|x| quote::quote! { #x: CounterU32::new(), }); + let field_init_values = metrics + .value_names + .iter() + .map(|x| syn::Ident::new(&x, Span::call_site())) + .map(|x| quote::quote! { #x: ValueU32::new(), }); let field_init_histolog2s = metrics .histolog2_names .iter() @@ -209,6 +217,13 @@ impl MetricsDecl { .map(|x| { quote::quote! { self.#x.ingest(inp.#x); } }); + let ingest_values = metrics + .value_names + .iter() + .map(|x| syn::Ident::new(&x, Span::call_site())) + .map(|x| { + quote::quote! { let _ = "NOTE HERE"; self.#x.ingest(inp.#x); } + }); let fields_histlog2s_ingest = metrics .histolog2_names .iter() @@ -232,6 +247,14 @@ impl MetricsDecl { ret.extend(v); } }); + let flatten_prom_values = metrics.value_names.iter().map(|n| { + let id = syn::Ident::new(n, Span::call_site()); + quote::quote! { + let n = format!("{}_{}", name, #n); + let v = self.#id.to_flatten_prometheus(&n); + ret.extend(v); + } + }); let field_init_composes = metrics.compose_mods.iter().map(|m| { let n = syn::Ident::new(&m.name, Span::call_site()); // let ct = syn::Ident::new(&m.input, Span::call_site()); @@ -247,6 +270,15 @@ impl MetricsDecl { } } }); + let field_values_get_mut = metrics.value_names.iter().map(|x| { + let n = syn::Ident::new(x, Span::call_site()); + quote::quote! { + #[inline(always)] + pub fn #n(&mut self) -> &mut ValueU32 { + &mut self.#n + } + } + }); let field_composes_get_mut = metrics.compose_mods.iter().map(|m| { let n = syn::Ident::new(&m.name, Span::call_site()); // let ct = syn::Ident::new(&m.input, Span::call_site()); @@ -274,20 +306,51 @@ impl MetricsDecl { } }); + let take_from_counters = metrics.counter_names.iter().map(|x| { + let n = syn::Ident::new(x, Span::call_site()); + quote::quote! { + ret.#n.take_from(&mut self.#n); + } + }); + let take_from_values = metrics.value_names.iter().map(|x| { + let n = syn::Ident::new(x, Span::call_site()); + quote::quote! { + ret.#n.take_from(&mut self.#n); + } + }); + let take_from_histolog2s = metrics.histolog2_names.iter().map(|x| { + let n = syn::Ident::new(x, Span::call_site()); + quote::quote! { + ret.#n.take_from(&mut self.#n); + } + }); + let take_from_composes = metrics.compose_mods.iter().map(|m| { + let n = syn::Ident::new(&m.name, Span::call_site()); + quote::quote! { + ret.#n = self.#n.take_and_reset(); + } + }); let impl_1 = quote::quote! { impl #struct_name { pub fn new() -> Self { Self { #(#field_init_counters)* + #(#field_init_values)* #(#field_init_histolog2s)* #(#field_init_composes)* } } pub fn take_and_reset(&mut self) -> Self { - std::mem::replace(self, Self::new()) + let mut ret = Self::new(); + #(#take_from_counters)* + #(#take_from_values)* + #(#take_from_histolog2s)* + #(#take_from_composes)* + ret } pub fn ingest(&mut self, inp: #struct_name) { #(#fields_counters_ingest)* + #(#ingest_values)* #(#fields_histlog2s_ingest)* #(#fields_composes_ingest)* } @@ -295,11 +358,13 @@ impl MetricsDecl { let mut ret = Vec::new(); #(#flatten_prom_composes)* #(#flatten_prom_counters)* + #(#flatten_prom_values)* #(#flatten_prom_histolog2s)* ret } #(#field_incs_counters)* + #(#field_values_get_mut)* #(#field_histlog2s_get_mut)* #(#field_composes_get_mut)* }