mirror of
https://github.com/storytold/voder-proxy.git
synced 2026-10-20 07:44:42 +00:00
add newrelic attribute for speaker
This commit is contained in:
+21
-12
@@ -5,12 +5,16 @@
|
|||||||
pub mod newrelic_logger;
|
pub mod newrelic_logger;
|
||||||
|
|
||||||
use anyhow::Result as AnyhowResult;
|
use anyhow::Result as AnyhowResult;
|
||||||
|
use crate::newrelic_logger::{NewRelicLogger, MaybeNewRelicTransaction};
|
||||||
use futures::future::{self, Future};
|
use futures::future::{self, Future};
|
||||||
use hyper::Method;
|
use hyper::Method;
|
||||||
|
use hyper::header::HeaderValue;
|
||||||
|
use hyper::http::header::HeaderName;
|
||||||
use hyper::rt::Stream;
|
use hyper::rt::Stream;
|
||||||
use hyper::server::conn::AddrStream;
|
use hyper::server::conn::AddrStream;
|
||||||
use hyper::service::{service_fn, make_service_fn};
|
use hyper::service::{service_fn, make_service_fn};
|
||||||
use hyper::{Body, Request, Response, Server};
|
use hyper::{Body, Request, Response, Server};
|
||||||
|
use rand::seq::IteratorRandom;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
@@ -18,11 +22,6 @@ use std::fmt::Display;
|
|||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use rand::seq::IteratorRandom;
|
|
||||||
use hyper::http::header::HeaderName;
|
|
||||||
use hyper::header::HeaderValue;
|
|
||||||
use newrelic::App;
|
|
||||||
use crate::newrelic_logger::NewRelicLogger;
|
|
||||||
|
|
||||||
type BoxFut = Box<dyn Future<Item=Response<Body>, Error=hyper::Error> + Send>;
|
type BoxFut = Box<dyn Future<Item=Response<Body>, Error=hyper::Error> + Send>;
|
||||||
|
|
||||||
@@ -134,7 +133,13 @@ impl Router {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn speak_proxy(req: Request<Body>, remote_addr: SocketAddr, router: Arc<Router>, endpoint: &'static str) -> BoxFut {
|
fn speak_proxy(
|
||||||
|
req: Request<Body>,
|
||||||
|
remote_addr: SocketAddr,
|
||||||
|
router: Arc<Router>,
|
||||||
|
transaction: MaybeNewRelicTransaction,
|
||||||
|
endpoint: &'static str) -> BoxFut
|
||||||
|
{
|
||||||
let mut headers = req.headers().clone();
|
let mut headers = req.headers().clone();
|
||||||
|
|
||||||
// This is the IP of the Digital Ocean load balancer.
|
// This is the IP of the Digital Ocean load balancer.
|
||||||
@@ -173,6 +178,8 @@ fn speak_proxy(req: Request<Body>, remote_addr: SocketAddr, router: Arc<Router>,
|
|||||||
|
|
||||||
info!("Routing {} for {} to {}", endpoint, &request_details.speaker, &proxy_host);
|
info!("Routing {} for {} to {}", endpoint, &request_details.speaker, &proxy_host);
|
||||||
|
|
||||||
|
transaction.add_attribute("speaker", &request_details.speaker);
|
||||||
|
|
||||||
let mut request_builder = Request::builder();
|
let mut request_builder = Request::builder();
|
||||||
request_builder.method(Method::POST)
|
request_builder.method(Method::POST)
|
||||||
.uri(endpoint);
|
.uri(endpoint);
|
||||||
@@ -247,15 +254,17 @@ fn main() -> AnyhowResult<()> {
|
|||||||
|
|
||||||
match (req.method(), req.uri().path()) {
|
match (req.method(), req.uri().path()) {
|
||||||
(&Method::POST, "/speak") => {
|
(&Method::POST, "/speak") => {
|
||||||
let _droppable_transaction = newrelic_logger3.web_transaction("proxy /speak");
|
let nr_transaction = newrelic_logger3.web_transaction("/speak");
|
||||||
speak_proxy(req, remote_addr.clone(), router3, "/speak")
|
speak_proxy(req, remote_addr.clone(), router3, nr_transaction, "/speak")
|
||||||
},
|
},
|
||||||
(&Method::POST, "/speak_spectrogram") => {
|
(&Method::POST, "/speak_spectrogram") => {
|
||||||
let _droppable_transaction = newrelic_logger3.web_transaction("proxy /speak_spectrogram");
|
let nr_transaction = newrelic_logger3.web_transaction("/speak_spectrogram");
|
||||||
speak_proxy(req, remote_addr.clone(), router3, "/speak_spectrogram")
|
speak_proxy(req, remote_addr.clone(), router3, nr_transaction, "/speak_spectrogram")
|
||||||
|
},
|
||||||
|
(&Method::GET, "/proxy_health") => {
|
||||||
|
let _droppable_transaction = newrelic_logger3.web_transaction("/proxy_health");
|
||||||
|
health_check_response(req)
|
||||||
},
|
},
|
||||||
(&Method::GET, "/proxy_health") =>
|
|
||||||
health_check_response(req),
|
|
||||||
_ => {
|
_ => {
|
||||||
let _droppable_transaction = newrelic_logger3.web_transaction("unmatched endpoint");
|
let _droppable_transaction = newrelic_logger3.web_transaction("unmatched endpoint");
|
||||||
let forward = router3.get_random_host();
|
let forward = router3.get_random_host();
|
||||||
|
|||||||
+22
-3
@@ -26,11 +26,30 @@ impl NewRelicLogger {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn web_transaction(&self, transaction_name: &str) -> Option<Transaction> {
|
pub fn web_transaction(&self, transaction_name: &str) -> MaybeNewRelicTransaction {
|
||||||
if let Some(ref newrelic_api) = self.newrelic_api {
|
if let Some(ref newrelic_api) = self.newrelic_api {
|
||||||
info!("Logging request to NewRelic");
|
info!("Logging request to NewRelic");
|
||||||
return newrelic_api.web_transaction(transaction_name).ok();
|
let maybe_transaction = newrelic_api.web_transaction(transaction_name).ok();
|
||||||
|
return MaybeNewRelicTransaction::from_optional(maybe_transaction);
|
||||||
}
|
}
|
||||||
None
|
MaybeNewRelicTransaction::from_optional(None)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct MaybeNewRelicTransaction {
|
||||||
|
transaction: Option<Transaction>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MaybeNewRelicTransaction {
|
||||||
|
pub fn from_optional(optional: Option<Transaction>) -> Self {
|
||||||
|
Self {
|
||||||
|
transaction: optional,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_attribute(&self, name: &str, value: &str) {
|
||||||
|
if let Some(ref transaction) = self.transaction {
|
||||||
|
let _result = transaction.add_attribute(name, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user