Emit per-database labeled counters and gauges. Six series: - `nodedb_database_queries_total{database="..."}` — cumulative queries - `nodedb_database_errors_total{database="..."}` — cumulative errors - `nodedb_database_collections_total{database="..."}` — current collection count - `nodedb_database_tenants_total{database="..."}` — tenant count (stub-zero) - `nodedb_database_memory_bytes{database="
(&self, out: &mut String)
| 30 | /// - `nodedb_database_memory_bytes{database="..."}` — memory usage (stub-zero) |
| 31 | /// - `nodedb_database_storage_bytes{database="..."}` — storage usage (stub-zero) |
| 32 | pub(super) fn prometheus_database_metrics(&self, out: &mut String) { |
| 33 | use std::fmt::Write as _; |
| 34 | |
| 35 | let queries = self |
| 36 | .database_queries_by_name |
| 37 | .read() |
| 38 | .unwrap_or_else(|p| p.into_inner()); |
| 39 | if !queries.is_empty() { |
| 40 | let _ = out.write_str( |
| 41 | "# HELP nodedb_database_queries_total Queries executed against each database\n\ |
| 42 | # TYPE nodedb_database_queries_total counter\n", |
| 43 | ); |
| 44 | let mut pairs: Vec<_> = queries.iter().collect(); |
| 45 | pairs.sort_by(|a, b| a.0.cmp(b.0)); |
| 46 | for (db, count) in pairs { |
| 47 | let _ = writeln!( |
| 48 | out, |
| 49 | r#"nodedb_database_queries_total{{database="{db}"}} {count}"# |
| 50 | ); |
| 51 | } |
| 52 | } |
| 53 | drop(queries); |
| 54 | |
| 55 | let errors = self |
| 56 | .database_errors_by_name |
| 57 | .read() |
| 58 | .unwrap_or_else(|p| p.into_inner()); |
| 59 | if !errors.is_empty() { |
| 60 | let _ = out.write_str( |
| 61 | "# HELP nodedb_database_errors_total Query errors against each database\n\ |
| 62 | # TYPE nodedb_database_errors_total counter\n", |
| 63 | ); |
| 64 | let mut pairs: Vec<_> = errors.iter().collect(); |
| 65 | pairs.sort_by(|a, b| a.0.cmp(b.0)); |
| 66 | for (db, count) in pairs { |
| 67 | let _ = writeln!( |
| 68 | out, |
| 69 | r#"nodedb_database_errors_total{{database="{db}"}} {count}"# |
| 70 | ); |
| 71 | } |
| 72 | } |
| 73 | drop(errors); |
| 74 | |
| 75 | let colls = self |
| 76 | .database_collections_by_name |
| 77 | .read() |
| 78 | .unwrap_or_else(|p| p.into_inner()); |
| 79 | if !colls.is_empty() { |
| 80 | let _ = out.write_str( |
| 81 | "# HELP nodedb_database_collections_total Collections registered in each database\n\ |
| 82 | # TYPE nodedb_database_collections_total gauge\n", |
| 83 | ); |
| 84 | let mut pairs: Vec<_> = colls.iter().collect(); |
| 85 | pairs.sort_by(|a, b| a.0.cmp(b.0)); |
| 86 | for (db, count) in pairs { |
| 87 | let _ = writeln!( |
| 88 | out, |
| 89 | r#"nodedb_database_collections_total{{database="{db}"}} {count}"# |