11use crate :: config:: Config ;
22use crate :: processor:: InboundMetric ;
3- use async_channel:: Sender ;
43use byteorder:: BigEndian ;
54use byteorder:: ByteOrder ;
65use openmetrics_udpserver_lib:: MetricType ;
7- use std:: net:: UdpSocket ;
6+ use tokio:: net:: UdpSocket ;
7+ use tokio:: sync:: broadcast:: Sender ;
88
99pub struct UdpServer {
1010 config : Config ,
@@ -20,41 +20,36 @@ impl UdpServer {
2020 }
2121
2222 pub async fn run ( & self ) {
23- let mut udp_socket =
24- UdpSocket :: bind ( & self . config . udp_bind ) . expect ( "Unable to bind UDP Server" ) ;
23+ let udp_socket = UdpSocket :: bind ( & self . config . udp_bind )
24+ . await
25+ . expect ( "Unable to bind UDP Server" ) ;
2526 loop {
26- match self . read ( & mut udp_socket) {
27- Ok ( metric) => {
28- if let Err ( err) = self . metric_sender . send ( metric) . await {
29- eprintln ! ( "Unable to process inbound metric: {}" , err) ;
27+ if udp_socket. readable ( ) . await . is_ok ( ) {
28+ let mut buf = [ 0 ; 300 ] ;
29+ if let Ok ( read_bytes) = udp_socket. try_recv ( & mut buf) {
30+ match self . decode_buffer ( & buf, read_bytes) {
31+ Ok ( inbound_metric) => {
32+ if let Err ( err) = self . metric_sender . send ( inbound_metric) {
33+ eprintln ! ( "Unable to process inbound metric: {}" , err) ;
34+ }
35+ }
36+ Err ( err) => {
37+ eprintln ! ( "could not decode message from socket: {}" , err) ;
38+ }
3039 }
3140 }
32- Err ( err) => {
33- eprintln ! ( "could not read message from socket: {}" , err) ;
34- }
3541 }
3642 }
3743 }
3844
39- fn read ( & self , socket : & mut UdpSocket ) -> Result < InboundMetric , String > {
40- let mut buf = [ 0 ; 300 ] ;
41- let ( amt, _) = socket
42- . recv_from ( & mut buf)
43- . map_err ( |_| "Couldn't recv from socket" . to_string ( ) ) ?;
44-
45- if amt <= 6 {
46- return Err ( "UDP Package size is too small" . to_string ( ) ) ;
47- }
48-
49- let metric_type = match MetricType :: from_u16 ( BigEndian :: read_u16 ( & buf[ 0 ..2 ] ) ) {
45+ fn decode_buffer ( & self , data : & [ u8 ] , read_bytes : usize ) -> Result < InboundMetric , String > {
46+ let metric_type = match MetricType :: from_u16 ( BigEndian :: read_u16 ( & data[ 0 ..2 ] ) ) {
5047 Some ( m) => m,
51- None => {
52- return Err ( "Got unsupported metric type" . to_string ( ) ) ;
53- }
48+ None => return Err ( "Got unsupported metric type" . to_string ( ) ) ,
5449 } ;
5550
56- let count = BigEndian :: read_i32 ( & buf [ 2 ..6 ] ) ;
57- let name = String :: from_utf8_lossy ( & buf [ 6 ..amt ] )
51+ let count = BigEndian :: read_i32 ( & data [ 2 ..6 ] ) ;
52+ let name = String :: from_utf8_lossy ( & data [ 6 ..read_bytes ] )
5853 . to_string ( )
5954 . replace ( '"' , "" ) ;
6055
0 commit comments