1
- use std:: { io, path:: PathBuf } ;
1
+ use std:: {
2
+ io,
3
+ path:: { Path , PathBuf } ,
4
+ } ;
2
5
3
6
use metrics:: gauge;
4
7
use tokio:: fs;
8
+ use tracing:: debug;
5
9
6
10
#[ derive( thiserror:: Error , Debug ) ]
7
11
pub enum Error {
@@ -68,7 +72,7 @@ pub(crate) async fn poll(path: PathBuf, labels: &[(String, String)]) -> Result<(
68
72
gauge ! ( metric_prefix, labels) . set ( value) ;
69
73
} else {
70
74
// Key-value pairs
71
- if kv_pairs ( content, & metric_prefix, labels) . is_err ( ) {
75
+ if kv_pairs ( & file_path , content, & metric_prefix, labels) . is_err ( ) {
72
76
// File may fail to parse, for instance cgroup.controllers
73
77
// is a list of strings.
74
78
continue ;
@@ -80,9 +84,31 @@ pub(crate) async fn poll(path: PathBuf, labels: &[(String, String)]) -> Result<(
80
84
Ok ( ( ) )
81
85
}
82
86
83
- fn kv_pairs ( content : & str , metric_prefix : & str , labels : & [ ( String , String ) ] ) -> Result < ( ) , Error > {
87
+ fn kv_pairs (
88
+ file_path : & Path ,
89
+ content : & str ,
90
+ metric_prefix : & str ,
91
+ labels : & [ ( String , String ) ] ,
92
+ ) -> Result < ( ) , Error > {
84
93
for line in content. lines ( ) {
85
94
let mut parts = line. split_whitespace ( ) ;
95
+ if let Some ( key) = parts. next ( ) {
96
+ if let Some ( value_str) = parts. next ( ) {
97
+ let value: f64 = value_str. parse ( ) ?;
98
+ let metric_name = format ! ( "{metric_prefix}.{key}" ) ;
99
+ gauge ! ( metric_name, labels) . set ( value) ;
100
+ } else {
101
+ debug ! (
102
+ "[{path}] missing value in key/value pair: {content}" ,
103
+ path = file_path. to_string_lossy( ) ,
104
+ ) ;
105
+ }
106
+ } else {
107
+ debug ! (
108
+ "[{path} missing key in key/value pair: {content}" ,
109
+ path = file_path. to_string_lossy( ) ,
110
+ ) ;
111
+ }
86
112
let key = parts. next ( ) . expect ( "malformed key-value pair" ) ;
87
113
let value_str = parts. next ( ) . expect ( "malformed key-value pair" ) ;
88
114
let value: f64 = value_str. parse ( ) ?;
0 commit comments