use std::{
io::{self, Write},
path::PathBuf,
};
use rand::Rng;
use serde::Deserialize;
pub(crate) use apache_common::ApacheCommon;
pub(crate) use ascii::Ascii;
pub(crate) use datadog_logs::DatadogLog;
pub(crate) use dogstatsd::DogStatsD;
pub(crate) use fluent::Fluent;
pub(crate) use json::Json;
pub(crate) use opentelemetry_log::OpentelemetryLogs;
pub(crate) use opentelemetry_metric::OpentelemetryMetrics;
pub(crate) use opentelemetry_trace::OpentelemetryTraces;
pub(crate) use splunk_hec::{Encoding as SplunkHecEncoding, SplunkHec};
pub(crate) use statik::Static;
pub(crate) use syslog::Syslog5424;
pub(crate) use trace_agent::TraceAgent;
pub mod apache_common;
pub mod ascii;
pub(crate) mod common;
pub mod datadog_logs;
pub mod dogstatsd;
pub mod fluent;
pub mod json;
pub mod opentelemetry_log;
pub mod opentelemetry_metric;
pub mod opentelemetry_trace;
pub mod splunk_hec;
pub mod statik;
pub mod syslog;
pub mod trace_agent;
#[derive(thiserror::Error, Debug)]
pub(crate) enum Error {
#[error("MsgPack payload could not be encoded: {0}")]
MsgPack(#[from] rmp_serde::encode::Error),
#[error("Json payload could not be encoded: {0}")]
Json(#[from] serde_json::Error),
#[error("IO operation failed: {0}")]
Io(#[from] io::Error),
}
pub(crate) trait Serialize {
fn to_bytes<W, R>(&self, rng: R, max_bytes: usize, writer: &mut W) -> Result<(), Error>
where
R: Rng + Sized,
W: Write;
}
#[derive(Debug, Deserialize, Clone, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum Encoding {
Json,
#[serde(alias = "msgpack")]
MsgPack,
}
#[derive(Debug, Deserialize, Clone, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum Config {
Fluent,
Syslog5424,
SplunkHec {
encoding: SplunkHecEncoding,
},
DatadogLog,
Static {
static_path: PathBuf,
},
Ascii,
Json,
ApacheCommon,
OpentelemetryTraces,
OpentelemetryLogs,
OpentelemetryMetrics,
#[serde(rename = "dogstatsd")]
DogStatsD(crate::payload::dogstatsd::Config),
TraceAgent(Encoding),
}
#[derive(Debug)]
#[allow(dead_code, clippy::large_enum_variant)]
pub(crate) enum Payload {
ApacheCommon(ApacheCommon),
Ascii(Ascii),
DatadogLog(DatadogLog),
Fluent(Fluent),
Json(Json),
SplunkHec(SplunkHec),
Static(Static),
Syslog(Syslog5424),
OtelTraces(OpentelemetryTraces),
OtelLogs(OpentelemetryLogs),
OtelMetrics(OpentelemetryMetrics),
DogStatsdD(DogStatsD),
TraceAgent(TraceAgent),
}
impl Serialize for Payload {
fn to_bytes<W, R>(&self, rng: R, max_bytes: usize, writer: &mut W) -> Result<(), Error>
where
W: Write,
R: Rng + Sized,
{
match self {
Payload::ApacheCommon(ser) => ser.to_bytes(rng, max_bytes, writer),
Payload::Ascii(ser) => ser.to_bytes(rng, max_bytes, writer),
Payload::DatadogLog(ser) => ser.to_bytes(rng, max_bytes, writer),
Payload::Fluent(ser) => ser.to_bytes(rng, max_bytes, writer),
Payload::Json(ser) => ser.to_bytes(rng, max_bytes, writer),
Payload::SplunkHec(ser) => ser.to_bytes(rng, max_bytes, writer),
Payload::Static(ser) => ser.to_bytes(rng, max_bytes, writer),
Payload::Syslog(ser) => ser.to_bytes(rng, max_bytes, writer),
Payload::OtelTraces(ser) => ser.to_bytes(rng, max_bytes, writer),
Payload::OtelLogs(ser) => ser.to_bytes(rng, max_bytes, writer),
Payload::OtelMetrics(ser) => ser.to_bytes(rng, max_bytes, writer),
Payload::DogStatsdD(ser) => ser.to_bytes(rng, max_bytes, writer),
Payload::TraceAgent(ser) => ser.to_bytes(rng, max_bytes, writer),
}
}
}
const fn div_ceil(lhs: usize, rhs: usize) -> usize {
let d = lhs / rhs;
let r = lhs % rhs;
if r > 0 && rhs > 0 {
d + 1
} else {
d
}
}
pub(crate) trait Generator<I> {
fn generate<R>(&self, rng: &mut R) -> I
where
R: rand::Rng + ?Sized;
}