tracing_fluentd/
default_writers.rs

1use crate::MakeWriter;
2
3use std::net::ToSocketAddrs;
4
5impl MakeWriter for std::vec::IntoIter<std::net::SocketAddr> {
6    type Writer = std::net::TcpStream;
7
8    #[inline(always)]
9    fn make(&self) -> std::io::Result<Self::Writer> {
10        for addr in self.as_slice().iter() {
11            match std::net::TcpStream::connect_timeout(addr, core::time::Duration::from_secs(1)) {
12                Ok(socket) => return Ok(socket),
13                Err(_) => continue,
14            }
15        }
16
17        Err(std::io::Error::new(std::io::ErrorKind::NotFound, "cannot connect to fluentd"))
18    }
19}
20
21///Creates writer by resolving address from provided string.
22impl MakeWriter for &'static str {
23    type Writer = std::net::TcpStream;
24
25    #[inline(always)]
26    fn make(&self) -> std::io::Result<Self::Writer> {
27        let addrs = self.to_socket_addrs()?;
28
29        for addr in addrs.as_slice().iter() {
30            match std::net::TcpStream::connect_timeout(addr, core::time::Duration::from_secs(1)) {
31                Ok(socket) => return Ok(socket),
32                Err(_) => continue,
33            }
34        }
35
36        Err(std::io::Error::new(std::io::ErrorKind::NotFound, "cannot connect to fluentd"))
37    }
38}
39
40///Creates writer by resolving address from provided string and port.
41impl MakeWriter for (&'static str, u16) {
42    type Writer = std::net::TcpStream;
43
44    #[inline(always)]
45    fn make(&self) -> std::io::Result<Self::Writer> {
46        let addrs = self.to_socket_addrs()?;
47
48        for addr in addrs.as_slice().iter() {
49            match std::net::TcpStream::connect_timeout(addr, core::time::Duration::from_secs(1)) {
50                Ok(socket) => return Ok(socket),
51                Err(_) => continue,
52            }
53        }
54
55        Err(std::io::Error::new(std::io::ErrorKind::NotFound, "cannot connect to fluentd"))
56    }
57}
58
59impl MakeWriter for std::net::SocketAddr {
60    type Writer = std::net::TcpStream;
61
62    #[inline(always)]
63    fn make(&self) -> std::io::Result<Self::Writer> {
64        match std::net::TcpStream::connect_timeout(self, core::time::Duration::from_secs(1)) {
65            Ok(socket) => Ok(socket),
66            Err(_) => Err(std::io::Error::new(std::io::ErrorKind::NotFound, "cannot connect to fluentd")),
67        }
68    }
69}
70
71impl MakeWriter for [std::net::SocketAddr; 1] {
72    type Writer = std::net::TcpStream;
73
74    #[inline(always)]
75    fn make(&self) -> std::io::Result<Self::Writer> {
76        match std::net::TcpStream::connect_timeout(&self[0], core::time::Duration::from_secs(1)) {
77            Ok(socket) => Ok(socket),
78            Err(_) => Err(std::io::Error::new(std::io::ErrorKind::NotFound, "cannot connect to fluentd")),
79        }
80    }
81}
82
83//While we can use generics, it doesn't really make sense to store addresses in such big arrays.
84macro_rules! impl_for_socket_addr_array {
85    ($($idx:literal),+) => {
86
87        $(
88            impl MakeWriter for [std::net::SocketAddr; $idx] {
89                type Writer = std::net::TcpStream;
90
91                #[inline(always)]
92                fn make(&self) -> std::io::Result<Self::Writer> {
93                    for addr in self {
94                        match std::net::TcpStream::connect_timeout(addr, core::time::Duration::from_secs(1)) {
95                            Ok(socket) => return Ok(socket),
96                            Err(_) => continue,
97                        }
98                    }
99
100                    Err(std::io::Error::new(std::io::ErrorKind::NotFound, "cannot connect to fluentd"))
101                }
102            }
103        )+
104    }
105}
106
107impl_for_socket_addr_array!(2,3,4,5,6,7,8,9,10,11,12);