Skip to content

Commit 7bbbf93

Browse files
committed
graph: Use slog::Level directly in log drain structs
- Replace level: String with level: Level in ElasticLog, FileLogDocument, and LokiLogDocument - Add shared serialize_log_level to common.rs that serializes Level as lowercase - Remove level_to_str() and level_str()
1 parent 49feba6 commit 7bbbf93

4 files changed

Lines changed: 25 additions & 32 deletions

File tree

graph/src/log/common.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::collections::HashMap;
22
use std::fmt;
33

4+
use serde::ser::Serializer as SerdeSerializer;
45
use serde::Serialize;
56
use slog::*;
67

@@ -105,16 +106,12 @@ pub struct LogMeta {
105106
pub column: i64,
106107
}
107108

108-
/// Converts an slog Level to a string representation
109-
pub fn level_to_str(level: Level) -> &'static str {
110-
match level {
111-
Level::Critical => "critical",
112-
Level::Error => "error",
113-
Level::Warning => "warning",
114-
Level::Info => "info",
115-
Level::Debug => "debug",
116-
Level::Trace => "trace",
117-
}
109+
/// Serializes an slog Level as a lowercase string
110+
pub fn serialize_log_level<S>(level: &Level, serializer: S) -> std::result::Result<S::Ok, S::Error>
111+
where
112+
S: SerdeSerializer,
113+
{
114+
serializer.serialize_str(&level.as_str().to_ascii_lowercase())
118115
}
119116

120117
/// Builder for common log entry fields across different drain implementations
@@ -205,9 +202,9 @@ impl<'a> LogEntryBuilder<'a> {
205202
}
206203
}
207204

208-
/// Gets the level as a string
209-
pub fn level_str(&self) -> &'static str {
210-
level_to_str(self.record.level())
205+
/// Gets the log level
206+
pub fn level(&self) -> Level {
207+
self.record.level()
211208
}
212209

213210
/// Gets the timestamp

graph/src/log/elastic.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use http::header::CONTENT_TYPE;
99
use prometheus::Counter;
1010
use reqwest;
1111
use reqwest::Client;
12-
use serde::ser::Serializer as SerdeSerializer;
1312
use serde::Serialize;
1413
use serde_json::json;
1514
use slog::*;
@@ -31,14 +30,6 @@ pub struct ElasticLoggingConfig {
3130
pub client: Client,
3231
}
3332

34-
/// Serializes an slog log level using a serde Serializer.
35-
fn serialize_log_level<S>(level: &str, serializer: S) -> Result<S::Ok, S::Error>
36-
where
37-
S: SerdeSerializer,
38-
{
39-
serializer.serialize_str(level)
40-
}
41-
4233
type ElasticLogMeta = LogMeta;
4334

4435
// Log message to be written to Elasticsearch.
@@ -51,8 +42,8 @@ struct ElasticLog {
5142
arguments: HashMap<String, String>,
5243
timestamp: String,
5344
text: String,
54-
#[serde(serialize_with = "serialize_log_level")]
55-
level: String,
45+
#[serde(serialize_with = "super::common::serialize_log_level")]
46+
level: Level,
5647
meta: ElasticLogMeta,
5748
}
5849

@@ -260,7 +251,7 @@ impl Drain for ElasticDrain {
260251
arguments: builder.build_arguments_map(),
261252
timestamp,
262253
text: builder.build_text(),
263-
level: builder.level_str().to_string(),
254+
level: builder.level(),
264255
meta: builder.build_meta(),
265256
};
266257

graph/src/log/file.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ struct FileLogDocument {
2525
id: String,
2626
subgraph_id: String,
2727
timestamp: String,
28-
level: String,
28+
#[serde(serialize_with = "super::common::serialize_log_level")]
29+
level: Level,
2930
text: String,
3031
arguments: Vec<(String, String)>,
3132
meta: FileLogMeta,
@@ -83,7 +84,7 @@ impl Drain for FileDrain {
8384
id: builder.build_id(),
8485
subgraph_id: builder.subgraph_id().to_string(),
8586
timestamp: builder.timestamp().to_string(),
86-
level: builder.level_str().to_string(),
87+
level: builder.level(),
8788
text: builder.build_text(),
8889
arguments: builder.build_arguments_vec(),
8990
meta: builder.build_meta(),
@@ -161,7 +162,7 @@ mod tests {
161162
id: "test-id".to_string(),
162163
subgraph_id: "QmTest".to_string(),
163164
timestamp: "2024-01-15T10:30:00Z".to_string(),
164-
level: "error".to_string(),
165+
level: Level::Error,
165166
text: "Test error message".to_string(),
166167
arguments,
167168
meta: FileLogMeta {

graph/src/log/loki.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ struct LokiLogDocument {
3434
id: String,
3535
subgraph_id: String,
3636
timestamp: String,
37-
level: String,
37+
#[serde(serialize_with = "super::common::serialize_log_level")]
38+
level: Level,
3839
text: String,
3940
arguments: HashMap<String, String>,
4041
meta: LokiLogMeta,
@@ -183,7 +184,7 @@ impl Drain for LokiDrain {
183184
id: builder.build_id(),
184185
subgraph_id: builder.subgraph_id().to_string(),
185186
timestamp,
186-
level: builder.level_str().to_string(),
187+
level: builder.level(),
187188
text: builder.build_text(),
188189
arguments: builder.build_arguments_map(),
189190
meta: builder.build_meta(),
@@ -201,7 +202,10 @@ impl Drain for LokiDrain {
201202
// Build labels for Loki stream
202203
let mut labels = HashMap::new();
203204
labels.insert("subgraphId".to_string(), builder.subgraph_id().to_string());
204-
labels.insert("level".to_string(), builder.level_str().to_string());
205+
labels.insert(
206+
"level".to_string(),
207+
builder.level().as_str().to_ascii_lowercase(),
208+
);
205209

206210
// Create log entry
207211
let entry = LokiLogEntry {
@@ -306,7 +310,7 @@ mod tests {
306310
id: "test-id".to_string(),
307311
subgraph_id: "QmTest".to_string(),
308312
timestamp: "2024-01-15T10:30:00Z".to_string(),
309-
level: "error".to_string(),
313+
level: Level::Error,
310314
text: "Test error".to_string(),
311315
arguments,
312316
meta: LokiLogMeta {

0 commit comments

Comments
 (0)