sampling: move serialization into "sampling" crate

Summary: This way any code can skip tracing and directly output a "sampled" value. I want to log a list of values, which isn't convenient using tracing.

Reviewed By: quark-zju

Differential Revision: D49509125

fbshipit-source-id: c6a684dcb7a13572460ddb9a7678ffebee80f9ce
This commit is contained in:
Muir Manders 2023-09-22 15:35:58 -07:00 committed by Facebook GitHub Bot
parent 5ae6da8b04
commit 25d6a8c2ba
4 changed files with 24 additions and 21 deletions

View File

@ -9,4 +9,6 @@ edition = "2021"
configmodel = { version = "0.1.0", path = "../config/model" }
once_cell = "1.12"
parking_lot = { version = "0.12.1", features = ["send_guard"] }
serde = { version = "1.0.185", features = ["derive", "rc"] }
serde_json = { version = "1.0.100", features = ["float_roundtrip", "unbounded_depth"] }
tracing = "0.1.35"

View File

@ -15,6 +15,10 @@ use std::sync::Arc;
use once_cell::sync::OnceCell;
use parking_lot::Mutex;
use parking_lot::MutexGuard;
use serde::ser::Serialize;
use serde::ser::SerializeMap;
use serde::Serializer;
use serde_json::Serializer as JsonSerializer;
pub static CONFIG: OnceCell<Option<Arc<SamplingConfig>>> = OnceCell::new();
@ -86,6 +90,23 @@ impl SamplingConfig {
pub fn file(&self) -> MutexGuard<File> {
self.file.lock()
}
pub fn append<V: ?Sized>(&self, category: &str, value: &V) -> std::io::Result<()>
where
V: Serialize,
{
let mut file = self.file();
let mut serializer = JsonSerializer::new(&*file);
let mut serializer = serializer.serialize_map(None)?;
serializer.serialize_entry("category", category)?;
serializer.serialize_entry("data", value)?;
serializer.end()?;
file.write_all(b"\0")?;
Ok(())
}
}
// Returns tuple of output path and whether it's okay if the path already exists.

View File

@ -8,8 +8,6 @@ edition = "2021"
[dependencies]
once_cell = "1.12"
sampling = { version = "0.1.0", path = "../sampling" }
serde = { version = "1.0.185", features = ["derive", "rc"] }
serde_json = { version = "1.0.100", features = ["float_roundtrip", "unbounded_depth"] }
tracing = "0.1.35"
tracing-serde = "0.1.3"
tracing-subscriber = { version = "0.3.17", features = ["ansi", "env-filter", "fmt", "json", "local-time", "parking_lot", "registry"] }

View File

@ -5,14 +5,10 @@
* GNU General Public License version 2.
*/
use std::io::Write;
use std::sync::Arc;
use once_cell::sync::OnceCell;
use sampling::SamplingConfig;
use serde::ser::SerializeMap;
use serde::ser::Serializer;
use serde_json::Serializer as JsonSerializer;
use tracing::subscriber::Interest;
use tracing::Event;
use tracing::Metadata;
@ -51,21 +47,7 @@ impl<S: Subscriber> Layer<S> for SamplingLayer {
None => return,
};
let serialize = || -> std::io::Result<()> {
let mut file = config.file();
let mut serializer = JsonSerializer::new(&*file);
let mut serializer = serializer.serialize_map(None)?;
serializer.serialize_entry("category", category)?;
serializer.serialize_entry("data", &event.field_map())?;
serializer.end()?;
file.write_all(b"\0")?;
Ok(())
};
let _ = serialize();
let _ = config.append(category, &event.field_map());
}
}