Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: run on_upstream_http_request hook in federation source #440

Merged
merged 3 commits into from
Feb 14, 2024

Conversation

YassinEldeeb
Copy link
Member

closes #432

Copy link

github-actions bot commented Feb 12, 2024

🚨 Rust Panic Audit: 87 Potential Panic Points Detected 🚨

Crate: federation_query_planner

📊 Total Usages: 51

  • 🎁 unwrap usages: 30
  • 🚨 panic usages: 3
  • 🔎 expect usages: 8
  • 🔢 array_index usages: 10

Crate: engine

📊 Total Usages: 11

  • 🚨 panic usages: 3
  • 🔎 expect usages: 1
  • 🎁 unwrap usages: 7

Crate: telemetry

📊 Total Usages: 9

  • 🎁 unwrap usages: 4
  • 🔢 array_index usages: 5

Crate: cloudflare_worker

📊 Total Usages: 6

  • 🚨 panic usages: 1
  • 🎁 unwrap usages: 5

Crate: tracing

📊 Total Usages: 6

  • 🎁 unwrap usages: 5
  • 🔎 expect usages: 1

Crate: conductor

📊 Total Usages: 3

  • 🔎 expect usages: 1
  • 🚨 panic usages: 1
  • 🎁 unwrap usages: 1

Crate: config

📊 Total Usages: 1

  • 🚨 panic usages: 1

📌 Expected Annotations

Crate: vrl

📊 Total Expected Usages: 2

expand details
  1. Reason: "if the provided VRL code in the config file can't compile, we have to exit."
  • Code: panic!("failed to compile vrl program");
  • Location: ./plugins/vrl/src/plugin.rs:122
  1. Reason: "states is a non-user provided variable"
  • Code: .expect("can't merge states when states is an empty vector!")
  • Location: ./plugins/vrl/src/plugin.rs:139

Crate: conductor

📊 Total Expected Usages: 2

expand details
  1. Reason: "we need to exit the process, if the logger can't be correctly set."
  • Code: tracing::subscriber::set_global_default(subscriber).expect("failed to set up tracing");
  • Location: ./bin/conductor/src/lib.rs:37
  1. Reason: "we need to exit the process, if the provided configuration file is incorrect."
  • Code: panic!("Failed to initialize gateway: {:?}", e);
  • Location: ./bin/conductor/src/lib.rs:75

Crate: napi

📊 Total Expected Usages: 1

expand details
  1. Reason: "we need this"
  • Code: panic!("Exited process!")
  • Location: ./libs/napi/src/lib.rs:18

Crate: engine

📊 Total Expected Usages: 5

expand details
  1. Reason: "if we are unable to construct the endpoints and attach them onto the gateway's http server, we have to exit"
  • Code: Err(e) => panic!("failed to construct endpoint: {:?}", e),
  • Location: ./libs/engine/src/gateway.rs:147
  1. Reason: "we can safely index here, it's inside a test with constant defined fixtures."
  • Code: ConductorGateway::execute(request, &gw.routes[0].route_data).await
  • Location: ./libs/engine/src/gateway.rs:179
  1. Reason: "without a fetcher, there's no executor, without an executor, there's no gateway."
  • Code: panic!("Failed while initializing the executor's fetcher for Federation source");
  • Location: ./libs/engine/src/source/federation_source.rs:111
  1. Reason: "without a fetcher, there's no executor, without an executor, there's no gateway."
  • Code: panic!("Failed while initializing the executor's fetcher for Federation source");
  • Location: ./libs/engine/src/source/federation_source.rs:142
  1. Reason: "without a fetcher, there's no executor, without an executor, there's no gateway."
  • Code: panic!(
  • Location: ./libs/engine/src/source/graphql_source.rs:30

Crate: common

📊 Total Expected Usages: 1

expand details
  1. Reason: "we're parsing a statically defined constant, we know it works ;)"
  • Code: .unwrap()
  • Location: ./libs/common/src/graphql.rs:23

Crate: config

📊 Total Expected Usages: 9

expand details
  1. Reason: "👇"
  • Code: let raw_contents = read_to_string(file_path)
  • Location: ./libs/config/src/lib.rs:576
  1. Reason: "👇"
  • Code: panic!("Failed to interpolate config file, please resolve the above errors");
  • Location: ./libs/config/src/lib.rs:608
  1. Reason: "👇"
  • Code: parse_config_from_json(&config_string).expect("Failed to parse JSON config file")
  • Location: ./libs/config/src/lib.rs:615
  1. Reason: "👇"
  • Code: parse_config_from_yaml(&config_string).expect("Failed to parse YAML config file")
  • Location: ./libs/config/src/lib.rs:619
  1. Reason: "👇"
  • Code: _ => panic!("Unsupported config file extension"),
  • Location: ./libs/config/src/lib.rs:636
  1. Reason: "👇"
  • Code: None => panic!("Config file has no extension"),
  • Location: ./libs/config/src/lib.rs:639
  1. Reason: "part of development docgen CLI"
  • Code: .expect("Failed to serialize json schema for config file!");
  • Location: ./libs/config/src/generate-json-schema.rs:50
  1. Reason: "part of development docgen CLI"
  • Code: .expect("Failed to write the json schema to the file system!");
  • Location: ./libs/config/src/generate-json-schema.rs:54
  1. Reason: "statically defined regex pattern, we know it works ;)"
  • Code: .unwrap();
  • Location: ./libs/config/src/interpolate.rs:18

Crate: cloudflare_worker

📊 Total Expected Usages: 4

expand details
  1. Reason: "it panics only if the header name is not valid, and we know it is."
  • Code: .unwrap()
  • Location: ./bin/cloudflare_worker/src/http_tracing.rs:20
  1. Reason: "it panics only if the URL source is not valid, and it's already validated before."
  • Code: let url = req.url().unwrap();
  • Location: ./bin/cloudflare_worker/src/http_tracing.rs:23
  1. Reason: "it only panics if we are not running in a CF context, should be safe."
  • Code: let cf_info = req.cf().unwrap();
  • Location: ./bin/cloudflare_worker/src/http_tracing.rs:27
  1. Reason: "unwraps only in special cases where "data:text" is used."
  • Code: let http_host = url.host().unwrap().to_string();
  • Location: ./bin/cloudflare_worker/src/http_tracing.rs:36

Crate: jwt_auth

📊 Total Expected Usages: 1

expand details
  1. Reason: "if initiating an http client fails, then we have to exit."
  • Code: let client = wasm_polyfills::create_http_client().build().unwrap();
  • Location: ./plugins/jwt_auth/src/jwks_provider.rs:49

Copy link

github-actions bot commented Feb 12, 2024

🐋 This PR was built and pushed to the following Docker images:

Docker Bake metadata
{
"conductor": {
  "containerimage.config.digest": "sha256:3f92bd76fa088714a0c5a2c3889f50dc7f4e6c3faf928513b27cb5860165c257",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:850bb01f800896373c8836bd92a62050ec9d43565b51e1b36fdf9ff2b8f399dc",
    "size": 902,
    "platform": {
      "architecture": "amd64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:850bb01f800896373c8836bd92a62050ec9d43565b51e1b36fdf9ff2b8f399dc",
  "image.name": "ghcr.io/the-guild-org/conductor/conductor:6aa851d3ba3d0cb4853dfab152c2d23605afc4c1"
}
}

Copy link

github-actions bot commented Feb 12, 2024

✅ Benchmark Results

     data_received..................: 13 MB   221 kB/s
     data_sent......................: 22 MB   363 kB/s
     http_req_blocked...............: min=1.04µs   avg=2.89µs   med=2.15µs   max=596.28µs p(95)=3.12µs   p(99)=12.76µs 
     http_req_connecting............: min=0s       avg=346ns    med=0s       max=526.22µs p(95)=0s       p(99)=0s      
     http_req_duration..............: min=311.65µs avg=408.99µs med=381.26µs max=21.43ms  p(95)=480.99µs p(99)=577.94µs
       { expected_response:true }...: min=311.65µs avg=408.99µs med=381.26µs max=21.43ms  p(95)=480.99µs p(99)=577.94µs
     ✓ { scenario:rps_1000 }........: min=311.65µs avg=408.99µs med=381.26µs max=21.43ms  p(95)=480.99µs p(99)=577.94µs
     http_req_failed................: 0.00%   ✓ 0           ✗ 60001
     ✓ { scenario:rps_1000 }........: 0.00%   ✓ 0           ✗ 60001
     http_req_receiving.............: min=9.98µs   avg=25.75µs  med=25.36µs  max=847.68µs p(95)=33.47µs  p(99)=40.76µs 
     http_req_sending...............: min=7.03µs   avg=15.59µs  med=14.07µs  max=1.88ms   p(95)=26.86µs  p(99)=35.05µs 
     http_req_tls_handshaking.......: min=0s       avg=0s       med=0s       max=0s       p(95)=0s       p(99)=0s      
     http_req_waiting...............: min=278.19µs avg=367.64µs med=340.57µs max=21.38ms  p(95)=440.21µs p(99)=526.98µs
     http_reqs......................: 60001   1000.005233/s
     ✓ { scenario:rps_1000 }........: 60001   1000.005233/s
     iteration_duration.............: min=387.26µs avg=495.04µs med=466.24µs max=22ms     p(95)=569.54µs p(99)=723.56µs
     iterations.....................: 60001   1000.005233/s
     ✓ { scenario:rps_1000 }........: 60001   1000.005233/s
     valid_graphql_response.........: 100.00% ✓ 60001       ✗ 0    
     ✓ { scenario:rps_1000 }........: 100.00% ✓ 60001       ✗ 0    
     valid_http_code................: 100.00% ✓ 60001       ✗ 0    
     ✓ { scenario:rps_1000 }........: 100.00% ✓ 60001       ✗ 0    
     vus............................: 1       min=0         max=2  
     vus_max........................: 200     min=200       max=200

Copy link
Member

@dotansimha dotansimha left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please also make sure to call on_upstream_http_response on every response.

Also, some clippy notes :)

Copy link
Member

@dotansimha dotansimha left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(see above)

@dotansimha dotansimha merged commit ccb9ff0 into master Feb 14, 2024
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

on_upstream_http_request hook not called for sources with type = federation
2 participants