serverdensity-udp-agent's People
Forkers
alexanderklumpserverdensity-udp-agent's Issues
Composer Package hinzufügen
Bitte auf https://packagist.org/packages/submit
Die Url https://github.com/easybill/serverdensity-udp-agent eintragen.
mir fehlen leider die Berechtigungen ;)
UDP Agent sollte unter "--version" den aktuellen Tag herausgeben
Im Moment kommt immer Prometheus UDP Monitor 2.0
- das sollte stattdessen zB v0.6.4
sein.
async vs. blocking
Der Code verwendet aktuell blocking code wie thread::sleep und gleichzeitig tokio. Es passieren schlimme dinge, wenn man in einer async runtime wie tokio blocking code ausführt - muss überall ausgebaut werden.
Achtung:
Es ist nicht nur das thread::sleep, du darfst auch crossbeam nicht verwenden.
Du kannst auch alternativ auf threads umstellen und tokio nicht verwenden. siehe crossbeam-rs/crossbeam#501 .
dieser code blockt nen kompletten tokio thread und damit evtl. die komplette runtime.
loop {
match receiver.recv(); // crossbeam_channel::Receiver.recv()
}
auch sowas blockt:
let mut res = self
.http_client
.post(&self.api_postback_uri)
.header("X-Forwarded-Host", self.config.account_url.clone())
.form(data)
.timeout(Duration::from_secs(30))
.send(); // <<< blocking
^ du kannst auch genre auf async verzichten wenns zu viel ist.
panic's und loops
Aktuell gibt es im code noch unwraps, diese müssen alle entfernt werden.
Zudem muss alles, was in einem Task läuft unfailbar sein (startet im zweifel neu und probiert es erneut).
Wenn z.b. der Processor failed muss das geloggt werden und er muss wieder neu gestartet werden.
Die run Methode kann z.b. so aussehen:
pub async fn run(&mut self, receiver: Receiver<InboundMetric>) -> anyhow::Result<(), anyhow::Error> {
loop {
match self
.run_inner(receiver.clone()) {
Ok(_) => {},
Err(e) => {
error!("XXX failed: {:?}", e)
}
};
// es ist wichtig, dass wir dem prozess etwas zeit lassen. Sonst haste schnell TB an logs :P
::tokio::time::sleep(Duration::from_secs(1)).await;
}
}
Main join
in der main function bitte nicht einfach tasks nach dem muster fire&forget spawnen, sondern mit einem select! alle tasks monitoren.
tokio::spawn(||{ loop { /** ... */ } });
tokio::spawn(||{ loop { /** ... */ } }).await;
bitte
let jh1 = tokio::spawn(||{ loop { /** ... */ } });
let jh2 = tokio::spawn(||{ loop { /** ... */ } });
select! {
_ => jh1 { error!("1 failed"); }
_ => jh2 { error!("2 failed"); }
}
Oft knallt z.b. ein prozess (panic) und du bekommst es nicht mit, dann hängt ein anderer (oder knallt) weil du ein ende einer queue kaputt gemacht hast. Wenn ein prozess (async task) der lange laufen muss, kaputt geht, müssen wir das mitbekommen.
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.