diff --git a/.github/workflows/publish-serverless-agent.yml b/.github/workflows/publish-serverless-agent.yml index e0fab67bf..0eec213b5 100644 --- a/.github/workflows/publish-serverless-agent.yml +++ b/.github/workflows/publish-serverless-agent.yml @@ -11,12 +11,16 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + - name: Install Protoc Binary + shell: bash + run: chmod +x ./scripts/install-protoc.sh && ./scripts/install-protoc.sh $HOME - name: Install musl dependencies run: rustup target add x86_64-unknown-linux-musl && sudo apt-get install musl-tools - name: Build project + shell: bash run: cargo build --release -p datadog-serverless-trace-mini-agent --target x86_64-unknown-linux-musl - name: Upload artifacts for release step - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: datadog-serverless-agent-linux-amd64 path: target/x86_64-unknown-linux-musl/release/datadog-serverless-trace-mini-agent @@ -26,10 +30,14 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + - name: Install Protoc Binary + shell: bash + run: chmod +x ./scripts/install-protoc.sh && ./scripts/install-protoc.sh $HOME - name: Build project + shell: bash run: cargo build --release -p datadog-serverless-trace-mini-agent - name: Upload artifacts for release step - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: datadog-serverless-agent-windows-amd64 path: target/release/datadog-serverless-trace-mini-agent.exe @@ -41,7 +49,7 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - name: Download artifacts from build step - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: path: target/release/binaries - name: UPX compress binaries @@ -51,12 +59,8 @@ jobs: chmod +x "$file" upx "$file" --lzma done - - name: Zip binaries - run: zip -r datadog-serverless-agent.zip ./* - working-directory: target/release/binaries - - name: Release - uses: softprops/action-gh-release@v1 + - name: Upload binaries + uses: actions/upload-artifact@v4 with: - draft: true - generate_release_notes: true - files: target/release/binaries/datadog-serverless-agent.zip + name: datadog-serverless-agent + path: target/release/binaries/*/* diff --git a/Cargo.lock b/Cargo.lock index 43a18caba..2052ed83d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1580,7 +1580,7 @@ dependencies = [ [[package]] name = "datadog-serverless-trace-mini-agent" -version = "0.7.0" +version = "0.7.2" dependencies = [ "datadog-trace-mini-agent", "datadog-trace-protobuf", diff --git a/dogstatsd/src/datadog.rs b/dogstatsd/src/datadog.rs index b95882975..347c6be18 100644 --- a/dogstatsd/src/datadog.rs +++ b/dogstatsd/src/datadog.rs @@ -18,13 +18,44 @@ pub struct DdApi { client: reqwest::Client, } +fn build_http_client( + http_proxy: Option, + https_proxy: Option, +) -> Result { + let client = reqwest::Client::builder(); + if let Some(proxy_uri) = http_proxy { + let proxy = reqwest::Proxy::http(proxy_uri)?; + client.proxy(proxy).build() + } else if let Some(proxy_uri) = https_proxy { + let proxy = reqwest::Proxy::https(proxy_uri)?; + client.proxy(proxy).build() + } else { + client.build() + } +} + impl DdApi { #[must_use] - pub fn new(api_key: String, site: String) -> Self { + pub fn new( + api_key: String, + site: String, + http_proxy: Option, + https_proxy: Option, + ) -> Self { + let client = match build_http_client(http_proxy, https_proxy) { + Ok(client) => client, + Err(e) => { + error!( + "Unable to parse proxy configuration: {}, no proxy will be used", + e + ); + reqwest::Client::new() + } + }; DdApi { api_key, fqdn_site: site, - client: reqwest::Client::new(), + client, } } diff --git a/dogstatsd/src/flusher.rs b/dogstatsd/src/flusher.rs index 7969c7f86..21dbacf23 100644 --- a/dogstatsd/src/flusher.rs +++ b/dogstatsd/src/flusher.rs @@ -18,8 +18,14 @@ pub fn build_fqdn_metrics(site: String) -> String { #[allow(clippy::await_holding_lock)] impl Flusher { - pub fn new(api_key: String, aggregator: Arc>, site: String) -> Self { - let dd_api = datadog::DdApi::new(api_key, site); + pub fn new( + api_key: String, + aggregator: Arc>, + site: String, + http_proxy: Option, + https_proxy: Option, + ) -> Self { + let dd_api = datadog::DdApi::new(api_key, site, http_proxy, https_proxy); Flusher { dd_api, aggregator } } diff --git a/dogstatsd/tests/integration_test.rs b/dogstatsd/tests/integration_test.rs index 1acb6543e..bb01466ff 100644 --- a/dogstatsd/tests/integration_test.rs +++ b/dogstatsd/tests/integration_test.rs @@ -41,6 +41,8 @@ async fn dogstatsd_server_ships_series() { "mock-api-key".to_string(), Arc::clone(&metrics_aggr), mock_server.url(), + None, + None, ); let server_address = "127.0.0.1:18125"; diff --git a/serverless/Cargo.toml b/serverless/Cargo.toml index 9b98698d5..558e4be33 100644 --- a/serverless/Cargo.toml +++ b/serverless/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "datadog-serverless-trace-mini-agent" -version = "0.7.0" +version = "0.7.2" edition = "2021" [dependencies] diff --git a/serverless/src/main.rs b/serverless/src/main.rs index 1c1a96e09..7bc5c390a 100644 --- a/serverless/src/main.rs +++ b/serverless/src/main.rs @@ -30,6 +30,8 @@ pub async fn main() { Builder::from_env(env).target(Target::Stdout).init(); let dd_api_key: Option = env::var("DD_API_KEY").ok(); + let dd_http_proxy: Option = env::var("DD_HTTP_PROXY").ok(); + let dd_https_proxy: Option = env::var("DD_HTTPS_PROXY").ok(); let dd_dogstatsd_port: u16 = env::var("DD_DOGSTATSD_PORT") .ok() .and_then(|port| port.parse::().ok()) @@ -78,7 +80,14 @@ pub async fn main() { let mut metrics_flusher = if dd_use_dogstatsd { debug!("Starting dogstatsd"); - let (_, metrics_flusher) = start_dogstatsd(dd_dogstatsd_port, dd_api_key, dd_site).await; + let (_, metrics_flusher) = start_dogstatsd( + dd_dogstatsd_port, + dd_api_key, + dd_site, + dd_http_proxy, + dd_https_proxy, + ) + .await; info!("dogstatsd-udp: starting to listen on port {dd_dogstatsd_port}"); metrics_flusher } else { @@ -103,6 +112,8 @@ async fn start_dogstatsd( port: u16, dd_api_key: Option, dd_site: String, + dd_http_proxy: Option, + dd_https_proxy: Option, ) -> (CancellationToken, Option) { let metrics_aggr = Arc::new(Mutex::new( MetricsAggregator::new(Vec::new(), CONTEXTS).expect("Failed to create metrics aggregator"), @@ -130,6 +141,8 @@ async fn start_dogstatsd( dd_api_key, Arc::clone(&metrics_aggr), build_fqdn_metrics(dd_site), + dd_http_proxy, + dd_https_proxy, ); Some(metrics_flusher) }