use std::default::Default;
#[derive(serde::Serialize, Debug)]
pub struct TracerMetadata {
pub schema_version: u8,
#[serde(skip_serializing_if = "Option::is_none")]
pub runtime_id: Option<String>,
pub tracer_language: String,
pub tracer_version: String,
pub hostname: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_env: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub process_tags: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub container_id: Option<String>,
}
impl Default for TracerMetadata {
fn default() -> Self {
TracerMetadata {
schema_version: 2,
runtime_id: None,
tracer_language: String::new(),
tracer_version: String::new(),
hostname: String::new(),
service_name: None,
service_env: None,
service_version: None,
process_tags: None,
container_id: None,
}
}
}
pub enum AnonymousFileHandle {
#[cfg(target_os = "linux")]
Linux(memfd::Memfd),
#[cfg(not(target_os = "linux"))]
Other(()),
}
#[cfg(target_os = "linux")]
mod linux {
use anyhow::Context;
use rand::distributions::Alphanumeric;
use rand::Rng;
use std::io::Write;
pub fn store_tracer_metadata(
data: &super::TracerMetadata,
) -> anyhow::Result<super::AnonymousFileHandle> {
let uid: String = rand::thread_rng()
.sample_iter(&Alphanumeric)
.take(8)
.map(char::from)
.collect();
let mfd_name: String = format!("datadog-tracer-info-{uid}");
let mfd = memfd::MemfdOptions::default()
.close_on_exec(true)
.allow_sealing(true)
.create::<&str>(mfd_name.as_ref())
.context("unable to create memfd")?;
let buf = rmp_serde::to_vec_named(data).context("failed serialization")?;
mfd.as_file()
.write_all(&buf)
.context("unable to write into memfd")?;
mfd.add_seals(&[
memfd::FileSeal::SealShrink,
memfd::FileSeal::SealGrow,
memfd::FileSeal::SealSeal,
])
.context("unable to seal memfd")?;
Ok(super::AnonymousFileHandle::Linux(mfd))
}
}
#[cfg(not(target_os = "linux"))]
mod other {
pub fn store_tracer_metadata(
_data: &super::TracerMetadata,
) -> anyhow::Result<super::AnonymousFileHandle> {
Ok(super::AnonymousFileHandle::Other(()))
}
}
#[cfg(target_os = "linux")]
pub use linux::*;
#[cfg(not(target_os = "linux"))]
pub use other::*;