mirror of
https://github.com/sadoyan/aralez.git
synced 2026-10-23 06:01:35 +08:00
Making custom Elsticsearch logger.
This commit is contained in:
+82
-1
@@ -9,7 +9,7 @@ use std::time::Duration;
|
||||
|
||||
pub static HC_CONNECTOR: LazyLock<Connector> = LazyLock::new(|| Connector::new(None));
|
||||
|
||||
pub async fn httpclient(method: &str, tls: bool, host: &str, path: &str, address: &str, port: u16, url: String) -> (bool, bool) {
|
||||
pub async fn httpclient(method: &str, tls: bool, host: &str, path: &str, address: &str, port: u16, url: String, payload: Bytes) -> (bool, bool) {
|
||||
let method = match method {
|
||||
"HEAD" => "HEAD",
|
||||
"GET" => "GET",
|
||||
@@ -24,6 +24,86 @@ pub async fn httpclient(method: &str, tls: bool, host: &str, path: &str, address
|
||||
peer.options.verify_hostname = false;
|
||||
}
|
||||
|
||||
let mut is_h2 = false;
|
||||
peer.options.total_connection_timeout = Option::from(Duration::from_secs(5));
|
||||
peer.options.alpn = ALPN::H2H1;
|
||||
|
||||
let (mut http_session, _) = match HC_CONNECTOR.get_http_session(&peer).await {
|
||||
Ok(s) => s,
|
||||
Err(e) => {
|
||||
if let Some(msg) = e.context {
|
||||
log::warn!("{}, type: {}", msg.as_str(), e.etype.as_str());
|
||||
} else {
|
||||
log::warn!("Fail to connect to addr: {}, tls {}, host {}", address, tls, host);
|
||||
}
|
||||
return (false, false);
|
||||
}
|
||||
};
|
||||
|
||||
match http_session.as_http2() {
|
||||
Some(_) => {
|
||||
peer.options.alpn = ALPN::H2;
|
||||
is_h2 = true;
|
||||
}
|
||||
None => {
|
||||
if ping_grpc(url.as_str()).await {
|
||||
return (true, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let mut req = match RequestHeader::build(method, path.as_bytes(), None) {
|
||||
Ok(r) => r,
|
||||
Err(e) => {
|
||||
log::warn!("Failed to build request: {}", e);
|
||||
return (false, false);
|
||||
}
|
||||
};
|
||||
|
||||
req.insert_header("Host", host).ok();
|
||||
let body_bytes = if method == "POST" {
|
||||
req.insert_header("Content-Type", "application/json").ok();
|
||||
req.insert_header("Content-Length", payload.len().to_string()).ok();
|
||||
payload
|
||||
} else {
|
||||
Bytes::new()
|
||||
};
|
||||
if let Err(e) = http_session.write_request_header(Box::new(req)).await {
|
||||
log::warn!("Write header failed: {}", e);
|
||||
return (false, false);
|
||||
}
|
||||
if let Err(e) = http_session.write_request_body(body_bytes, true).await {
|
||||
log::warn!("Write body failed: {}", e);
|
||||
return (false, false);
|
||||
}
|
||||
let status = match http_session.read_response_header().await {
|
||||
Ok(_) => http_session.response_header().map(|r| r.status.as_u16()).unwrap_or(500),
|
||||
Err(e) => {
|
||||
if !is_h2 && ping_grpc(url.as_str()).await {
|
||||
return (true, true);
|
||||
}
|
||||
log::warn!("Health Check read failed ({}) : {} - {}", if is_h2 { "H2" } else { "H1" }, host, e);
|
||||
return (false, false);
|
||||
}
|
||||
};
|
||||
HC_CONNECTOR.release_http_session(http_session, &peer, None).await;
|
||||
((200..500).contains(&status), is_h2)
|
||||
}
|
||||
/*
|
||||
pub async fn httpclient(method: &str, tls: bool, host: &str, path: &str, address: &str, port: u16, url: String) -> (bool, bool) {
|
||||
let method = match method {
|
||||
"HEAD" => "HEAD",
|
||||
"GET" => "GET",
|
||||
"POST" => "POST",
|
||||
_ => "GET",
|
||||
};
|
||||
let mut peer = HttpPeer::new((address, port), tls, host.to_string());
|
||||
|
||||
if tls {
|
||||
peer.options.verify_cert = false;
|
||||
peer.options.verify_hostname = false;
|
||||
}
|
||||
|
||||
let mut is_h2 = false;
|
||||
peer.options.total_connection_timeout = Option::from(Duration::from_secs(5));
|
||||
peer.options.alpn = ALPN::H2H1;
|
||||
@@ -93,3 +173,4 @@ pub async fn httpclient(method: &str, tls: bool, host: &str, path: &str, address
|
||||
HC_CONNECTOR.release_http_session(http_session, &peer, None).await;
|
||||
((200..500).contains(&status), is_h2)
|
||||
}
|
||||
*/
|
||||
|
||||
@@ -2,6 +2,7 @@ use crate::utils::hcclient::httpclient;
|
||||
use crate::utils::lazylock::REVERSE_STORE;
|
||||
use crate::utils::tools::*;
|
||||
use crate::utils::types::{InnerMap, UpstreamsDashMap, UpstreamsIdMap};
|
||||
use bytes::Bytes;
|
||||
use dashmap::DashMap;
|
||||
use std::sync::atomic::AtomicUsize;
|
||||
use std::sync::Arc;
|
||||
@@ -9,6 +10,7 @@ use std::time::Duration;
|
||||
use tokio::net::TcpStream;
|
||||
use tokio::time::{interval, timeout};
|
||||
use tokio_native_tls::native_tls::TlsConnector;
|
||||
const EMPTY_PAYLOAD: Bytes = Bytes::from_static(b"");
|
||||
|
||||
pub async fn hc2(upslist: Arc<UpstreamsDashMap>, fullist: Arc<UpstreamsDashMap>, idlist: Arc<UpstreamsIdMap>, params: (&str, u64)) {
|
||||
let mut period = interval(Duration::from_secs(params.1));
|
||||
@@ -66,7 +68,7 @@ async fn build_upstreams(fullist: &UpstreamsDashMap, method: &str) -> UpstreamsD
|
||||
} else {
|
||||
format!("http://{}:{}{}", upstream.address, upstream.port, path)
|
||||
};
|
||||
let resp = httpclient(method, tls, host, path, upstream.address.as_ref(), upstream.port, link).await;
|
||||
let resp = httpclient(method, tls, host, path, upstream.address.as_ref(), upstream.port, link, EMPTY_PAYLOAD).await;
|
||||
if resp.0 {
|
||||
if resp.1 {
|
||||
scheme.is_http2 = resp.1;
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
use crate::logging::core::log_builder;
|
||||
use crate::utils::healthcheck;
|
||||
use crate::utils::lazylock::REVERSE_STORE;
|
||||
use crate::utils::state::{is_first_run, mark_not_first_run};
|
||||
@@ -264,8 +263,7 @@ pub fn parce_main_config(path: &str) -> AppConfig {
|
||||
if let Ok(jwt_key) = env::var("JWT_KEY") {
|
||||
cfo.master_key = Some(jwt_key);
|
||||
};
|
||||
|
||||
log_builder(&cfo, &cfo.log_file);
|
||||
// log_builder(&cfo, &cfo.log_file);
|
||||
cfo.hc_method = cfo.hc_method.to_uppercase();
|
||||
if let Some((ip, port_str)) = cfo.config_address.rsplit_once(':') {
|
||||
if let Ok(port) = port_str.parse::<u16>() {
|
||||
|
||||
Reference in New Issue
Block a user