From 99a4fbbbabd09296b50e0d00c9888a634a2b60fd Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 17 Mar 2025 09:10:23 -0700 Subject: [PATCH 01/47] DOC-358 DOC-392 draft router GCP cloud run deployment --- .../self-hosted/containerization/gcp.mdx | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 docs/source/routing/self-hosted/containerization/gcp.mdx diff --git a/docs/source/routing/self-hosted/containerization/gcp.mdx b/docs/source/routing/self-hosted/containerization/gcp.mdx new file mode 100644 index 0000000000..ab6abeda57 --- /dev/null +++ b/docs/source/routing/self-hosted/containerization/gcp.mdx @@ -0,0 +1,118 @@ +--- +title: Deploy router in Google Cloud Platform (GCP) +subtitle: "" +description: Build and deploy Apollo GraphOS Router or Apollo Router Core to Google Cloud Platform (GCP) with Google Cloud Run. +--- + +Learn how to deploy the router on Google Cloud Platform (GCP) with Cloud Run. + +## Prerequisites + +### Router + +1. Choose a version of the router to deploy (for example, `v1.61.0`). + +### Docker + +1. Install [Docker](https://www.docker.com/get-started/) locally. + +### Google Cloud Platform (GCP) + +1. Create a new [Google Cloud account](https://cloud.google.com/) or go to an existing account. +1. Install the [gcloud CLI](https://cloud.google.com/sdk/docs/install), if not already installed. +1. Create a new GCP project. + 1. Choose a project name (for example, `my-project`). Keep this name handy, as you'll need it later to build and run a router image. +1. Enable [Artifact Registry](https://cloud.google.com/artifact-registry/docs/enable-service) in your project. + 1. Create a repository and choose a repository name (for example, `my-repo`). Keep this name handy, as you'll need it later to build and deploy a router image. +1. (Recommended) In GCP Secret Manager, set `APOLLO_KEY` to your graph API key and `APOLLO_GRAPH_REF` to your graph ref. You'll need them later to deploy a router image. + +## Build and push router image + +1. In a local directory, create a `router.yaml` file and copy-paste the following into the file: + + ```yaml title="router.yaml" + supergraph: + listen: 0.0.0.0:4000 + health_check: + listen: 0.0.0.0:8088 + ``` + + Because the router's default HTTP and health check endpoint addresses are localhost and wouldn't be reachable when deployed, edit your `router.yaml` to configure these endpoints to listen to all addresses: + +1. Create a `Dockerfile` file and copy-paste the following into the file: + + ```text + # Use the official Apollo Router Core image as the base. + # Set the image tag to the desired router version (e.g. v1.61.0) + FROM ghcr.io/apollographql/router:v1.61.0 + + # Replace the default router config with the local, customized router.yaml + COPY router.yaml /dist/config/router.yaml + ``` + +1. From the same local directory, run the following `docker` CLI command to build a new router image. Choose a name and tag for the image, for example `router-gcp:v1.61.0`. + + ```bash + docker buildx build --platform linux/amd64 -t router-gcp:v1.61.0 --load . + ``` + + - Because Cloud Run only supports AMD64-based images, the `docker buildx build --platform linux/amd64` command ensures the image is built for AMD64 and is compatible. + - The `--load` option loads the built image to `docker images`. + +1. Run `docker images` and validate that your router image was successfully built and loaded. + +1. Run the following `docker` commands to tag and push the local router image to Artifact Registry: + +```bash +docker tag router-gcp:v1.61.0 us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 +docker push us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 +``` + +1. In GCP console for your project, go to Artifact Registry and validate the router image has been successfully pushed. + +## Configure and deploy router + +With the router image pushed to GCP, you can now configure and deploy it as a Cloud Run service. + +You can use either Google Cloud console or gcloud CLI. In either case, you need to gather the following information: + +* Name for your deployed router service (for example, `my-router`) +* GCP project name (for example, `my-project`) +* Artifact Registry repo name (for example, `my-repo`) +* GCP region (for example, `us-west2`) +* Full image path (for example, `us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0`) +* `APOLLO_KEY` and `APOLLO_GRAPH_REF` secrets + +### Deploy with Google Cloud console + +1. In GCP console for your project, go to Cloud Run and select **Deploy container** > **Service**. +1. On the **Create Service** page, update the following configurations: + 1. Set **Container image URL** to your tagged and pushed router image. + 1. Set **Service name** to a name for your deployed router (for example, `my-router`). + 1. Set **Region** to your GCP region. + 1. Set **Authentication** to **Allow unauthenticated invocations**. + 1. On the **Container(s)** > **Edit Container** tab, update the following configurations: + 1. On the **Settings** tab: + 1. Set **Container port** to `4000`. + 1. Set **Container command** to `/dist/router`. + 1. (Optional) if running router in dev mode, set **Container arguments** to `--dev`. + 1. On the **Variables & Secrets** tab, add the following variables (either as environment variables or referenced secrets): + 1. Add `APOLLO_KEY` and set it to your graph API key. + 1. Add `APOLLO_GRAPH_REF` and set it to your graph ref. + +1. Click **Deploy** on the bottom-left of the console. + +### Deploy with gcloud CLI + +To deploy the router with the gcloud CLI, run the following commands, with your configuration info in place of the example info: + +```bash +gcloud run deploy my-router \ +--image=us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 \ +--command=/dist/router \ +--args=--dev \ +--set-secrets=APOLLO_KEY=APOLLO_KEY:latest,APOLLO_GRAPH_REF=APOLLO_GRAPH_REF:latest \ +--region=us-west2 \ +--project=router-container-gcp \ + && gcloud run services update-traffic router-gcp --to-latest +``` From cc4c688c960c634810befc4d04fb995ee7b21aef Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 17 Mar 2025 16:50:58 -0700 Subject: [PATCH 02/47] copyedits --- .../self-hosted/containerization/gcp.mdx | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/docs/source/routing/self-hosted/containerization/gcp.mdx b/docs/source/routing/self-hosted/containerization/gcp.mdx index ab6abeda57..422a11dae3 100644 --- a/docs/source/routing/self-hosted/containerization/gcp.mdx +++ b/docs/source/routing/self-hosted/containerization/gcp.mdx @@ -4,27 +4,28 @@ subtitle: "" description: Build and deploy Apollo GraphOS Router or Apollo Router Core to Google Cloud Platform (GCP) with Google Cloud Run. --- -Learn how to deploy the router on Google Cloud Platform (GCP) with Cloud Run. +Learn how to deploy the router for development on Google Cloud Platform (GCP) with Cloud Run. -## Prerequisites + -### Router +Not deploying on GCP? See our guides for deploying the router [locally in Docker](/graph) -1. Choose a version of the router to deploy (for example, `v1.61.0`). + + +## Prerequisites -### Docker +1. Choose a version of the router to deploy (for example, `v1.61.0`). 1. Install [Docker](https://www.docker.com/get-started/) locally. -### Google Cloud Platform (GCP) 1. Create a new [Google Cloud account](https://cloud.google.com/) or go to an existing account. 1. Install the [gcloud CLI](https://cloud.google.com/sdk/docs/install), if not already installed. -1. Create a new GCP project. +1. In GCP, create a new project. 1. Choose a project name (for example, `my-project`). Keep this name handy, as you'll need it later to build and run a router image. -1. Enable [Artifact Registry](https://cloud.google.com/artifact-registry/docs/enable-service) in your project. +1. In GCP, enable [Artifact Registry](https://cloud.google.com/artifact-registry/docs/enable-service) in your project. 1. Create a repository and choose a repository name (for example, `my-repo`). Keep this name handy, as you'll need it later to build and deploy a router image. -1. (Recommended) In GCP Secret Manager, set `APOLLO_KEY` to your graph API key and `APOLLO_GRAPH_REF` to your graph ref. You'll need them later to deploy a router image. +1. In GCP Secret Manager, set `APOLLO_KEY` to your graph API key and `APOLLO_GRAPH_REF` to your graph ref. You'll need them later to deploy a router image. ## Build and push router image @@ -63,10 +64,10 @@ Learn how to deploy the router on Google Cloud Platform (GCP) with Cloud Run. 1. Run the following `docker` commands to tag and push the local router image to Artifact Registry: -```bash -docker tag router-gcp:v1.61.0 us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 -docker push us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 -``` + ```bash + docker tag router-gcp:v1.61.0 us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 + docker push us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 + ``` 1. In GCP console for your project, go to Artifact Registry and validate the router image has been successfully pushed. @@ -91,14 +92,14 @@ You can use either Google Cloud console or gcloud CLI. In either case, you need 1. Set **Service name** to a name for your deployed router (for example, `my-router`). 1. Set **Region** to your GCP region. 1. Set **Authentication** to **Allow unauthenticated invocations**. - 1. On the **Container(s)** > **Edit Container** tab, update the following configurations: - 1. On the **Settings** tab: - 1. Set **Container port** to `4000`. - 1. Set **Container command** to `/dist/router`. - 1. (Optional) if running router in dev mode, set **Container arguments** to `--dev`. - 1. On the **Variables & Secrets** tab, add the following variables (either as environment variables or referenced secrets): - 1. Add `APOLLO_KEY` and set it to your graph API key. - 1. Add `APOLLO_GRAPH_REF` and set it to your graph ref. +1. On the **Container(s)** > **Edit Container** tab, update the following configurations: + 1. On the **Settings** tab: + 1. Set **Container port** to `4000`. This port must match your router's configuration for `supergraph.listen`. + 1. Set **Container command** to `/dist/router`. + 1. (Optional) if running router in dev mode, set **Container arguments** to `--dev`. + 1. On the **Variables & Secrets** tab, add the following variables (either as environment variables or referenced secrets): + 1. Add `APOLLO_KEY` and set it to your graph API key. + 1. Add `APOLLO_GRAPH_REF` and set it to your graph ref. 1. Click **Deploy** on the bottom-left of the console. From 323cdd20d88828061a7e8a9852589f75fed8ea03 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Tue, 18 Mar 2025 14:29:13 -0700 Subject: [PATCH 03/47] copyedits --- .../self-hosted/containerization/gcp.mdx | 63 ++++++++++--------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/docs/source/routing/self-hosted/containerization/gcp.mdx b/docs/source/routing/self-hosted/containerization/gcp.mdx index 422a11dae3..eeafee2be5 100644 --- a/docs/source/routing/self-hosted/containerization/gcp.mdx +++ b/docs/source/routing/self-hosted/containerization/gcp.mdx @@ -6,11 +6,8 @@ description: Build and deploy Apollo GraphOS Router or Apollo Router Core to Goo Learn how to deploy the router for development on Google Cloud Platform (GCP) with Cloud Run. - +> Not deploying to GCP? Try our guides for deploying to AWS or Azure. -Not deploying on GCP? See our guides for deploying the router [locally in Docker](/graph) - - ## Prerequisites @@ -22,9 +19,9 @@ Not deploying on GCP? See our guides for deploying the router [locally in Docker 1. Create a new [Google Cloud account](https://cloud.google.com/) or go to an existing account. 1. Install the [gcloud CLI](https://cloud.google.com/sdk/docs/install), if not already installed. 1. In GCP, create a new project. - 1. Choose a project name (for example, `my-project`). Keep this name handy, as you'll need it later to build and run a router image. + * Choose a project name (for example, `my-project`). Keep this name handy, as you'll need it later to build and run a router image. 1. In GCP, enable [Artifact Registry](https://cloud.google.com/artifact-registry/docs/enable-service) in your project. - 1. Create a repository and choose a repository name (for example, `my-repo`). Keep this name handy, as you'll need it later to build and deploy a router image. + * Create a repository and choose a repository name (for example, `my-repo`). Keep this name handy, as you'll need it later to build and deploy a router image. 1. In GCP Secret Manager, set `APOLLO_KEY` to your graph API key and `APOLLO_GRAPH_REF` to your graph ref. You'll need them later to deploy a router image. ## Build and push router image @@ -42,7 +39,7 @@ Not deploying on GCP? See our guides for deploying the router [locally in Docker 1. Create a `Dockerfile` file and copy-paste the following into the file: - ```text + ```text showLineNumbers=false # Use the official Apollo Router Core image as the base. # Set the image tag to the desired router version (e.g. v1.61.0) FROM ghcr.io/apollographql/router:v1.61.0 @@ -53,7 +50,7 @@ Not deploying on GCP? See our guides for deploying the router [locally in Docker 1. From the same local directory, run the following `docker` CLI command to build a new router image. Choose a name and tag for the image, for example `router-gcp:v1.61.0`. - ```bash + ```bash showLineNumbers=false docker buildx build --platform linux/amd64 -t router-gcp:v1.61.0 --load . ``` @@ -64,7 +61,7 @@ Not deploying on GCP? See our guides for deploying the router [locally in Docker 1. Run the following `docker` commands to tag and push the local router image to Artifact Registry: - ```bash + ```bash showLineNumbers=false docker tag router-gcp:v1.61.0 us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 docker push us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 ``` @@ -88,32 +85,38 @@ You can use either Google Cloud console or gcloud CLI. In either case, you need 1. In GCP console for your project, go to Cloud Run and select **Deploy container** > **Service**. 1. On the **Create Service** page, update the following configurations: - 1. Set **Container image URL** to your tagged and pushed router image. - 1. Set **Service name** to a name for your deployed router (for example, `my-router`). - 1. Set **Region** to your GCP region. - 1. Set **Authentication** to **Allow unauthenticated invocations**. + * Set **Container image URL** to your tagged and pushed router image. + * Set **Service name** to a name for your deployed router (for example, `my-router`). + * Set **Region** to your GCP region. + * Set **Authentication** to **Allow unauthenticated invocations**. 1. On the **Container(s)** > **Edit Container** tab, update the following configurations: 1. On the **Settings** tab: - 1. Set **Container port** to `4000`. This port must match your router's configuration for `supergraph.listen`. - 1. Set **Container command** to `/dist/router`. - 1. (Optional) if running router in dev mode, set **Container arguments** to `--dev`. + * Set **Container port** to `4000`. This port must match your router's configuration for `supergraph.listen`. + * Set **Container command** to `/dist/router`. + * (Optional) if running router in dev mode, set **Container arguments** to `--dev`. 1. On the **Variables & Secrets** tab, add the following variables (either as environment variables or referenced secrets): - 1. Add `APOLLO_KEY` and set it to your graph API key. - 1. Add `APOLLO_GRAPH_REF` and set it to your graph ref. + * Add `APOLLO_KEY` and set it to your graph API key. + * Add `APOLLO_GRAPH_REF` and set it to your graph ref. 1. Click **Deploy** on the bottom-left of the console. ### Deploy with gcloud CLI -To deploy the router with the gcloud CLI, run the following commands, with your configuration info in place of the example info: - -```bash -gcloud run deploy my-router \ ---image=us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 \ ---command=/dist/router \ ---args=--dev \ ---set-secrets=APOLLO_KEY=APOLLO_KEY:latest,APOLLO_GRAPH_REF=APOLLO_GRAPH_REF:latest \ ---region=us-west2 \ ---project=router-container-gcp \ - && gcloud run services update-traffic router-gcp --to-latest -``` +1. To deploy the router with the gcloud CLI, run the `gloucd run deploy` command, using your configuration info in place of the example info: + + ```bash showLineNumbers=false + gcloud run deploy my-router \ + --image=us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 \ + --command=/dist/router \ + --args=--dev \ + --set-secrets=APOLLO_KEY=APOLLO_KEY:latest,APOLLO_GRAPH_REF=APOLLO_GRAPH_REF:latest \ + --region=us-west2 \ + --project=router-container-gcp + ``` + +1. Update traffic to your deployed router by running `gcloud run services update-traffic`: + + ```bash + gcloud run services update-traffic my-router --to-latest + ``` + \ No newline at end of file From 61da482678a0d0057a5fa24e47150407fb435579 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Thu, 20 Mar 2025 15:12:02 -0700 Subject: [PATCH 04/47] copyedits --- .../routing/self-hosted/containerization/gcp.mdx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/source/routing/self-hosted/containerization/gcp.mdx b/docs/source/routing/self-hosted/containerization/gcp.mdx index eeafee2be5..c7d6d3bc98 100644 --- a/docs/source/routing/self-hosted/containerization/gcp.mdx +++ b/docs/source/routing/self-hosted/containerization/gcp.mdx @@ -4,18 +4,15 @@ subtitle: "" description: Build and deploy Apollo GraphOS Router or Apollo Router Core to Google Cloud Platform (GCP) with Google Cloud Run. --- -Learn how to deploy the router for development on Google Cloud Platform (GCP) with Cloud Run. +Learn how to deploy the router on Google Cloud Platform (GCP) with Cloud Run. > Not deploying to GCP? Try our guides for deploying to AWS or Azure. - ## Prerequisites -1. Choose a version of the router to deploy (for example, `v1.61.0`). +Before you begin, set up the tools you need to deploy the router on Cloud Run: 1. Install [Docker](https://www.docker.com/get-started/) locally. - - 1. Create a new [Google Cloud account](https://cloud.google.com/) or go to an existing account. 1. Install the [gcloud CLI](https://cloud.google.com/sdk/docs/install), if not already installed. 1. In GCP, create a new project. @@ -23,10 +20,13 @@ Learn how to deploy the router for development on Google Cloud Platform (GCP) wi 1. In GCP, enable [Artifact Registry](https://cloud.google.com/artifact-registry/docs/enable-service) in your project. * Create a repository and choose a repository name (for example, `my-repo`). Keep this name handy, as you'll need it later to build and deploy a router image. 1. In GCP Secret Manager, set `APOLLO_KEY` to your graph API key and `APOLLO_GRAPH_REF` to your graph ref. You'll need them later to deploy a router image. +1. Choose a version of the router to deploy (for example, `v1.61.0`). You'll need it when specifying the router image to deploy. ## Build and push router image -1. In a local directory, create a `router.yaml` file and copy-paste the following into the file: +After setting up Docker and GCP, build a router image with custom router configuration and push the image to GCP: + +1. In a local directory, create a `router.yaml` file and copy-paste the following configuration into the file: ```yaml title="router.yaml" supergraph: @@ -37,7 +37,7 @@ Learn how to deploy the router for development on Google Cloud Platform (GCP) wi Because the router's default HTTP and health check endpoint addresses are localhost and wouldn't be reachable when deployed, edit your `router.yaml` to configure these endpoints to listen to all addresses: -1. Create a `Dockerfile` file and copy-paste the following into the file: +1. Create a `Dockerfile` file and copy-paste the following into the file, where the container image of your chosen version of router is downloaded, and your customized `router.yaml` configuration file replaces the default router configuration file: ```text showLineNumbers=false # Use the official Apollo Router Core image as the base. From 3d959a8246565aaf5f702b4168210875ad9a76b6 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Fri, 21 Mar 2025 14:51:51 -0700 Subject: [PATCH 05/47] copyedits --- .../self-hosted/containerization/gcp.mdx | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/docs/source/routing/self-hosted/containerization/gcp.mdx b/docs/source/routing/self-hosted/containerization/gcp.mdx index c7d6d3bc98..35b362efe1 100644 --- a/docs/source/routing/self-hosted/containerization/gcp.mdx +++ b/docs/source/routing/self-hosted/containerization/gcp.mdx @@ -6,11 +6,15 @@ description: Build and deploy Apollo GraphOS Router or Apollo Router Core to Goo Learn how to deploy the router on Google Cloud Platform (GCP) with Cloud Run. -> Not deploying to GCP? Try our guides for deploying to AWS or Azure. + + +Not deploying to GCP? Try our deployment guides AWS or Azure. + + ## Prerequisites -Before you begin, set up the tools you need to deploy the router on Cloud Run: +Before starting, set up the following tools: 1. Install [Docker](https://www.docker.com/get-started/) locally. 1. Create a new [Google Cloud account](https://cloud.google.com/) or go to an existing account. @@ -24,7 +28,7 @@ Before you begin, set up the tools you need to deploy the router on Cloud Run: ## Build and push router image -After setting up Docker and GCP, build a router image with custom router configuration and push the image to GCP: +After setting up Docker and GCP, build a router image with custom configuration, then push it to your GCP registry: 1. In a local directory, create a `router.yaml` file and copy-paste the following configuration into the file: @@ -59,14 +63,24 @@ After setting up Docker and GCP, build a router image with custom router configu 1. Run `docker images` and validate that your router image was successfully built and loaded. -1. Run the following `docker` commands to tag and push the local router image to Artifact Registry: +1. Run `docker tag` to tag the image before pushing it to Artifact Registry. Make sure your tag conforms with Artifact Registry's [naming convention](https://cloud.google.com/artifact-registry/docs/docker/names) (for example, `us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0`). + + ```bash showLineNumbers=false + docker tag router-gcp:v1.61.0 \ + us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 + ``` + +1. Run `docker push` to push the router image to Artifact Registry. ```bash showLineNumbers=false - docker tag router-gcp:v1.61.0 us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 docker push us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 ``` -1. In GCP console for your project, go to Artifact Registry and validate the router image has been successfully pushed. +1. Validate the router image has been successfully pushed to Artifact Registry. You can use Google Cloud Console and navigate to your repository in Artifact Registry. You can also use the gcloud CLI and run `gcloud artifacts docker images`. For example: + + ```bash showLineNumbers=false + gcloud artifacts docker images list us-west2-docker.pkg.dev/my-project/my-repo + ``` ## Configure and deploy router @@ -89,16 +103,14 @@ You can use either Google Cloud console or gcloud CLI. In either case, you need * Set **Service name** to a name for your deployed router (for example, `my-router`). * Set **Region** to your GCP region. * Set **Authentication** to **Allow unauthenticated invocations**. -1. On the **Container(s)** > **Edit Container** tab, update the following configurations: - 1. On the **Settings** tab: - * Set **Container port** to `4000`. This port must match your router's configuration for `supergraph.listen`. - * Set **Container command** to `/dist/router`. - * (Optional) if running router in dev mode, set **Container arguments** to `--dev`. - 1. On the **Variables & Secrets** tab, add the following variables (either as environment variables or referenced secrets): - * Add `APOLLO_KEY` and set it to your graph API key. - * Add `APOLLO_GRAPH_REF` and set it to your graph ref. - -1. Click **Deploy** on the bottom-left of the console. +1. On the **Container(s)** > **Edit Container** tab, go to the **Settings** tab and update the following configurations: + * Set **Container port** to `4000`. This port must match your router's configuration for `supergraph.listen`. + * Set **Container command** to `/dist/router`. + * (Optional) if running router in dev mode, set **Container arguments** to `--dev`. +1. Also on the **Container(s)** > **Edit Container** tab, go to the **Variables & Secrets** tab and add the following variables (either as environment variables or referenced secrets): + * Add `APOLLO_KEY` and set it to your graph API key. + * Add `APOLLO_GRAPH_REF` and set it to your graph ref. +1. Click **Deploy** to deploy the router. ### Deploy with gcloud CLI From 58a4d3768efaaa6b3e3ccbec36fbdc679d3c4253 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Fri, 21 Mar 2025 15:01:09 -0700 Subject: [PATCH 06/47] copyedits --- docs/source/routing/self-hosted/containerization/gcp.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/routing/self-hosted/containerization/gcp.mdx b/docs/source/routing/self-hosted/containerization/gcp.mdx index 35b362efe1..9e4266b60e 100644 --- a/docs/source/routing/self-hosted/containerization/gcp.mdx +++ b/docs/source/routing/self-hosted/containerization/gcp.mdx @@ -1,5 +1,5 @@ --- -title: Deploy router in Google Cloud Platform (GCP) +title: Deploying router in Google Cloud Platform (GCP) subtitle: "" description: Build and deploy Apollo GraphOS Router or Apollo Router Core to Google Cloud Platform (GCP) with Google Cloud Run. --- @@ -18,8 +18,8 @@ Before starting, set up the following tools: 1. Install [Docker](https://www.docker.com/get-started/) locally. 1. Create a new [Google Cloud account](https://cloud.google.com/) or go to an existing account. -1. Install the [gcloud CLI](https://cloud.google.com/sdk/docs/install), if not already installed. -1. In GCP, create a new project. +1. Install the [gcloud CLI](https://cloud.google.com/sdk/docs/install), if not already installed, and log in to your GCP account. +1. Create a new project in GCP. * Choose a project name (for example, `my-project`). Keep this name handy, as you'll need it later to build and run a router image. 1. In GCP, enable [Artifact Registry](https://cloud.google.com/artifact-registry/docs/enable-service) in your project. * Create a repository and choose a repository name (for example, `my-repo`). Keep this name handy, as you'll need it later to build and deploy a router image. From 5110f15b498a4920f9f2117274c1b25b8b509077 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Fri, 4 Apr 2025 10:41:58 -0700 Subject: [PATCH 07/47] copyedit GCP, draft AWS, outline Azure --- .../self-hosted/containerization/aws.mdx | 146 ++++++++++++++++++ .../self-hosted/containerization/azure.mdx | 23 +++ .../self-hosted/containerization/gcp.mdx | 6 +- 3 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 docs/source/routing/self-hosted/containerization/aws.mdx create mode 100644 docs/source/routing/self-hosted/containerization/azure.mdx diff --git a/docs/source/routing/self-hosted/containerization/aws.mdx b/docs/source/routing/self-hosted/containerization/aws.mdx new file mode 100644 index 0000000000..9ae1e4a108 --- /dev/null +++ b/docs/source/routing/self-hosted/containerization/aws.mdx @@ -0,0 +1,146 @@ +--- +title: Deploying router to Amazon Web Services (AWS) +subtitle: Deploy with Amazon Elastic Container Service (ECS) and AWS Fargate +description: Build and deploy Apollo GraphOS Router or Apollo Router Core to AWS Fargate +--- + +Learn how to deploy the router to AWS Fargate. + + + +Not deploying to AWS? Try our deployment guides for [GCP](/graphos/routing/self-hosted/containerization/gcp) or [Azure](/graphos/routing/self-hosted/containerization/azure). + + + +## Prerequisites + +1. Install [Docker](https://www.docker.com/get-started/) locally. +1. Set up you [AWS environment](https://aws.amazon.com/getting-started/guides/setup-environment/) + - Install the AWS CLI. + - Use an existing Create an Amazon +1. Choose a version of the router to deploy (for example, `v1.61.0`). You'll need it when specifying the router image to deploy. + +## Build router image + +After setting up the prerequisite tools, build a router image with custom configuration, then push it to AWS: + +1. In a local directory, create a `router.yaml` file and copy-paste the following configuration into the file: + + ```yaml title="router.yaml" + supergraph: + listen: 0.0.0.0:4000 + health_check: + listen: 0.0.0.0:8088 + ``` + + Because the router's default HTTP and health check endpoint addresses are localhost and wouldn't be reachable when deployed, edit your `router.yaml` to configure these endpoints to listen to all addresses: + +1. Create a `Dockerfile` file and copy-paste the following into the file, where the container image of your chosen version of router is downloaded, and your customized `router.yaml` configuration file replaces the default router configuration file: + + ```text showLineNumbers=false + # Use the official Apollo Router Core image as the base. + # Set the image tag to the desired router version (e.g. v1.61.0) + FROM ghcr.io/apollographql/router:v1.61.0 + + # Replace the default router config with the local, customized router.yaml + COPY router.yaml /dist/config/router.yaml + ``` + +1. From the same local directory, run the following `docker` CLI command to build a new router image. Choose a name and tag for the image, for example `router-aws:v1.61.0`. + + ```bash showLineNumbers=false + docker buildx build --platform linux/amd64 -t router-aws:v1.61.0 --load . + ``` + + - Because Cloud Run only supports AMD64-based images, the `docker buildx build --platform linux/amd64` command ensures the image is built for AMD64 and is compatible. + - The `--load` option loads the built image to `docker images`. + +1. Run `docker images` and validate that your router image is in the returned list of images. + +## Push router image to registry + +Now that you have a built router image, create a repository in Elastic Cloud Registry (ECR) and push your image to it: + +1. In a local terminal, run the AWS CLI command to create a new ECR repository: + - For `--repository-name`, set a name for your repository (for example, `router-repo`) + - For `--region`, set your AWS region (for example, `us-west-1`) + + ```bash showLineNumbers=false + aws ecr create-repository \ + --repository-name router-repo \ + --region us-west-1 + ``` + +1. In AWS CLI, authenticate your Docker CLI to ECR. + - For `--region`, use your AWS regions (for example, `us-west-1`) + - Use your ECR repository URI, which you can copy from your ECR Repositories Console (for example, `0123456789000.dkr.ecr.us-west-1.amazonaws.com`) + + ```bash showLineNumbers=false + aws ecr get-login-password --region us-west-1 | docker login --username AWS --password-stdin 0123456789000.dkr.ecr.us-west-1.amazonaws.com + ``` + + > To troubleshoot ECR authentication, go to [AWS documentation](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-authenticate-registry). + +1. Run `docker tag` to tag the image before pushing it to ECR. + + ```bash showLineNumbers=false + docker tag router-aws:v1.61.0 0123456789000.dkr.ecr.us-west-1.amazonaws.com/router-repo:v1.61.0 + ``` + +1. Run `docker push` to push the router image to your ECR repository URI, using a tag (e.g., `:v1.61.0`): + + ```bash showLineNumbers=false + docker push 0123456789000.dkr.ecr.us-west-1.amazonaws.com/router-repo:v1.61.0 + ``` + +1. Run `aws ecr list-images` and validate that your image is in the list of images in your ECR repository: + + ```bash showLineNumbers=false + aws ecr list-images --repository-name router-repo + ``` + +## Configure deployment + +With your image pushed to your ECR repository, in ECS you can define a task for the router and deploy it as a service. + +### Create cluster + +You need an ECS cluster to deploy the router. + +If you don't have a cluster, you can create one with default settings: + +1. In the AWS Console, go to the Amazon ECS Console, then click **Create cluster**. +1. Enter a name for your cluster. +1. Click **Create**. + +### Create task definition + +Create an ECS task definition for your router: + +1. In the AWS ECS Console, go to **Task definitions** from the left navigation panel, then click **Create new task definition** and select **Create new task definition**. +1. Configure the fields for **Container - 1**: + - Choose a **Name** for the container. + - Set **Image URI** to the URI of your router image. + - Under **Port mappings**, set **Container port** to `4000` and choose a **Port name**. + - Under **Environment variables**, set the environment variables `APOLLO_KEY` and `APOLLO_GRAPH_REF` to your graph API key and graph ref. +1. In `Docker configuration - optional`, enter the command options to configure the router and run it in development mode: + + ```text showLineNumbers=false + --dev,--config,/dist/config/router.yaml + ``` +1. Click **Create**. + +### Deploy router + +Deploy the router in your ECS cluster: + +1. In AWS ECS Console under **Task definitions**, select your defined task, then click **Deploy** and select **Create service**. +1. Configure the fields for the service: + - For `Existing cluster`, select your cluster from the dropdown. + - Enter a `Service name`. +1. Click **Create** to create the service. ECS will start deploying the service for the router. +1. After AWS finishes deploying, click on the service to go to its page in Console. Check the service logs for messages from the running router. For example: + + ```text title="Example router log message" + {"timestamp":"2025-04-04T17:32:14.928608731Z","level":"INFO","message":"Apollo Router v1.61.0 // (c) Apollo Graph, Inc. // Licensed as ELv2 (https://go.apollo.dev/elv2)","target":"apollo_router::executable","resource":{}} + ``` diff --git a/docs/source/routing/self-hosted/containerization/azure.mdx b/docs/source/routing/self-hosted/containerization/azure.mdx new file mode 100644 index 0000000000..fc0d6b8ca6 --- /dev/null +++ b/docs/source/routing/self-hosted/containerization/azure.mdx @@ -0,0 +1,23 @@ +--- +title: Deploying router to Azure Web Service +subtitle: "" +description: Build and deploy Apollo GraphOS Router or Apollo Router Core to Azure Web Service. +--- + +Learn how to deploy the router on Azure Web Service. + + + +Not deploying to Azure? Try our deployment guides for [GCP](/graphos/routing/self-hosted/containerization/gcp) or [AWS](/graphos/routing/self-hosted/containerization/aws). + + + +## Prerequisites + +## Build router image + +## Push router image to registry + +## Configure deployment + +## Deploy router diff --git a/docs/source/routing/self-hosted/containerization/gcp.mdx b/docs/source/routing/self-hosted/containerization/gcp.mdx index 9e4266b60e..9bbe2629f3 100644 --- a/docs/source/routing/self-hosted/containerization/gcp.mdx +++ b/docs/source/routing/self-hosted/containerization/gcp.mdx @@ -1,5 +1,5 @@ --- -title: Deploying router in Google Cloud Platform (GCP) +title: Deploying router to Google Cloud Run subtitle: "" description: Build and deploy Apollo GraphOS Router or Apollo Router Core to Google Cloud Platform (GCP) with Google Cloud Run. --- @@ -8,13 +8,13 @@ Learn how to deploy the router on Google Cloud Platform (GCP) with Cloud Run. -Not deploying to GCP? Try our deployment guides AWS or Azure. +Not deploying to GCP? Try our deployment guides for [AWS](/graphos/routing/self-hosted/containerization/aws) or [Azure](/graphos/routing/self-hosted/containerization/azure). ## Prerequisites -Before starting, set up the following tools: +Before you start, set up the following tools: 1. Install [Docker](https://www.docker.com/get-started/) locally. 1. Create a new [Google Cloud account](https://cloud.google.com/) or go to an existing account. From 456a6618b4e99b67266dfebb70db762744319071 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Fri, 11 Apr 2025 15:34:24 -0700 Subject: [PATCH 08/47] add Azure guide, copyedit GCP and AWS --- .../self-hosted/containerization/aws.mdx | 17 +- .../self-hosted/containerization/azure.mdx | 152 +++++++++++++++++- .../self-hosted/containerization/gcp.mdx | 15 +- 3 files changed, 169 insertions(+), 15 deletions(-) diff --git a/docs/source/routing/self-hosted/containerization/aws.mdx b/docs/source/routing/self-hosted/containerization/aws.mdx index 9ae1e4a108..a2a50231c7 100644 --- a/docs/source/routing/self-hosted/containerization/aws.mdx +++ b/docs/source/routing/self-hosted/containerization/aws.mdx @@ -1,10 +1,15 @@ --- -title: Deploying router to Amazon Web Services (AWS) -subtitle: Deploy with Amazon Elastic Container Service (ECS) and AWS Fargate -description: Build and deploy Apollo GraphOS Router or Apollo Router Core to AWS Fargate +title: Deploying GraphOS Router on Amazon Web Services +subtitle: Deploy router with Elastic Container Service (ECS) +description: Build and deploy Apollo GraphOS Router on Amazon Web Services (AWS) with Elastic Container Service (ECS) --- -Learn how to deploy the router to AWS Fargate. +Learn how to deploy the router for development on AWS with Elastic Container Service (ECS). + +You will: +- Build a router image with a Dockerfile. +- Set up an Elastic Cloud Registry and push your router image to it. +- Create an ECS task definition for your router and deploy it. @@ -14,6 +19,10 @@ Not deploying to AWS? Try our deployment guides for [GCP](/graphos/routing/self- ## Prerequisites +Before you start: + +1. [Set up a GraphQL API in GraphOS](/graphos/get-started/guides/graphql#step-1-set-up-your-graphql-api). + - Save your `APOLLO_KEY` and `APOLLO_GRAPH_REF`. You'll need them when deploying the router. 1. Install [Docker](https://www.docker.com/get-started/) locally. 1. Set up you [AWS environment](https://aws.amazon.com/getting-started/guides/setup-environment/) - Install the AWS CLI. diff --git a/docs/source/routing/self-hosted/containerization/azure.mdx b/docs/source/routing/self-hosted/containerization/azure.mdx index fc0d6b8ca6..163aad1ea8 100644 --- a/docs/source/routing/self-hosted/containerization/azure.mdx +++ b/docs/source/routing/self-hosted/containerization/azure.mdx @@ -1,10 +1,15 @@ --- -title: Deploying router to Azure Web Service -subtitle: "" -description: Build and deploy Apollo GraphOS Router or Apollo Router Core to Azure Web Service. +title: Deploying GraphOS Router to Azure +subtitle: Deploy router with Azure Container App +description: Build and deploy Apollo GraphOS Router as an Azure Container App --- -Learn how to deploy the router on Azure Web Service. +Learn how to deploy the router for development on Azure as a Container App. + +You will: +- Build a router image with a Dockerfile. +- Set up an Azure Container Registry and push your router image to it. +- Create and deploy an Azure Container App for your router. @@ -14,10 +19,143 @@ Not deploying to Azure? Try our deployment guides for [GCP](/graphos/routing/sel ## Prerequisites +Before you start: + +1. [Set up a GraphQL API in GraphOS](/graphos/get-started/guides/graphql#step-1-set-up-your-graphql-api). + - Save your `APOLLO_KEY` and `APOLLO_GRAPH_REF`. You'll need them when deploying the router. +1. Install [Docker](https://www.docker.com/get-started/) locally. +1. Login to or create an [Azure account](https://azure.microsoft.com/en-us/pricing/purchase-options/azure-account). +1. Install [Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli). +1. Choose a version of the router to deploy (for example, `v1.61.0`). You'll need it when specifying the router image to deploy. + ## Build router image -## Push router image to registry +After setting up the prerequisite tools, build a router image with custom configuration: + +1. In a local directory, create a `router.yaml` file and copy-paste the following configuration into the file: + + ```yaml title="router.yaml" + supergraph: + listen: 0.0.0.0:4000 + health_check: + listen: 0.0.0.0:8088 + ``` + + Because the router's default HTTP and health check endpoint addresses are localhost and wouldn't be reachable when deployed, edit your `router.yaml` to configure these endpoints to listen to all addresses: + +1. Create a `Dockerfile` file and copy-paste the following into the file, where the container image of your chosen version of router is downloaded, and your customized `router.yaml` configuration file replaces the default router configuration file: + + ```text showLineNumbers=false + # Use the official Apollo Router Core image as the base. + # Set the image tag to the desired router version (e.g. v1.61.0) + FROM ghcr.io/apollographql/router:v1.61.0 + + # Replace the default router config with the local, customized router.yaml + COPY router.yaml /dist/config/router.yaml + ``` + +1. From the same local directory, use `docker buildx build` to build a new router image for a specific platform. Choose a name and tag for the image, for example `router:v1.61.0`. + + ```bash showLineNumbers=false + docker buildx build --platform linux/amd64 -t router:v1.61.0 --load . + ``` + + - The `--load` option loads the built image to `docker images`. + +1. Run `docker images` and validate that your router image is in the returned list of images. + +## Push router image to Azure Container Registry + +Create an Azure Container Registry as needed, then push your router image to it. + +### Create new container registry + +If you don't have an existing container registry, create a new one: + +1. Log in to the Azure Portal and go to [Container registries](https://portal.azure.com/?quickstart=true#browse/Microsoft.ContainerRegistry%2Fregistries). +1. Click **Create container registry**. +1. Fill in the details: + - **Subscription**: Select your subscription + - **Resource group**: Select existing group or create new + - **Registry name**: Enter a unique name for your registry (for example, `myapolloregistry`) + - **Location**: Select an appropriate region + - **Pricing plan**: Select an appropriate plan + +1. Click **Review + create**, then click **Create**. +1. Your registry should now be created. Click on your registry to go to its portal page. + +### Log in to container registry + +1. In a terminal, sign in to Azure CLI: + + ```bash showLineNumbers=false + az login + ``` + +1. Log in and authenticate to your registry (for example, `myapolloregistry`): + + ```bash showLineNumbers=false + az acr login --name myapolloregistry + ``` + +### Tag and push image to registry + +1. Use `docker tag` to create an alias of the image with the fully qualified path to your registry (for example, `myapolloregistry.azurecr.io`): + + ```bash showLineNumbers=false + docker tag router:v1.61.0 myapolloregistry.azurecr.io/router:v1.61.0 + ``` +1. Push the image to the registry: + + ```bash showLineNumbers=false + docker push myapolloregistry.azurecr.io/router:v1.61.0 + ``` + +1. Use `az acr repository list` to verify your image is now in the registry: + + ```bash showLineNumbers=false + az acr repository list --name myapolloregistry + ``` + + + +```bash showLineNumbers=false +[ + "myapolloregistry" +] +``` + + +### Deploy the router + +Create and deploy a container app to run the router in Azure: + +1. Log in to the Azure Portal, then go to [Create Container App](https://portal.azure.com/#create/Microsoft.ContainerApp) +1. Fill in the details for the **Basics** tab: + - Subscription: Select your subscription + - Resource Group: Select existing group or create new + - Name: Enter a unique name for your web app. + - Publish: Choose **Container** + - Operating System: Choose **Linux** + - Region: Select an appropriate region + - App Service Plan: Select existing plan or create new + +1. Fill in the details for the **Container** tab: + - **Subscription**: Select your subscription + - **Registry**: Select your registry + - **Image**: Select your router image + - **Image tag**: Select your router image's tag + - **Arguments override**: Enter `--dev, --config, /dist/config/router.yaml` + - **Environment variables**: Enter `APOLLO_GRAPH_REF` and `APOLLO_KEY` with your graph ref and API key, respectively + +1. Fill in the details for the **Ingress** tab: + - **Ingress**: Check **Enabled** + - **Ingress traffic**: Select **Accepting traffic from anywhere** + - **Ingress type**: Select **HTTP** + - **Target port**: Enter `4000` (must match your router's `supergraph.listen` port) -## Configure deployment +1. Click **Review + create**. +1. Click **Create**, then wait for your deployment to complete. +1. Click **Go to resource** to open the portal page for your deployed container, then click on the **Application Url** to verify that your router's Sandbox is running successfully. -## Deploy router +Congrats, you've successfully deployed the router with Azure! diff --git a/docs/source/routing/self-hosted/containerization/gcp.mdx b/docs/source/routing/self-hosted/containerization/gcp.mdx index 9bbe2629f3..66e9dafd0d 100644 --- a/docs/source/routing/self-hosted/containerization/gcp.mdx +++ b/docs/source/routing/self-hosted/containerization/gcp.mdx @@ -1,10 +1,15 @@ --- -title: Deploying router to Google Cloud Run -subtitle: "" +title: Deploying GraphOs Router on Google Cloud Platform +subtitle: Deploy router with Google Cloud Run description: Build and deploy Apollo GraphOS Router or Apollo Router Core to Google Cloud Platform (GCP) with Google Cloud Run. --- -Learn how to deploy the router on Google Cloud Platform (GCP) with Cloud Run. +Learn how to deploy the router for development on Google Cloud Platform (GCP) with Cloud Run. + +You will: +- Build a router image with a Dockerfile. +- Set up an Azure Container Registry and push your router image to it. +- Create and deploy an Azure Container App for your router. @@ -14,8 +19,10 @@ Not deploying to GCP? Try our deployment guides for [AWS](/graphos/routing/self- ## Prerequisites -Before you start, set up the following tools: +Before you start: +1. [Set up a GraphQL API in GraphOS](/graphos/get-started/guides/graphql#step-1-set-up-your-graphql-api). + - Save your `APOLLO_KEY` and `APOLLO_GRAPH_REF`. You'll need them when deploying the router. 1. Install [Docker](https://www.docker.com/get-started/) locally. 1. Create a new [Google Cloud account](https://cloud.google.com/) or go to an existing account. 1. Install the [gcloud CLI](https://cloud.google.com/sdk/docs/install), if not already installed, and log in to your GCP account. From 4d7702a8cfefa947304aa815db4ab3b7cd02c12f Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 14 Apr 2025 13:09:48 -0700 Subject: [PATCH 09/47] copyedits --- docs/source/routing/self-hosted/containerization/docker.mdx | 4 ++-- docs/source/routing/self-hosted/containerization/gcp.mdx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/routing/self-hosted/containerization/docker.mdx b/docs/source/routing/self-hosted/containerization/docker.mdx index 28a69e5b3b..c3ce8950eb 100644 --- a/docs/source/routing/self-hosted/containerization/docker.mdx +++ b/docs/source/routing/self-hosted/containerization/docker.mdx @@ -1,6 +1,6 @@ --- -title: Run in Docker -subtitle: Run the router container image in Docker +title: Deploying GraphOS Router in Docker +subtitle: Deploy router container image description: Run the Apollo Router Core container image in Docker with examples covering basic setup, configuration overrides, debugging, and building custom Docker images. --- diff --git a/docs/source/routing/self-hosted/containerization/gcp.mdx b/docs/source/routing/self-hosted/containerization/gcp.mdx index 66e9dafd0d..551c7f9d68 100644 --- a/docs/source/routing/self-hosted/containerization/gcp.mdx +++ b/docs/source/routing/self-hosted/containerization/gcp.mdx @@ -1,5 +1,5 @@ --- -title: Deploying GraphOs Router on Google Cloud Platform +title: Deploying GraphOS Router on Google Cloud Platform subtitle: Deploy router with Google Cloud Run description: Build and deploy Apollo GraphOS Router or Apollo Router Core to Google Cloud Platform (GCP) with Google Cloud Run. --- From a460f9df13806f6be4ae061c2ad2a1363a695fa5 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Tue, 15 Apr 2025 16:48:35 -0700 Subject: [PATCH 10/47] copyedits --- .../self-hosted/containerization/aws.mdx | 39 ++++---- .../self-hosted/containerization/azure.mdx | 14 +-- .../self-hosted/containerization/gcp.mdx | 94 +++++++++++-------- 3 files changed, 88 insertions(+), 59 deletions(-) diff --git a/docs/source/routing/self-hosted/containerization/aws.mdx b/docs/source/routing/self-hosted/containerization/aws.mdx index a2a50231c7..a99920f2d1 100644 --- a/docs/source/routing/self-hosted/containerization/aws.mdx +++ b/docs/source/routing/self-hosted/containerization/aws.mdx @@ -1,7 +1,7 @@ --- title: Deploying GraphOS Router on Amazon Web Services -subtitle: Deploy router with Elastic Container Service (ECS) -description: Build and deploy Apollo GraphOS Router on Amazon Web Services (AWS) with Elastic Container Service (ECS) +subtitle: Deploy router with Amazon Elastic Container Service (ECS) +description: Build and deploy Apollo Router on Amazon Web Services (AWS) with Amazon Elastic Container Service (ECS) --- Learn how to deploy the router for development on AWS with Elastic Container Service (ECS). @@ -13,7 +13,7 @@ You will: -Not deploying to AWS? Try our deployment guides for [GCP](/graphos/routing/self-hosted/containerization/gcp) or [Azure](/graphos/routing/self-hosted/containerization/azure). +Not deploying to AWS? Try our router deployment guides for [GCP](/graphos/routing/self-hosted/containerization/gcp) or [Azure](/graphos/routing/self-hosted/containerization/azure). @@ -31,7 +31,7 @@ Before you start: ## Build router image -After setting up the prerequisite tools, build a router image with custom configuration, then push it to AWS: +To deploy your own router, start by customizing and building a router image, using a Dockerfile and a router configuration file: 1. In a local directory, create a `router.yaml` file and copy-paste the following configuration into the file: @@ -42,9 +42,9 @@ After setting up the prerequisite tools, build a router image with custom config listen: 0.0.0.0:8088 ``` - Because the router's default HTTP and health check endpoint addresses are localhost and wouldn't be reachable when deployed, edit your `router.yaml` to configure these endpoints to listen to all addresses: + The router's default HTTP and health check endpoint addresses are localhost, so they wouldn't be reachable when deployed. This configuration enables the router to listen to all addresses. -1. Create a `Dockerfile` file and copy-paste the following into the file, where the container image of your chosen version of router is downloaded, and your customized `router.yaml` configuration file replaces the default router configuration file: +1. Create a `Dockerfile` file and copy-paste the following into the file: ```text showLineNumbers=false # Use the official Apollo Router Core image as the base. @@ -55,6 +55,8 @@ After setting up the prerequisite tools, build a router image with custom config COPY router.yaml /dist/config/router.yaml ``` + The Dockerfile sources the base router image from the GitHub container registry, using the version of router you specify. It then copies your customized `router.yaml` configuration file to overwrite the default router configuration file. + 1. From the same local directory, run the following `docker` CLI command to build a new router image. Choose a name and tag for the image, for example `router-aws:v1.61.0`. ```bash showLineNumbers=false @@ -108,7 +110,7 @@ Now that you have a built router image, create a repository in Elastic Cloud Reg aws ecr list-images --repository-name router-repo ``` -## Configure deployment +## Create and deploy ECS task With your image pushed to your ECR repository, in ECS you can define a task for the router and deploy it as a service. @@ -127,15 +129,17 @@ If you don't have a cluster, you can create one with default settings: Create an ECS task definition for your router: 1. In the AWS ECS Console, go to **Task definitions** from the left navigation panel, then click **Create new task definition** and select **Create new task definition**. -1. Configure the fields for **Container - 1**: - - Choose a **Name** for the container. - - Set **Image URI** to the URI of your router image. - - Under **Port mappings**, set **Container port** to `4000` and choose a **Port name**. - - Under **Environment variables**, set the environment variables `APOLLO_KEY` and `APOLLO_GRAPH_REF` to your graph API key and graph ref. +1. Fill in the details for **Container - 1**: + - **Name**: Enter a container name + - **Image URI**: Select the URI of your router image + - **Port mappings**: + - **Container port**: Enter `4000` (must match ) and + - **Port name**: Enter a port name + - **Environment variables**: Enter the environment variables `APOLLO_KEY` and `APOLLO_GRAPH_REF` and set them to your graph API key and graph ref, respectively 1. In `Docker configuration - optional`, enter the command options to configure the router and run it in development mode: ```text showLineNumbers=false - --dev,--config,/dist/config/router.yaml + --dev, --config, /dist/config/router.yaml ``` 1. Click **Create**. @@ -144,12 +148,15 @@ Create an ECS task definition for your router: Deploy the router in your ECS cluster: 1. In AWS ECS Console under **Task definitions**, select your defined task, then click **Deploy** and select **Create service**. -1. Configure the fields for the service: - - For `Existing cluster`, select your cluster from the dropdown. - - Enter a `Service name`. +1. Fill in the fields for the service: + - **Existing cluster**: Select your cluster + - **Service name**: Enter a name for your service 1. Click **Create** to create the service. ECS will start deploying the service for the router. 1. After AWS finishes deploying, click on the service to go to its page in Console. Check the service logs for messages from the running router. For example: ```text title="Example router log message" {"timestamp":"2025-04-04T17:32:14.928608731Z","level":"INFO","message":"Apollo Router v1.61.0 // (c) Apollo Graph, Inc. // Licensed as ELv2 (https://go.apollo.dev/elv2)","target":"apollo_router::executable","resource":{}} ``` +1. Go to the service URL and validate the the router's development Sandbox is running successfully. + +Congrats, you've successfully deployed the router! diff --git a/docs/source/routing/self-hosted/containerization/azure.mdx b/docs/source/routing/self-hosted/containerization/azure.mdx index 163aad1ea8..514058cd2c 100644 --- a/docs/source/routing/self-hosted/containerization/azure.mdx +++ b/docs/source/routing/self-hosted/containerization/azure.mdx @@ -13,7 +13,7 @@ You will: -Not deploying to Azure? Try our deployment guides for [GCP](/graphos/routing/self-hosted/containerization/gcp) or [AWS](/graphos/routing/self-hosted/containerization/aws). +Not deploying to Azure? Try our router deployment guides for [GCP](/graphos/routing/self-hosted/containerization/gcp) or [AWS](/graphos/routing/self-hosted/containerization/aws). @@ -30,7 +30,7 @@ Before you start: ## Build router image -After setting up the prerequisite tools, build a router image with custom configuration: +To deploy your own router, start by customizing and building a router image, using a Dockerfile and a router configuration file: 1. In a local directory, create a `router.yaml` file and copy-paste the following configuration into the file: @@ -41,9 +41,9 @@ After setting up the prerequisite tools, build a router image with custom config listen: 0.0.0.0:8088 ``` - Because the router's default HTTP and health check endpoint addresses are localhost and wouldn't be reachable when deployed, edit your `router.yaml` to configure these endpoints to listen to all addresses: + The router's default HTTP and health check endpoint addresses are localhost, so they wouldn't be reachable when deployed. This configuration enables the router to listen to all addresses. -1. Create a `Dockerfile` file and copy-paste the following into the file, where the container image of your chosen version of router is downloaded, and your customized `router.yaml` configuration file replaces the default router configuration file: +1. Create a `Dockerfile` file and copy-paste the following into the file: ```text showLineNumbers=false # Use the official Apollo Router Core image as the base. @@ -54,6 +54,8 @@ After setting up the prerequisite tools, build a router image with custom config COPY router.yaml /dist/config/router.yaml ``` + The Dockerfile sources the base router image from the GitHub container registry, using the version of router you specify. It then copies your customized `router.yaml` configuration file to overwrite the default router configuration file. + 1. From the same local directory, use `docker buildx build` to build a new router image for a specific platform. Choose a name and tag for the image, for example `router:v1.61.0`. ```bash showLineNumbers=false @@ -64,7 +66,7 @@ After setting up the prerequisite tools, build a router image with custom config 1. Run `docker images` and validate that your router image is in the returned list of images. -## Push router image to Azure Container Registry +## Push router image to container registry Create an Azure Container Registry as needed, then push your router image to it. @@ -158,4 +160,4 @@ Create and deploy a container app to run the router in Azure: 1. Click **Create**, then wait for your deployment to complete. 1. Click **Go to resource** to open the portal page for your deployed container, then click on the **Application Url** to verify that your router's Sandbox is running successfully. -Congrats, you've successfully deployed the router with Azure! +Congrats, you've successfully deployed the router! diff --git a/docs/source/routing/self-hosted/containerization/gcp.mdx b/docs/source/routing/self-hosted/containerization/gcp.mdx index 551c7f9d68..5f12a5c830 100644 --- a/docs/source/routing/self-hosted/containerization/gcp.mdx +++ b/docs/source/routing/self-hosted/containerization/gcp.mdx @@ -4,16 +4,16 @@ subtitle: Deploy router with Google Cloud Run description: Build and deploy Apollo GraphOS Router or Apollo Router Core to Google Cloud Platform (GCP) with Google Cloud Run. --- -Learn how to deploy the router for development on Google Cloud Platform (GCP) with Cloud Run. +Learn how to deploy the router for development on Google Cloud Platform (GCP) with Google Cloud Run. You will: -- Build a router image with a Dockerfile. -- Set up an Azure Container Registry and push your router image to it. -- Create and deploy an Azure Container App for your router. +- Build a router image using a Dockerfile and a router configuration file. +- Set up a container registry and push your router image to it. +- Create a Cloud Run service and configure it to deploy your router. -Not deploying to GCP? Try our deployment guides for [AWS](/graphos/routing/self-hosted/containerization/aws) or [Azure](/graphos/routing/self-hosted/containerization/azure). +Not deploying to GCP? Try our router deployment guides for [AWS](/graphos/routing/self-hosted/containerization/aws) or [Azure](/graphos/routing/self-hosted/containerization/azure). @@ -22,20 +22,16 @@ Not deploying to GCP? Try our deployment guides for [AWS](/graphos/routing/self- Before you start: 1. [Set up a GraphQL API in GraphOS](/graphos/get-started/guides/graphql#step-1-set-up-your-graphql-api). - - Save your `APOLLO_KEY` and `APOLLO_GRAPH_REF`. You'll need them when deploying the router. + - Save your `APOLLO_KEY` and `APOLLO_GRAPH_REF` in your GCP Secret Manager. You'll need them when deploying the router. 1. Install [Docker](https://www.docker.com/get-started/) locally. -1. Create a new [Google Cloud account](https://cloud.google.com/) or go to an existing account. -1. Install the [gcloud CLI](https://cloud.google.com/sdk/docs/install), if not already installed, and log in to your GCP account. -1. Create a new project in GCP. - * Choose a project name (for example, `my-project`). Keep this name handy, as you'll need it later to build and run a router image. -1. In GCP, enable [Artifact Registry](https://cloud.google.com/artifact-registry/docs/enable-service) in your project. - * Create a repository and choose a repository name (for example, `my-repo`). Keep this name handy, as you'll need it later to build and deploy a router image. -1. In GCP Secret Manager, set `APOLLO_KEY` to your graph API key and `APOLLO_GRAPH_REF` to your graph ref. You'll need them later to deploy a router image. +1. Create a [GCP account](https://cloud.google.com/) or use an existing account. +1. Create a [GCP project](https://console.cloud.google.com/projectcreate). Choose a project name (for example, `my-project`) and save it to use later when deploying the router. +1. Install the [gcloud CLI](https://cloud.google.com/sdk/docs/install) and log in to your GCP account. 1. Choose a version of the router to deploy (for example, `v1.61.0`). You'll need it when specifying the router image to deploy. -## Build and push router image +## Build router image -After setting up Docker and GCP, build a router image with custom configuration, then push it to your GCP registry: +To deploy your own router, start by customizing and building a router image, using a Dockerfile and a router configuration file: 1. In a local directory, create a `router.yaml` file and copy-paste the following configuration into the file: @@ -46,9 +42,9 @@ After setting up Docker and GCP, build a router image with custom configuration, listen: 0.0.0.0:8088 ``` - Because the router's default HTTP and health check endpoint addresses are localhost and wouldn't be reachable when deployed, edit your `router.yaml` to configure these endpoints to listen to all addresses: + The router's default HTTP and health check endpoint addresses are localhost, so they wouldn't be reachable when deployed. This configuration enables the router to listen to all addresses. -1. Create a `Dockerfile` file and copy-paste the following into the file, where the container image of your chosen version of router is downloaded, and your customized `router.yaml` configuration file replaces the default router configuration file: +1. Create a `Dockerfile` file and copy-paste the following into the file: ```text showLineNumbers=false # Use the official Apollo Router Core image as the base. @@ -59,7 +55,9 @@ After setting up Docker and GCP, build a router image with custom configuration, COPY router.yaml /dist/config/router.yaml ``` -1. From the same local directory, run the following `docker` CLI command to build a new router image. Choose a name and tag for the image, for example `router-gcp:v1.61.0`. + The Dockerfile sources the base router image from the GitHub container registry, using the version of router you specify. It then copies your customized `router.yaml` configuration file to overwrite the default router configuration file. + +1. From the same local directory, use `docker buildx` CLI command to build a new router image. Choose a name and tag for the image, for example `router-gcp:v1.61.0`. ```bash showLineNumbers=false docker buildx build --platform linux/amd64 -t router-gcp:v1.61.0 --load . @@ -68,16 +66,27 @@ After setting up Docker and GCP, build a router image with custom configuration, - Because Cloud Run only supports AMD64-based images, the `docker buildx build --platform linux/amd64` command ensures the image is built for AMD64 and is compatible. - The `--load` option loads the built image to `docker images`. -1. Run `docker images` and validate that your router image was successfully built and loaded. +1. Use `docker images` to validate that your router image is successfully built and loaded. + +## Push router image to container registry + +With a router image built, set up GCP Artifact Registry, then tag and push your image to it. + +### Set up container registry + +1. In GCP, enable [Artifact Registry](https://cloud.google.com/artifact-registry/docs/enable-service) in your project. + - Create a repository and choose a repository name (for example, `my-repo`). Keep this name handy, as you'll need it later to build and deploy a router image. + +### Tag and push router image -1. Run `docker tag` to tag the image before pushing it to Artifact Registry. Make sure your tag conforms with Artifact Registry's [naming convention](https://cloud.google.com/artifact-registry/docs/docker/names) (for example, `us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0`). +1. Use `docker tag` to tag the image before pushing it to Artifact Registry. Make sure your tag conforms with Artifact Registry's [naming convention](https://cloud.google.com/artifact-registry/docs/docker/names) (for example, `us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0`). ```bash showLineNumbers=false docker tag router-gcp:v1.61.0 \ us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 ``` -1. Run `docker push` to push the router image to Artifact Registry. +1. Use `docker push` to push the router image to Artifact Registry. ```bash showLineNumbers=false docker push us-west2-docker.pkg.dev/my-project/my-repo/router-gcp:v1.61.0 @@ -89,7 +98,7 @@ After setting up Docker and GCP, build a router image with custom configuration, gcloud artifacts docker images list us-west2-docker.pkg.dev/my-project/my-repo ``` -## Configure and deploy router +## Create and deploy Cloud Run service With the router image pushed to GCP, you can now configure and deploy it as a Cloud Run service. @@ -105,23 +114,24 @@ You can use either Google Cloud console or gcloud CLI. In either case, you need ### Deploy with Google Cloud console 1. In GCP console for your project, go to Cloud Run and select **Deploy container** > **Service**. -1. On the **Create Service** page, update the following configurations: - * Set **Container image URL** to your tagged and pushed router image. - * Set **Service name** to a name for your deployed router (for example, `my-router`). - * Set **Region** to your GCP region. - * Set **Authentication** to **Allow unauthenticated invocations**. -1. On the **Container(s)** > **Edit Container** tab, go to the **Settings** tab and update the following configurations: - * Set **Container port** to `4000`. This port must match your router's configuration for `supergraph.listen`. - * Set **Container command** to `/dist/router`. - * (Optional) if running router in dev mode, set **Container arguments** to `--dev`. -1. Also on the **Container(s)** > **Edit Container** tab, go to the **Variables & Secrets** tab and add the following variables (either as environment variables or referenced secrets): - * Add `APOLLO_KEY` and set it to your graph API key. - * Add `APOLLO_GRAPH_REF` and set it to your graph ref. -1. Click **Deploy** to deploy the router. +1. On the **Create Service** page, fill in the details: + - **Container image URL**: Select your router image + - **Service name**: Enter a name for your deployed router (for example, `my-router`) + - **Region**: Select your GCP region + - **Authentication**: Select **Allow unauthenticated invocations**. +1. On the **Container(s)** > **Edit Container** tab, go to the **Settings** tab and fill in the details: + - **Container port**: Enter `4000` (must match the `supergraph.listen` port of your router configuration) + - **Container command**: Enter `/dist/router` + - **Container arguments**: Enter `--dev` (runs the router in development mode) +1. Also on the **Container(s)** > **Edit Container** tab, go to the **Variables & Secrets** and fill in the details: + * Add `APOLLO_KEY` and set it to your graph API key + * Add `APOLLO_GRAPH_REF` and set it to your graph ref +1. Click **Deploy**. +1. Once deployed, select the service from the [Cloud Run console](https://console.cloud.google.com/run), then click on its **URL** (for example, `https://my-router-123456789012.us-west1.run.app/`) and validate that router's development Sandbox is running successfully. ### Deploy with gcloud CLI -1. To deploy the router with the gcloud CLI, run the `gloucd run deploy` command, using your configuration info in place of the example info: +1. To deploy the router with the gcloud CLI, use `gcloud run deploy` with your configuration info in place of the example info: ```bash showLineNumbers=false gcloud run deploy my-router \ @@ -138,4 +148,14 @@ You can use either Google Cloud console or gcloud CLI. In either case, you need ```bash gcloud run services update-traffic my-router --to-latest ``` - \ No newline at end of file + +1. Use `gcloud run services` to get the service URL. For example, for a service named `my-router`: + + ```bash + gcloud run services describe my-router --format 'value(status.url)' + ``` + +1. In a browser, go to the service URL and validate the the router's development Sandbox is running successfully. + +Congrats, you've successfully deployed the router! + From c3337123b14adda4bf656ac15ef098ca153616bd Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 21 Apr 2025 11:21:59 -0700 Subject: [PATCH 11/47] DOC-358 draft config reference updates: separate reference and overview --- .../shared/router-config-properties-table.mdx | 10284 ++++++++++++++++ docs/shared/router-yaml-complete.mdx | 1096 ++ docs/source/routing/about-router.mdx | 2 +- .../source/routing/configuration/overview.mdx | 36 + .../reference.mdx} | 395 +- 5 files changed, 11553 insertions(+), 260 deletions(-) create mode 100644 docs/shared/router-config-properties-table.mdx create mode 100644 docs/shared/router-yaml-complete.mdx create mode 100644 docs/source/routing/configuration/overview.mdx rename docs/source/routing/{configuration.mdx => configuration/reference.mdx} (83%) diff --git a/docs/shared/router-config-properties-table.mdx b/docs/shared/router-config-properties-table.mdx new file mode 100644 index 0000000000..71eb92b2d2 --- /dev/null +++ b/docs/shared/router-config-properties-table.mdx @@ -0,0 +1,10284 @@ +# Router Configuration Properties + +### `apq` + +Automatic Persisted Queries (APQ) configuration + +- **Type:** `object` + +```yaml title="apq" +apq: + enabled: true + router: + cache: + in_memory: + limit: 1 + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: null + urls: + - http://example.com/urls_item + username: example_username + subgraph: + all: + enabled: false + subgraphs: {} +``` + + +--- + +### `apq.enabled` + +Activates Automatic Persisted Queries (enabled by default) + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="apq.enabled" +enabled: true +``` + + +--- + +### `apq.router` + +Router level (APQ) configuration + +- **Type:** `object` + +```yaml title="apq.router" +router: + cache: + in_memory: + limit: 1 + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: null + urls: + - http://example.com/urls_item + username: example_username +``` + + +--- + +### `apq.router.cache` + +Cache configuration + +- **Type:** `object` + +```yaml title="apq.router.cache" +cache: + in_memory: + limit: 1 + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: null + urls: + - http://example.com/urls_item + username: example_username +``` + + +--- + +### `apq.router.cache.in_memory` + +In memory cache configuration + +- **Type:** `object` + +```yaml title="apq.router.cache.in_memory" +in_memory: + limit: 1 +``` + + +--- + +### `apq.router.cache.in_memory.limit` + +Number of entries in the Least Recently Used cache + +- **Type:** `integer` +- **Minimum:** `1.0` + +```yaml title="apq.router.cache.in_memory.limit" +limit: 1 +``` + + +--- + +### `apq.router.cache.redis` + +Redis cache configuration + +- **Type:** `object` + +```yaml title="apq.router.cache.redis" +redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: null + urls: + - http://example.com/urls_item + username: example_username +``` + + +--- + +### `apq.router.cache.redis.namespace` + +namespace used to prefix Redis keys + +- **Type:** `string` + +```yaml title="apq.router.cache.redis.namespace" +namespace: example_namespace +``` + + +--- + +### `apq.router.cache.redis.password` + +Redis password if not provided in the URLs. This field takes precedence over the password in the URL + +- **Type:** `string` + +```yaml title="apq.router.cache.redis.password" +password: example_password +``` + + +--- + +### `apq.router.cache.redis.pool_size` + +The size of the Redis connection pool + +- **Type:** `integer` +- **Default:** `1` +- **Minimum:** `0.0` + +```yaml title="apq.router.cache.redis.pool_size" +pool_size: 1 +``` + + +--- + +### `apq.router.cache.redis.required_to_start` + +Prevents the router from starting if it cannot connect to Redis + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="apq.router.cache.redis.required_to_start" +required_to_start: false +``` + + +--- + +### `apq.router.cache.redis.reset_ttl` + +When a TTL is set on a key, reset it when reading the data from that key + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="apq.router.cache.redis.reset_ttl" +reset_ttl: true +``` + + +--- + +### `apq.router.cache.redis.timeout` + +Redis request timeout (default: 2ms) + +- **Type:** `string` +- **Default:** `None` + +```yaml title="apq.router.cache.redis.timeout" +timeout: null +``` + + +--- + +### `apq.router.cache.redis.tls` + +Configuration options pertaining to the subgraph server component. + +- **Type:** `object` + +```yaml title="apq.router.cache.redis.tls" +tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key +``` + + +--- + +### `apq.router.cache.redis.ttl` + +TTL for entries + +- **Type:** `string` +- **Default:** `None` + +```yaml title="apq.router.cache.redis.ttl" +ttl: null +``` + + +--- + +### `apq.router.cache.redis.urls` + +List of URLs to the Redis cluster + +- **Type:** `array` + +```yaml title="apq.router.cache.redis.urls" +urls: +- http://example.com/urls_item +``` + + +--- + +### `apq.router.cache.redis.username` + +Redis username if not provided in the URLs. This field takes precedence over the username in the URL + +- **Type:** `string` + +```yaml title="apq.router.cache.redis.username" +username: example_username +``` + + +--- + +### `apq.subgraph` + +Configuration options pertaining to the subgraph server component. + +- **Type:** `object` + +```yaml title="apq.subgraph" +subgraph: + all: + enabled: false + subgraphs: {} +``` + + +--- + +### `apq.subgraph.all` + +Subgraph level Automatic Persisted Queries (APQ) configuration + +- **Type:** `object` + +```yaml title="apq.subgraph.all" +all: + enabled: false +``` + + +--- + +### `apq.subgraph.all.enabled` + +Enable + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="apq.subgraph.all.enabled" +enabled: false +``` + + +--- + +### `apq.subgraph.subgraphs` + +per subgraph options + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="apq.subgraph.subgraphs" +subgraphs: {} +``` + + +--- + +### `authentication` + +Authentication + +- **Type:** `object` + +```yaml title="authentication" +authentication: + connector: + sources: {} + router: + jwt: + header_name: authorization + header_value_prefix: Bearer + ignore_other_prefixes: false + jwks: + - algorithms: null + headers: + - name: example_name + value: example_value + issuer: example_issuer + poll_interval: + nanos: 0 + secs: 60 + url: http://service.example.com/url + on_error: Continue + sources: + - name: authorization + type: header + value_prefix: Bearer + subgraph: + all: + aws_sig_v4: + hardcoded: + access_key_id: example_access_key_id + assume_role: + external_id: example_external_id + role_arn: example_role_arn + session_name: example_session_name + region: example_region + secret_access_key: example_secret_access_key + service_name: example_service_name + subgraphs: {} +``` + + +--- + +### `authentication.connector` + +Configure connector authentication + +- **Type:** `object` + +```yaml title="authentication.connector" +connector: + sources: {} +``` + + +--- + +### `authentication.connector.sources` + +Create a configuration that will apply only to a specific source. + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="authentication.connector.sources" +sources: {} +``` + + +--- + +### `authentication.router` + +- **Type:** `object` + +```yaml title="authentication.router" +router: + jwt: + header_name: authorization + header_value_prefix: Bearer + ignore_other_prefixes: false + jwks: + - algorithms: null + headers: + - name: example_name + value: example_value + issuer: example_issuer + poll_interval: + nanos: 0 + secs: 60 + url: http://service.example.com/url + on_error: Continue + sources: + - name: authorization + type: header + value_prefix: Bearer +``` + + +--- + +### `authentication.router.jwt` + +- **Type:** `object` + +```yaml title="authentication.router.jwt" +jwt: + header_name: authorization + header_value_prefix: Bearer + ignore_other_prefixes: false + jwks: + - algorithms: null + headers: + - name: example_name + value: example_value + issuer: example_issuer + poll_interval: + nanos: 0 + secs: 60 + url: http://service.example.com/url + on_error: Continue + sources: + - name: authorization + type: header + value_prefix: Bearer +``` + + +--- + +### `authentication.router.jwt.header_name` + +HTTP header expected to contain JWT + +- **Type:** `string` +- **Default:** `'authorization'` + +```yaml title="authentication.router.jwt.header_name" +header_name: authorization +``` + + +--- + +### `authentication.router.jwt.header_value_prefix` + +Header value prefix + +- **Type:** `string` +- **Default:** `'Bearer'` + +```yaml title="authentication.router.jwt.header_value_prefix" +header_value_prefix: Bearer +``` + + +--- + +### `authentication.router.jwt.ignore_other_prefixes` + +Whether to ignore any mismatched prefixes + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="authentication.router.jwt.ignore_other_prefixes" +ignore_other_prefixes: false +``` + + +--- + +### `authentication.router.jwt.jwks` + +List of JWKS used to verify tokens + +- **Type:** `array` + +```yaml title="authentication.router.jwt.jwks" +jwks: +- algorithms: null + headers: + - name: example_name + value: example_value + issuer: example_issuer + poll_interval: + nanos: 0 + secs: 60 + url: http://service.example.com/url +``` + + +--- + +### `authentication.router.jwt.on_error` + +- **Type:** `string` +- **Enum:** `Continue`, `Error` + +```yaml title="authentication.router.jwt.on_error" +on_error: Continue +``` + + +--- + +### `authentication.router.jwt.sources` + +Alternative sources to extract the JWT + +- **Type:** `array` + +```yaml title="authentication.router.jwt.sources" +sources: +- name: authorization + type: header + value_prefix: Bearer +``` + + +--- + +### `authentication.subgraph` + +Configure subgraph authentication + +- **Type:** `object` + +```yaml title="authentication.subgraph" +subgraph: + all: + aws_sig_v4: + hardcoded: + access_key_id: example_access_key_id + assume_role: + external_id: example_external_id + role_arn: example_role_arn + session_name: example_session_name + region: example_region + secret_access_key: example_secret_access_key + service_name: example_service_name + subgraphs: {} +``` + + +--- + +### `authentication.subgraph.all` + +- **Type:** `any` + +```yaml title="authentication.subgraph.all" +all: + aws_sig_v4: + hardcoded: + access_key_id: example_access_key_id + assume_role: + external_id: example_external_id + role_arn: example_role_arn + session_name: example_session_name + region: example_region + secret_access_key: example_secret_access_key + service_name: example_service_name +``` + + +--- + +### `authentication.subgraph.subgraphs` + +Create a configuration that will apply only to a specific subgraph. + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="authentication.subgraph.subgraphs" +subgraphs: {} +``` + + +--- + +### `authorization` + +Authorization plugin + +- **Type:** `object` + +```yaml title="authorization" +authorization: + directives: + dry_run: false + enabled: true + errors: + log: true + response: errors + reject_unauthorized: false + require_authentication: false +``` + + +--- + +### `authorization.directives` + +- **Type:** `object` + +```yaml title="authorization.directives" +directives: + dry_run: false + enabled: true + errors: + log: true + response: errors + reject_unauthorized: false +``` + + +--- + +### `authorization.directives.dry_run` + +generates the authorization error messages without modying the query + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="authorization.directives.dry_run" +dry_run: false +``` + + +--- + +### `authorization.directives.enabled` + +enables the `@authenticated` and `@requiresScopes` directives + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="authorization.directives.enabled" +enabled: true +``` + + +--- + +### `authorization.directives.errors` + +- **Type:** `object` + +```yaml title="authorization.directives.errors" +errors: + log: true + response: errors +``` + + +--- + +### `authorization.directives.errors.log` + +log authorization errors + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="authorization.directives.errors.log" +log: true +``` + + +--- + +### `authorization.directives.errors.response` + +- **Type:** `any` + +```yaml title="authorization.directives.errors.response" +response: errors +``` + + +--- + +### `authorization.directives.reject_unauthorized` + +refuse a query entirely if any part would be filtered + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="authorization.directives.reject_unauthorized" +reject_unauthorized: false +``` + + +--- + +### `authorization.require_authentication` + +Reject unauthenticated requests + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="authorization.require_authentication" +require_authentication: false +``` + + +--- + +### `batching` + +Configuration for Batching + +- **Type:** `object` + +```yaml title="batching" +batching: + enabled: false + maximum_size: null + mode: batch_http_link + subgraph: + all: + enabled: false + subgraphs: {} +``` + + +--- + +### `batching.enabled` + +Activates Batching (disabled by default) + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="batching.enabled" +enabled: false +``` + + +--- + +### `batching.maximum_size` + +Maximum size for a batch + +- **Type:** `integer` +- **Default:** `None` +- **Minimum:** `0.0` + +```yaml title="batching.maximum_size" +maximum_size: null +``` + + +--- + +### `batching.mode` + +- **Type:** `any` + +```yaml title="batching.mode" +mode: batch_http_link +``` + + +--- + +### `batching.subgraph` + +Configuration options pertaining to the subgraph server component. + +- **Type:** `object` + +```yaml title="batching.subgraph" +subgraph: + all: + enabled: false + subgraphs: {} +``` + + +--- + +### `batching.subgraph.all` + +Common options for configuring subgraph batching + +- **Type:** `object` + +```yaml title="batching.subgraph.all" +all: + enabled: false +``` + + +--- + +### `batching.subgraph.all.enabled` + +Whether this batching config should be enabled + +- **Type:** `boolean` + +```yaml title="batching.subgraph.all.enabled" +enabled: false +``` + + +--- + +### `batching.subgraph.subgraphs` + +per subgraph options + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="batching.subgraph.subgraphs" +subgraphs: {} +``` + + +--- + +### `connectors` + +- **Type:** `object` + +```yaml title="connectors" +connectors: + debug_extensions: false + expose_sources_in_context: false + max_requests_per_operation_per_source: null + sources: {} + subgraphs: {} +``` + + +--- + +### `connectors.debug_extensions` + +Enables connector debugging information on response extensions if the feature is enabled + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="connectors.debug_extensions" +debug_extensions: false +``` + + +--- + +### `connectors.expose_sources_in_context` + +When enabled, adds an entry to the context for use in coprocessors ```json { "context": { "entries": { "apollo_connectors::sources_in_query_plan": [ { "subgraph_name": "subgraph", "source_name": "source" } ] } } } ``` + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="connectors.expose_sources_in_context" +expose_sources_in_context: false +``` + + +--- + +### `connectors.max_requests_per_operation_per_source` + +The maximum number of requests for a connector source + +- **Type:** `integer` +- **Default:** `None` +- **Minimum:** `0.0` + +```yaml title="connectors.max_requests_per_operation_per_source" +max_requests_per_operation_per_source: null +``` + + +--- + +### `connectors.sources` + +Map of subgraph_name.connector_source_name to source configuration + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="connectors.sources" +sources: {} +``` + + +--- + +### `connectors.subgraphs` + +A map of subgraph name to connectors config for that subgraph + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="connectors.subgraphs" +subgraphs: {} +``` + + +--- + +### `coprocessor` + +Configures the externalization plugin + +- **Type:** `object` + +```yaml title="coprocessor" +coprocessor: + client: + dns_resolution_strategy: ipv4_only + experimental_http2: enable + execution: + request: + body: false + context: false + headers: false + method: false + query_plan: false + sdl: false + response: + body: false + context: false + headers: false + sdl: false + status_code: false + router: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + path: false + sdl: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + sdl: false + status_code: false + subgraph: + all: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + service_name: false + subgraph_request_id: false + uri: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + service_name: false + status_code: false + subgraph_request_id: false + supergraph: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + sdl: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + sdl: false + status_code: false + timeout: + nanos: 0 + secs: 1 + url: http://service.example.com/url +``` + + +--- + +### `coprocessor.client` + +- **Type:** `object` + +```yaml title="coprocessor.client" +client: + dns_resolution_strategy: ipv4_only + experimental_http2: enable +``` + + +--- + +### `coprocessor.client.dns_resolution_strategy` + +- **Type:** `any` + +```yaml title="coprocessor.client.dns_resolution_strategy" +dns_resolution_strategy: ipv4_only +``` + + +--- + +### `coprocessor.client.experimental_http2` + +- **Type:** `any` + +```yaml title="coprocessor.client.experimental_http2" +experimental_http2: enable +``` + + +--- + +### `coprocessor.execution` + +- **Type:** `object` + +```yaml title="coprocessor.execution" +execution: + request: + body: false + context: false + headers: false + method: false + query_plan: false + sdl: false + response: + body: false + context: false + headers: false + sdl: false + status_code: false +``` + + +--- + +### `coprocessor.execution.request` + +What information is passed to a router request/response stage + +- **Type:** `object` + +```yaml title="coprocessor.execution.request" +request: + body: false + context: false + headers: false + method: false + query_plan: false + sdl: false +``` + + +--- + +### `coprocessor.execution.request.body` + +Send the body + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.execution.request.body" +body: false +``` + + +--- + +### `coprocessor.execution.request.context` + +Configures the context + +- **Type:** `any` + +```yaml title="coprocessor.execution.request.context" +context: false +``` + + +--- + +### `coprocessor.execution.request.headers` + +Send the headers + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.execution.request.headers" +headers: false +``` + + +--- + +### `coprocessor.execution.request.method` + +Send the method + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.execution.request.method" +method: false +``` + + +--- + +### `coprocessor.execution.request.query_plan` + +Send the query plan + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.execution.request.query_plan" +query_plan: false +``` + + +--- + +### `coprocessor.execution.request.sdl` + +Send the SDL + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.execution.request.sdl" +sdl: false +``` + + +--- + +### `coprocessor.execution.response` + +What information is passed to a router request/response stage + +- **Type:** `object` + +```yaml title="coprocessor.execution.response" +response: + body: false + context: false + headers: false + sdl: false + status_code: false +``` + + +--- + +### `coprocessor.execution.response.body` + +Send the body + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.execution.response.body" +body: false +``` + + +--- + +### `coprocessor.execution.response.context` + +Configures the context + +- **Type:** `any` + +```yaml title="coprocessor.execution.response.context" +context: false +``` + + +--- + +### `coprocessor.execution.response.headers` + +Send the headers + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.execution.response.headers" +headers: false +``` + + +--- + +### `coprocessor.execution.response.sdl` + +Send the SDL + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.execution.response.sdl" +sdl: false +``` + + +--- + +### `coprocessor.execution.response.status_code` + +Send the HTTP status + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.execution.response.status_code" +status_code: false +``` + + +--- + +### `coprocessor.router` + +- **Type:** `object` + +```yaml title="coprocessor.router" +router: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + path: false + sdl: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + sdl: false + status_code: false +``` + + +--- + +### `coprocessor.router.request` + +What information is passed to a router request/response stage + +- **Type:** `object` + +```yaml title="coprocessor.router.request" +request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + path: false + sdl: false +``` + + +--- + +### `coprocessor.router.request.body` + +Send the body + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.router.request.body" +body: false +``` + + +--- + +### `coprocessor.router.request.condition` + +- **Type:** `any` + +```yaml title="coprocessor.router.request.condition" +condition: + eq: + - false + - false +``` + + +--- + +### `coprocessor.router.request.context` + +Configures the context + +- **Type:** `any` + +```yaml title="coprocessor.router.request.context" +context: false +``` + + +--- + +### `coprocessor.router.request.headers` + +Send the headers + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.router.request.headers" +headers: false +``` + + +--- + +### `coprocessor.router.request.method` + +Send the method + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.router.request.method" +method: false +``` + + +--- + +### `coprocessor.router.request.path` + +Send the path + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.router.request.path" +path: false +``` + + +--- + +### `coprocessor.router.request.sdl` + +Send the SDL + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.router.request.sdl" +sdl: false +``` + + +--- + +### `coprocessor.router.response` + +What information is passed to a router request/response stage + +- **Type:** `object` + +```yaml title="coprocessor.router.response" +response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + sdl: false + status_code: false +``` + + +--- + +### `coprocessor.router.response.body` + +Send the body + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.router.response.body" +body: false +``` + + +--- + +### `coprocessor.router.response.condition` + +- **Type:** `any` + +```yaml title="coprocessor.router.response.condition" +condition: + eq: + - false + - false +``` + + +--- + +### `coprocessor.router.response.context` + +Configures the context + +- **Type:** `any` + +```yaml title="coprocessor.router.response.context" +context: false +``` + + +--- + +### `coprocessor.router.response.headers` + +Send the headers + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.router.response.headers" +headers: false +``` + + +--- + +### `coprocessor.router.response.sdl` + +Send the SDL + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.router.response.sdl" +sdl: false +``` + + +--- + +### `coprocessor.router.response.status_code` + +Send the HTTP status + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.router.response.status_code" +status_code: false +``` + + +--- + +### `coprocessor.subgraph` + +What information is passed to a subgraph request/response stage + +- **Type:** `object` + +```yaml title="coprocessor.subgraph" +subgraph: + all: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + service_name: false + subgraph_request_id: false + uri: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + service_name: false + status_code: false + subgraph_request_id: false +``` + + +--- + +### `coprocessor.subgraph.all` + +What information is passed to a subgraph request/response stage + +- **Type:** `object` + +```yaml title="coprocessor.subgraph.all" +all: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + service_name: false + subgraph_request_id: false + uri: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + service_name: false + status_code: false + subgraph_request_id: false +``` + + +--- + +### `coprocessor.subgraph.all.request` + +What information is passed to a subgraph request/response stage + +- **Type:** `object` + +```yaml title="coprocessor.subgraph.all.request" +request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + service_name: false + subgraph_request_id: false + uri: false +``` + + +--- + +### `coprocessor.subgraph.all.request.body` + +Send the body + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.subgraph.all.request.body" +body: false +``` + + +--- + +### `coprocessor.subgraph.all.request.condition` + +- **Type:** `any` + +```yaml title="coprocessor.subgraph.all.request.condition" +condition: + eq: + - false + - false +``` + + +--- + +### `coprocessor.subgraph.all.request.context` + +Configures the context + +- **Type:** `any` + +```yaml title="coprocessor.subgraph.all.request.context" +context: false +``` + + +--- + +### `coprocessor.subgraph.all.request.headers` + +Send the headers + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.subgraph.all.request.headers" +headers: false +``` + + +--- + +### `coprocessor.subgraph.all.request.method` + +Send the method URI + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.subgraph.all.request.method" +method: false +``` + + +--- + +### `coprocessor.subgraph.all.request.service_name` + +Send the service name + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.subgraph.all.request.service_name" +service_name: false +``` + + +--- + +### `coprocessor.subgraph.all.request.subgraph_request_id` + +Send the subgraph request id + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.subgraph.all.request.subgraph_request_id" +subgraph_request_id: false +``` + + +--- + +### `coprocessor.subgraph.all.request.uri` + +Send the subgraph URI + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.subgraph.all.request.uri" +uri: false +``` + + +--- + +### `coprocessor.subgraph.all.response` + +What information is passed to a subgraph request/response stage + +- **Type:** `object` + +```yaml title="coprocessor.subgraph.all.response" +response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + service_name: false + status_code: false + subgraph_request_id: false +``` + + +--- + +### `coprocessor.subgraph.all.response.body` + +Send the body + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.subgraph.all.response.body" +body: false +``` + + +--- + +### `coprocessor.subgraph.all.response.condition` + +- **Type:** `any` + +```yaml title="coprocessor.subgraph.all.response.condition" +condition: + eq: + - false + - false +``` + + +--- + +### `coprocessor.subgraph.all.response.context` + +Configures the context + +- **Type:** `any` + +```yaml title="coprocessor.subgraph.all.response.context" +context: false +``` + + +--- + +### `coprocessor.subgraph.all.response.headers` + +Send the headers + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.subgraph.all.response.headers" +headers: false +``` + + +--- + +### `coprocessor.subgraph.all.response.service_name` + +Send the service name + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.subgraph.all.response.service_name" +service_name: false +``` + + +--- + +### `coprocessor.subgraph.all.response.status_code` + +Send the http status + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.subgraph.all.response.status_code" +status_code: false +``` + + +--- + +### `coprocessor.subgraph.all.response.subgraph_request_id` + +Send the subgraph request id + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.subgraph.all.response.subgraph_request_id" +subgraph_request_id: false +``` + + +--- + +### `coprocessor.supergraph` + +- **Type:** `object` + +```yaml title="coprocessor.supergraph" +supergraph: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + sdl: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + sdl: false + status_code: false +``` + + +--- + +### `coprocessor.supergraph.request` + +What information is passed to a router request/response stage + +- **Type:** `object` + +```yaml title="coprocessor.supergraph.request" +request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + sdl: false +``` + + +--- + +### `coprocessor.supergraph.request.body` + +Send the body + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.supergraph.request.body" +body: false +``` + + +--- + +### `coprocessor.supergraph.request.condition` + +- **Type:** `any` + +```yaml title="coprocessor.supergraph.request.condition" +condition: + eq: + - false + - false +``` + + +--- + +### `coprocessor.supergraph.request.context` + +Configures the context + +- **Type:** `any` + +```yaml title="coprocessor.supergraph.request.context" +context: false +``` + + +--- + +### `coprocessor.supergraph.request.headers` + +Send the headers + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.supergraph.request.headers" +headers: false +``` + + +--- + +### `coprocessor.supergraph.request.method` + +Send the method + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.supergraph.request.method" +method: false +``` + + +--- + +### `coprocessor.supergraph.request.sdl` + +Send the SDL + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.supergraph.request.sdl" +sdl: false +``` + + +--- + +### `coprocessor.supergraph.response` + +What information is passed to a router request/response stage + +- **Type:** `object` + +```yaml title="coprocessor.supergraph.response" +response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + sdl: false + status_code: false +``` + + +--- + +### `coprocessor.supergraph.response.body` + +Send the body + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.supergraph.response.body" +body: false +``` + + +--- + +### `coprocessor.supergraph.response.condition` + +- **Type:** `any` + +```yaml title="coprocessor.supergraph.response.condition" +condition: + eq: + - false + - false +``` + + +--- + +### `coprocessor.supergraph.response.context` + +Configures the context + +- **Type:** `any` + +```yaml title="coprocessor.supergraph.response.context" +context: false +``` + + +--- + +### `coprocessor.supergraph.response.headers` + +Send the headers + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.supergraph.response.headers" +headers: false +``` + + +--- + +### `coprocessor.supergraph.response.sdl` + +Send the SDL + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.supergraph.response.sdl" +sdl: false +``` + + +--- + +### `coprocessor.supergraph.response.status_code` + +Send the HTTP status + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="coprocessor.supergraph.response.status_code" +status_code: false +``` + + +--- + +### `coprocessor.timeout` + +The timeout for external requests + +- **Type:** `string` +- **Default:** `{"secs": 1, "nanos": 0}` + +```yaml title="coprocessor.timeout" +timeout: + nanos: 0 + secs: 1 +``` + + +--- + +### `coprocessor.url` + +The url you'd like to offload processing to + +- **Type:** `string` + +```yaml title="coprocessor.url" +url: http://service.example.com/url +``` + + +--- + +### `cors` + +Cross origin request configuration. + +- **Type:** `object` + +```yaml title="cors" +cors: + allow_any_origin: false + allow_credentials: false + allow_headers: [] + expose_headers: null + match_origins: null + max_age: null + methods: + - GET + - POST + - OPTIONS + origins: + - https://studio.apollographql.com +``` + + +--- + +### `cors.allow_any_origin` + +Set to true to allow any origin. + +Defaults to false Having this set to true is the only way to allow Origin: null. + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="cors.allow_any_origin" +allow_any_origin: false +``` + + +--- + +### `cors.allow_credentials` + +Set to true to add the `Access-Control-Allow-Credentials` header. + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="cors.allow_credentials" +allow_credentials: false +``` + + +--- + +### `cors.allow_headers` + +The headers to allow. + +If this value is not set, the router will mirror client's `Access-Control-Request-Headers`. + +Note that if you set headers here, you also want to have a look at your `CSRF` plugins configuration, and make sure you either: - accept `x-apollo-operation-name` AND / OR `apollo-require-preflight` - defined `csrf` required headers in your yml configuration, as shown in the `examples/cors-and-csrf/custom-headers.router.yaml` files. + +- **Type:** `array` +- **Default:** `[]` + +```yaml title="cors.allow_headers" +allow_headers: [] +``` + + +--- + +### `cors.expose_headers` + +Which response headers should be made available to scripts running in the browser, in response to a cross-origin request. + +- **Type:** `array` +- **Default:** `None` + +```yaml title="cors.expose_headers" +expose_headers: null +``` + + +--- + +### `cors.match_origins` + +`Regex`es you want to match the origins against to determine if they're allowed. Defaults to an empty list. Note that `origins` will be evaluated before `match_origins` + +- **Type:** `array` +- **Default:** `None` + +```yaml title="cors.match_origins" +match_origins: null +``` + + +--- + +### `cors.max_age` + +The `Access-Control-Max-Age` header value in time units + +- **Type:** `string` +- **Default:** `None` + +```yaml title="cors.max_age" +max_age: null +``` + + +--- + +### `cors.methods` + +Allowed request methods. Defaults to GET, POST, OPTIONS. + +- **Type:** `array` +- **Default:** `["GET", "POST", "OPTIONS"]` + +```yaml title="cors.methods" +methods: +- GET +- POST +- OPTIONS +``` + + +--- + +### `cors.origins` + +The origin(s) to allow requests from. Defaults to `https://studio.apollographql.com/` for Apollo Studio. + +- **Type:** `array` +- **Default:** `["https://studio.apollographql.com"]` + +```yaml title="cors.origins" +origins: +- https://studio.apollographql.com +``` + + +--- + +### `csrf` + +CSRF protection configuration. + +See https://owasp.org/www-community/attacks/csrf for an explanation on CSRF attacks. + +- **Type:** `object` + +```yaml title="csrf" +csrf: + required_headers: + - x-apollo-operation-name + - apollo-require-preflight + unsafe_disabled: false +``` + + +--- + +### `csrf.required_headers` + +Override the headers to check for by setting custom_headers Note that if you set required_headers here, you may also want to have a look at your `CORS` configuration, and make sure you either: - did not set any `allow_headers` list (so it defaults to `mirror_request`) - added your required headers to the allow_headers list, as shown in the `examples/cors-and-csrf/custom-headers.router.yaml` files. + +- **Type:** `array` +- **Default:** `["x-apollo-operation-name", "apollo-require-preflight"]` + +```yaml title="csrf.required_headers" +required_headers: +- x-apollo-operation-name +- apollo-require-preflight +``` + + +--- + +### `csrf.unsafe_disabled` + +The CSRF plugin is enabled by default. + +Setting `unsafe_disabled: true` *disables* CSRF protection. + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="csrf.unsafe_disabled" +unsafe_disabled: false +``` + + +--- + +### `demand_control` + +Demand control configuration + +- **Type:** `object` + +```yaml title="demand_control" +demand_control: + enabled: false + mode: measure + strategy: + static_estimated: + list_size: 0 + max: 0.0 +``` + + +--- + +### `demand_control.enabled` + +Enable demand control + +- **Type:** `boolean` + +```yaml title="demand_control.enabled" +enabled: false +``` + + +--- + +### `demand_control.mode` + +- **Type:** `string` +- **Enum:** `measure`, `enforce` + +```yaml title="demand_control.mode" +mode: measure +``` + + +--- + +### `demand_control.strategy` + +Algorithm for calculating the cost of an incoming query. + +- **Type:** `any` + +```yaml title="demand_control.strategy" +strategy: + static_estimated: + list_size: 0 + max: 0.0 +``` + + +--- + +### `experimental_chaos` + +Configuration for chaos testing, trying to reproduce bugs that require uncommon conditions. You probably don’t want this in production! + +- **Type:** `object` + +```yaml title="experimental_chaos" +experimental_chaos: + force_reload: null +``` + + +--- + +### `experimental_chaos.force_reload` + +Force a hot reload of the Router (as if the schema or configuration had changed) at a regular time interval. + +- **Type:** `string` +- **Default:** `None` + +```yaml title="experimental_chaos.force_reload" +force_reload: null +``` + + +--- + +### `experimental_type_conditioned_fetching` + +Type conditioned fetching configuration. + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="experimental_type_conditioned_fetching" +experimental_type_conditioned_fetching: false +``` + + +--- + +### `fleet_detector` + +- **Type:** `object` + +```yaml title="fleet_detector" +fleet_detector: {} +``` + + +--- + +### `forbid_mutations` + +Forbid mutations configuration + +- **Type:** `boolean` + +```yaml title="forbid_mutations" +forbid_mutations: false +``` + + +--- + +### `headers` + +Configuration for header propagation + +- **Type:** `object` + +```yaml title="headers" +headers: + all: + request: + - insert: + name: example_name + value: example_value + subgraphs: {} +``` + + +--- + +### `headers.all` + +- **Type:** `object` + +```yaml title="headers.all" +all: + request: + - insert: + name: example_name + value: example_value +``` + + +--- + +### `headers.all.request` + +Propagate/Insert/Remove headers from request + +- **Type:** `array` + +```yaml title="headers.all.request" +request: +- insert: + name: example_name + value: example_value +``` + + +--- + +### `headers.subgraphs` + +Rules to specific subgraphs + +- **Type:** `object` + +```yaml title="headers.subgraphs" +subgraphs: {} +``` + + +--- + +### `health_check` + +Configuration options pertaining to the health component. + +- **Type:** `object` + +```yaml title="health_check" +health_check: + enabled: true + listen: example_listen + path: /health + readiness: + allowed: 100 + interval: + sampling: 0s + unready: null +``` + + +--- + +### `health_check.enabled` + +Set to false to disable the health check + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="health_check.enabled" +enabled: true +``` + + +--- + +### `health_check.listen` + +Listening address. + +- **Type:** `any` + +```yaml title="health_check.listen" +listen: example_listen +``` + + +--- + +### `health_check.path` + +Optionally set a custom healthcheck path Defaults to /health + +- **Type:** `string` +- **Default:** `'/health'` + +```yaml title="health_check.path" +path: /health +``` + + +--- + +### `health_check.readiness` + +Configuration options pertaining to the readiness health sub-component. + +- **Type:** `object` + +```yaml title="health_check.readiness" +readiness: + allowed: 100 + interval: + sampling: 0s + unready: null +``` + + +--- + +### `health_check.readiness.allowed` + +How many rejections are allowed in an interval (default: 100) If this number is exceeded, the router will start to report unready. + +- **Type:** `integer` +- **Default:** `100` +- **Minimum:** `0.0` + +```yaml title="health_check.readiness.allowed" +allowed: 100 +``` + + +--- + +### `health_check.readiness.interval` + +Configuration options pertaining to the readiness health interval sub-component. + +- **Type:** `object` + +```yaml title="health_check.readiness.interval" +interval: + sampling: 0s + unready: null +``` + + +--- + +### `health_check.readiness.interval.sampling` + +The sampling interval (default: 5s) + +- **Type:** `string` +- **Default:** `'0s'` + +```yaml title="health_check.readiness.interval.sampling" +sampling: 0s +``` + + +--- + +### `health_check.readiness.interval.unready` + +The unready interval (default: 2 * sampling interval) + +- **Type:** `string` +- **Default:** `None` + +```yaml title="health_check.readiness.interval.unready" +unready: null +``` + + +--- + +### `homepage` + +Configuration options pertaining to the home page. + +- **Type:** `object` + +```yaml title="homepage" +homepage: + enabled: true + graph_ref: null +``` + + +--- + +### `homepage.enabled` + +Set to false to disable the homepage + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="homepage.enabled" +enabled: true +``` + + +--- + +### `homepage.graph_ref` + +Graph reference This will allow you to redirect from the Apollo Router landing page back to Apollo Studio Explorer + +- **Type:** `string` +- **Default:** `None` + +```yaml title="homepage.graph_ref" +graph_ref: null +``` + + +--- + +### `include_subgraph_errors` + +Configuration for exposing errors that originate from subgraphs + +- **Type:** `object` + +```yaml title="include_subgraph_errors" +include_subgraph_errors: + all: false + subgraphs: {} +``` + + +--- + +### `include_subgraph_errors.all` + +Include errors from all subgraphs + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="include_subgraph_errors.all" +all: false +``` + + +--- + +### `include_subgraph_errors.subgraphs` + +Include errors from specific subgraphs + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="include_subgraph_errors.subgraphs" +subgraphs: {} +``` + + +--- + +### `license_enforcement` + +- **Type:** `object` + +```yaml title="license_enforcement" +license_enforcement: {} +``` + + +--- + +### `limits` + +Configuration for operation limits, parser limits, HTTP limits, etc. + +- **Type:** `object` + +```yaml title="limits" +limits: + http1_max_request_buf_size: null + http1_max_request_headers: null + http_max_request_bytes: 2000000 + introspection_max_depth: true + max_aliases: null + max_depth: null + max_height: null + max_root_fields: null + parser_max_recursion: 500 + parser_max_tokens: 15000 + warn_only: false +``` + + +--- + +### `limits.http1_max_request_buf_size` + +Limit the maximum buffer size for the HTTP1 connection. + +Default is ~400kib. + +- **Type:** `string` +- **Default:** `None` + +```yaml title="limits.http1_max_request_buf_size" +http1_max_request_buf_size: null +``` + + +--- + +### `limits.http1_max_request_headers` + +Limit the maximum number of headers of incoming HTTP1 requests. Default is 100. + +If router receives more headers than the buffer size, it responds to the client with "431 Request Header Fields Too Large". + +- **Type:** `integer` +- **Default:** `None` +- **Minimum:** `0.0` + +```yaml title="limits.http1_max_request_headers" +http1_max_request_headers: null +``` + + +--- + +### `limits.http_max_request_bytes` + +Limit the size of incoming HTTP requests read from the network, to protect against running out of memory. Default: 2000000 (2 MB) + +- **Type:** `integer` +- **Default:** `2000000` +- **Minimum:** `0.0` + +```yaml title="limits.http_max_request_bytes" +http_max_request_bytes: 2000000 +``` + + +--- + +### `limits.introspection_max_depth` + +Limit the depth of nested list fields in introspection queries to protect avoid generating huge responses. Returns a GraphQL error with `{ message: "Maximum introspection depth exceeded" }` when nested fields exceed the limit. Default: true + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="limits.introspection_max_depth" +introspection_max_depth: true +``` + + +--- + +### `limits.max_aliases` + +If set, requests with operations with more aliases than this maximum are rejected with a HTTP 400 Bad Request response and GraphQL error with `"extensions": {"code": "MAX_ALIASES_LIMIT"}` + +- **Type:** `integer` +- **Default:** `None` +- **Minimum:** `0.0` + +```yaml title="limits.max_aliases" +max_aliases: null +``` + + +--- + +### `limits.max_depth` + +If set, requests with operations deeper than this maximum are rejected with a HTTP 400 Bad Request response and GraphQL error with `"extensions": {"code": "MAX_DEPTH_LIMIT"}` + +Counts depth of an operation, looking at its selection sets,˛ including fields in fragments and inline fragments. The following example has a depth of 3. + +```graphql +query getProduct { + book { + # 1 ...bookDetails + } +} + +fragment bookDetails on Book { + details { + # 2 ... on ProductDetailsBook + { country # 3 } } } +``` + +- **Type:** `integer` +- **Default:** `None` +- **Minimum:** `0.0` + +```yaml title="limits.max_depth" +max_depth: null +``` + + +--- + +### `limits.max_height` + +If set, requests with operations higher than this maximum are rejected with a HTTP 400 Bad Request response and GraphQL error with `"extensions": {"code": "MAX_DEPTH_LIMIT"}` + +Height is based on simple merging of fields using the same name or alias, but only within the same selection set. For example `name` here is only counted once and the query has height 3, not 4: + +```graphql +query { name { first } name { last } } +``` + +This may change in a future version of Apollo Router to do [full field merging across fragments](https://spec.graphql.org/October2021/#sec-Field-Selection-Merging) instead. + +- **Type:** `integer` +- **Default:** `None` +- **Minimum:** `0.0` + +```yaml title="limits.max_height" +max_height: null +``` + + +--- + +### `limits.max_root_fields` + +If set, requests with operations with more root fields than this maximum are rejected with a HTTP 400 Bad Request response and GraphQL error with `"extensions": {"code": "MAX_ROOT_FIELDS_LIMIT"}` + +This limit counts only the top level fields in a selection set, including fragments and inline fragments. + +- **Type:** `integer` +- **Default:** `None` +- **Minimum:** `0.0` + +```yaml title="limits.max_root_fields" +max_root_fields: null +``` + + +--- + +### `limits.parser_max_recursion` + +Limit recursion in the GraphQL parser to protect against stack overflow. default: 500 + +- **Type:** `integer` +- **Default:** `500` +- **Minimum:** `0.0` + +```yaml title="limits.parser_max_recursion" +parser_max_recursion: 500 +``` + + +--- + +### `limits.parser_max_tokens` + +Limit the number of tokens the GraphQL parser processes before aborting. + +- **Type:** `integer` +- **Default:** `15000` +- **Minimum:** `0.0` + +```yaml title="limits.parser_max_tokens" +parser_max_tokens: 15000 +``` + + +--- + +### `limits.warn_only` + +If set to true (which is the default is dev mode), requests that exceed a `max_*` limit are *not* rejected. Instead they are executed normally, and a warning is logged. + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="limits.warn_only" +warn_only: false +``` + + +--- + +### `override_subgraph_url` + +Subgraph URL mappings + +- **Type:** `any` + +```yaml title="override_subgraph_url" +override_subgraph_url: {} +``` + + +--- + +### `persisted_queries` + +Persisted Queries (PQ) configuration + +- **Type:** `object` + +```yaml title="persisted_queries" +persisted_queries: + enabled: false + experimental_prewarm_query_plan_cache: + on_reload: true + on_startup: false + hot_reload: false + local_manifests: null + log_unknown: false + safelist: + enabled: false + require_id: false +``` + + +--- + +### `persisted_queries.enabled` + +Activates Persisted Queries (disabled by default) + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="persisted_queries.enabled" +enabled: false +``` + + +--- + +### `persisted_queries.experimental_prewarm_query_plan_cache` + +Persisted Queries (PQ) query plan cache prewarm configuration + +- **Type:** `object` + +```yaml title="persisted_queries.experimental_prewarm_query_plan_cache" +experimental_prewarm_query_plan_cache: + on_reload: true + on_startup: false +``` + + +--- + +### `persisted_queries.experimental_prewarm_query_plan_cache.on_reload` + +Enabling this field uses the persisted query list to pre-warm the query planner cache on schema and config changes (enabled by default) + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="persisted_queries.experimental_prewarm_query_plan_cache.on_reload" +on_reload: true +``` + + +--- + +### `persisted_queries.experimental_prewarm_query_plan_cache.on_startup` + +Enabling this field uses the persisted query list to pre-warm the query planner cache on startup (disabled by default) + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="persisted_queries.experimental_prewarm_query_plan_cache.on_startup" +on_startup: false +``` + + +--- + +### `persisted_queries.hot_reload` + +Enables hot reloading of the local persisted query manifests + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="persisted_queries.hot_reload" +hot_reload: false +``` + + +--- + +### `persisted_queries.local_manifests` + +Enables using a local copy of the persisted query manifest to safelist operations + +- **Type:** `array` +- **Default:** `None` + +```yaml title="persisted_queries.local_manifests" +local_manifests: null +``` + + +--- + +### `persisted_queries.log_unknown` + +Enabling this field configures the router to log any freeform GraphQL request that is not in the persisted query list + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="persisted_queries.log_unknown" +log_unknown: false +``` + + +--- + +### `persisted_queries.safelist` + +Persisted Queries (PQ) Safelisting configuration + +- **Type:** `object` + +```yaml title="persisted_queries.safelist" +safelist: + enabled: false + require_id: false +``` + + +--- + +### `persisted_queries.safelist.enabled` + +Enables using the persisted query list as a safelist (disabled by default) + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="persisted_queries.safelist.enabled" +enabled: false +``` + + +--- + +### `persisted_queries.safelist.require_id` + +Enabling this field configures the router to reject any request that does not include the persisted query ID + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="persisted_queries.safelist.require_id" +require_id: false +``` + + +--- + +### `plugins` + +- **Type:** `any` + +```yaml title="plugins" +plugins: unknown_type_plugins +``` + + +--- + +### `preview_entity_cache` + +Configuration for entity caching + +- **Type:** `object` + +```yaml title="preview_entity_cache" +preview_entity_cache: + enabled: false + expose_keys_in_context: false + invalidation: + concurrent_requests: 10 + listen: example_listen + path: example_path + scan_count: 1000 + metrics: + enabled: false + separate_per_type: false + ttl: 30s + subgraph: + all: + enabled: true + invalidation: + enabled: false + shared_key: '' + private_id: null + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: null + urls: + - http://example.com/urls_item + username: example_username + ttl: 30s + subgraphs: {} +``` + + +--- + +### `preview_entity_cache.enabled` + +Enable or disable the entity caching feature + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="preview_entity_cache.enabled" +enabled: false +``` + + +--- + +### `preview_entity_cache.expose_keys_in_context` + +Expose cache keys in context + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="preview_entity_cache.expose_keys_in_context" +expose_keys_in_context: false +``` + + +--- + +### `preview_entity_cache.invalidation` + +- **Type:** `object` + +```yaml title="preview_entity_cache.invalidation" +invalidation: + concurrent_requests: 10 + listen: example_listen + path: example_path + scan_count: 1000 +``` + + +--- + +### `preview_entity_cache.invalidation.concurrent_requests` + +Number of concurrent invalidation requests + +- **Type:** `integer` +- **Default:** `10` +- **Minimum:** `0.0` + +```yaml title="preview_entity_cache.invalidation.concurrent_requests" +concurrent_requests: 10 +``` + + +--- + +### `preview_entity_cache.invalidation.listen` + +Listening address. + +- **Type:** `any` + +```yaml title="preview_entity_cache.invalidation.listen" +listen: example_listen +``` + + +--- + +### `preview_entity_cache.invalidation.path` + +Specify on which path you want to listen for invalidation endpoint. + +- **Type:** `string` + +```yaml title="preview_entity_cache.invalidation.path" +path: example_path +``` + + +--- + +### `preview_entity_cache.invalidation.scan_count` + +Number of keys to return at once from a redis SCAN command + +- **Type:** `integer` +- **Default:** `1000` +- **Minimum:** `0.0` + +```yaml title="preview_entity_cache.invalidation.scan_count" +scan_count: 1000 +``` + + +--- + +### `preview_entity_cache.metrics` + +Per subgraph configuration for entity caching + +- **Type:** `object` + +```yaml title="preview_entity_cache.metrics" +metrics: + enabled: false + separate_per_type: false + ttl: 30s +``` + + +--- + +### `preview_entity_cache.metrics.enabled` + +enables metrics evaluating the benefits of entity caching + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="preview_entity_cache.metrics.enabled" +enabled: false +``` + + +--- + +### `preview_entity_cache.metrics.separate_per_type` + +Adds the entity type name to attributes. This can greatly increase the cardinality + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="preview_entity_cache.metrics.separate_per_type" +separate_per_type: false +``` + + +--- + +### `preview_entity_cache.metrics.ttl` + +Per subgraph configuration for entity caching + +- **Type:** `string` + +```yaml title="preview_entity_cache.metrics.ttl" +ttl: 30s +``` + + +--- + +### `preview_entity_cache.subgraph` + +Configuration options pertaining to the subgraph server component. + +- **Type:** `object` + +```yaml title="preview_entity_cache.subgraph" +subgraph: + all: + enabled: true + invalidation: + enabled: false + shared_key: '' + private_id: null + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: null + urls: + - http://example.com/urls_item + username: example_username + ttl: 30s + subgraphs: {} +``` + + +--- + +### `preview_entity_cache.subgraph.all` + +Per subgraph configuration for entity caching + +- **Type:** `object` + +```yaml title="preview_entity_cache.subgraph.all" +all: + enabled: true + invalidation: + enabled: false + shared_key: '' + private_id: null + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: null + urls: + - http://example.com/urls_item + username: example_username + ttl: 30s +``` + + +--- + +### `preview_entity_cache.subgraph.all.enabled` + +activates caching for this subgraph, overrides the global configuration + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="preview_entity_cache.subgraph.all.enabled" +enabled: true +``` + + +--- + +### `preview_entity_cache.subgraph.all.invalidation` + +- **Type:** `object` + +```yaml title="preview_entity_cache.subgraph.all.invalidation" +invalidation: + enabled: false + shared_key: '' +``` + + +--- + +### `preview_entity_cache.subgraph.all.invalidation.enabled` + +Enable the invalidation + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="preview_entity_cache.subgraph.all.invalidation.enabled" +enabled: false +``` + + +--- + +### `preview_entity_cache.subgraph.all.invalidation.shared_key` + +Shared key needed to request the invalidation endpoint + +- **Type:** `string` +- **Default:** `''` + +```yaml title="preview_entity_cache.subgraph.all.invalidation.shared_key" +shared_key: '' +``` + + +--- + +### `preview_entity_cache.subgraph.all.private_id` + +Context key used to separate cache sections per user + +- **Type:** `string` +- **Default:** `None` + +```yaml title="preview_entity_cache.subgraph.all.private_id" +private_id: null +``` + + +--- + +### `preview_entity_cache.subgraph.all.redis` + +Redis cache configuration + +- **Type:** `object` + +```yaml title="preview_entity_cache.subgraph.all.redis" +redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: null + urls: + - http://example.com/urls_item + username: example_username +``` + + +--- + +### `preview_entity_cache.subgraph.all.redis.namespace` + +namespace used to prefix Redis keys + +- **Type:** `string` + +```yaml title="preview_entity_cache.subgraph.all.redis.namespace" +namespace: example_namespace +``` + + +--- + +### `preview_entity_cache.subgraph.all.redis.password` + +Redis password if not provided in the URLs. This field takes precedence over the password in the URL + +- **Type:** `string` + +```yaml title="preview_entity_cache.subgraph.all.redis.password" +password: example_password +``` + + +--- + +### `preview_entity_cache.subgraph.all.redis.pool_size` + +The size of the Redis connection pool + +- **Type:** `integer` +- **Default:** `1` +- **Minimum:** `0.0` + +```yaml title="preview_entity_cache.subgraph.all.redis.pool_size" +pool_size: 1 +``` + + +--- + +### `preview_entity_cache.subgraph.all.redis.required_to_start` + +Prevents the router from starting if it cannot connect to Redis + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="preview_entity_cache.subgraph.all.redis.required_to_start" +required_to_start: false +``` + + +--- + +### `preview_entity_cache.subgraph.all.redis.reset_ttl` + +When a TTL is set on a key, reset it when reading the data from that key + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="preview_entity_cache.subgraph.all.redis.reset_ttl" +reset_ttl: true +``` + + +--- + +### `preview_entity_cache.subgraph.all.redis.timeout` + +Redis request timeout (default: 2ms) + +- **Type:** `string` +- **Default:** `None` + +```yaml title="preview_entity_cache.subgraph.all.redis.timeout" +timeout: null +``` + + +--- + +### `preview_entity_cache.subgraph.all.redis.tls` + +Configuration options pertaining to the subgraph server component. + +- **Type:** `object` + +```yaml title="preview_entity_cache.subgraph.all.redis.tls" +tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key +``` + + +--- + +### `preview_entity_cache.subgraph.all.redis.ttl` + +TTL for entries + +- **Type:** `string` +- **Default:** `None` + +```yaml title="preview_entity_cache.subgraph.all.redis.ttl" +ttl: null +``` + + +--- + +### `preview_entity_cache.subgraph.all.redis.urls` + +List of URLs to the Redis cluster + +- **Type:** `array` + +```yaml title="preview_entity_cache.subgraph.all.redis.urls" +urls: +- http://example.com/urls_item +``` + + +--- + +### `preview_entity_cache.subgraph.all.redis.username` + +Redis username if not provided in the URLs. This field takes precedence over the username in the URL + +- **Type:** `string` + +```yaml title="preview_entity_cache.subgraph.all.redis.username" +username: example_username +``` + + +--- + +### `preview_entity_cache.subgraph.all.ttl` + +Per subgraph configuration for entity caching + +- **Type:** `string` + +```yaml title="preview_entity_cache.subgraph.all.ttl" +ttl: 30s +``` + + +--- + +### `preview_entity_cache.subgraph.subgraphs` + +per subgraph options + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="preview_entity_cache.subgraph.subgraphs" +subgraphs: {} +``` + + +--- + +### `preview_file_uploads` + +Configuration for File Uploads plugin + +- **Type:** `object` + +```yaml title="preview_file_uploads" +preview_file_uploads: + enabled: false + protocols: + multipart: + enabled: true + limits: + max_file_size: example_max_file_size + max_files: 0 + mode: stream +``` + + +--- + +### `preview_file_uploads.enabled` + +Whether the file upload plugin should be enabled (default: false) + +- **Type:** `boolean` + +```yaml title="preview_file_uploads.enabled" +enabled: false +``` + + +--- + +### `preview_file_uploads.protocols` + +Configuration for the various protocols supported by the file upload plugin + +- **Type:** `object` + +```yaml title="preview_file_uploads.protocols" +protocols: + multipart: + enabled: true + limits: + max_file_size: example_max_file_size + max_files: 0 + mode: stream +``` + + +--- + +### `preview_file_uploads.protocols.multipart` + +Configuration for a multipart request for file uploads. + +This protocol conforms to [jaydenseric's multipart spec](https://github.com/jaydenseric/graphql-multipart-request-spec) + +- **Type:** `object` + +```yaml title="preview_file_uploads.protocols.multipart" +multipart: + enabled: true + limits: + max_file_size: example_max_file_size + max_files: 0 + mode: stream +``` + + +--- + +### `preview_file_uploads.protocols.multipart.enabled` + +Whether to enable the multipart protocol for file uploads (default: true) + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="preview_file_uploads.protocols.multipart.enabled" +enabled: true +``` + + +--- + +### `preview_file_uploads.protocols.multipart.limits` + +Request limits for a multipart request + +- **Type:** `object` + +```yaml title="preview_file_uploads.protocols.multipart.limits" +limits: + max_file_size: example_max_file_size + max_files: 0 +``` + + +--- + +### `preview_file_uploads.protocols.multipart.limits.max_file_size` + +The maximum size of each file, in bytes (default: 5MB) + +- **Type:** `string` + +```yaml title="preview_file_uploads.protocols.multipart.limits.max_file_size" +max_file_size: example_max_file_size +``` + + +--- + +### `preview_file_uploads.protocols.multipart.limits.max_files` + +The maximum amount of files allowed for a single query (default: 4) + +- **Type:** `integer` +- **Minimum:** `0.0` + +```yaml title="preview_file_uploads.protocols.multipart.limits.max_files" +max_files: 0 +``` + + +--- + +### `preview_file_uploads.protocols.multipart.mode` + +Supported mode for a multipart request + +- **Type:** `any` + +```yaml title="preview_file_uploads.protocols.multipart.mode" +mode: stream +``` + + +--- + +### `progressive_override` + +Configuration for the progressive override plugin + +- **Type:** `object` + +```yaml title="progressive_override" +progressive_override: {} +``` + + +--- + +### `rhai` + +Configuration for the Rhai Plugin + +- **Type:** `object` + +```yaml title="rhai" +rhai: + main: example_main + scripts: example_scripts +``` + + +--- + +### `rhai.main` + +The main entry point for Rhai script evaluation + +- **Type:** `string` + +```yaml title="rhai.main" +main: example_main +``` + + +--- + +### `rhai.scripts` + +The directory where Rhai scripts can be found + +- **Type:** `string` + +```yaml title="rhai.scripts" +scripts: example_scripts +``` + + +--- + +### `sandbox` + +Configuration options pertaining to the sandbox page. + +- **Type:** `object` + +```yaml title="sandbox" +sandbox: + enabled: false +``` + + +--- + +### `sandbox.enabled` + +Set to true to enable sandbox + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="sandbox.enabled" +enabled: false +``` + + +--- + +### `subscription` + +Subscriptions configuration + +- **Type:** `object` + +```yaml title="subscription" +subscription: + enable_deduplication: true + enabled: true + max_opened_subscriptions: null + mode: + callback: + heartbeat_interval: disabled + listen: example_listen + path: example_path + public_url: http://service.example.com/public_url + subgraphs: [] + passthrough: + all: + heartbeat_interval: disabled + path: null + protocol: graphql_ws + subgraphs: {} + queue_capacity: null +``` + + +--- + +### `subscription.enable_deduplication` + +Enable the deduplication of subscription (for example if we detect the exact same request to subgraph we won't open a new websocket to the subgraph in passthrough mode) (default: true) + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="subscription.enable_deduplication" +enable_deduplication: true +``` + + +--- + +### `subscription.enabled` + +Enable subscription + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="subscription.enabled" +enabled: true +``` + + +--- + +### `subscription.max_opened_subscriptions` + +This is a limit to only have maximum X opened subscriptions at the same time. By default if it's not set there is no limit. + +- **Type:** `integer` +- **Default:** `None` +- **Minimum:** `0.0` + +```yaml title="subscription.max_opened_subscriptions" +max_opened_subscriptions: null +``` + + +--- + +### `subscription.mode` + +- **Type:** `object` + +```yaml title="subscription.mode" +mode: + callback: + heartbeat_interval: disabled + listen: example_listen + path: example_path + public_url: http://service.example.com/public_url + subgraphs: [] + passthrough: + all: + heartbeat_interval: disabled + path: null + protocol: graphql_ws + subgraphs: {} +``` + + +--- + +### `subscription.mode.callback` + +Using a callback url + +- **Type:** `object` + +```yaml title="subscription.mode.callback" +callback: + heartbeat_interval: disabled + listen: example_listen + path: example_path + public_url: http://service.example.com/public_url + subgraphs: [] +``` + + +--- + +### `subscription.mode.callback.heartbeat_interval` + +- **Type:** `any` + +```yaml title="subscription.mode.callback.heartbeat_interval" +heartbeat_interval: disabled +``` + + +--- + +### `subscription.mode.callback.listen` + +Listening address. + +- **Type:** `any` + +```yaml title="subscription.mode.callback.listen" +listen: example_listen +``` + + +--- + +### `subscription.mode.callback.path` + +Specify on which path you want to listen for callbacks (default: /callback) + +- **Type:** `string` + +```yaml title="subscription.mode.callback.path" +path: example_path +``` + + +--- + +### `subscription.mode.callback.public_url` + +URL used to access this router instance, including the path configured on the Router + +- **Type:** `string` + +```yaml title="subscription.mode.callback.public_url" +public_url: http://service.example.com/public_url +``` + + +--- + +### `subscription.mode.callback.subgraphs` + +Specify on which subgraph we enable the callback mode for subscription If empty it applies to all subgraphs (passthrough mode takes precedence) + +- **Type:** `array` +- **Default:** `[]` + +```yaml title="subscription.mode.callback.subgraphs" +subgraphs: [] +``` + + +--- + +### `subscription.mode.passthrough` + +- **Type:** `object` + +```yaml title="subscription.mode.passthrough" +passthrough: + all: + heartbeat_interval: disabled + path: null + protocol: graphql_ws + subgraphs: {} +``` + + +--- + +### `subscription.mode.passthrough.all` + +WebSocket configuration for a specific subgraph + +- **Type:** `object` + +```yaml title="subscription.mode.passthrough.all" +all: + heartbeat_interval: disabled + path: null + protocol: graphql_ws +``` + + +--- + +### `subscription.mode.passthrough.all.heartbeat_interval` + +- **Type:** `any` + +```yaml title="subscription.mode.passthrough.all.heartbeat_interval" +heartbeat_interval: disabled +``` + + +--- + +### `subscription.mode.passthrough.all.path` + +Path on which WebSockets are listening + +- **Type:** `string` +- **Default:** `None` + +```yaml title="subscription.mode.passthrough.all.path" +path: null +``` + + +--- + +### `subscription.mode.passthrough.all.protocol` + +- **Type:** `string` +- **Enum:** `graphql_ws`, `graphql_transport_ws` + +```yaml title="subscription.mode.passthrough.all.protocol" +protocol: graphql_ws +``` + + +--- + +### `subscription.mode.passthrough.subgraphs` + +Configuration for specific subgraphs + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="subscription.mode.passthrough.subgraphs" +subgraphs: {} +``` + + +--- + +### `subscription.queue_capacity` + +It represent the capacity of the in memory queue to know how many events we can keep in a buffer + +- **Type:** `integer` +- **Default:** `None` +- **Minimum:** `0.0` + +```yaml title="subscription.queue_capacity" +queue_capacity: null +``` + + +--- + +### `supergraph` + +Configuration options pertaining to the supergraph server component. + +- **Type:** `object` + +```yaml title="supergraph" +supergraph: + defer_support: true + early_cancel: false + experimental_log_on_broken_pipe: false + generate_query_fragments: true + introspection: false + listen: example_listen + path: / + query_planning: + cache: + in_memory: + limit: 1 + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: + nanos: 0 + secs: 2592000 + urls: + - http://example.com/urls_item + username: example_username + experimental_paths_limit: null + experimental_plans_limit: null + experimental_reuse_query_plans: false + warmed_up_queries: null +``` + + +--- + +### `supergraph.defer_support` + +Set to false to disable defer support + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="supergraph.defer_support" +defer_support: true +``` + + +--- + +### `supergraph.early_cancel` + +abort request handling when the client drops the connection. Default: false. When set to true, some parts of the request pipeline like telemetry will not work properly, but request handling will stop immediately when the client connection is closed. + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="supergraph.early_cancel" +early_cancel: false +``` + + +--- + +### `supergraph.experimental_log_on_broken_pipe` + +Log a message if the client closes the connection before the response is sent. Default: false. + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="supergraph.experimental_log_on_broken_pipe" +experimental_log_on_broken_pipe: false +``` + + +--- + +### `supergraph.generate_query_fragments` + +Enable QP generation of fragments for subgraph requests Default: true + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="supergraph.generate_query_fragments" +generate_query_fragments: true +``` + + +--- + +### `supergraph.introspection` + +Enable introspection Default: false + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="supergraph.introspection" +introspection: false +``` + + +--- + +### `supergraph.listen` + +Listening address. + +- **Type:** `any` + +```yaml title="supergraph.listen" +listen: example_listen +``` + + +--- + +### `supergraph.path` + +The HTTP path on which GraphQL requests will be served. default: "/" + +- **Type:** `string` +- **Default:** `'/'` + +```yaml title="supergraph.path" +path: / +``` + + +--- + +### `supergraph.query_planning` + +Query planning cache configuration + +- **Type:** `object` + +```yaml title="supergraph.query_planning" +query_planning: + cache: + in_memory: + limit: 1 + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: + nanos: 0 + secs: 2592000 + urls: + - http://example.com/urls_item + username: example_username + experimental_paths_limit: null + experimental_plans_limit: null + experimental_reuse_query_plans: false + warmed_up_queries: null +``` + + +--- + +### `supergraph.query_planning.cache` + +Cache configuration + +- **Type:** `object` + +```yaml title="supergraph.query_planning.cache" +cache: + in_memory: + limit: 1 + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: + nanos: 0 + secs: 2592000 + urls: + - http://example.com/urls_item + username: example_username +``` + + +--- + +### `supergraph.query_planning.cache.in_memory` + +In memory cache configuration + +- **Type:** `object` + +```yaml title="supergraph.query_planning.cache.in_memory" +in_memory: + limit: 1 +``` + + +--- + +### `supergraph.query_planning.cache.in_memory.limit` + +Number of entries in the Least Recently Used cache + +- **Type:** `integer` +- **Minimum:** `1.0` + +```yaml title="supergraph.query_planning.cache.in_memory.limit" +limit: 1 +``` + + +--- + +### `supergraph.query_planning.cache.redis` + +Redis cache configuration + +- **Type:** `object` + +```yaml title="supergraph.query_planning.cache.redis" +redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: + nanos: 0 + secs: 2592000 + urls: + - http://example.com/urls_item + username: example_username +``` + + +--- + +### `supergraph.query_planning.cache.redis.namespace` + +namespace used to prefix Redis keys + +- **Type:** `string` + +```yaml title="supergraph.query_planning.cache.redis.namespace" +namespace: example_namespace +``` + + +--- + +### `supergraph.query_planning.cache.redis.password` + +Redis password if not provided in the URLs. This field takes precedence over the password in the URL + +- **Type:** `string` + +```yaml title="supergraph.query_planning.cache.redis.password" +password: example_password +``` + + +--- + +### `supergraph.query_planning.cache.redis.pool_size` + +The size of the Redis connection pool + +- **Type:** `integer` +- **Default:** `1` +- **Minimum:** `0.0` + +```yaml title="supergraph.query_planning.cache.redis.pool_size" +pool_size: 1 +``` + + +--- + +### `supergraph.query_planning.cache.redis.required_to_start` + +Prevents the router from starting if it cannot connect to Redis + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="supergraph.query_planning.cache.redis.required_to_start" +required_to_start: false +``` + + +--- + +### `supergraph.query_planning.cache.redis.reset_ttl` + +When a TTL is set on a key, reset it when reading the data from that key + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="supergraph.query_planning.cache.redis.reset_ttl" +reset_ttl: true +``` + + +--- + +### `supergraph.query_planning.cache.redis.timeout` + +Redis request timeout (default: 2ms) + +- **Type:** `string` +- **Default:** `None` + +```yaml title="supergraph.query_planning.cache.redis.timeout" +timeout: null +``` + + +--- + +### `supergraph.query_planning.cache.redis.tls` + +Configuration options pertaining to the subgraph server component. + +- **Type:** `object` + +```yaml title="supergraph.query_planning.cache.redis.tls" +tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key +``` + + +--- + +### `supergraph.query_planning.cache.redis.ttl` + +TTL for entries + +- **Type:** `string` +- **Default:** `{"secs": 2592000, "nanos": 0}` + +```yaml title="supergraph.query_planning.cache.redis.ttl" +ttl: + nanos: 0 + secs: 2592000 +``` + + +--- + +### `supergraph.query_planning.cache.redis.urls` + +List of URLs to the Redis cluster + +- **Type:** `array` + +```yaml title="supergraph.query_planning.cache.redis.urls" +urls: +- http://example.com/urls_item +``` + + +--- + +### `supergraph.query_planning.cache.redis.username` + +Redis username if not provided in the URLs. This field takes precedence over the username in the URL + +- **Type:** `string` + +```yaml title="supergraph.query_planning.cache.redis.username" +username: example_username +``` + + +--- + +### `supergraph.query_planning.experimental_paths_limit` + +Before creating query plans, for each path of fields in the query we compute all the possible options to traverse that path via the subgraphs. Multiple options can arise because fields in the path can be provided by multiple subgraphs, and abstract types (i.e. unions and interfaces) returned by fields sometimes require the query planner to traverse through each constituent object type. The number of options generated in this computation can grow large if the schema or query are sufficiently complex, and that will increase the time spent planning. + +This config allows specifying a per-path limit to the number of options considered. If any path's options exceeds this limit, query planning will abort and the operation will fail. + +The default value is None, which specifies no limit. + +- **Type:** `integer` +- **Default:** `None` +- **Minimum:** `0.0` + +```yaml title="supergraph.query_planning.experimental_paths_limit" +experimental_paths_limit: null +``` + + +--- + +### `supergraph.query_planning.experimental_plans_limit` + +Sets a limit to the number of generated query plans. The planning process generates many different query plans as it explores the graph, and the list can grow large. By using this limit, we prevent that growth and still get a valid query plan, but it may not be the optimal one. + +The default limit is set to 10000, but it may change in the future + +- **Type:** `integer` +- **Default:** `None` +- **Minimum:** `0.0` + +```yaml title="supergraph.query_planning.experimental_plans_limit" +experimental_plans_limit: null +``` + + +--- + +### `supergraph.query_planning.experimental_reuse_query_plans` + +If cache warm up is configured, this will allow the router to keep a query plan created with the old schema, if it determines that the schema update does not affect the corresponding query + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="supergraph.query_planning.experimental_reuse_query_plans" +experimental_reuse_query_plans: false +``` + + +--- + +### `supergraph.query_planning.warmed_up_queries` + +Warms up the cache on reloads by running the query plan over a list of the most used queries (from the in memory cache) Configures the number of queries warmed up. Defaults to 1/3 of the in memory cache + +- **Type:** `integer` +- **Default:** `None` +- **Minimum:** `0.0` + +```yaml title="supergraph.query_planning.warmed_up_queries" +warmed_up_queries: null +``` + + +--- + +### `telemetry` + +Telemetry configuration + +- **Type:** `object` + +```yaml title="telemetry" +telemetry: + apollo: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + buffer_size: 10000 + client_name_header: apollographql-client-name + client_version_header: apollographql-client-version + endpoint: https://usage-reporting.api.apollographql.com/api/ingress/traces + errors: + preview_extended_error_metrics: disabled + subgraph: + all: + redact: true + redaction_policy: strict + send: true + subgraphs: {} + experimental_local_field_metrics: false + experimental_otlp_endpoint: https://usage-reporting.api.apollographql.com/ + experimental_otlp_tracing_protocol: grpc + field_level_instrumentation_sampler: 0.0 + metrics_reference_mode: extended + otlp_tracing_sampler: 0.0 + send_headers: + only: + - example_only_item + send_variable_values: + only: + - example_only_item + signature_normalization_algorithm: legacy + exporters: + logging: + common: + resource: {} + service_name: null + service_namespace: null + stdout: + enabled: true + format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] + rate_limit: + capacity: 1 + enabled: false + interval: + nanos: 0 + secs: 1 + tty_format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] + metrics: + common: + buckets: + - 0.001 + - 0.005 + - 0.015 + - 0.05 + - 0.1 + - 0.2 + - 0.3 + - 0.4 + - 0.5 + - 1.0 + - 5.0 + - 10.0 + resource: {} + service_name: null + service_namespace: null + views: + - aggregation: + histogram: + buckets: + - 0.0 + allowed_attribute_keys: + - example_allowed_attribute_keys_item + description: example_description + name: example_name + unit: example_unit + otlp: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} + http: + headers: {} + protocol: grpc + temporality: cumulative + prometheus: + enabled: false + listen: example_listen + path: /metrics + tracing: + common: + max_attributes_per_event: 128 + max_attributes_per_link: 128 + max_attributes_per_span: 128 + max_events_per_span: 128 + max_links_per_span: 128 + parent_based_sampler: true + preview_datadog_agent_sampling: null + resource: {} + sampler: 0.0 + service_name: null + service_namespace: null + datadog: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enable_span_mapping: true + enabled: false + endpoint: example_endpoint + fixed_span_names: true + resource_mapping: {} + span_metrics: + connect: true + connect_request: true + execution: true + http_request: true + parse_query: true + query_planning: true + request: true + router: true + subgraph: true + subgraph_request: true + supergraph: true + experimental_response_trace_id: + enabled: false + format: hexadecimal + header_name: example_header_name + otlp: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} + http: + headers: {} + protocol: grpc + temporality: cumulative + propagation: + aws_xray: false + baggage: false + datadog: false + jaeger: false + request: + format: hexadecimal + header_name: example_header_name + trace_context: false + zipkin: false + zipkin: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + instrumentation: + events: + connector: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + router: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + subgraph: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + supergraph: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + instruments: + cache: + apollo.router.operations.entity.cache: + attributes: + graphql.type.name: + alias: example_alias + connector: + http.client.request.body.size: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.request.duration: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.response.body.size: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + default_requirement_level: none + graphql: + field.execution: + attributes: + graphql.field.name: + alias: example_alias + graphql.field.type: + alias: example_alias + graphql.list.length: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.type.name: + alias: example_alias + list.length: + attributes: + graphql.field.name: + alias: example_alias + graphql.field.type: + alias: example_alias + graphql.list.length: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.type.name: + alias: example_alias + router: + http.server.active_requests: + attributes: + http.request.method: false + server.address: false + server.port: false + url.scheme: false + http.server.request.body.size: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + http.server.request.duration: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + http.server.response.body.size: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + subgraph: + http.client.request.body.size: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.request.duration: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.response.body.size: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + supergraph: + cost.actual: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + cost.delta: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + cost.estimated: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + spans: + connector: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + default_attribute_requirement_level: none + mode: deprecated + router: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + subgraph: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + supergraph: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias +``` + + +--- + +### `telemetry.apollo` + +- **Type:** `object` + +```yaml title="telemetry.apollo" +apollo: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + buffer_size: 10000 + client_name_header: apollographql-client-name + client_version_header: apollographql-client-version + endpoint: https://usage-reporting.api.apollographql.com/api/ingress/traces + errors: + preview_extended_error_metrics: disabled + subgraph: + all: + redact: true + redaction_policy: strict + send: true + subgraphs: {} + experimental_local_field_metrics: false + experimental_otlp_endpoint: https://usage-reporting.api.apollographql.com/ + experimental_otlp_tracing_protocol: grpc + field_level_instrumentation_sampler: 0.0 + metrics_reference_mode: extended + otlp_tracing_sampler: 0.0 + send_headers: + only: + - example_only_item + send_variable_values: + only: + - example_only_item + signature_normalization_algorithm: legacy +``` + + +--- + +### `telemetry.apollo.batch_processor` + +Batch processor configuration + +- **Type:** `object` + +```yaml title="telemetry.apollo.batch_processor" +batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 +``` + + +--- + +### `telemetry.apollo.batch_processor.max_concurrent_exports` + +Maximum number of concurrent exports + +Limits the number of spawned tasks for exports and thus memory consumed by an exporter. A value of 1 will cause exports to be performed synchronously on the BatchSpanProcessor task. The default is 1. + +- **Type:** `integer` +- **Default:** `1` +- **Minimum:** `0.0` + +```yaml title="telemetry.apollo.batch_processor.max_concurrent_exports" +max_concurrent_exports: 1 +``` + + +--- + +### `telemetry.apollo.batch_processor.max_export_batch_size` + +The maximum number of spans to process in a single batch. If there are more than one batch worth of spans then it processes multiple batches of spans one batch after the other without any delay. The default value is 512. + +- **Type:** `integer` +- **Default:** `512` +- **Minimum:** `0.0` + +```yaml title="telemetry.apollo.batch_processor.max_export_batch_size" +max_export_batch_size: 512 +``` + + +--- + +### `telemetry.apollo.batch_processor.max_export_timeout` + +The maximum duration to export a batch of data. The default value is 30 seconds. + +- **Type:** `string` +- **Default:** `{"secs": 30, "nanos": 0}` + +```yaml title="telemetry.apollo.batch_processor.max_export_timeout" +max_export_timeout: + nanos: 0 + secs: 30 +``` + + +--- + +### `telemetry.apollo.batch_processor.max_queue_size` + +The maximum queue size to buffer spans for delayed processing. If the queue gets full it drops the spans. The default value of is 2048. + +- **Type:** `integer` +- **Default:** `2048` +- **Minimum:** `0.0` + +```yaml title="telemetry.apollo.batch_processor.max_queue_size" +max_queue_size: 2048 +``` + + +--- + +### `telemetry.apollo.batch_processor.scheduled_delay` + +The delay interval in milliseconds between two consecutive processing of batches. The default value is 5 seconds. + +- **Type:** `string` +- **Default:** `{"secs": 5, "nanos": 0}` + +```yaml title="telemetry.apollo.batch_processor.scheduled_delay" +scheduled_delay: + nanos: 0 + secs: 5 +``` + + +--- + +### `telemetry.apollo.buffer_size` + +The buffer size for sending traces to Apollo. Increase this if you are experiencing lost traces. + +- **Type:** `integer` +- **Default:** `10000` +- **Minimum:** `1.0` + +```yaml title="telemetry.apollo.buffer_size" +buffer_size: 10000 +``` + + +--- + +### `telemetry.apollo.client_name_header` + +The name of the header to extract from requests when populating 'client name' for traces and metrics in Apollo Studio. + +- **Type:** `string` +- **Default:** `'apollographql-client-name'` + +```yaml title="telemetry.apollo.client_name_header" +client_name_header: apollographql-client-name +``` + + +--- + +### `telemetry.apollo.client_version_header` + +The name of the header to extract from requests when populating 'client version' for traces and metrics in Apollo Studio. + +- **Type:** `string` +- **Default:** `'apollographql-client-version'` + +```yaml title="telemetry.apollo.client_version_header" +client_version_header: apollographql-client-version +``` + + +--- + +### `telemetry.apollo.endpoint` + +The Apollo Studio endpoint for exporting traces and metrics. + +- **Type:** `string` +- **Default:** `'https://usage-reporting.api.apollographql.com/api/ingress/traces'` + +```yaml title="telemetry.apollo.endpoint" +endpoint: https://usage-reporting.api.apollographql.com/api/ingress/traces +``` + + +--- + +### `telemetry.apollo.errors` + +- **Type:** `object` + +```yaml title="telemetry.apollo.errors" +errors: + preview_extended_error_metrics: disabled + subgraph: + all: + redact: true + redaction_policy: strict + send: true + subgraphs: {} +``` + + +--- + +### `telemetry.apollo.errors.preview_extended_error_metrics` + +Extended Open Telemetry error metrics mode + +- **Type:** `any` + +```yaml title="telemetry.apollo.errors.preview_extended_error_metrics" +preview_extended_error_metrics: disabled +``` + + +--- + +### `telemetry.apollo.errors.subgraph` + +- **Type:** `object` + +```yaml title="telemetry.apollo.errors.subgraph" +subgraph: + all: + redact: true + redaction_policy: strict + send: true + subgraphs: {} +``` + + +--- + +### `telemetry.apollo.errors.subgraph.all` + +- **Type:** `object` + +```yaml title="telemetry.apollo.errors.subgraph.all" +all: + redact: true + redaction_policy: strict + send: true +``` + + +--- + +### `telemetry.apollo.errors.subgraph.subgraphs` + +Handling of errors coming from specified subgraphs + +- **Type:** `object` + +```yaml title="telemetry.apollo.errors.subgraph.subgraphs" +subgraphs: {} +``` + + +--- + +### `telemetry.apollo.experimental_local_field_metrics` + +Enable field metrics that are generated without FTV1 to be sent to Apollo Studio. + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="telemetry.apollo.experimental_local_field_metrics" +experimental_local_field_metrics: false +``` + + +--- + +### `telemetry.apollo.experimental_otlp_endpoint` + +The Apollo Studio endpoint for exporting traces and metrics. + +- **Type:** `string` +- **Default:** `'https://usage-reporting.api.apollographql.com/'` + +```yaml title="telemetry.apollo.experimental_otlp_endpoint" +experimental_otlp_endpoint: https://usage-reporting.api.apollographql.com/ +``` + + +--- + +### `telemetry.apollo.experimental_otlp_tracing_protocol` + +- **Type:** `string` +- **Enum:** `grpc`, `http` + +```yaml title="telemetry.apollo.experimental_otlp_tracing_protocol" +experimental_otlp_tracing_protocol: grpc +``` + + +--- + +### `telemetry.apollo.field_level_instrumentation_sampler` + +- **Type:** `any` + +```yaml title="telemetry.apollo.field_level_instrumentation_sampler" +field_level_instrumentation_sampler: 0.0 +``` + + +--- + +### `telemetry.apollo.metrics_reference_mode` + +Apollo usage report reference generation modes. + +- **Type:** `any` + +```yaml title="telemetry.apollo.metrics_reference_mode" +metrics_reference_mode: extended +``` + + +--- + +### `telemetry.apollo.otlp_tracing_sampler` + +- **Type:** `any` + +```yaml title="telemetry.apollo.otlp_tracing_sampler" +otlp_tracing_sampler: 0.0 +``` + + +--- + +### `telemetry.apollo.send_headers` + +Forward headers + +- **Type:** `any` + +```yaml title="telemetry.apollo.send_headers" +send_headers: + only: + - example_only_item +``` + + +--- + +### `telemetry.apollo.send_variable_values` + +Forward GraphQL variables + +- **Type:** `any` + +```yaml title="telemetry.apollo.send_variable_values" +send_variable_values: + only: + - example_only_item +``` + + +--- + +### `telemetry.apollo.signature_normalization_algorithm` + +Signature normalization algorithm for Apollo's usage report. + +- **Type:** `any` +- **Default:** `legacy` + +Apollo's legacy operation signature algorithm removes information about certain fields, such as input objects and aliases. +This removal means some operations may have the same normalized signature though they are distinct operations. + +Enhanced normalization incorporates [input types](#input-types) and [aliases](#aliases) in signature generation. +It also includes other improvements that make it more likely that two operations that only vary slightly have the same signature. + + + +The router supports enhanced operation signature normalization in the following versions: + +- [General availability](/resources/product-launch-stages/#general-availability) in v1.54.0 and later +- [Experimental](/resources/product-launch-stages/#experimental-features) in v1.49.0 to v1.53.0 + + + +Configure enhanced operation signature normalization in `router.yaml` with the `telemetry.apollo.signature_normalization_algorithm` option: + +```yaml title="router.yaml" +telemetry: + apollo: + signature_normalization_algorithm: enhanced # Default is legacy +``` + +Once you enable this configuration, operations with enhanced signatures might appear with different operation IDs than they did previously in GraphOS Studio. + + +--- + +### `telemetry.exporters` + +Exporter configuration + +- **Type:** `object` + +```yaml title="telemetry.exporters" +exporters: + logging: + common: + resource: {} + service_name: null + service_namespace: null + stdout: + enabled: true + format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] + rate_limit: + capacity: 1 + enabled: false + interval: + nanos: 0 + secs: 1 + tty_format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] + metrics: + common: + buckets: + - 0.001 + - 0.005 + - 0.015 + - 0.05 + - 0.1 + - 0.2 + - 0.3 + - 0.4 + - 0.5 + - 1.0 + - 5.0 + - 10.0 + resource: {} + service_name: null + service_namespace: null + views: + - aggregation: + histogram: + buckets: + - 0.0 + allowed_attribute_keys: + - example_allowed_attribute_keys_item + description: example_description + name: example_name + unit: example_unit + otlp: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} + http: + headers: {} + protocol: grpc + temporality: cumulative + prometheus: + enabled: false + listen: example_listen + path: /metrics + tracing: + common: + max_attributes_per_event: 128 + max_attributes_per_link: 128 + max_attributes_per_span: 128 + max_events_per_span: 128 + max_links_per_span: 128 + parent_based_sampler: true + preview_datadog_agent_sampling: null + resource: {} + sampler: 0.0 + service_name: null + service_namespace: null + datadog: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enable_span_mapping: true + enabled: false + endpoint: example_endpoint + fixed_span_names: true + resource_mapping: {} + span_metrics: + connect: true + connect_request: true + execution: true + http_request: true + parse_query: true + query_planning: true + request: true + router: true + subgraph: true + subgraph_request: true + supergraph: true + experimental_response_trace_id: + enabled: false + format: hexadecimal + header_name: example_header_name + otlp: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} + http: + headers: {} + protocol: grpc + temporality: cumulative + propagation: + aws_xray: false + baggage: false + datadog: false + jaeger: false + request: + format: hexadecimal + header_name: example_header_name + trace_context: false + zipkin: false + zipkin: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint +``` + + +--- + +### `telemetry.exporters.logging` + +Logging configuration. + +- **Type:** `object` + +```yaml title="telemetry.exporters.logging" +logging: + common: + resource: {} + service_name: null + service_namespace: null + stdout: + enabled: true + format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] + rate_limit: + capacity: 1 + enabled: false + interval: + nanos: 0 + secs: 1 + tty_format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] +``` + + +--- + +### `telemetry.exporters.logging.common` + +- **Type:** `object` + +```yaml title="telemetry.exporters.logging.common" +common: + resource: {} + service_name: null + service_namespace: null +``` + + +--- + +### `telemetry.exporters.logging.common.resource` + +The Open Telemetry resource + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="telemetry.exporters.logging.common.resource" +resource: {} +``` + + +--- + +### `telemetry.exporters.logging.common.service_name` + +Set a service.name resource in your metrics + +- **Type:** `string` +- **Default:** `None` + +```yaml title="telemetry.exporters.logging.common.service_name" +service_name: null +``` + + +--- + +### `telemetry.exporters.logging.common.service_namespace` + +Set a service.namespace attribute in your metrics + +- **Type:** `string` +- **Default:** `None` + +```yaml title="telemetry.exporters.logging.common.service_namespace" +service_namespace: null +``` + + +--- + +### `telemetry.exporters.logging.stdout` + +- **Type:** `object` + +```yaml title="telemetry.exporters.logging.stdout" +stdout: + enabled: true + format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] + rate_limit: + capacity: 1 + enabled: false + interval: + nanos: 0 + secs: 1 + tty_format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] +``` + + +--- + +### `telemetry.exporters.logging.stdout.enabled` + +Set to true to log to stdout. + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="telemetry.exporters.logging.stdout.enabled" +enabled: true +``` + + +--- + +### `telemetry.exporters.logging.stdout.format` + +- **Type:** `any` + +```yaml title="telemetry.exporters.logging.stdout.format" +format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] +``` + + +--- + +### `telemetry.exporters.logging.stdout.rate_limit` + +- **Type:** `object` + +```yaml title="telemetry.exporters.logging.stdout.rate_limit" +rate_limit: + capacity: 1 + enabled: false + interval: + nanos: 0 + secs: 1 +``` + + +--- + +### `telemetry.exporters.logging.stdout.tty_format` + +- **Type:** `any` + +```yaml title="telemetry.exporters.logging.stdout.tty_format" +tty_format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] +``` + + +--- + +### `telemetry.exporters.metrics` + +Metrics configuration + +- **Type:** `object` + +```yaml title="telemetry.exporters.metrics" +metrics: + common: + buckets: + - 0.001 + - 0.005 + - 0.015 + - 0.05 + - 0.1 + - 0.2 + - 0.3 + - 0.4 + - 0.5 + - 1.0 + - 5.0 + - 10.0 + resource: {} + service_name: null + service_namespace: null + views: + - aggregation: + histogram: + buckets: + - 0.0 + allowed_attribute_keys: + - example_allowed_attribute_keys_item + description: example_description + name: example_name + unit: example_unit + otlp: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} + http: + headers: {} + protocol: grpc + temporality: cumulative + prometheus: + enabled: false + listen: example_listen + path: /metrics +``` + + +--- + +### `telemetry.exporters.metrics.common` + +- **Type:** `object` + +```yaml title="telemetry.exporters.metrics.common" +common: + buckets: + - 0.001 + - 0.005 + - 0.015 + - 0.05 + - 0.1 + - 0.2 + - 0.3 + - 0.4 + - 0.5 + - 1.0 + - 5.0 + - 10.0 + resource: {} + service_name: null + service_namespace: null + views: + - aggregation: + histogram: + buckets: + - 0.0 + allowed_attribute_keys: + - example_allowed_attribute_keys_item + description: example_description + name: example_name + unit: example_unit +``` + + +--- + +### `telemetry.exporters.metrics.common.buckets` + +Custom buckets for all histograms + +- **Type:** `array` +- **Default:** `[0.001, 0.005, 0.015, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 1.0, 5.0, 10.0]` + +```yaml title="telemetry.exporters.metrics.common.buckets" +buckets: +- 0.001 +- 0.005 +- 0.015 +- 0.05 +- 0.1 +- 0.2 +- 0.3 +- 0.4 +- 0.5 +- 1.0 +- 5.0 +- 10.0 +``` + + +--- + +### `telemetry.exporters.metrics.common.resource` + +The Open Telemetry resource + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="telemetry.exporters.metrics.common.resource" +resource: {} +``` + + +--- + +### `telemetry.exporters.metrics.common.service_name` + +Set a service.name resource in your metrics + +- **Type:** `string` +- **Default:** `None` + +```yaml title="telemetry.exporters.metrics.common.service_name" +service_name: null +``` + + +--- + +### `telemetry.exporters.metrics.common.service_namespace` + +Set a service.namespace attribute in your metrics + +- **Type:** `string` +- **Default:** `None` + +```yaml title="telemetry.exporters.metrics.common.service_namespace" +service_namespace: null +``` + + +--- + +### `telemetry.exporters.metrics.common.views` + +Views applied on metrics + +- **Type:** `array` + +```yaml title="telemetry.exporters.metrics.common.views" +views: +- aggregation: + histogram: + buckets: + - 0.0 + allowed_attribute_keys: + - example_allowed_attribute_keys_item + description: example_description + name: example_name + unit: example_unit +``` + + +--- + +### `telemetry.exporters.metrics.otlp` + +- **Type:** `object` + +```yaml title="telemetry.exporters.metrics.otlp" +otlp: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} + http: + headers: {} + protocol: grpc + temporality: cumulative +``` + + +--- + +### `telemetry.exporters.metrics.otlp.batch_processor` + +Batch processor configuration + +- **Type:** `object` + +```yaml title="telemetry.exporters.metrics.otlp.batch_processor" +batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 +``` + + +--- + +### `telemetry.exporters.metrics.otlp.enabled` + +Enable otlp + +- **Type:** `boolean` + +```yaml title="telemetry.exporters.metrics.otlp.enabled" +enabled: false +``` + + +--- + +### `telemetry.exporters.metrics.otlp.endpoint` + +- **Type:** `string` + +```yaml title="telemetry.exporters.metrics.otlp.endpoint" +endpoint: example_endpoint +``` + + +--- + +### `telemetry.exporters.metrics.otlp.grpc` + +- **Type:** `object` + +```yaml title="telemetry.exporters.metrics.otlp.grpc" +grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} +``` + + +--- + +### `telemetry.exporters.metrics.otlp.http` + +- **Type:** `object` + +```yaml title="telemetry.exporters.metrics.otlp.http" +http: + headers: {} +``` + + +--- + +### `telemetry.exporters.metrics.otlp.protocol` + +- **Type:** `string` +- **Enum:** `grpc`, `http` + +```yaml title="telemetry.exporters.metrics.otlp.protocol" +protocol: grpc +``` + + +--- + +### `telemetry.exporters.metrics.otlp.temporality` + +- **Type:** `any` + +```yaml title="telemetry.exporters.metrics.otlp.temporality" +temporality: cumulative +``` + + +--- + +### `telemetry.exporters.metrics.prometheus` + +Prometheus configuration + +- **Type:** `object` + +```yaml title="telemetry.exporters.metrics.prometheus" +prometheus: + enabled: false + listen: example_listen + path: /metrics +``` + + +--- + +### `telemetry.exporters.metrics.prometheus.enabled` + +Set to true to enable + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="telemetry.exporters.metrics.prometheus.enabled" +enabled: false +``` + + +--- + +### `telemetry.exporters.metrics.prometheus.listen` + +Listening address. + +- **Type:** `any` + +```yaml title="telemetry.exporters.metrics.prometheus.listen" +listen: example_listen +``` + + +--- + +### `telemetry.exporters.metrics.prometheus.path` + +The path where prometheus will be exposed + +- **Type:** `string` +- **Default:** `'/metrics'` + +```yaml title="telemetry.exporters.metrics.prometheus.path" +path: /metrics +``` + + +--- + +### `telemetry.exporters.tracing` + +Tracing configuration + +- **Type:** `object` + +```yaml title="telemetry.exporters.tracing" +tracing: + common: + max_attributes_per_event: 128 + max_attributes_per_link: 128 + max_attributes_per_span: 128 + max_events_per_span: 128 + max_links_per_span: 128 + parent_based_sampler: true + preview_datadog_agent_sampling: null + resource: {} + sampler: 0.0 + service_name: null + service_namespace: null + datadog: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enable_span_mapping: true + enabled: false + endpoint: example_endpoint + fixed_span_names: true + resource_mapping: {} + span_metrics: + connect: true + connect_request: true + execution: true + http_request: true + parse_query: true + query_planning: true + request: true + router: true + subgraph: true + subgraph_request: true + supergraph: true + experimental_response_trace_id: + enabled: false + format: hexadecimal + header_name: example_header_name + otlp: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} + http: + headers: {} + protocol: grpc + temporality: cumulative + propagation: + aws_xray: false + baggage: false + datadog: false + jaeger: false + request: + format: hexadecimal + header_name: example_header_name + trace_context: false + zipkin: false + zipkin: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint +``` + + +--- + +### `telemetry.exporters.tracing.common` + +- **Type:** `object` + +```yaml title="telemetry.exporters.tracing.common" +common: + max_attributes_per_event: 128 + max_attributes_per_link: 128 + max_attributes_per_span: 128 + max_events_per_span: 128 + max_links_per_span: 128 + parent_based_sampler: true + preview_datadog_agent_sampling: null + resource: {} + sampler: 0.0 + service_name: null + service_namespace: null +``` + + +--- + +### `telemetry.exporters.tracing.common.max_attributes_per_event` + +The maximum attributes per event before discarding + +- **Type:** `integer` +- **Default:** `128` +- **Minimum:** `0.0` + +```yaml title="telemetry.exporters.tracing.common.max_attributes_per_event" +max_attributes_per_event: 128 +``` + + +--- + +### `telemetry.exporters.tracing.common.max_attributes_per_link` + +The maximum attributes per link before discarding + +- **Type:** `integer` +- **Default:** `128` +- **Minimum:** `0.0` + +```yaml title="telemetry.exporters.tracing.common.max_attributes_per_link" +max_attributes_per_link: 128 +``` + + +--- + +### `telemetry.exporters.tracing.common.max_attributes_per_span` + +The maximum attributes per span before discarding + +- **Type:** `integer` +- **Default:** `128` +- **Minimum:** `0.0` + +```yaml title="telemetry.exporters.tracing.common.max_attributes_per_span" +max_attributes_per_span: 128 +``` + + +--- + +### `telemetry.exporters.tracing.common.max_events_per_span` + +The maximum events per span before discarding + +- **Type:** `integer` +- **Default:** `128` +- **Minimum:** `0.0` + +```yaml title="telemetry.exporters.tracing.common.max_events_per_span" +max_events_per_span: 128 +``` + + +--- + +### `telemetry.exporters.tracing.common.max_links_per_span` + +The maximum links per span before discarding + +- **Type:** `integer` +- **Default:** `128` +- **Minimum:** `0.0` + +```yaml title="telemetry.exporters.tracing.common.max_links_per_span" +max_links_per_span: 128 +``` + + +--- + +### `telemetry.exporters.tracing.common.parent_based_sampler` + +Whether to use parent based sampling + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="telemetry.exporters.tracing.common.parent_based_sampler" +parent_based_sampler: true +``` + + +--- + +### `telemetry.exporters.tracing.common.preview_datadog_agent_sampling` + +Use datadog agent sampling. This means that all spans will be sent to the Datadog agent and the `sampling.priority` attribute will be used to control if the span will then be sent to Datadog + +- **Type:** `boolean` +- **Default:** `None` + +```yaml title="telemetry.exporters.tracing.common.preview_datadog_agent_sampling" +preview_datadog_agent_sampling: null +``` + + +--- + +### `telemetry.exporters.tracing.common.resource` + +The Open Telemetry resource + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="telemetry.exporters.tracing.common.resource" +resource: {} +``` + + +--- + +### `telemetry.exporters.tracing.common.sampler` + +- **Type:** `any` + +```yaml title="telemetry.exporters.tracing.common.sampler" +sampler: 0.0 +``` + + +--- + +### `telemetry.exporters.tracing.common.service_name` + +The trace service name + +- **Type:** `string` +- **Default:** `None` + +```yaml title="telemetry.exporters.tracing.common.service_name" +service_name: null +``` + + +--- + +### `telemetry.exporters.tracing.common.service_namespace` + +The trace service namespace + +- **Type:** `string` +- **Default:** `None` + +```yaml title="telemetry.exporters.tracing.common.service_namespace" +service_namespace: null +``` + + +--- + +### `telemetry.exporters.tracing.datadog` + +- **Type:** `object` + +```yaml title="telemetry.exporters.tracing.datadog" +datadog: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enable_span_mapping: true + enabled: false + endpoint: example_endpoint + fixed_span_names: true + resource_mapping: {} + span_metrics: + connect: true + connect_request: true + execution: true + http_request: true + parse_query: true + query_planning: true + request: true + router: true + subgraph: true + subgraph_request: true + supergraph: true +``` + + +--- + +### `telemetry.exporters.tracing.datadog.batch_processor` + +Batch processor configuration + +- **Type:** `object` + +```yaml title="telemetry.exporters.tracing.datadog.batch_processor" +batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 +``` + + +--- + +### `telemetry.exporters.tracing.datadog.enable_span_mapping` + +Enable datadog span mapping for span name and resource name. + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="telemetry.exporters.tracing.datadog.enable_span_mapping" +enable_span_mapping: true +``` + + +--- + +### `telemetry.exporters.tracing.datadog.enabled` + +Enable datadog + +- **Type:** `boolean` + +```yaml title="telemetry.exporters.tracing.datadog.enabled" +enabled: false +``` + + +--- + +### `telemetry.exporters.tracing.datadog.endpoint` + +- **Type:** `string` + +```yaml title="telemetry.exporters.tracing.datadog.endpoint" +endpoint: example_endpoint +``` + + +--- + +### `telemetry.exporters.tracing.datadog.fixed_span_names` + +Fixes the span names, this means that the APM view will show the original span names in the operation dropdown. + +- **Type:** `boolean` +- **Default:** `True` + +```yaml title="telemetry.exporters.tracing.datadog.fixed_span_names" +fixed_span_names: true +``` + + +--- + +### `telemetry.exporters.tracing.datadog.resource_mapping` + +Custom mapping to be used as the resource field in spans, defaults to: router -> http.route supergraph -> graphql.operation.name query_planning -> graphql.operation.name subgraph -> subgraph.name subgraph_request -> subgraph.name http_request -> http.route + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="telemetry.exporters.tracing.datadog.resource_mapping" +resource_mapping: {} +``` + + +--- + +### `telemetry.exporters.tracing.datadog.span_metrics` + +Which spans will be eligible for span stats to be collected for viewing in the APM view. Defaults to true for `request`, `router`, `query_parsing`, `supergraph`, `execution`, `query_planning`, `subgraph`, `subgraph_request`, `connect`, `connect_request` and `http_request`. + +- **Type:** `object` +- **Default:** `{"parse_query": true, "connect": true, "execution": true, "http_request": true, "request": true, "query_planning": true, "connect_request": true, "subgraph": true, "router": true, "supergraph": true, "subgraph_request": true}` + +```yaml title="telemetry.exporters.tracing.datadog.span_metrics" +span_metrics: + connect: true + connect_request: true + execution: true + http_request: true + parse_query: true + query_planning: true + request: true + router: true + subgraph: true + subgraph_request: true + supergraph: true +``` + + +--- + +### `telemetry.exporters.tracing.experimental_response_trace_id` + +- **Type:** `object` + +```yaml title="telemetry.exporters.tracing.experimental_response_trace_id" +experimental_response_trace_id: + enabled: false + format: hexadecimal + header_name: example_header_name +``` + + +--- + +### `telemetry.exporters.tracing.experimental_response_trace_id.enabled` + +Expose the trace_id in response headers + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="telemetry.exporters.tracing.experimental_response_trace_id.enabled" +enabled: false +``` + + +--- + +### `telemetry.exporters.tracing.experimental_response_trace_id.format` + +- **Type:** `any` + +```yaml title="telemetry.exporters.tracing.experimental_response_trace_id.format" +format: hexadecimal +``` + + +--- + +### `telemetry.exporters.tracing.experimental_response_trace_id.header_name` + +Choose the header name to expose trace_id (default: apollo-trace-id) + +- **Type:** `string` + +```yaml title="telemetry.exporters.tracing.experimental_response_trace_id.header_name" +header_name: example_header_name +``` + + +--- + +### `telemetry.exporters.tracing.otlp` + +- **Type:** `object` + +```yaml title="telemetry.exporters.tracing.otlp" +otlp: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} + http: + headers: {} + protocol: grpc + temporality: cumulative +``` + + +--- + +### `telemetry.exporters.tracing.otlp.batch_processor` + +Batch processor configuration + +- **Type:** `object` + +```yaml title="telemetry.exporters.tracing.otlp.batch_processor" +batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 +``` + + +--- + +### `telemetry.exporters.tracing.otlp.enabled` + +Enable otlp + +- **Type:** `boolean` + +```yaml title="telemetry.exporters.tracing.otlp.enabled" +enabled: false +``` + + +--- + +### `telemetry.exporters.tracing.otlp.endpoint` + +- **Type:** `string` + +```yaml title="telemetry.exporters.tracing.otlp.endpoint" +endpoint: example_endpoint +``` + + +--- + +### `telemetry.exporters.tracing.otlp.grpc` + +- **Type:** `object` + +```yaml title="telemetry.exporters.tracing.otlp.grpc" +grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} +``` + + +--- + +### `telemetry.exporters.tracing.otlp.http` + +- **Type:** `object` + +```yaml title="telemetry.exporters.tracing.otlp.http" +http: + headers: {} +``` + + +--- + +### `telemetry.exporters.tracing.otlp.protocol` + +- **Type:** `string` +- **Enum:** `grpc`, `http` + +```yaml title="telemetry.exporters.tracing.otlp.protocol" +protocol: grpc +``` + + +--- + +### `telemetry.exporters.tracing.otlp.temporality` + +- **Type:** `any` + +```yaml title="telemetry.exporters.tracing.otlp.temporality" +temporality: cumulative +``` + + +--- + +### `telemetry.exporters.tracing.propagation` + +Configure propagation of traces. In general you won't have to do this as these are automatically configured along with any exporter you configure. + +- **Type:** `object` + +```yaml title="telemetry.exporters.tracing.propagation" +propagation: + aws_xray: false + baggage: false + datadog: false + jaeger: false + request: + format: hexadecimal + header_name: example_header_name + trace_context: false + zipkin: false +``` + + +--- + +### `telemetry.exporters.tracing.propagation.aws_xray` + +Propagate AWS X-Ray + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="telemetry.exporters.tracing.propagation.aws_xray" +aws_xray: false +``` + + +--- + +### `telemetry.exporters.tracing.propagation.baggage` + +Propagate baggage https://www.w3.org/TR/baggage/ + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="telemetry.exporters.tracing.propagation.baggage" +baggage: false +``` + + +--- + +### `telemetry.exporters.tracing.propagation.datadog` + +Propagate Datadog + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="telemetry.exporters.tracing.propagation.datadog" +datadog: false +``` + + +--- + +### `telemetry.exporters.tracing.propagation.jaeger` + +Propagate Jaeger + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="telemetry.exporters.tracing.propagation.jaeger" +jaeger: false +``` + + +--- + +### `telemetry.exporters.tracing.propagation.request` + +- **Type:** `object` + +```yaml title="telemetry.exporters.tracing.propagation.request" +request: + format: hexadecimal + header_name: example_header_name +``` + + +--- + +### `telemetry.exporters.tracing.propagation.trace_context` + +Propagate trace context https://www.w3.org/TR/trace-context/ + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="telemetry.exporters.tracing.propagation.trace_context" +trace_context: false +``` + + +--- + +### `telemetry.exporters.tracing.propagation.zipkin` + +Propagate Zipkin + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="telemetry.exporters.tracing.propagation.zipkin" +zipkin: false +``` + + +--- + +### `telemetry.exporters.tracing.zipkin` + +- **Type:** `object` + +```yaml title="telemetry.exporters.tracing.zipkin" +zipkin: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint +``` + + +--- + +### `telemetry.exporters.tracing.zipkin.batch_processor` + +Batch processor configuration + +- **Type:** `object` + +```yaml title="telemetry.exporters.tracing.zipkin.batch_processor" +batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 +``` + + +--- + +### `telemetry.exporters.tracing.zipkin.enabled` + +Enable zipkin + +- **Type:** `boolean` + +```yaml title="telemetry.exporters.tracing.zipkin.enabled" +enabled: false +``` + + +--- + +### `telemetry.exporters.tracing.zipkin.endpoint` + +- **Type:** `string` + +```yaml title="telemetry.exporters.tracing.zipkin.endpoint" +endpoint: example_endpoint +``` + + +--- + +### `telemetry.instrumentation` + +Instrumentation configuration + +- **Type:** `object` + +```yaml title="telemetry.instrumentation" +instrumentation: + events: + connector: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + router: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + subgraph: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + supergraph: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + instruments: + cache: + apollo.router.operations.entity.cache: + attributes: + graphql.type.name: + alias: example_alias + connector: + http.client.request.body.size: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.request.duration: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.response.body.size: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + default_requirement_level: none + graphql: + field.execution: + attributes: + graphql.field.name: + alias: example_alias + graphql.field.type: + alias: example_alias + graphql.list.length: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.type.name: + alias: example_alias + list.length: + attributes: + graphql.field.name: + alias: example_alias + graphql.field.type: + alias: example_alias + graphql.list.length: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.type.name: + alias: example_alias + router: + http.server.active_requests: + attributes: + http.request.method: false + server.address: false + server.port: false + url.scheme: false + http.server.request.body.size: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + http.server.request.duration: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + http.server.response.body.size: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + subgraph: + http.client.request.body.size: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.request.duration: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.response.body.size: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + supergraph: + cost.actual: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + cost.delta: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + cost.estimated: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + spans: + connector: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + default_attribute_requirement_level: none + mode: deprecated + router: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + subgraph: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + supergraph: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.events` + +Events are + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.events" +events: + connector: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + router: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + subgraph: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + supergraph: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.connector` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.events.connector" +connector: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.connector.error` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.events.connector.error" +error: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.connector.request` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.events.connector.request" +request: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.connector.response` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.events.connector.response" +response: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.router` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.events.router" +router: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.router.error` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.events.router.error" +error: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.router.request` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.events.router.request" +request: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.router.response` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.events.router.response" +response: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.subgraph` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.events.subgraph" +subgraph: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.subgraph.error` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.events.subgraph.error" +error: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.subgraph.request` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.events.subgraph.request" +request: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.subgraph.response` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.events.subgraph.response" +response: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.supergraph` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.events.supergraph" +supergraph: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.supergraph.error` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.events.supergraph.error" +error: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.supergraph.request` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.events.supergraph.request" +request: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.events.supergraph.response` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.events.supergraph.response" +response: + condition: + eq: + - false + - false + level: info +``` + + +--- + +### `telemetry.instrumentation.instruments` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.instruments" +instruments: + cache: + apollo.router.operations.entity.cache: + attributes: + graphql.type.name: + alias: example_alias + connector: + http.client.request.body.size: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.request.duration: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.response.body.size: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + default_requirement_level: none + graphql: + field.execution: + attributes: + graphql.field.name: + alias: example_alias + graphql.field.type: + alias: example_alias + graphql.list.length: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.type.name: + alias: example_alias + list.length: + attributes: + graphql.field.name: + alias: example_alias + graphql.field.type: + alias: example_alias + graphql.list.length: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.type.name: + alias: example_alias + router: + http.server.active_requests: + attributes: + http.request.method: false + server.address: false + server.port: false + url.scheme: false + http.server.request.body.size: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + http.server.request.duration: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + http.server.response.body.size: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + subgraph: + http.client.request.body.size: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.request.duration: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.response.body.size: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + supergraph: + cost.actual: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + cost.delta: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + cost.estimated: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.instruments.cache` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.instruments.cache" +cache: + apollo.router.operations.entity.cache: + attributes: + graphql.type.name: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.instruments.cache.apollo.router.operations.entity.cache` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.cache.apollo.router.operations.entity.cache" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.connector` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.instruments.connector" +connector: + http.client.request.body.size: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.request.duration: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.response.body.size: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.instruments.connector.http.client.request.body.size` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.connector.http.client.request.body.size" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.connector.http.client.request.duration` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.connector.http.client.request.duration" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.connector.http.client.response.body.size` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.connector.http.client.response.body.size" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.default_requirement_level` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.default_requirement_level" +default_requirement_level: none +``` + + +--- + +### `telemetry.instrumentation.instruments.graphql` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.instruments.graphql" +graphql: + field.execution: + attributes: + graphql.field.name: + alias: example_alias + graphql.field.type: + alias: example_alias + graphql.list.length: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.type.name: + alias: example_alias + list.length: + attributes: + graphql.field.name: + alias: example_alias + graphql.field.type: + alias: example_alias + graphql.list.length: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.type.name: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.instruments.graphql.field.execution` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.graphql.field.execution" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.graphql.list.length` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.graphql.list.length" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.router` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.instruments.router" +router: + http.server.active_requests: + attributes: + http.request.method: false + server.address: false + server.port: false + url.scheme: false + http.server.request.body.size: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + http.server.request.duration: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + http.server.response.body.size: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.instruments.router.http.server.active_requests` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.router.http.server.active_requests" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.router.http.server.request.body.size` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.router.http.server.request.body.size" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.router.http.server.request.duration` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.router.http.server.request.duration" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.router.http.server.response.body.size` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.router.http.server.response.body.size" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.subgraph` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.instruments.subgraph" +subgraph: + http.client.request.body.size: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.request.duration: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.response.body.size: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.instruments.subgraph.http.client.request.body.size` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.subgraph.http.client.request.body.size" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.subgraph.http.client.request.duration` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.subgraph.http.client.request.duration" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.subgraph.http.client.response.body.size` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.subgraph.http.client.response.body.size" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.supergraph` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.instruments.supergraph" +supergraph: + cost.actual: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + cost.delta: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + cost.estimated: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.instruments.supergraph.cost.actual` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.supergraph.cost.actual" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.supergraph.cost.delta` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.supergraph.cost.delta" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.instruments.supergraph.cost.estimated` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.instruments.supergraph.cost.estimated" +# Value not generated in example data +``` + + +--- + +### `telemetry.instrumentation.spans` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.spans" +spans: + connector: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + default_attribute_requirement_level: none + mode: deprecated + router: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + subgraph: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + supergraph: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.spans.connector` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.spans.connector" +connector: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.spans.connector.attributes` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.spans.connector.attributes" +attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.spans.default_attribute_requirement_level` + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.spans.default_attribute_requirement_level" +default_attribute_requirement_level: none +``` + + +--- + +### `telemetry.instrumentation.spans.mode` + +Span mode to create new or deprecated spans + +- **Type:** `any` + +```yaml title="telemetry.instrumentation.spans.mode" +mode: deprecated +``` + + +--- + +### `telemetry.instrumentation.spans.router` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.spans.router" +router: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.spans.router.attributes` + +Common attributes for http server and client. See https://opentelemetry.io/docs/specs/semconv/http/http-spans/#common-attributes + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.spans.router.attributes" +attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.spans.subgraph` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.spans.subgraph" +subgraph: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.spans.subgraph.attributes` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.spans.subgraph.attributes" +attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.spans.supergraph` + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.spans.supergraph" +supergraph: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias +``` + + +--- + +### `telemetry.instrumentation.spans.supergraph.attributes` + +Attributes for Cost + +- **Type:** `object` + +```yaml title="telemetry.instrumentation.spans.supergraph.attributes" +attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias +``` + + +--- + +### `tls` + +TLS related configuration options. + +- **Type:** `object` + +```yaml title="tls" +tls: + connector: + all: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + sources: {} + subgraph: + all: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + subgraphs: {} + supergraph: + certificate: example_certificate + certificate_chain: example_certificate_chain + key: example_key +``` + + +--- + +### `tls.connector` + +- **Type:** `object` + +```yaml title="tls.connector" +connector: + all: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + sources: {} +``` + + +--- + +### `tls.connector.all` + +Configuration options pertaining to the subgraph server component. + +- **Type:** `object` + +```yaml title="tls.connector.all" +all: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key +``` + + +--- + +### `tls.connector.all.certificate_authorities` + +list of certificate authorities in PEM format + +- **Type:** `string` +- **Default:** `None` + +```yaml title="tls.connector.all.certificate_authorities" +certificate_authorities: null +``` + + +--- + +### `tls.connector.all.client_authentication` + +TLS client authentication + +- **Type:** `object` + +```yaml title="tls.connector.all.client_authentication" +client_authentication: + certificate_chain: example_certificate_chain + key: example_key +``` + + +--- + +### `tls.connector.all.client_authentication.certificate_chain` + +list of certificates in PEM format + +- **Type:** `string` + +```yaml title="tls.connector.all.client_authentication.certificate_chain" +certificate_chain: example_certificate_chain +``` + + +--- + +### `tls.connector.all.client_authentication.key` + +key in PEM format + +- **Type:** `string` + +```yaml title="tls.connector.all.client_authentication.key" +key: example_key +``` + + +--- + +### `tls.connector.sources` + +Map of subgraph_name.connector_source_name to configuration + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="tls.connector.sources" +sources: {} +``` + + +--- + +### `tls.subgraph` + +Configuration options pertaining to the subgraph server component. + +- **Type:** `object` + +```yaml title="tls.subgraph" +subgraph: + all: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + subgraphs: {} +``` + + +--- + +### `tls.subgraph.all` + +Configuration options pertaining to the subgraph server component. + +- **Type:** `object` + +```yaml title="tls.subgraph.all" +all: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key +``` + + +--- + +### `tls.subgraph.all.certificate_authorities` + +list of certificate authorities in PEM format + +- **Type:** `string` +- **Default:** `None` + +```yaml title="tls.subgraph.all.certificate_authorities" +certificate_authorities: null +``` + + +--- + +### `tls.subgraph.all.client_authentication` + +TLS client authentication + +- **Type:** `object` + +```yaml title="tls.subgraph.all.client_authentication" +client_authentication: + certificate_chain: example_certificate_chain + key: example_key +``` + + +--- + +### `tls.subgraph.all.client_authentication.certificate_chain` + +list of certificates in PEM format + +- **Type:** `string` + +```yaml title="tls.subgraph.all.client_authentication.certificate_chain" +certificate_chain: example_certificate_chain +``` + + +--- + +### `tls.subgraph.all.client_authentication.key` + +key in PEM format + +- **Type:** `string` + +```yaml title="tls.subgraph.all.client_authentication.key" +key: example_key +``` + + +--- + +### `tls.subgraph.subgraphs` + +per subgraph options + +- **Type:** `object` +- **Default:** `{}` + +```yaml title="tls.subgraph.subgraphs" +subgraphs: {} +``` + + +--- + +### `tls.supergraph` + +Configuration options pertaining to the supergraph server component. + +- **Type:** `object` + +```yaml title="tls.supergraph" +supergraph: + certificate: example_certificate + certificate_chain: example_certificate_chain + key: example_key +``` + + +--- + +### `tls.supergraph.certificate` + +server certificate in PEM format + +- **Type:** `string` + +```yaml title="tls.supergraph.certificate" +certificate: example_certificate +``` + + +--- + +### `tls.supergraph.certificate_chain` + +list of certificate authorities in PEM format + +- **Type:** `string` + +```yaml title="tls.supergraph.certificate_chain" +certificate_chain: example_certificate_chain +``` + + +--- + +### `tls.supergraph.key` + +server key in PEM format + +- **Type:** `string` + +```yaml title="tls.supergraph.key" +key: example_key +``` + + +--- + +### `traffic_shaping` + +Configuration for the experimental traffic shaping plugin + +- **Type:** `object` + +```yaml title="traffic_shaping" +traffic_shaping: + all: + compression: gzip + deduplicate_query: false + dns_resolution_strategy: ipv4_only + experimental_http2: enable + global_rate_limit: + capacity: 1 + interval: 30s + timeout: null + connector: + all: + compression: gzip + dns_resolution_strategy: ipv4_only + experimental_http2: enable + global_rate_limit: + capacity: 1 + interval: 30s + timeout: null + sources: {} + deduplicate_variables: null + router: + concurrency_limit: 0 + global_rate_limit: + capacity: 1 + interval: 30s + timeout: null + subgraphs: {} +``` + + +--- + +### `traffic_shaping.all` + +Traffic shaping options + +- **Type:** `object` + +```yaml title="traffic_shaping.all" +all: + compression: gzip + deduplicate_query: false + dns_resolution_strategy: ipv4_only + experimental_http2: enable + global_rate_limit: + capacity: 1 + interval: 30s + timeout: null +``` + + +--- + +### `traffic_shaping.all.compression` + +- **Type:** `any` + +```yaml title="traffic_shaping.all.compression" +compression: gzip +``` + + +--- + +### `traffic_shaping.all.deduplicate_query` + +Enable query deduplication + +- **Type:** `boolean` + +```yaml title="traffic_shaping.all.deduplicate_query" +deduplicate_query: false +``` + + +--- + +### `traffic_shaping.all.dns_resolution_strategy` + +- **Type:** `any` + +```yaml title="traffic_shaping.all.dns_resolution_strategy" +dns_resolution_strategy: ipv4_only +``` + + +--- + +### `traffic_shaping.all.experimental_http2` + +- **Type:** `any` + +```yaml title="traffic_shaping.all.experimental_http2" +experimental_http2: enable +``` + + +--- + +### `traffic_shaping.all.global_rate_limit` + +- **Type:** `object` + +```yaml title="traffic_shaping.all.global_rate_limit" +global_rate_limit: + capacity: 1 + interval: 30s +``` + + +--- + +### `traffic_shaping.all.global_rate_limit.capacity` + +Number of requests allowed + +- **Type:** `integer` +- **Minimum:** `1.0` + +```yaml title="traffic_shaping.all.global_rate_limit.capacity" +capacity: 1 +``` + + +--- + +### `traffic_shaping.all.global_rate_limit.interval` + +Per interval + +- **Type:** `string` + +```yaml title="traffic_shaping.all.global_rate_limit.interval" +interval: 30s +``` + + +--- + +### `traffic_shaping.all.timeout` + +Enable timeout for incoming requests + +- **Type:** `string` +- **Default:** `None` + +```yaml title="traffic_shaping.all.timeout" +timeout: null +``` + + +--- + +### `traffic_shaping.connector` + +- **Type:** `object` + +```yaml title="traffic_shaping.connector" +connector: + all: + compression: gzip + dns_resolution_strategy: ipv4_only + experimental_http2: enable + global_rate_limit: + capacity: 1 + interval: 30s + timeout: null + sources: {} +``` + + +--- + +### `traffic_shaping.connector.all` + +- **Type:** `object` + +```yaml title="traffic_shaping.connector.all" +all: + compression: gzip + dns_resolution_strategy: ipv4_only + experimental_http2: enable + global_rate_limit: + capacity: 1 + interval: 30s + timeout: null +``` + + +--- + +### `traffic_shaping.connector.all.compression` + +- **Type:** `any` + +```yaml title="traffic_shaping.connector.all.compression" +compression: gzip +``` + + +--- + +### `traffic_shaping.connector.all.dns_resolution_strategy` + +- **Type:** `any` + +```yaml title="traffic_shaping.connector.all.dns_resolution_strategy" +dns_resolution_strategy: ipv4_only +``` + + +--- + +### `traffic_shaping.connector.all.experimental_http2` + +- **Type:** `any` + +```yaml title="traffic_shaping.connector.all.experimental_http2" +experimental_http2: enable +``` + + +--- + +### `traffic_shaping.connector.all.global_rate_limit` + +- **Type:** `object` + +```yaml title="traffic_shaping.connector.all.global_rate_limit" +global_rate_limit: + capacity: 1 + interval: 30s +``` + + +--- + +### `traffic_shaping.connector.all.global_rate_limit.capacity` + +Number of requests allowed + +- **Type:** `integer` +- **Minimum:** `1.0` + +```yaml title="traffic_shaping.connector.all.global_rate_limit.capacity" +capacity: 1 +``` + + +--- + +### `traffic_shaping.connector.all.global_rate_limit.interval` + +Per interval + +- **Type:** `string` + +```yaml title="traffic_shaping.connector.all.global_rate_limit.interval" +interval: 30s +``` + + +--- + +### `traffic_shaping.connector.all.timeout` + +Enable timeout for connectors requests + +- **Type:** `string` +- **Default:** `None` + +```yaml title="traffic_shaping.connector.all.timeout" +timeout: null +``` + + +--- + +### `traffic_shaping.connector.sources` + +Applied on specific connector sources + +- **Type:** `object` + +```yaml title="traffic_shaping.connector.sources" +sources: {} +``` + + +--- + +### `traffic_shaping.deduplicate_variables` + +DEPRECATED, now always enabled: Enable variable deduplication optimization when sending requests to subgraphs (https://github.com/apollographql/router/issues/87) + +- **Type:** `boolean` +- **Default:** `None` + +```yaml title="traffic_shaping.deduplicate_variables" +deduplicate_variables: null +``` + + +--- + +### `traffic_shaping.router` + +- **Type:** `object` + +```yaml title="traffic_shaping.router" +router: + concurrency_limit: 0 + global_rate_limit: + capacity: 1 + interval: 30s + timeout: null +``` + + +--- + +### `traffic_shaping.router.concurrency_limit` + +The global concurrency limit + +- **Type:** `integer` +- **Minimum:** `0.0` + +```yaml title="traffic_shaping.router.concurrency_limit" +concurrency_limit: 0 +``` + + +--- + +### `traffic_shaping.router.global_rate_limit` + +- **Type:** `object` + +```yaml title="traffic_shaping.router.global_rate_limit" +global_rate_limit: + capacity: 1 + interval: 30s +``` + + +--- + +### `traffic_shaping.router.global_rate_limit.capacity` + +Number of requests allowed + +- **Type:** `integer` +- **Minimum:** `1.0` + +```yaml title="traffic_shaping.router.global_rate_limit.capacity" +capacity: 1 +``` + + +--- + +### `traffic_shaping.router.global_rate_limit.interval` + +Per interval + +- **Type:** `string` + +```yaml title="traffic_shaping.router.global_rate_limit.interval" +interval: 30s +``` + + +--- + +### `traffic_shaping.router.timeout` + +Enable timeout for incoming requests + +- **Type:** `string` +- **Default:** `None` + +```yaml title="traffic_shaping.router.timeout" +timeout: null +``` + + +--- + +### `traffic_shaping.subgraphs` + +Applied on specific subgraphs + +- **Type:** `object` + +```yaml title="traffic_shaping.subgraphs" +subgraphs: {} +``` diff --git a/docs/shared/router-yaml-complete.mdx b/docs/shared/router-yaml-complete.mdx new file mode 100644 index 0000000000..95e42e1376 --- /dev/null +++ b/docs/shared/router-yaml-complete.mdx @@ -0,0 +1,1096 @@ +```yaml +apq: + enabled: true + router: + cache: + in_memory: + limit: 1 + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: null + urls: + - http://example.com/urls_item + username: example_username + subgraph: + all: + enabled: false + subgraphs: {} +authentication: + connector: + sources: {} + router: + jwt: + header_name: authorization + header_value_prefix: Bearer + ignore_other_prefixes: false + jwks: + - algorithms: null + headers: + - name: example_name + value: example_value + issuer: example_issuer + poll_interval: + secs: 60 + nanos: 0 + url: http://service.example.com/url + on_error: Continue + sources: + - name: authorization + type: header + value_prefix: Bearer + subgraph: + all: + aws_sig_v4: + hardcoded: + access_key_id: example_access_key_id + assume_role: + external_id: example_external_id + role_arn: example_role_arn + session_name: example_session_name + region: example_region + secret_access_key: example_secret_access_key + service_name: example_service_name + subgraphs: {} +authorization: + directives: + dry_run: false + enabled: true + errors: + log: true + response: errors + reject_unauthorized: false + require_authentication: false +batching: + enabled: false + maximum_size: null + mode: batch_http_link + subgraph: + all: + enabled: false + subgraphs: {} +connectors: + debug_extensions: false + expose_sources_in_context: false + max_requests_per_operation_per_source: null + sources: {} + subgraphs: {} +coprocessor: + client: + dns_resolution_strategy: ipv4_only + experimental_http2: enable + execution: + request: + body: false + context: false + headers: false + method: false + query_plan: false + sdl: false + response: + body: false + context: false + headers: false + sdl: false + status_code: false + router: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + path: false + sdl: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + sdl: false + status_code: false + subgraph: + all: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + service_name: false + subgraph_request_id: false + uri: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + service_name: false + status_code: false + subgraph_request_id: false + supergraph: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + sdl: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + sdl: false + status_code: false + timeout: + secs: 1 + nanos: 0 + url: http://service.example.com/url +cors: + allow_any_origin: false + allow_credentials: false + allow_headers: [] + expose_headers: null + match_origins: null + max_age: null + methods: + - GET + - POST + - OPTIONS + origins: + - https://studio.apollographql.com +csrf: + required_headers: + - x-apollo-operation-name + - apollo-require-preflight + unsafe_disabled: false +demand_control: + enabled: false + mode: measure + strategy: + static_estimated: + list_size: 0 + max: 0.0 +experimental_chaos: + force_reload: null +experimental_type_conditioned_fetching: false +fleet_detector: {} +forbid_mutations: false +headers: + all: + request: + - insert: + name: example_name + value: example_value + subgraphs: {} +health_check: + enabled: true + listen: example_listen + path: /health + readiness: + allowed: 100 + interval: + sampling: 0s + unready: null +homepage: + enabled: true + graph_ref: null +include_subgraph_errors: + all: false + subgraphs: {} +license_enforcement: {} +limits: + http1_max_request_buf_size: null + http1_max_request_headers: null + http_max_request_bytes: 2000000 + introspection_max_depth: true + max_aliases: null + max_depth: null + max_height: null + max_root_fields: null + parser_max_recursion: 500 + parser_max_tokens: 15000 + warn_only: false +override_subgraph_url: {} +persisted_queries: + enabled: false + experimental_prewarm_query_plan_cache: + on_reload: true + on_startup: false + hot_reload: false + local_manifests: null + log_unknown: false + safelist: + enabled: false + require_id: false +plugins: unknown_type_plugins +preview_entity_cache: + enabled: false + expose_keys_in_context: false + invalidation: + concurrent_requests: 10 + listen: example_listen + path: example_path + scan_count: 1000 + metrics: + enabled: false + separate_per_type: false + ttl: 30s + subgraph: + all: + enabled: true + invalidation: + enabled: false + shared_key: "" + private_id: null + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: null + urls: + - http://example.com/urls_item + username: example_username + ttl: 30s + subgraphs: {} +preview_file_uploads: + enabled: false + protocols: + multipart: + enabled: true + limits: + max_file_size: example_max_file_size + max_files: 0 + mode: stream +progressive_override: {} +rhai: + main: example_main + scripts: example_scripts +sandbox: + enabled: false +subscription: + enable_deduplication: true + enabled: true + max_opened_subscriptions: null + mode: + callback: + heartbeat_interval: disabled + listen: example_listen + path: example_path + public_url: http://service.example.com/public_url + subgraphs: [] + passthrough: + all: + heartbeat_interval: disabled + path: null + protocol: graphql_ws + subgraphs: {} + queue_capacity: null +supergraph: + defer_support: true + early_cancel: false + experimental_log_on_broken_pipe: false + generate_query_fragments: true + introspection: false + listen: example_listen + path: / + query_planning: + cache: + in_memory: + limit: 1 + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: + secs: 2592000 + nanos: 0 + urls: + - http://example.com/urls_item + username: example_username + experimental_paths_limit: null + experimental_plans_limit: null + experimental_reuse_query_plans: false + warmed_up_queries: null +telemetry: + apollo: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + secs: 30 + nanos: 0 + max_queue_size: 2048 + scheduled_delay: + secs: 5 + nanos: 0 + buffer_size: 10000 + client_name_header: apollographql-client-name + client_version_header: apollographql-client-version + endpoint: https://usage-reporting.api.apollographql.com/api/ingress/traces + errors: + preview_extended_error_metrics: disabled + subgraph: + all: + redact: true + redaction_policy: strict + send: true + subgraphs: {} + experimental_local_field_metrics: false + experimental_otlp_endpoint: https://usage-reporting.api.apollographql.com/ + experimental_otlp_tracing_protocol: grpc + field_level_instrumentation_sampler: 0.0 + metrics_reference_mode: extended + otlp_tracing_sampler: 0.0 + send_headers: + only: + - example_only_item + send_variable_values: + only: + - example_only_item + signature_normalization_algorithm: legacy + exporters: + logging: + common: + resource: {} + service_name: null + service_namespace: null + stdout: + enabled: true + format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] + rate_limit: + capacity: 1 + enabled: false + interval: + secs: 1 + nanos: 0 + tty_format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] + metrics: + common: + buckets: + - 0.001 + - 0.005 + - 0.015 + - 0.05 + - 0.1 + - 0.2 + - 0.3 + - 0.4 + - 0.5 + - 1.0 + - 5.0 + - 10.0 + resource: {} + service_name: null + service_namespace: null + views: + - aggregation: + histogram: + buckets: + - 0.0 + allowed_attribute_keys: + - example_allowed_attribute_keys_item + description: example_description + name: example_name + unit: example_unit + otlp: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + secs: 30 + nanos: 0 + max_queue_size: 2048 + scheduled_delay: + secs: 5 + nanos: 0 + enabled: false + endpoint: example_endpoint + grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} + http: + headers: {} + protocol: grpc + temporality: cumulative + prometheus: + enabled: false + listen: example_listen + path: /metrics + tracing: + common: + max_attributes_per_event: 128 + max_attributes_per_link: 128 + max_attributes_per_span: 128 + max_events_per_span: 128 + max_links_per_span: 128 + parent_based_sampler: true + preview_datadog_agent_sampling: null + resource: {} + sampler: 0.0 + service_name: null + service_namespace: null + datadog: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + secs: 30 + nanos: 0 + max_queue_size: 2048 + scheduled_delay: + secs: 5 + nanos: 0 + enable_span_mapping: true + enabled: false + endpoint: example_endpoint + fixed_span_names: true + resource_mapping: {} + span_metrics: + parse_query: true + connect: true + execution: true + http_request: true + request: true + query_planning: true + connect_request: true + subgraph: true + router: true + supergraph: true + subgraph_request: true + experimental_response_trace_id: + enabled: false + format: hexadecimal + header_name: example_header_name + otlp: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + secs: 30 + nanos: 0 + max_queue_size: 2048 + scheduled_delay: + secs: 5 + nanos: 0 + enabled: false + endpoint: example_endpoint + grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} + http: + headers: {} + protocol: grpc + temporality: cumulative + propagation: + aws_xray: false + baggage: false + datadog: false + jaeger: false + request: + format: hexadecimal + header_name: example_header_name + trace_context: false + zipkin: false + zipkin: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + secs: 30 + nanos: 0 + max_queue_size: 2048 + scheduled_delay: + secs: 5 + nanos: 0 + enabled: false + endpoint: example_endpoint + instrumentation: + events: + connector: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + router: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + subgraph: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + supergraph: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + instruments: + cache: + apollo.router.operations.entity.cache: + attributes: + graphql.type.name: + alias: example_alias + connector: + http.client.request.body.size: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.request.duration: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.response.body.size: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + default_requirement_level: none + graphql: + field.execution: + attributes: + graphql.field.name: + alias: example_alias + graphql.field.type: + alias: example_alias + graphql.list.length: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.type.name: + alias: example_alias + list.length: + attributes: + graphql.field.name: + alias: example_alias + graphql.field.type: + alias: example_alias + graphql.list.length: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.type.name: + alias: example_alias + router: + http.server.active_requests: + attributes: + http.request.method: false + server.address: false + server.port: false + url.scheme: false + http.server.request.body.size: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + http.server.request.duration: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + http.server.response.body.size: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + subgraph: + http.client.request.body.size: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.request.duration: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.response.body.size: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + supergraph: + cost.actual: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + cost.delta: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + cost.estimated: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + spans: + connector: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + default_attribute_requirement_level: none + mode: deprecated + router: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + subgraph: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + supergraph: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias +tls: + connector: + all: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + sources: {} + subgraph: + all: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + subgraphs: {} + supergraph: + certificate: example_certificate + certificate_chain: example_certificate_chain + key: example_key +traffic_shaping: + all: + compression: gzip + deduplicate_query: false + dns_resolution_strategy: ipv4_only + experimental_http2: enable + global_rate_limit: + capacity: 1 + interval: 30s + timeout: null + connector: + all: + compression: gzip + dns_resolution_strategy: ipv4_only + experimental_http2: enable + global_rate_limit: + capacity: 1 + interval: 30s + timeout: null + sources: {} + deduplicate_variables: null + router: + concurrency_limit: 0 + global_rate_limit: + capacity: 1 + interval: 30s + timeout: null + subgraphs: {} +``` \ No newline at end of file diff --git a/docs/source/routing/about-router.mdx b/docs/source/routing/about-router.mdx index c2365f7307..a12dcaa6f6 100644 --- a/docs/source/routing/about-router.mdx +++ b/docs/source/routing/about-router.mdx @@ -8,7 +8,7 @@ redirectFrom: ## What is GraphOS Router? -GraphOS Router is the runtime of the GraphOS platform. It executes client operations by planning and executing subgraph queries, then merging them into client responses. It's also the single entry point and gateway to your federated GraphQL API. +GraphOS Router is the high-performance runtime of the GraphOS platform. It's the single entry point to a graph that's composed via Apollo Federation. GraphOS Router accepts incoming GraphQL client operations, intelligently plans their execution by the different "subgraph" APIs and services, and combines the fetched data into a single client response. The router can hot-reload updated configuration. When enabled, changes in `router.yaml` trigger the router to restart with its updated configuration. diff --git a/docs/source/routing/configuration.mdx b/docs/source/routing/configuration/reference.mdx similarity index 83% rename from docs/source/routing/configuration.mdx rename to docs/source/routing/configuration/reference.mdx index 03c70e2751..f307879a3a 100644 --- a/docs/source/routing/configuration.mdx +++ b/docs/source/routing/configuration/reference.mdx @@ -1,34 +1,22 @@ --- -title: Router Configuration -subtitle: Configure a router via environment variables, command-line options, and YAML +title: Router Configuration Reference +subtitle: "" description: Learn how to configure the Apollo GraphOS Router or Apollo Router Core with environment variables, command-line options and commands, and YAML configuration files. -redirectFrom: - - /router/configuration/overview/ --- +import RouterYaml from '../../../shared/router-yaml-complete.mdx'; +import RouterConfigTable from '../../../shared/router-config-properties-table.mdx'; -Learn how to customize the behavior of your GraphOS Router or Apollo Router Core with environment variables, command-line commands and options, and YAML file configuration. +This reference covers the environment variables, command-line options, and YAML configuration file properties for configuring an Apollo Router. -## Self-hosted and cloud configuration differences - -You can configure a router in multiple ways. Because cloud-hosted and self-hosted routers share the common foundation of Apollo Router Core, all routers support declarative configuration with a YAML file, usually named `router.yaml`. Differences between configuring cloud-hosted and self-hosted routers: - -- A cloud-hosted router is managed by Apollo and fully integrated with GraphOS, so its configuration is provided via the GraphOS Studio IDE. -- A self-hosted router is launched via command line, so its configuration includes command-line options and environment variables. +## Environment variables -| | Cloud-Hosted Router | Self-Hosted Router | -| --- | :---: | :---: | -| Studio IDE | ✅ | ❌ | -| YAML file | ✅ | ✅ | -| Command-line options | ❌ | ✅ | -| Environment variables | ❌ | ✅ | +This section lists and describes the environment variables you can set when running the `router` binary. -## Environment variables + -If you're using the GraphOS Router with [managed federation](/federation/managed-federation/overview/) and GraphOS Studio, set these environment variables in the startup command: +The supported environment variables apply only if you're using GraphOS Router with [managed federation](/federation/managed-federation/overview/) and GraphOS Studio. -```bash -APOLLO_KEY="..." APOLLO_GRAPH_REF="..." ./router -``` + @@ -88,15 +76,23 @@ A path to a file containing the [graph API key](/graphos/api-keys/#graph-api-key
-## Command-line options +### Example command with environment variables -After [installing the Apollo Router Core](/router/quickstart) in your current working directory, you can run the router with the following example command: +You must set any environment variables before the `router` command: ```bash -./router --config router.yaml --supergraph supergraph-schema.graphql +APOLLO_KEY="..." APOLLO_GRAPH_REF="..." ./router ``` -This reference lists and describes the options supported by the `router` binary. Where indicated, some of these options can also be provided via an environment variable. If an option is provided _both_ ways, the command-line value takes precedence. +## Command-line options + +This reference lists and describes the options supported by the `router` binary. Where indicated, some of these options can also be provided via an environment variable. + + + +For options available as both a command-line option and an environment variable, the command-line value takes precedence. + + @@ -315,191 +311,34 @@ If set, the router prints its version number, then exits.
-### Dev mode defaults - - - -**Do not set the `--dev` option in production.** If you want to replicate any specific dev mode functionality in production, instead make the corresponding modifications to your [YAML config file](#yaml-config-file). - - - -Setting the [`--dev`](#--dev) flag is equivalent to running `./router --hot-reload` with the following configuration options: - -```yaml -sandbox: - enabled: true -homepage: - enabled: false -supergraph: - introspection: true -include_subgraph_errors: - all: true -plugins: - # Enable with the header, Apollo-Expose-Query-Plan: true - experimental.expose_query_plan: true -``` - -## Configuration awareness in your text editor - -The router can generate a JSON schema for config validation in your text editor. This schema helps you format the YAML file correctly and also provides content assist. - -Generate the schema with the following command: - -```bash -./router config schema > configuration_schema.json -``` - -After you generate the schema, configure your text editor. Here are the instructions for some commonly used editors: - -- [Visual Studio Code](https://code.visualstudio.com/docs/languages/json#_json-schemas-and-settings) -- [Emacs](https://emacs-lsp.github.io/lsp-mode/page/lsp-yaml) -- [IntelliJ](https://www.jetbrains.com/help/idea/json.html#ws_json_using_schemas) -- [Sublime](https://github.com/sublimelsp/LSP-yaml) -- [Vim](https://github.com/Quramy/vison) - -## Upgrading your router configuration +## YAML properties -New releases of the router might introduce breaking changes to the [YAML config file's](#yaml-config-file) expected format, usually to extend existing functionality or improve usability. - -**If you run a new version of your router with a configuration file that it no longer supports, it emits a warning on startup and terminates.** - -If you encounter this warning, you can use the `router config upgrade` command to see the new expected format for your existing configuration file: - -```bash -./router config upgrade -``` +The router can be configured by a YAML configuration file. This file enables you to declaratively configure various runtime properties of your router's behavior. -You can also view a diff of exactly which changes are necessary to upgrade your existing configuration file: - -```bash -./router config upgrade --diff -``` - -## Validating your Router configuration - -The Router can be used to validate an existing configuration file. This can be useful if you want to have a validate step as part of your CI pipeline. - -``` -./router config validate -``` - -This command takes a config file and validates it against the router's full supported configuration format. - - - -This is a static validation that checks if it is syntactically correct using the JSON schema. The router does additional logical checks on startup against the config that this command does not capture. - - - -## YAML config file - -GraphOS Router and Apollo Router Core take an optional YAML configuration file as input via the [`--config`](#-c----config) option: +At startup, you set the config file for your router by providing its path with the [`--config`](#-c----config) option: ```bash ./router --config router.yaml ``` -This file enables you to customize numerous aspects of your router's behavior, covered in the subsections below. - -If you pass the [`--hot-reload`](#--hr----hot-reload) flag to the `router` command, your router automatically restarts whenever changes are made to its configuration file. +### Example YAML config file - +Expand the code block to view an example YAML config file containing all properties. -Enable your text editor to validate the format and content of your router YAML configuration file by [configuring it with the router's configuration schema](#configuration-awareness-in-your-text-editor). + - + -### Listen address + -By default, the router starts an HTTP server that listens on `127.0.0.1:4000`. You can specify a different address by setting `supergraph.listen`: + -#### IPv4 - -```yaml title="router.yaml" -supergraph: - # The socket address and port to listen on - listen: 127.0.0.1:4000 -``` - -#### IPv6 - -```yaml title="router.yaml" -supergraph: - # The socket address and port to listen on. - # Note that this must be quoted to avoid interpretation as an array in YAML. - listen: "[::1]:4000" -``` - -#### Unix socket - - - -Listening on a Unix socket is not supported on Windows. - - - -```yaml title="router_unix.yaml" -supergraph: - # Absolute path to a Unix socket - listen: /tmp/router.sock -``` +## TODO ### Endpoint path -By default, the router starts an HTTP server that exposes a `POST`/`GET` endpoint at path `/`. - -You can specify a different path by setting `supergraph.path`: - -```yaml title="router.yaml" -supergraph: - # The path for GraphQL execution - # (Defaults to /) - path: /graphql -``` - -The path must start with `/`. - -A path can contain parameters and wildcards: - -- `/{parameter}` matches a single segment. For example: - - - `/abc/{my_param}/def` matches `/abc/1/def` and `/abc/whatever/def`, but it doesn't match `/abc/1/2/def` or `/abc/def` - -- `/{*parameter}` matches all segments in the rest of a path. For example: - - `/abc/{*wildcard}` matches `/abc/1/def` and `/abc/w/h/a/t/e/v/e/r`, but it doesn't match `/abc/` or `/not_abc_at_all` - - - -- Both parameters and wildcards require a name, even though you can’t use those names anywhere. - -- The router doesn't support wildcards in the _middle_ of a path (e.g., `/{*wild}/graphql`). Instead, use a path parameter (e.g., `/{parameter}/graphql`). - - - ### Introspection -By default, the router does _not_ resolve introspection queries. You can enable introspection like so: - -```yaml title="router.yaml" -# Do not enable introspection in production! -supergraph: - introspection: true -``` - -The [schema-intropsection schema](https://spec.graphql.org/draft/#sec-Schema-Introspection.Schema-Introspection-Schema) is recursive: a client can query the fields of the types of some other fields, and so on arbitrarily deep. This can produce responses that grow much faster than the size of the request. - -To protect against abusive Router now refuses to execute introspection queries that nest list fields too deep and returns an error instead. The criteria matches `MaxIntrospectionDepthRule` in graphql-js, but may change in future versions. - -In case it rejects legitimate queries, this check can be disabled in Router configuration: - -```yaml title="router.yaml" -# Do not enable introspection in production! -supergraph: - introspection: true -limits: - introspection_max_depth: false -``` - ### Debugging - To configure logging, see [Logging in the router](/router/configuration/telemetry/exporters/logging/overview). @@ -508,63 +347,11 @@ limits: ### Landing pages -The router can serve any of the following landing pages to browsers that visit its [endpoint path](#endpoint-path): - -- A basic landing page that displays an example query `curl` command (default) - - ```yaml title="router.yaml" - # This is the default behavior. You don't need to include this config. - homepage: - enabled: true - ``` -- _No_ landing page - - ```yaml title="router.yaml" - homepage: - enabled: false - ``` - -- [Apollo Sandbox](/graphos/explorer/sandbox), which enables you to explore your schema and compose operations against it using the Explorer - - Note the additional configuration required to use Sandbox: - - ```yaml title="router.yaml" - sandbox: - enabled: true - - # Sandbox uses introspection to obtain your router's schema. - supergraph: - introspection: true - - # Sandbox requires the default landing page to be disabled. - homepage: - enabled: false - ``` - - - - **Do not enable Sandbox in production.** Sandbox requires enabling introspection, which is strongly discouraged in production environments. - - ### Subgraph routing URLs -By default, the router obtains the routing URL for each of your subgraphs from the composed supergraph schema you provide it. In most cases, no additional configuration is required. The URL can use HTTP and HTTPS for network access to subgraph, or have the following shape for Unix sockets usage: `unix:///path/to/subgraph.sock` - -However, if you _do_ need to override a particular subgraph's routing URL (for example, to handle changing network topography), you can do so with the `override_subgraph_url` option: - -```yaml -override_subgraph_url: - organizations: http://localhost:8080 - accounts: "${env.ACCOUNTS_SUBGRAPH_HOST_URL}" -``` - -In this example, the `organizations` subgraph URL is overridden to point to `http://localhost:8080`, and the `accounts` subgraph URL is overridden to point to a new URL using [variable expansion](#variable-expansion). The URL specified in the supergraph schema is ignored. -Any subgraphs that are _omitted_ from `override_subgraph_url` continue to use the routing URL specified in the supergraph schema. - -If you need to override the subgraph URL at runtime on a per-request basis, you can use [request customizations](/router/customizations/overview/#request-path) in the `SubgraphService` layer. ### Caching @@ -596,21 +383,7 @@ The router supports enhanced operation signature normalization in the following
-Apollo's legacy operation signature algorithm removes information about certain fields, such as input objects and aliases. -This removal means some operations may have the same normalized signature though they are distinct operations. - -Enhanced normalization incorporates [input types](#input-types) and [aliases](#aliases) in signature generation. -It also includes other improvements that make it more likely that two operations that only vary slightly have the same signature. -Configure enhanced operation signature normalization in `router.yaml` with the `telemetry.apollo.signature_normalization_algorithm` option: - -```yaml title="router.yaml" -telemetry: - apollo: - signature_normalization_algorithm: enhanced # Default is legacy -``` - -Once you enable this configuration, operations with enhanced signatures might appear with different operation IDs than they did previously in GraphOS Studio. #### Input types @@ -1294,6 +1067,110 @@ headers: Here, the `name` and `value` entries under `&insert_custom_header` are reused under `*insert_custom_header`. +## Self-hosted and cloud configuration differences + +You can configure a router in multiple ways. Because cloud-hosted and self-hosted routers share the common foundation of Apollo Router Core, all routers support declarative configuration with a YAML file, usually named `router.yaml`. Differences between configuring cloud-hosted and self-hosted routers: + +- A cloud-hosted router is managed by Apollo and fully integrated with GraphOS, so its configuration is provided via the GraphOS Studio IDE. +- A self-hosted router is launched via command line, so its configuration includes command-line options and environment variables. + +| | Cloud-Hosted Router | Self-Hosted Router | +| --- | :---: | :---: | +| Studio IDE | ✅ | ❌ | +| YAML file | ✅ | ✅ | +| Command-line options | ❌ | ✅ | +| Environment variables | ❌ | ✅ | + +## Developing router configuration + +Here are some tips and best practices for developing and updating the configuration for your router. + +### Dev mode defaults + + + +**Do not set the `--dev` option in production.** If you want to replicate any specific dev mode functionality in production, instead make the corresponding modifications to your [YAML config file](#yaml-config-file). + + + +Setting the [`--dev`](#--dev) flag is equivalent to running `./router --hot-reload` with the following configuration options: + +```yaml +sandbox: + enabled: true +homepage: + enabled: false +supergraph: + introspection: true +include_subgraph_errors: + all: true +plugins: + # Enable with the header, Apollo-Expose-Query-Plan: true + experimental.expose_query_plan: true +``` + +### Configuration awareness in your text editor + +The router can generate a JSON schema for config validation in your text editor. This schema helps you format the YAML file correctly and also provides content assist. + +Generate the schema with the following command: + +```bash +./router config schema > configuration_schema.json +``` + +After you generate the schema, configure your text editor. Here are the instructions for some commonly used editors: + +- [Visual Studio Code](https://code.visualstudio.com/docs/languages/json#_json-schemas-and-settings) +- [Emacs](https://emacs-lsp.github.io/lsp-mode/page/lsp-yaml) +- [IntelliJ](https://www.jetbrains.com/help/idea/json.html#ws_json_using_schemas) +- [Sublime](https://github.com/sublimelsp/LSP-yaml) +- [Vim](https://github.com/Quramy/vison) + +### Upgrading your router configuration + +New releases of the router might introduce breaking changes to the [YAML config file's](#yaml-config-file) expected format, usually to extend existing functionality or improve usability. + +**If you run a new version of your router with a configuration file that it no longer supports, it emits a warning on startup and terminates.** + +If you encounter this warning, you can use the `router config upgrade` command to see the new expected format for your existing configuration file: + +```bash +./router config upgrade +``` + +You can also view a diff of exactly which changes are necessary to upgrade your existing configuration file: + +```bash +./router config upgrade --diff +``` + +### Validating your router configuration + +The router can be used to validate an existing configuration file. This can be useful if you want to have a validate step as part of your CI pipeline. + +``` +./router config validate +``` + +This command takes a config file and validates it against the router's full supported configuration format. + + + +This is a static validation that checks if it is syntactically correct using the JSON schema. The router does additional logical checks on startup against the config that this command does not capture. + + + +## Todo asides + +If you pass the [`--hot-reload`](#--hr----hot-reload) flag to the `router` command, your router automatically restarts whenever changes are made to its configuration file. + + + +Enable your text editor to validate the format and content of your router YAML configuration file by [configuring it with the router's configuration schema](#configuration-awareness-in-your-text-editor). + + + ## Related topics - [Checklist for configuring the router for production](/technotes/TN0008-production-readiness-checklist/#apollo-router) From d4613a8361addf45d867b677f589c6850c4e77f7 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Wed, 23 Apr 2025 13:07:09 -0700 Subject: [PATCH 12/47] add changelog page --- docs/source/routing/changelog.mdx | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 docs/source/routing/changelog.mdx diff --git a/docs/source/routing/changelog.mdx b/docs/source/routing/changelog.mdx new file mode 100644 index 0000000000..44a2abcbb6 --- /dev/null +++ b/docs/source/routing/changelog.mdx @@ -0,0 +1,9 @@ +--- +title: Apollo Router Changelogs +subtitle: "" +description: Changelogs of Apollo Router releases +--- + +Apollo maintains a changelog for each router release in GitHub. + +Go to [router releases in GitHub](https://github.com/apollographql/router/releases) to view changelogs. From 26fa14e7bf1e6ad24c32ac564048fd481e9ab87c Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Wed, 23 Apr 2025 13:50:32 -0700 Subject: [PATCH 13/47] divide configuration pages --- docs/source/routing/configuration/cli.mdx | 236 +++++++++++++ docs/source/routing/configuration/envvars.mdx | 83 +++++ .../configuration/{reference.mdx => yaml.mdx} | 311 +----------------- 3 files changed, 323 insertions(+), 307 deletions(-) create mode 100644 docs/source/routing/configuration/cli.mdx create mode 100644 docs/source/routing/configuration/envvars.mdx rename docs/source/routing/configuration/{reference.mdx => yaml.mdx} (80%) diff --git a/docs/source/routing/configuration/cli.mdx b/docs/source/routing/configuration/cli.mdx new file mode 100644 index 0000000000..fba74b1c31 --- /dev/null +++ b/docs/source/routing/configuration/cli.mdx @@ -0,0 +1,236 @@ +--- +title: Router CLI Configuration Reference +subtitle: "" +description: Reference of command-line options for Apollo GraphOS Router and Apollo Router Core. +--- +import RouterYaml from '../../../shared/router-yaml-complete.mdx'; +import RouterConfigTable from '../../../shared/router-config-properties-table.mdx'; + +This reference covers the command-line options for configuring an Apollo Router. + +## Command-line options + +This reference lists and describes the options supported by the `router` binary. Where indicated, some of these options can also be provided via an environment variable. + + + +For options available as both a command-line option and an environment variable, the command-line value takes precedence. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Option / Environment VariableDescription
+ +##### `-s` / `--supergraph` + +`APOLLO_ROUTER_SUPERGRAPH_PATH`, `APOLLO_ROUTER_SUPERGRAPH_URLS` + + + +The [supergraph schema](/federation/federated-types/overview#supergraph-schema) of a router. Specified by absolute or relative path (`-s` / `--supergraph `, or `APOLLO_ROUTER_SUPERGRAPH_PATH`), or a comma-separated list of URLs (`--supergraph-urls `, or `APOLLO_ROUTER_SUPERGRAPH_URLS`). + +> 💡 Avoid embedding tokens in `APOLLO_ROUTER_SUPERGRAPH_URLS` because the URLs may appear in log messages. + +Setting this option disables polling from Apollo Uplink to fetch the latest supergraph schema. + +To learn how to compose your supergraph schema with the Rover CLI, see the [Federation quickstart](/federation/quickstart). + +**Required** if you are _not_ using managed federation. If you _are_ using managed federation, you may need to set this option when following [advanced deployment workflows](/federation/managed-federation/deployment/#advanced-deployment-workflows). + +
+ +##### `-c` / `--config` + +`APOLLO_ROUTER_CONFIG_PATH` + + + +The absolute or relative path to the router's optional [YAML configuration file](#yaml-config-file). + +
+ +##### `--apollo-key-path` + +`APOLLO_KEY_PATH` + + + +⚠️ **This is not available on Windows.** + +The absolute or relative path to a file containing the Apollo graph API key for use with managed federation. + +
+ +##### `--dev` + + + +⚠️ **Do not set this option in production!** + +If set, a router runs in dev mode to help with local development. + +[Learn more about dev mode.](/graphos/routing/configuration/yaml#dev-mode-defaults) + +
+ +##### `--hr` / `--hot-reload` + +`APOLLO_ROUTER_HOT_RELOAD` + + + +If set, the router watches for changes to its configuration file and any supergraph file passed with `--supergraph` and reloads them automatically without downtime. This setting only affects local files provided to the router. The supergraph and configuration provided from GraphOS via Launches (and delivered via Uplink) are _always_ loaded automatically, regardless of this setting. + +
+ +##### `--log` + +`APOLLO_ROUTER_LOG` + + + +The log level, indicating the _most_ severe log message type to include. In ascending order of verbosity, can be one of: `off`, `error`, `warn`, `info`, `debug`, or `trace`. + +The default value is `info`. + +
+ +##### `--license` + +`APOLLO_ROUTER_LICENSE_PATH`, `APOLLO_ROUTER_LICENSE` + + + +An offline GraphOS Enterprise license. Enables Enterprise router features when disconnected from GraphOS. + +An offline license is specified either as an absolute or relative path to a license file (`--license ` or `APOLLO_ROUTER_LICENSE_PATH`), or as the stringified contents of a license (`APOLLO_ROUTER_LICENSE`). + +When not set, the router retrieves an Enterprise license [from GraphOS via Apollo Uplink](/router/enterprise-features/#the-enterprise-license). + +For information about fetching an offline license and configuring the router, see [Offline Enterprise license](/router/enterprise-features/#offline-enterprise-license). + +
+ +##### `--apollo-uplink-endpoints` + +`APOLLO_UPLINK_ENDPOINTS` + + + +If using [managed federation](/federation/managed-federation/overview/), the Apollo Uplink URL(s) that the router should poll to fetch its latest configuration. Almost all managed router instances should _omit_ this option to use the default set of Uplink URLs. + +If you specify multiple URLs, separate them with commas (no whitespace). + +For default behavior and possible values, see [Apollo Uplink](/federation/managed-federation/uplink/). + +
+ +##### `--apollo-uplink-timeout` + +`APOLLO_UPLINK_TIMEOUT` + + + +The request timeout for each poll sent to Apollo Uplink. + +The default value is `30s` (thirty seconds). + +
+ +##### `--anonymous-telemetry-disabled` + +`APOLLO_TELEMETRY_DISABLED` + + + +If set, disables sending anonymous usage information to Apollo. + +
+ +##### `--listen` + +`APOLLO_ROUTER_LISTEN_ADDRESS` + + + +If set, the listen address of the router. + +
+ +##### `-V` / `--version` + + + +If set, the router prints its version number, then exits. + +
diff --git a/docs/source/routing/configuration/envvars.mdx b/docs/source/routing/configuration/envvars.mdx new file mode 100644 index 0000000000..4549a6e64e --- /dev/null +++ b/docs/source/routing/configuration/envvars.mdx @@ -0,0 +1,83 @@ +--- +title: Router Environment Variable Configuration Reference +subtitle: "" +description: Reference of YAML configuration properties for Apollo GraphOS Router and Apollo Router Core. +--- + +This reference covers the environment variables, command-line options, and YAML configuration file properties for configuring an Apollo Router. + +## Environment variables + +This section lists and describes the environment variables you can set when running the `router` binary. + + + +The supported environment variables apply only if you're using GraphOS Router with [managed federation](/federation/managed-federation/overview/) and GraphOS Studio. + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Environment VariableDescription
+ +##### `APOLLO_GRAPH_REF` + + + +The graph ref for the GraphOS graph and variant that the router fetches its supergraph schema from (e.g., `docs-example-graph@staging`). + +**Required** when using [managed federation](/federation/managed-federation/overview/), except when using an [offline license](#--license) to run the router. + +
+ +##### `APOLLO_KEY` + + + +The [graph API key](/graphos/api-keys/#graph-api-keys) that the router should use to authenticate with GraphOS when fetching its supergraph schema. + +**Required** when using [managed federation](/federation/managed-federation/overview/), except when using an [offline license](#--license) to run the router or when using `APOLLO_KEY_PATH`. + +
+ +##### `APOLLO_KEY_PATH` + + + +⚠️ **This is not available on Windows.** + +A path to a file containing the [graph API key](/graphos/api-keys/#graph-api-keys) that the router should use to authenticate with GraphOS when fetching its supergraph schema. + +**Required** when using [managed federation](/federation/managed-federation/overview/), except when using an [offline license](#--license) to run the router or when using `APOLLO_KEY`. + +
+ +## Example command + +To use environment variables when running router, you must set them before the `router` command: + +```bash +APOLLO_KEY="..." APOLLO_GRAPH_REF="..." ./router +``` diff --git a/docs/source/routing/configuration/reference.mdx b/docs/source/routing/configuration/yaml.mdx similarity index 80% rename from docs/source/routing/configuration/reference.mdx rename to docs/source/routing/configuration/yaml.mdx index f307879a3a..4e6b7bb294 100644 --- a/docs/source/routing/configuration/reference.mdx +++ b/docs/source/routing/configuration/yaml.mdx @@ -1,317 +1,14 @@ --- -title: Router Configuration Reference +title: Router YAML Configuration Reference subtitle: "" -description: Learn how to configure the Apollo GraphOS Router or Apollo Router Core with environment variables, command-line options and commands, and YAML configuration files. +description: Reference of YAML configuration properties for Apollo GraphOS Router and Apollo Router Core. --- import RouterYaml from '../../../shared/router-yaml-complete.mdx'; import RouterConfigTable from '../../../shared/router-config-properties-table.mdx'; -This reference covers the environment variables, command-line options, and YAML configuration file properties for configuring an Apollo Router. +This reference covers the YAML configuration file properties for configuring an Apollo Router. -## Environment variables - -This section lists and describes the environment variables you can set when running the `router` binary. - - - -The supported environment variables apply only if you're using GraphOS Router with [managed federation](/federation/managed-federation/overview/) and GraphOS Studio. - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Environment VariableDescription
- -##### `APOLLO_GRAPH_REF` - - - -The graph ref for the GraphOS graph and variant that the router fetches its supergraph schema from (e.g., `docs-example-graph@staging`). - -**Required** when using [managed federation](/federation/managed-federation/overview/), except when using an [offline license](#--license) to run the router. - -
- -##### `APOLLO_KEY` - - - -The [graph API key](/graphos/api-keys/#graph-api-keys) that the router should use to authenticate with GraphOS when fetching its supergraph schema. - -**Required** when using [managed federation](/federation/managed-federation/overview/), except when using an [offline license](#--license) to run the router or when using `APOLLO_KEY_PATH`. - -
- -##### `APOLLO_KEY_PATH` - - - -⚠️ **This is not available on Windows.** - -A path to a file containing the [graph API key](/graphos/api-keys/#graph-api-keys) that the router should use to authenticate with GraphOS when fetching its supergraph schema. - -**Required** when using [managed federation](/federation/managed-federation/overview/), except when using an [offline license](#--license) to run the router or when using `APOLLO_KEY`. - -
- -### Example command with environment variables - -You must set any environment variables before the `router` command: - -```bash -APOLLO_KEY="..." APOLLO_GRAPH_REF="..." ./router -``` - -## Command-line options - -This reference lists and describes the options supported by the `router` binary. Where indicated, some of these options can also be provided via an environment variable. - - - -For options available as both a command-line option and an environment variable, the command-line value takes precedence. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Option / Environment VariableDescription
- -##### `-s` / `--supergraph` - -`APOLLO_ROUTER_SUPERGRAPH_PATH`, `APOLLO_ROUTER_SUPERGRAPH_URLS` - - - -The [supergraph schema](/federation/federated-types/overview#supergraph-schema) of a router. Specified by absolute or relative path (`-s` / `--supergraph `, or `APOLLO_ROUTER_SUPERGRAPH_PATH`), or a comma-separated list of URLs (`--supergraph-urls `, or `APOLLO_ROUTER_SUPERGRAPH_URLS`). - -> 💡 Avoid embedding tokens in `APOLLO_ROUTER_SUPERGRAPH_URLS` because the URLs may appear in log messages. - -Setting this option disables polling from Apollo Uplink to fetch the latest supergraph schema. - -To learn how to compose your supergraph schema with the Rover CLI, see the [Federation quickstart](/federation/quickstart). - -**Required** if you are _not_ using managed federation. If you _are_ using managed federation, you may need to set this option when following [advanced deployment workflows](/federation/managed-federation/deployment/#advanced-deployment-workflows). - -
- -##### `-c` / `--config` - -`APOLLO_ROUTER_CONFIG_PATH` - - - -The absolute or relative path to the router's optional [YAML configuration file](#yaml-config-file). - -
- -##### `--apollo-key-path` - -`APOLLO_KEY_PATH` - - - -⚠️ **This is not available on Windows.** - -The absolute or relative path to a file containing the Apollo graph API key for use with managed federation. - -
- -##### `--dev` - - - -⚠️ **Do not set this option in production!** - -If set, a router runs in dev mode to help with local development. - -[Learn more about dev mode.](#dev-mode-defaults) - -
- -##### `--hr` / `--hot-reload` - -`APOLLO_ROUTER_HOT_RELOAD` - - - -If set, the router watches for changes to its configuration file and any supergraph file passed with `--supergraph` and reloads them automatically without downtime. This setting only affects local files provided to the router. The supergraph and configuration provided from GraphOS via Launches (and delivered via Uplink) are _always_ loaded automatically, regardless of this setting. - -
- -##### `--log` - -`APOLLO_ROUTER_LOG` - - - -The log level, indicating the _most_ severe log message type to include. In ascending order of verbosity, can be one of: `off`, `error`, `warn`, `info`, `debug`, or `trace`. - -The default value is `info`. - -
- -##### `--license` - -`APOLLO_ROUTER_LICENSE_PATH`, `APOLLO_ROUTER_LICENSE` - - - -An offline GraphOS Enterprise license. Enables Enterprise router features when disconnected from GraphOS. - -An offline license is specified either as an absolute or relative path to a license file (`--license ` or `APOLLO_ROUTER_LICENSE_PATH`), or as the stringified contents of a license (`APOLLO_ROUTER_LICENSE`). - -When not set, the router retrieves an Enterprise license [from GraphOS via Apollo Uplink](/router/enterprise-features/#the-enterprise-license). - -For information about fetching an offline license and configuring the router, see [Offline Enterprise license](/router/enterprise-features/#offline-enterprise-license). - -
- -##### `--apollo-uplink-endpoints` - -`APOLLO_UPLINK_ENDPOINTS` - - - -If using [managed federation](/federation/managed-federation/overview/), the Apollo Uplink URL(s) that the router should poll to fetch its latest configuration. Almost all managed router instances should _omit_ this option to use the default set of Uplink URLs. - -If you specify multiple URLs, separate them with commas (no whitespace). - -For default behavior and possible values, see [Apollo Uplink](/federation/managed-federation/uplink/). - -
- -##### `--apollo-uplink-timeout` - -`APOLLO_UPLINK_TIMEOUT` - - - -The request timeout for each poll sent to Apollo Uplink. - -The default value is `30s` (thirty seconds). - -
- -##### `--anonymous-telemetry-disabled` - -`APOLLO_TELEMETRY_DISABLED` - - - -If set, disables sending anonymous usage information to Apollo. - -
- -##### `--listen` - -`APOLLO_ROUTER_LISTEN_ADDRESS` - - - -If set, the listen address of the router. - -
- -##### `-V` / `--version` - - - -If set, the router prints its version number, then exits. - -
- -## YAML properties +## YAML configuration properties The router can be configured by a YAML configuration file. This file enables you to declaratively configure various runtime properties of your router's behavior. From 3a26590c8bc0fa6365ff62528849fe8ae34ac59d Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Thu, 24 Apr 2025 13:34:49 -0700 Subject: [PATCH 14/47] add intros for key graphos features --- docs/source/routing/graphos-features.mdx | 42 ++++++++++++++++++------ 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/docs/source/routing/graphos-features.mdx b/docs/source/routing/graphos-features.mdx index 351c516447..87e54b27bc 100644 --- a/docs/source/routing/graphos-features.mdx +++ b/docs/source/routing/graphos-features.mdx @@ -6,30 +6,52 @@ redirectFrom: - /router/enterprise-features --- -A router connected to GraphOS, whether cloud-hosted or self-hosted, is called a **GraphOS Router**. It has access to specific GraphOS features depending on the connected GraphOS organization's plan. Refer to the [pricing page](https://www.apollographql.com/pricing#graphos-router) to compare GraphOS Router features across plan types. - ## GraphOS Router features -The GraphOS Router supports a collection of premium features specific to GraphOS. These features include: +A GraphOS Router gains additional features when it's passed a license from a GraphOS plan. + +> Refer to the [pricing page](https://www.apollographql.com/pricing) to compare GraphOS Router features across plan types. + +### Subscriptions + +Subscriptions enable clients to manage real-time data updates effectively, without the need for constant polling. This is particularly crucial in applications that need live updates, such as notifications, stock tickers, or chat applications. Using subscriptions improves performance and user experience by ensuring that clients receive the latest information as soon as changes occur on the backend. + +The router supports both the callback and multipart protocols for handling subscriptions. [Learn more](/graphos/routing/operations/subscriptions). + + +### `@defer` + +The router's support of the `@defer` directive helps client developers tackle the common challenge of how to create a responsive user experience when certain fields of a query take longer to resolve than others. This is important for real-time applications like dashboards or reports. + +`@defer` improves application performance by delivering response data incrementally. The router supports deferring root fields of the `Query` type and fields of any entity type, and it can retrieve deferred data via follow-up queries to your subgraphs. [Learn more](/graphos/routing/operations/defer). + +### Entity caching + +Entity caching speeds up graph data retrieval by storing only the necessary data for entities, rather than entire client responses. It's helpful in scenarios where the same data is requested frequently, such as product information systems and user profile services. + +Using Redis, the router stores subgraph responses and ensures that requests for the same entity from different clients are served from the cache, rather than fetching the data repeatedly from subgraphs. It can cache data at a fine-grained level and provides separate configurations for caching duration (TTL) and other caching behaviors per subgraph. [Learn more](/graphos/routing/performance/caching/entity). + +### Query batching + +Query batching helps maintain data consistency when working with rapidly changing data and making multiple requests within a short duration. This is particularly beneficial in micro-frontend architectures where multiple frontend components request data independently to render a single page. + +Query batching allows developers to bundle multiple requests into a single batch, ensuring consistent data across these requests. The router can accept batched requests from clients and process each request separately, preserving data consistency. [Learn more](/graphos/routing/performance/query-batching) + +### Other GraphOS Router features -- Real-time updates via [GraphQL subscriptions](/graphos/routing/operations/subscriptions) -- Improved performance with [query batching](/graphos/routing/performance/query-batching) - Authentication of inbound requests via [JSON Web Token (JWT)](/graphos/routing/security/jwt) - [Authorization of specific fields and types](/graphos/routing/security/authorization) through the [`@requiresScopes`](/graphos/routing/security/authorization#requiresscopes), [`@authenticated`](/graphos/routing/security/authorization#authenticated), and [`@policy`](/graphos/routing/security/authorization#policy) directives - Incremental migration between subgraphs through [the progressive `@override` directive](/graphos/schema-design/federated-schemas/entities/migrate-fields#incremental-migration-with-progressive-override). - Redis-backed [distributed caching of query plans and persisted queries](/graphos/routing/performance/caching/distributed) -- Redis-backed [entity caching of subgraph responses](/graphos/routing/performance/caching/entity) - Custom request handling in any language via [external coprocessing](/graphos/routing/customization/coprocessor) - Mitigation of potentially malicious requests via [request limits](/graphos/routing/security/request-limits),[demand control](/graphos/routing/security/request-limits), and [safelisting](/graphos/routing/security/persisted-queries) - Custom instrumentation and telemetry, including [custom attributes for spans](/graphos/reference/router/telemetry/instrumentation/spans#attributes). - An [offline license](/graphos/reference/router/graphos-features#the-enterprise-license) that enables running the router with GraphOS features when disconnected from the internet. - [Using contexts to share data](/graphos/schema-design/federated-schemas/entities/use-contexts) with the `@context` and `@fromContext` directives -For details on these features, see [this blog post](https://blog.apollographql.com/apollo-router-v1-12-improved-router-security-performance-and-extensibility) in addition to the documentation links above. - -### Enabling plan-specific features +### Enabling licensed plan features -To enable support for plan-specific features in GraphOS Router: +To enable licensed plan features in a router: - You must run GraphOS Router v1.12 or later. [Download the latest version.](/graphos/reference/router/self-hosted-install#1-download-and-extract-the-router-binary) - Certain features might require a later router version. See a particular feature's documentation for details. From cfd5ff5e6abfa67a8591387055007bc442500880 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Thu, 24 Apr 2025 14:44:08 -0700 Subject: [PATCH 15/47] copyedits --- docs/source/routing/self-hosted/containerization/aws.mdx | 8 +------- .../source/routing/self-hosted/containerization/azure.mdx | 8 +------- .../routing/self-hosted/containerization/docker.mdx | 6 +++--- docs/source/routing/self-hosted/containerization/gcp.mdx | 8 +------- 4 files changed, 6 insertions(+), 24 deletions(-) diff --git a/docs/source/routing/self-hosted/containerization/aws.mdx b/docs/source/routing/self-hosted/containerization/aws.mdx index a99920f2d1..9eaad0a49a 100644 --- a/docs/source/routing/self-hosted/containerization/aws.mdx +++ b/docs/source/routing/self-hosted/containerization/aws.mdx @@ -1,5 +1,5 @@ --- -title: Deploying GraphOS Router on Amazon Web Services +title: Deploying GraphOS Router on AWS subtitle: Deploy router with Amazon Elastic Container Service (ECS) description: Build and deploy Apollo Router on Amazon Web Services (AWS) with Amazon Elastic Container Service (ECS) --- @@ -11,12 +11,6 @@ You will: - Set up an Elastic Cloud Registry and push your router image to it. - Create an ECS task definition for your router and deploy it. - - -Not deploying to AWS? Try our router deployment guides for [GCP](/graphos/routing/self-hosted/containerization/gcp) or [Azure](/graphos/routing/self-hosted/containerization/azure). - - - ## Prerequisites Before you start: diff --git a/docs/source/routing/self-hosted/containerization/azure.mdx b/docs/source/routing/self-hosted/containerization/azure.mdx index 514058cd2c..97aba854c2 100644 --- a/docs/source/routing/self-hosted/containerization/azure.mdx +++ b/docs/source/routing/self-hosted/containerization/azure.mdx @@ -1,5 +1,5 @@ --- -title: Deploying GraphOS Router to Azure +title: Deploying GraphOS Router on Azure subtitle: Deploy router with Azure Container App description: Build and deploy Apollo GraphOS Router as an Azure Container App --- @@ -11,12 +11,6 @@ You will: - Set up an Azure Container Registry and push your router image to it. - Create and deploy an Azure Container App for your router. - - -Not deploying to Azure? Try our router deployment guides for [GCP](/graphos/routing/self-hosted/containerization/gcp) or [AWS](/graphos/routing/self-hosted/containerization/aws). - - - ## Prerequisites Before you start: diff --git a/docs/source/routing/self-hosted/containerization/docker.mdx b/docs/source/routing/self-hosted/containerization/docker.mdx index c3ce8950eb..ac4bfc3063 100644 --- a/docs/source/routing/self-hosted/containerization/docker.mdx +++ b/docs/source/routing/self-hosted/containerization/docker.mdx @@ -1,12 +1,12 @@ --- title: Deploying GraphOS Router in Docker subtitle: Deploy router container image -description: Run the Apollo Router Core container image in Docker with examples covering basic setup, configuration overrides, debugging, and building custom Docker images. +description: Run an Apollo Router container image in Docker with examples covering basic setup, configuration overrides, debugging, and building custom Docker images. --- import ElasticNotice from '../../../../shared/elastic-notice.mdx'; -This guide provides the following examples of running an Apollo Router Core container image in Docker: +This guide provides the following examples of running an Apollo Router container image in Docker: * Running a basic example with default configuration. * Customizing your configuration to override the default configuration. @@ -49,7 +49,7 @@ services: APOLLO_KEY: "" ``` -Whether you use `docker run` or `docker compose`, make sure to replace `` with whichever version you want to use, such as `v1.58.0`, and `` and `` with your graph reference and API key, respectively. +Whether you use `docker run` or `docker compose`, make sure to replace `` with whichever version you want to use, and `` and `` with your graph reference and API key, respectively. For more complex configurations, such as overriding subgraph URLs or propagating headers, see [Router Configuration](/router/configuration/overview/). diff --git a/docs/source/routing/self-hosted/containerization/gcp.mdx b/docs/source/routing/self-hosted/containerization/gcp.mdx index 5f12a5c830..6236080198 100644 --- a/docs/source/routing/self-hosted/containerization/gcp.mdx +++ b/docs/source/routing/self-hosted/containerization/gcp.mdx @@ -1,5 +1,5 @@ --- -title: Deploying GraphOS Router on Google Cloud Platform +title: Deploying GraphOS Router on GCP subtitle: Deploy router with Google Cloud Run description: Build and deploy Apollo GraphOS Router or Apollo Router Core to Google Cloud Platform (GCP) with Google Cloud Run. --- @@ -11,12 +11,6 @@ You will: - Set up a container registry and push your router image to it. - Create a Cloud Run service and configure it to deploy your router. - - -Not deploying to GCP? Try our router deployment guides for [AWS](/graphos/routing/self-hosted/containerization/aws) or [Azure](/graphos/routing/self-hosted/containerization/azure). - - - ## Prerequisites Before you start: From 412bc03c9f8023fa82e4cf0971efb68ae3f47f07 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Fri, 25 Apr 2025 15:50:25 -0700 Subject: [PATCH 16/47] add new quickstart --- docs/source/routing/get-started.mdx | 274 ++++++++++++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 docs/source/routing/get-started.mdx diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx new file mode 100644 index 0000000000..5797e5dc79 --- /dev/null +++ b/docs/source/routing/get-started.mdx @@ -0,0 +1,274 @@ +--- +title: Apollo Router Quickstart +subtitle: Run the router in dev mode for an example graph +description: This quickstart tutorial walks you through installing an Apollo Router binary, running it with an example supergraph schema, and making test queries with Apollo Sandbox +--- + +import ElasticNotice from "../../../shared/elastic-notice.mdx"; + +Hello! Let's run an Apollo Router binary for the very first time. + +You will: + +- Learn why the router is a graph's runtime. +- Download a router binary. +- Download a supergraph schema. +- Run the router for your supergraph in development mode. +- Make queries to the running router with the Apollo Sandbox IDE. + +## 0. Apollo Router is the graph runtime + +Apollo Router is often called the runtime or execution engine of Apollo. That's because it runs a federated graph. It accepts incoming GraphQL client requests, plans how to efficiently call the APIs that make up the graph, orchestrates the API calls to fetch the requested data, and bundles the data into a response. + +You can run a router locally or scale up to deploy a fleet in your own infrastructure. Each router is an endpoint to a GraphQL API. It's the gateway for all client requests to a graph. Like API gateways in general, a router offers a central place to implement cross-cutting concerns, such as authentication, authorization, caching, logging, monitoring, rate limiting, and demand control. + +## 1. Download and extract the router binary + + + +- Download and install the latest version of the router binary with a single command line: + + ```bash showLineNumbers=false + curl -sSL https://router.apollo.dev/download/nix/latest | sh + ``` + + + + To download and install a specific version of router, set the version in the download URL path. + + For example, to download router v2.0.0: + + ```bash showLineNumbers=false + curl -sSL https://router.apollo.dev/download/nix/v2.0.0 | sh + ``` + + + + > Optionally, go to [router releases](https://github.com/apollographql/router/releases) in GitHub to download and extract a bundle. + +- Check that your router installed successfully by running the `router` binary from your project's root directory: + + ```bash showLineNumbers=false + ./router --version + ``` + +## 2. Download a supergraph schema + +A router needs a schema for the supergraph that it's orchestrating. For this guide, we're downloading an example supergraph schema that we'll provide to the router. + +1. From your project's root directory, run the following to download and save a supergraph schema to a file: + +```bash +curl -sSL https://supergraph.demo.starstuff.dev/ > supergraph-schema.graphql +``` + + + +```graphql title="supergraph-schema.graphql" +schema + @link(url: "https://specs.apollo.dev/link/v1.0") + @link(url: "https://specs.apollo.dev/join/v0.3", for: EXECUTION) { + query: Query + mutation: Mutation +} + +directive @join__enumValue(graph: join__Graph!) repeatable on ENUM_VALUE + +directive @join__field( + graph: join__Graph + requires: join__FieldSet + provides: join__FieldSet + type: String + external: Boolean + override: String + usedOverridden: Boolean +) repeatable on FIELD_DEFINITION | INPUT_FIELD_DEFINITION + +directive @join__graph(name: String!, url: String!) on ENUM_VALUE + +directive @join__implements( + graph: join__Graph! + interface: String! +) repeatable on OBJECT | INTERFACE + +directive @join__type( + graph: join__Graph! + key: join__FieldSet + extension: Boolean! = false + resolvable: Boolean! = true + isInterfaceObject: Boolean! = false +) repeatable on OBJECT | INTERFACE | UNION | ENUM | INPUT_OBJECT | SCALAR + +directive @join__unionMember( + graph: join__Graph! + member: String! +) repeatable on UNION + +directive @link( + url: String + as: String + for: link__Purpose + import: [link__Import] +) repeatable on SCHEMA + +scalar join__FieldSet + +enum join__Graph { + ACCOUNTS + @join__graph(name: "accounts", url: "https://accounts.demo.starstuff.dev/") + INVENTORY + @join__graph( + name: "inventory" + url: "https://inventory.demo.starstuff.dev/" + ) + PRODUCTS + @join__graph(name: "products", url: "https://products.demo.starstuff.dev/") + REVIEWS + @join__graph(name: "reviews", url: "https://reviews.demo.starstuff.dev/") +} + +scalar link__Import + +enum link__Purpose { + """ + `SECURITY` features provide metadata necessary to securely resolve fields. + """ + SECURITY + + """ + `EXECUTION` features provide metadata necessary for operation execution. + """ + EXECUTION +} + +type Mutation @join__type(graph: PRODUCTS) @join__type(graph: REVIEWS) { + createProduct(upc: ID!, name: String): Product @join__field(graph: PRODUCTS) + createReview(upc: ID!, id: ID!, body: String): Review + @join__field(graph: REVIEWS) +} + +type Product + @join__type(graph: ACCOUNTS, key: "upc", extension: true) + @join__type(graph: INVENTORY, key: "upc") + @join__type(graph: PRODUCTS, key: "upc") + @join__type(graph: REVIEWS, key: "upc") { + upc: String! + weight: Int + @join__field(graph: INVENTORY, external: true) + @join__field(graph: PRODUCTS) + price: Int + @join__field(graph: INVENTORY, external: true) + @join__field(graph: PRODUCTS) + inStock: Boolean @join__field(graph: INVENTORY) + shippingEstimate: Int @join__field(graph: INVENTORY, requires: "price weight") + name: String @join__field(graph: PRODUCTS) + reviews: [Review] @join__field(graph: REVIEWS) + reviewsForAuthor(authorID: ID!): [Review] @join__field(graph: REVIEWS) +} + +type Query + @join__type(graph: ACCOUNTS) + @join__type(graph: INVENTORY) + @join__type(graph: PRODUCTS) + @join__type(graph: REVIEWS) { + me: User @join__field(graph: ACCOUNTS) + recommendedProducts: [Product] @join__field(graph: ACCOUNTS) + topProducts(first: Int = 5): [Product] @join__field(graph: PRODUCTS) +} + +type Review @join__type(graph: REVIEWS, key: "id") { + id: ID! + body: String + author: User @join__field(graph: REVIEWS, provides: "username") + product: Product +} + +type User + @join__type(graph: ACCOUNTS, key: "id") + @join__type(graph: REVIEWS, key: "id") { + id: ID! + name: String @join__field(graph: ACCOUNTS) + username: String + @join__field(graph: ACCOUNTS) + @join__field(graph: REVIEWS, external: true) + reviews: [Review] @join__field(graph: REVIEWS) +} +``` + + + +## 3. Run and test the router in dev mode + +You can run the router in development mode, where it enables some useful development-only features. This dev mode includes running its own [Apollo Sandbox](/graphos/explorer/sandbox/), a local GraphQL server that's running the router's supergraph and that has its own browser-based IDE that you make test queries with. + +Let's now run the router in dev mode, using the supergraph schema you saved, and make some test queries in its Sandbox: + +1. Run the router with command-line options that enable dev mode and provide a path to a supergraph schema: + + ```sh + ./router --dev --supergraph supergraph-schema.graphql + ``` + + + + ```sh + 2025-04-25T21:54:05.910202Z INFO Running with *development* mode settings which facilitate development experience (e.g., introspection enabled) + 2025-04-25T21:54:05.981114Z INFO Apollo Router v2.1.3 // (c) Apollo Graph, Inc. // Licensed as ELv2 (https://go.apollo.dev/elv2) + 2025-04-25T21:54:05.981141Z INFO Anonymous usage data is gathered to inform Apollo product development. See https://go.apollo.dev/o/privacy for details. + 2025-04-25T21:54:05.985764Z INFO state machine transitioned event="UpdateLicense(Unlicensed)" state=Startup previous_state="Startup" + 2025-04-25T21:54:05.987948Z INFO state machine transitioned event="UpdateConfiguration()" state=Startup previous_state="Startup" + 2025-04-25T21:54:05.988144Z INFO state machine transitioned event="NoMoreLicense" state=Startup previous_state="Startup" + 2025-04-25T21:54:06.010232Z INFO Health check exposed at http://127.0.0.1:8088/health + 2025-04-25T21:54:06.010717Z WARN Connector debugging is enabled, this may expose sensitive information. + 2025-04-25T21:54:06.405064Z INFO GraphQL endpoint exposed at http://127.0.0.1:4000/ 🚀 + 2025-04-25T21:54:06.405628Z INFO You're using some "experimental" features of the Apollo Router (those which have their configuration prefixed by "experimental_"). + We may make breaking changes in future releases. To help us design the stable version we need your feedback. + Here is a list of links where you can give your opinion: + + - experimental_response_trace_id: https://github.com/apollographql/router/discussions/2147 + + For more information about launch stages, please see the documentation here: https://www.apollographql.com/docs/resources/product-launch-stages/ + 2025-04-25T21:54:06.406568Z INFO state machine transitioned event="UpdateSchema()" state=Running previous_state="Startup" + 2025-04-25T21:54:06.406591Z INFO state machine transitioned event="NoMoreConfiguration" state=Running previous_state="Running" + ``` + + + +1. Open a browser and go to the URL of the router's Sandbox, `http://127.0.0.1:4000`. + +1. Copy and paste the example query into the **Operation** pane: + +```graphql +query Query { + recommendedProducts { + inStock + name + price + reviews { + author { + name + } + } + } +} +``` + +1. Click **Query** to run the query, then check its response in the **Response** pane. + +Apollo Sandbox IDE showing successful query and response at the end of the router quickstart + +That's it! You've successfully run a router in dev mode for an example supergraph. + + +## Next steps + +Now that you know how to run the router in dev mode with a supergraph schema, you can: + +- Explore router's [GraphOS features](/graphos/routing/features) +- Deploy the router [in your own infrastructure](/graphos/routing/self-hosted/containerization/overview) +- Learn how to [configure the router](/router/configuration/overview) From 6cbdd038933efe7389776b6a7a298f9f8b782af0 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Fri, 25 Apr 2025 15:53:11 -0700 Subject: [PATCH 17/47] add/fix sandbox img --- .../images/router-quickstart-sandbox.jpg | Bin 0 -> 292321 bytes docs/source/routing/get-started.mdx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/source/images/router-quickstart-sandbox.jpg diff --git a/docs/source/images/router-quickstart-sandbox.jpg b/docs/source/images/router-quickstart-sandbox.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98e67f0688cd19f5d6d15370798df033c4458579 GIT binary patch literal 292321 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

Fp8?H+j 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∾Sg3!nqPHLNPxDw?g+4&=8?E2|$2u*5 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%0DO#$BCfV`$L10fXlk+DY;W1%VsMPe_@-_P_C=Nf zGI#s&JIT6ByzG6+$4u5M_R4eXk@Y{fxQh@U0X`5o4(k$cKDxDr_q;9=q-^oI zCh8Szoj%#c>3Sag@*4}&E7T}A?hYO}3!zbrwj5cCe}O9w748Lx6{$~EXd5}ogwIvX zy&)LrjCxH6L}sx|KHog??2^Kc4?h0qW<@?6Ji-v8-KIyXxnpB8J)18GkuTV>*JVK( zo8wqL6a?D15(Bbt^GH4m;cDVEs^IeQ1O_1R)sUdJwVIfn=Mpd}PE;ZSZ}5vs&xqEVu_ z6U4n?J^B2Huz1t@lgzt6Cls|5mXS*<<5!<453sJ;6##4OG{u#GWMvE@*;`K{23n6a zwYE^MEh(~C*AQ329am>hWgl#*o2Z(>MT(hgTt2B?_Iz+ofbyM0B^%I-0k%gU_)wiv zgbv5#59F}`fMPyT2=Jr?Dsr;5ch+h)p2p{tt^6=$i}Xmj7y13*mVD<#il@j#sX6bH zA2eRt53m6Pj2Hve!`e_38Bhm0PNBkB`wqd6xF1m7eS1oAGgBs^f+ur@GIKJ}W61F& zQ{KI#9&bA;RW3lON9Q!@W)kTRKyS0~C)sqce%Y|LrD=NQ*DB=Us{7m$`<(FP>^I_^ zq4hriwKU1uoSx1Q|H_6}im(P`@0SjUsP<6-0}6q;@%R|sYUpNMpG=#yJb&Dy_tJ4p z3vv7UA-m87ET$OvSlFt_b_gH*G=$sj_TUog*t)e!fWyt!kvHtpbvtZV{8SR#2-@ZL zuR`974QE1TU-`9u!Z9R38T3@jdI;M_;|!(gO3P?L zYhB$yipyllMBBV=?U_e%N-4Q`bTRg!5~nRifqa(&!*gtGc;2*C>D08XZmdl-@l;Cn z6pe`P<(6dm&{?)P;k<<|=i(-7Qp(F-(iUVpGza)Z4rLiKec1g$E@E^wUUh+1_jXjA z7B^fD(AVo@PBgN?oeg$HPsidHwxEl)TKMg* zk7)bqQMFhuFR2G>;t@-bU{a})c-Z}~ZA=DVb(K0mzkjzK5|hiLqeQvtKCK3c#*iBm z-liXo=X{LQ{qj1*T+Q(|o3x6?$HkEDU;$kP#Sdifm6e8K!a_U^322e6fQvqpvOqSW z*pLndsI-%Hct+}@zuo>M)--c_hu{05%r()E8upTg&tsynC%uj*q?6A86&!G#E^G~x zY{=4-_e<^zQBTi?6u2Tz4%ORQ%iXyZqtz^3^@%9$etZ^j2NU1yaIvx+U)+fWO(EOw z>&VbdT8HXc;Xot!i^;I2Vcc#)w>oo0qdlPD6*_H1?#pYB5L^}!i(lyC0y8)cldcgQ z8Q~>Y@GaNctS@C(mdm`2bx`ZNbC9I30aeV_ml3F8ar;b&Nk5;4<%233K^yd+S609S zy$L9B#)LZPh-!I>l;+I@nGs*ggMcxG_sMJ5C*{AX3!J&I>T*JvV)u+yq)%9GirnQp1BU3AtsoD22H0~U zA?FnRErXL%K#;6mQVgPA>ySJ-(yYxm5o02B=*oTmmyQiC7H&1kVat0_W>CXb?#zmxF{(|V)6Vrlo?gSWEcd|0BO*o5i__(Gv*Sb7ZtN$C zU`*AD)^W7v7Vh*qP&|@&E1Ytgs)`u;NXj&!k#vJ zn6|DWl=FGykSpu0@?-KyL+k@kG+0Pmf_f7$x~}E!L5V{HmTpi0djeK+X|cO#^CSHy zi5r3t??=gE0ZS%HjqqnmpRlQL$2{6G$}oTsQIAp{Kv~_5N&}2~t-0pkyZG*P?K?Ir z__W%*BYTCa&Z?`1+CD?#I>G?6CB%S5%+t$Pb~&%sAh zEZ;Xv@({DDMr9&;MsWI}vSZ0>#_7Dqx0;kb9ZbCS>?(S#m&S)B=S==$a)(Vj>rx7r zEImDGhMwMm1sjGBXSU)QSt?hgx`L$h%*{X@Ad!px2pPm6_6XwuqZ@H7muye30XsHr zM`EH?D~N1LoD8LD5y1xOZNHef zM)7J5g{@==7e|o0m7-(f()nID<12G!mfzoT9yt(lpsiUd#ckWht$tw#DzzF2UVMqI zZElp9jLiIQO}(_x%}jFr#e_Vf*I=MyK<}kJwRh<2%|PwBLi6iPt)-LZ*u7C5Z{a71 zxwq)eGW42e*nN^ypD}82-P*ZxwC(=)&oc#6I_4@5(HSdyW&G#FE^hn`hRYJm$%*tl zxGU9>GP5Wf%MhJ&X=NqSbF+&msS{TOW-^Z`MAH_v<|RSk3kamc z9-vQ-qiCUNJfvC7xi!g?4OGR?X&$ATm5Xf!nwp{P31#~APw4`D&z*(X6eV+|tj!#6 zc$b7>O+Wn~)D zub7xts#AsU6kHrNpIwhQS!lhxY;J*(-&1T|`ho;X0$M>Y-kBbn1tjYB*#Mm8?Qk?& zX;T|WazssnShO#utuVtl)__2que|dx9GV}?e)Z+p){?fUKaCIE0fZ2NHf4!39g-R& z-*#=SdyQSbd7xhhxkuRyByI(KVgK~#N;`85C1~kLsy8u(!EQqU1EaS(XlF2t01B(e za!&yvc2wgLkX@`{=3!Is10iO#j8iE=3gI8QLOOM{10mDPQvsi}N@N?CfBM54XN-b- zhdPqWUp-i5Q}P>gwN}cS$7$p21{l#(WF?BM{+8?#6a>FVDWqxy6!(&$0=o;$66d#d zNsftO>S>K}#)JGtQ!g`K`%S-ld~^9@qH#LUlw6>Es}Tof)wGw}{peb(=p--0p&M zulZ*RziYT2bI}*O>tvKGt2{H?_s)p?MCU>2YF?#7+X7GPamFVsMs|yfB-;z(q(RFA z)Vn8fplP*iA*19UhtkZii(h}OopgbGNA*gwx@|>h$GZo6C3r^F!WlOc=sb{{*hk;6 zp4pxKAtPz5r?j4gQY{&+`6;@xQrPcEv|G29X&jdPN#%k+pv)A}0x88*LBx>tPnrx4 z)46sAy;~7XFpzB-`61Vt|2e6wlJfX<)w*Ru3|lwgtG|3=p~jhxqyVI6gA?VsRlOmt z((vo_0v$kHyTGfh5rpS}i3f)n5Xnhp9rj}mqpDLK8O2e*n95bE%vl44!JTz4v5R?` zAXKv~sc#XoWs1jgy5%Sg>xiv4)@+zRl|J%~p%rXBeZngF@LslqoRLGZ1dG}jz=)_t zE7TQbwrqbWE6NQ%*}4=VpFE&(|5H|>^hgb=F7-&J`LLbWgf$d^ebR%2T#GFGOQ9c5 zhR%r^O1xu_I&Vm3vcUVdFT@~40VV7aTf}H2`B@}h-fdFoTF1OFM$|WP8aMM{sB1rT zwlr}5cK9^n7JvM^Lx<`2Df&S49I|eqGx(ZCWGC)hbkXd`3$MtG6QgfN&&tO2G`%q> z+>0{?xp;7?#00d~aTTRTKlp7~b&%gBhYxix)~+^9FYUA2UP8KvMJk&=(pb=R5U$ zKv0J!OMA;%=n)zi5+S%B0YER>$1x2-uHsAQWvZ1U{mdK&7SD+tI(BKlMgF4Yc;~2P zZeSs{Z~6TaL3t!Ew&IM?H^Oqh`N*Jd;Y9Xt_gTJ0>{cNuiy%wmhZ58`!w5>8Q#guy z`+h(Z28(faPqf)wQBi>@C!Oz4)zy92bM(>FF87I#3ZP=&zj2TKFRqpUSeyS7O7*|X zH2#f0{pImbJN5n-IVAog;_=^q|DPu!|NUh5-#M0(d%N`@(9<`z{N>Tf1R+PA=Sl*n zvd*NeO??0Kcu-VX=L#yxeEqZq z9Hoy1oNQKFWZA?3ULy}0##OOlPbM>;WS6Pl^l)l@*VKU7!7SRm`9?VApWS|rTQamY zGC#!XFOuMce}B^cS3dtg*xGV=lA*5$@FD>!@K8TM%>Em&?XQr)-!G(p<~jN$;t-;* zRfr-+;wH#;8@aF5+xif6s_Dgn-kS0+?c+Q{$CZCEoxvZjg2?K0wC3c8SOS;kpR8{F z-KyvR===SL6BGWjr~KvXe`;@u2wbcS`Bs_j5TkbHTd!Lg`ZnY;Q)$WHd3^4012^(I zp*Cb##WLKIR1}FXW&dXRoGM|3yz5j9%SJ6zo(YOHEtwv&Yokivw^O5>jeArZe z40~js{-dMgPHnO*%=KQTmqDo@0i-JsyJXRhjM!i3Mn-`+nGgnC^%&rz67qX*gr2+hi%B-m=NHq1yP$nrnPBkWf9FtN-k(wfuKYpWz5&Q@ z0X7!Uj54s!4BrF5+wmVrB5?09&HtA6=I*nV)*<%};eaQAykSW9+CTmglM6t~V6u=1 zB5}8gI$=T2e<=DuFyk_9MjB@wj3Ne&^(>VKJ=iziBwuuJb+j)j03yx~Vlz=O^MGnA z^dSvFv_SbmpXJu3|2Oj91FETh%@+nyX)4kYgh&&lDpI6IRJw>Ly+x%72vHFT5)uLF zO+Y|F2vtBzloopEAV^n`AS4t;kU%0B11a9^d(X^0@44UHduGne+*$Ln)?Sc=ot3ip ze?QOjYjGWtJs~P(N*x*`%JbuPC>*5C#|zWZ+SZtElyJ@Yr)1GG7Z<_i?Z@tR`~B6> zZxf)&s;P@mZWou+Dd)Ppyv}j4Ukhh>MfP=iFb%@J{$xyP)f>}x5TP8QwYZD#*)L~r zHu0=?Gi#>Rrhz=SL?7ea*Y zI8hBZTx3{v3c_T%zEorD0UF(q2xS&^BR+)+#dk;Y+Ad(FTC%u%t(MMBvhMQ0g zLj_Z+wc>XC)rXZ%ofG<*y-)kR{ek=TkM8w_fBVJ435^CXN&=IgOTNJ<+??Lno6xtE zWYogd^MjtS)Y)cV@J zkkibHSDkU+lk>8sq7a>m} zB-?O^JsF?aaS+kpPg%Ait@h!CG|J)+SBd}y^i-Nx*3^iL8t1UQuIa6VIv${dj7G3G zG7?L&f*ywpFviLp=t;*7VfUpT1+MtXyobX6czC~G>C|lCVF-qz<^V3jT-^9H415=7_K>8WC0T)O6 zwFIT0E1on4YYAKT1>Ox^l7AirzSs>wZ<1I-JL(Ah0FaGqK(`{JY$lZh;MWNi51Q5W z%`Y7c;}3b|P_l3x$@A=y;=_dYMLbm|HKIW^4$Fo0L5cXDDu-K)2lbMz5`%IZ(w8i6 zk&6anPI&OnbwM?I0xBh>P2aP=$T^<3@x;8r>h_`t5!wnJXXF7Z@o4dOE0e2k86-mG zrW_$-lW-Q@Ww4J@Od6@p#3VW|x!%OCZ5snjqW_r~Y_@QqW$%p%5>HRQHkBvjKz?;O z3~M^E8cLj8w5%ql9lOxfsoQviQcO9+C}e8FT^Lp1+hfrvz8V6`kQ!R!lO?+Uo^y$n zfR?qTVr8_>L2To61OQj^CiN(u6+j>Z6Rk$Na7QNl~S*d z#Ae=5D=QTRMYQoRCi~fvM2&5CZJK3{unTI2 zoPJPB)NZaPen*lFmYtTJC;UYpw6;b{`+;&#hYG@*0A&6Xy>j4spGg5VwugCYir?iDyC7A62{b#mm`YRx4oDO=o-md)J^4-I_-m3xY`I0T`nxP) z46kJ)e-PgjIR{Lg4D{)Iq+#cP6(GDbAdPK=0eiv8=#6I56+BJ4Q$mXx4h6EjEfD@n z4Z2}n9&WPQ-!sRxZ=91U|9Vv6%UOqbh{IYK(g}p|L4Q?!mB*>-KeC>bdrxY&z#SZ@ zy*73wGrov!1c3Keyl&KsJuRDg$V#7AqMJjwb?pG<_jv_xMc;TF6WM*Vnm`Axx{>LK zvFV4Ybb&GoER|3>Ko|q;v4BOn@(Nj{{YH`Qw>*P|{t4OMXXl{CTju1XSLuj4Zz=^1!Y+ql7*6)548NT1l zMy>l`6dn#4!_b9vDK?B3bTI;$2Qi*6L<-JzU-oxil8cT0QYYXX@N#?A!0QVze7-$4 zi7jySaJc33jPEFa^fA4Mtn_l{+6pt8Szir)CT$cJ+uw1B6g4-nG~zaF;rDVDNcT9g zEfQ?G;;}=pHxnx0HBzJjuU>O z3C=HH9eTZ{+(4UM7LTiY2#F>w3m)nI*c!u*r7#&&1x)4F!hD}G)1yo^LWXPWp0<_W41S<9K) zzI0eT=s7%;C%VC`ft@V)&h6p+9A0X5$T{**n1ON9p{R7LooE^_Y;_4>*vv{V{!C(O zeq8WbP;H&?pK*x2it)2RHD1tbb~AOnT9}rN(2R&7+=?4oDvYC~Os|d8uQFZ$Dl1SU zrWeZ2d?&h^*kB=?yM#<`nCI`+RgyB4&CiqZ6CH@4)$X&%a%FZvK>BZ zY}g47uwMqiHvbCxB_PpM6vj@u(UEY+&TR@{M>xl zvMSM&Y>CjfpeZqjC63mUA&K?#8XB%%KkeEzMeQ>8uO3ybHIYdlR<#zD@7_*7i&;^P z1c(sN2`H+(XA+2X)q?vTnY$Nf*`H0&x4#Id-u*Ziq4DW-FSRLwIQJ#wS)Q^J+oaOLKr0iaz;^oHog%dJSG>a?P$?Jo0aRD-MW{2M7n`;dj zj-J*EebQ(Dz~GeQl`$*C8H`PK*aNB)!W(m)H9AF(5Irv|U*mWE=@vAoS(&dR+l}rL zJpL0q>j#JiA$_SJSQ#ap`fU+VNRy?zh7XT?h;Hv{t!sPT%r?~8kbBEhEm$q>>A7R0 z7f2Ecz!w9in^3!!@KJy)5ff35=T&`Fnlj})O*bsph<<|gT)0DAPBa z=+JX%>eQKKxjrmaNi|W=oy^l?w#ZgQ*NU}5Sy)83=FG~qC4_mjWhwPh;sx`szDXC- zuS~ya|B5PX!6-!D+)9B6Dz|}2!?x7qMb&sWsq8){TS}Dv>m1zP?)iKiQN=T^KjNw2 zQ_p=UmscZt{yvkb?JBm~MsH0PYTN4@^YZg_1f7+8uAy}=9N&B)E215i9sH&4i+$|} z6@QdX>T94#w8FhWOm;}j)Z+zi--liA@8EuqG9gRE%H$(wRjzO9-H*1GQ7fMpix`uB z!U}esS%T8}<=g=OS2oHZK<+pRzc{75;~4P6lB+vRQ5!J5mXz=iM5PLvF@xzb5JB^tXGcXFnJkL+z-xd+XK$J9|axwYSc zj=G(H;6J>t{_C0P-}Cq1F<1S!C!nQ%{zj<b=Z!DVCa4uq0agNFP8|05l{-K)G!8g^R13yg-FQc9e zztyjgSRYzC8+b5l>O>3d(fbv~QcqI>$ES$z`I)<5nhD&SQH)>%nx8?y#U+%c4A+Im zGfzoKyvB%1S+4LyPiBF{SLGciS zZgj9VP05%vHND2mzl)Fo%;0RKl)qF#zX;)4&tP^=V$-nHlYm@-Gn6DoDFHr|4ESBL zQpS1~f_3_bzMGh~?5!##bWnwmz!)d?R>8m(fLOIk$nM{w%0Y--e$|KxJjou9JKN`k z>=h4S29{Bw7clROUypB$6XPzfe4Ot-n^aVM)Bd34q>#Ffy}Ru-(_bv-#{_*tL{+1I zD0_{c%9@<^d2)I;#Q1U2&T;}BU|L4XAQk|0hEN2lHK-i+C8?LzcIl%FvT9PDmOU1f6i(fp|x$^qaj4rfZi{i*kkTQ22d z<7RYJlC}%dH~kyov$(pOBVOS%ALO~<~s`FJ*(hF1*5PP)?EheEV65V z5I6zERu9H`FPjWl#c3js>)DnWRs%-eYkNQ*S--;{9c2w?u^{96KNCXQDiQU|sx2_JP+xFlM zBg-1Hil(W#BD>CkeZlO$9luWn6dVCmK##Gv!>WyURb;X0Ul#C}Gd-kKWw`BQPP16c zT+?&DYc04h3NnMF^I7yDLGV*FNuNEf0Z2lQT)&5Nv$G-DI5AX~in371mC6qlbTYg3 z#8iu~SLMB&;&mN(arBjd*tHP>Ye&&&0sEofv1t9!L@`t+=8*o?EwgI03uksg%E)$@x*{xh`|K(>#8chu2MdcgN3r3rM7 zZbJAyWxs6{lS`GX*ohQD5;DPj26FV%A5KiyANK394D<}UGgq9Y`C#v;;Q>d7gT@CO z_HlqN(tQ~fOhLpTq%J0xY_aro(+1~+Tf+st+Reu0?WCnDOi!zz6;WNrj&WBl_x~_x zFX})tp0z>9s{?rU2l!*m38q*rDK$RmWIAC@=(@(hta4u6{=l=Wv>%r_FVI_C+&5DT zN&3g*F;J)>1A<9 zM%l=symaHa?$EUP`D5(YxLF3xSnk>cqa)ywWD_Rm@=KWgl_@%egzClRR~~Nj3w@9; z>yYl#oxD-r_(&mZ^uxw!?Qf9r7lMyVBZlN>ij78tG%`|^=~*>8%GICf=r}(s{**kO z4C^Fyvju#l_gf@4Q;}{)Rb1A!ibHZXv|@R_*mWoobfEe#A=CG*sj#>e6dZ^CO&aHJcs%qamfQiH`?FNklM>IO=5 zQ%1~>t=O48t1f(u)6dv86V*(L<%OSav^z(MX@_zPX*vP(BA%erT_-4gh-F}%ZF2Ie z6OQdr@#C*xj^!_3ieYQ=-!62nljnYsq&P6jqUT$xx%cwRI?i4T#vK+ z={yDL#7BP{P0=|AvozHpTzbE}?XOzp^xVdh)*2bMJ@%$){2>%3q3t@|B*cjmRS+Po2pKZO#moV;FqOnqz= z{jrClPsVqFK3=o>ShuWFd=n{HCEB0tU+&{PkXO3Sqi7;smC!23efFSrrih69bcYtz zllI$@%?hqfJ7qy*_jQvYoy;bD(^vUQrZx?wKD zv)M^a#kHr`iIDw1pgLh9VABpL7;=|XKkh-;sIkB$U7%sD%}N%V@Up$3WlF>1wZXVy zL-MqP$fNU%ZzB3Rp|c9|pFfseP&QIl#;hP*Z1#2iK*1^bOXvIBE5#oT--I?z@VxL=UT(c$;Q&OnUOg7p|XikM<@lNK6CJx+-| z$fF35pB+<*)KPl3lz8nsKI-t0ywdn(lw$O;nb*w-}9B-?1b&R{=$2>3J2p14 zu;q=^SsGJR9L~1FoU&Uu-atMSSZkawlK*9C5cjI!g44RZ$F^3$r+vi!(+_8wtgW)0 zpH|3ffu8^;&Ir#aV1sKHyJW?O=ycPWplf*FdpO3(lYJi?=kd%DAZ^KPylTr!tMJ;n zYGnwy1s9^ukz$v(BCiiX_BRZ>B8?mkMpkhd4KhY{XKG&`N_sV%d4pqcsol5S!RMjZ z)7q2Ip@OwTUrcyUoFBcHb&gGj5NN15{dw=Np}2p7=B^OHsrNNJ1To zHwZQBv;~w{b3$OAo#2)!xM_xR=8w9|tcLncYF$#t)lQpS|LNeKM%mgx0(3;!IQTZ` z7!c6gz$`3rp!Vt?yTa*;)IV_L;CF&Ji#dyIqv_U?groX{kuzdhG&8=+>#~7apg$^x;6fo|P z>R@?oXI^5G)2H=4a6ObCZ@j{6TR!SdaG$e36Fb^HBo?5?TD`9D^o~E5x$@f}un-uU zIt%a*t!XY!fO-x?YN4NfO-e~ya@G$qYijBEz;B(VzQ)~+;mS(C#O=MxVJe=Cc*-0L zM7+P#AkvG;i z#>NDMGnmy4tEE&vsxIYt8wnDJI0nnOj&i7-Y`ZD@xqUi5C?rbFNVe#7)?A3B)#yQ% z)j+MUu`vh%_(f_WO=AJD6Gx+W#*VIc$WEc_iT5p!ELbRNM$&ae3i))gn@iz|l0D*u zjZqM@i3JmHI~DL%KTp% zeecW`$|CQo4Ic`#)oi*T5TLQQyO`^b818u(j!IN1?D!zn7_X}0zo<#Jy!&c@N}5oh zXr0F^sDE+N3onfP%i^0;C51)5MaLQj{6O>oAM+!?>uvKV^V>4Y_3rsC&C5By&w?JA zo7+4&$>O2hVXNf%>o;6#K>%b%YwyV;mM2{eh0K zshj`gBIEhoMy2l(j)PsAJ!Ar3Z-gO+Ra=!&A(UH9q%ZOQp#oT(&X>lM&H00og$5%& zBAkj(%nq7xoEg;kAt;!1`gD>k$6Fc>6Ye&Q$dRdU$Qm%ZJXx~dT~a7!=yV3tl7$Xv zY5dW?usQ^)MQ&sQx}DkUJvvpQh|;hnD}Gr1S6>N9^1+vLXbr`8?t#IkGjhX89w+3| z&E#?!MQ}MFp6)VP0L5d#;fE8B(31|jofxzvX9f-G{2st3TLo&3l&VZJ-!vVy*>{e1 zB>`P=-Nu$9?2T(ZJ%nNEm<+Abv$ZgX?xy<x;JNZb%HL zc71}QN=-n`%61J}WmP*Xbft4%n&AD21^C&AJ%=UKxSe7YR5d^&f3ffYbBQrwJQdn& zpg=zBDBBQK5Ak7jXRN#{@e;d#pZr>WXcyX|Nbzkt9I^=Q!SlnmE>iQB4xi+159>K~ zKgV_>O3jJ8k5eoABlN1k3-9ChMhaKU4qV}yaFV%q%lAF{lud==+s#p`2g_k)0o(L{ z1iAZ<*!S-v@caXzvR`5sF`dX1O)v@IVf6B(3U?fuxe4(4qi-N4(En5AMPm&F4Td zz$*ak+PO}VRi>7ZL~feLZM*z^<85Ys_n-tkYu8K1i{Ur@Pbjy97Gf-l?(%7vp#mEz zx5qq4;Kmv!m0~}J@MvCnP z3F^O@gxiLcnK3d#s#@2Rpvt1K{q|R7zLz|fdi}BUsM-OfgN-#&-A7U(%yk1P{g!5l zcuzqHG*f?TO!XNt4ORf>{pg*1m=xI{bCCuhKUdFY@NN_8VEz>23-OY-?iM_?8$m=M zyI8^QJUBpU#&|}ze7r^(zf|FmS!QBWxJs=xL1=S*bC z*OGNtN6A;gA;8SH4zPhJdIa7FCKQ9-3=F77gAO20x-oknUjLTQPfhbtfaP{JetmbN z<7owRYSR6@`H*?Uy*r8V_L*Xj=61jvfiy|FEqN#0;Z3W^p)mu_ev{pfWHN!C;M z$TeztMvOF6!D}wu5`1R7Xn2i%kRXv8!IbOJK#X7|klvOEfOzjudRe$Q7x%(g;*07| zDCekN#nc0}sD{_>!R$T*7gKlAivU)5)2iUp$-TPB3X7uloSoo@p$@xk_?Yr#Z=y}J z_u2!d6KM51O`X{XsYelg&|Ss!W2BJ}^Dk1axjMmc;%ay(L~W&}^E~swFlzBSWL|i~ zf_4&SK~ZL)9$+KgL{P---tTU{A)ohqecywJrV~LA4%jBM%NQqc%J3oTi(W4UobB`G zwQ;dIr5tM4vfHk?R;2Nk`Y?sHxokuq-I#9*%!H`R_&+A_F=8;~Cj$YAqFG+uNr&Iv zw-SG=ZSX?_aD)LkQvVU#-(kA)Ki5VV`(BjbCm7G-Gr*BF~^G!=kO|6s5);?Hj? zEkVTGE;ursKvy7@qKVhZXDQm*l%0&_g~HNr=%RU8in7Y&3yh?UwH3M!DBPIWQUFY>AZE#YJv4h z~Y%A9k*Y^H=hx|!bp5JOpF0RjX)t{=rSiVt^tAJ4^ zQ<#?hi{%Fmyj^ev808ckNbV`{2nLW>Xn6QUUZYJtEI$4D5O2 z|CU+7rTDHx4KSlr?F2`+;QOuOvsJwdV8OFBTQ5^IpQi)zR;hg>GX;XAEns#@r~$v> ziBh?dPjh=8u%nr;=$v}g(MKy=RJLT>fA09qTi!>fmDm*O?%b)o5xLJ_TKmIegOh1{ z5Tj5qz)DL-9qBj-S8b;bkPogq>~J55F3B0f`K?0hb^3$`tJ6)wH`j}OmtVX%;s?CX zC@kqZY8C>(WnrKQ%G5WvW8^DURXG3H_y>vAvgk;aC_&cPsI{mMW-z--q}3bwZ>_W=WRG z0M{$n{ulBxp%`Gga39c5*KftE(%DJO@4r~A$OhSWvN29V&1Eh=PD#Nvb9Ofmzw_x( zyQ^jFpmP4)U|Gww1&P^|vN*ylg-_g^uF9(?#;RHCcw+`y~x`ukFo z{x?@y`>7xQn`x3E&ypKzB^(Sqt>Z9tm}vxb9}B?ochLzjHzH@#6M?Z+yD&4R;r;() z2>nfTq2Ql=XaC5Dy8jKZCn`qHqyuS|UVvZipE%urS-SpkejbYf3o;cEqXxp`20V_w z7+fYcc}F*X82~Py-}%`VsLO%4$*1`F?e6(w>e$!l9#8_4gHen1RTY434%;?PXaE<+ zHMQH<@G_NtdYt>mq@A*NkFgCmB*FKcerU7p=g#i32uHB;QvwWTs`C!VG}KEk1Y z3c<^qfN(LjVcGp|f>fU{S;oMl2Ji8P*zXeO+_7<9rq_&FJxo%mQl(L4__R)qQlh=Nk;JkxlTM(Iq$x$Il0BsnciG5 zZx30xJ7>N>elc{jzWPf4TlD7KTaRr~bxh{{W;>Z0ZCV3O?n21PJR?OME|^Pk+Z-Sg zb1l+%d^%3GPpH5R%f+Ryv@=JV$x06`SMos#q;si5{)UpLd7dpJ;5D>2BjNYRih!An z1u45I#&-&yN`J1c7l{{5Nk7kc)FDf? zTGW487`~*KY#{s^GnsDEmTnp#nQ_NLc+}yso~p0Q5bjvZ#LE4cMgwLMRsib(jRZ2k z`GK-gu!$U-sHE|%O%25kc>bycq~E+1bZ(^9QpAga#|ao_LpoSjs}a4hfqn^L01dS? z8IaKENW46$o*UBA+VX;!B691P7x+B5piKDQWW~Fh4=Gs*+sMaQ;SN!H5J?u*JN7uI zP4r7Nvdu8);Drn^K~IG)M@Q2xJC;=QodmB!h$vzjOuCBth@l9hE;KT#nUZUW{YZZ0 zVIRNpY>bNxqdF__n*8#e-&-_wSx)_wUg@{(bG@ zzdiNzpOp*$kz>+-%X9xV6ZZccYJuirykwpRck;|`_k%>GrU2|1nEtr@tne8(C!>d| z&Y!!y96G?A;r7j8L7KD~4Y*P9;9*vMLTQk-oV>QI?BJ<#*vm*y`LF9Rg&|Yv$q4;= zFgyJ0Zx< zi9B8WLzp7SDAZ8Jp(xi$sRQDEms3sJJ`kSEH9X?o_tr-}YvUHs1oZ0c#9DR)CL7PxqyP)^8(-LgqN0 ztxb+*PUk1fbwb5mTyeLV@^yY<6;&3A2|Zt5O`P;bbd{eG4N^ z&oH$7;$mgH(BT7{{wvAQ=!O<4MfTe{;IkZR@M`QvLJU?qt6Es@WJ^E(`FFWKtGOe9 z6Ou6_-r&eLgX7}^33|@U&*)l<{%lq`$T~xn;_^9_f&4pXOrM@oIxq9$2&)qI5CY%g zO|0|==vtm+5K*~;D&=fVPVFYm87_v2eGRyo?;YOxY2Kv?W`63>et8F?9%};Q9+gNt zLKk8b{$lY~7N+=;zpbBo3G=xFGJRhy=MbbTR;>wE;C@!h`TBC@6RYg{O|WX&2m+w$ zL|z7r05VHv$H->r+F;w*u*>kDspa zd2Uy1=eCX;n%7igsu}LblN^yzJPL{;ZR|^$7mR~ZYG=~cx}?`28TtBk^|4HjE!xfc zGg293sMA}ngTVkDA3uyKMVc8%GoI5qmykF}52V3}F~0|k?QSvJO!R>sPfOIoba;CE z9PRf|(M&G&xT+fkG4KPCEFlpO@f$N_If_%uhoBF@q2CAMb%o{HHklFoR@;Kw<{1 zt_bCK8H3)~dlna7`17Jb^_PKwR}=L1uoOicauEfzRfS+dnS|^;*)fHNgM-AG z@ijjDj10TU&87a?YHzM!Ew&RC*CYBbq;=9+7;*LlZ0|Xy0t~y9n!=Rw)0|Fsz@_r8 zFL>s)sVyVsoMDUcd66|v=T{Xty4ctin<4hux*IrT5O$E3lOSJxg#fgof1|JakH7s_ z!HzAyf8_xr&lU~5oU>eij~uS!1|tc%@{tY+2tlcoYQyBs1JeC`Q=uFP7qx zf>^Su)pr9F@T^LIn`Qxo@%*U?`QvS~WxxN$vf@37od@Xp<90w#@dLbjYzO@_0K6mk zPl=F!O0@W!9^{`z)^r2lT$!MQ$C--jpgO>HjQ=^fmVS|Jad`@DcT#@LKTsfTC?Zz+ zAs_Z4By)WuQAI~p~>|e0er*L zQgL<6AP_^yUd6=mA-jygzOK#$;|M}K#5u}&(qC1EY+M-P7j*DhLo@t`))5{efHtJn~VvO>9#@+O@u!*7=e#tqDCZKA zpL)bPdQiZ1PbVy;fVr z6){%sjQ0ON9~XI|Us$|y6Hk?0?acEdXl>kF^auCn=JvUr;-i-Jstuk|%E_P+N@{ zQ5~m!^AE@dozs)9R1bJuSrnc}AGoG{C~ebo;4YA|lz=3erE<|d$ib*(usA?2th^Uk z$rpw%_6-hWoufwQ)^ykI9y{^z&0)AJ|S^+)4-maR5G?R>A-! z<-A8;bXjjMD!~Ah^0iS~(}1_OG2@Cf<{j=14ao{A0v`lOg5qM!Kk2;a#j*`drEdnz zcXRdPlm^ZDt2!{m*K)VLS$L5Htn#{9{Wry?d!JpnVUp2q4+f6x zveO#&?%4~BzT(Zn8qDu&!p9+a0WmF{vyut~!PINz94zxzZY(_9HOKF)^JMWEZ@oYB zgrQqOlD(%}5IJNqHioGIS0S@^gGJQWN~!7H;W}&8kfGb2F zp|ki!?=GGw6z7An{fN=&>Ba^AM0g|0{l&bAWM+KG_VZ7J7D!(AwQ*Lrd58{k2*6__ zz#foD9JF&QR!a+$6Yyf&auq*VYbBF?#P#jR@<$#7g>sgMFEVy)S;Zrucr-a<4+ArSxo;>> z)6X999kafb+`Dh0Gq?;a=d7gK_x^KD`~Dsx{qO(zJIM6^XjAae2zvo&vVZ@+atNQ(^bH)p9S==H;n|pAdeZSP=yI{-9+dzsCPKK zZXB-fI}?&VAa;3JlyEnWo6n4e1#Hf;Go%CdmygPH84QuO|LzH8QcQOJ6&b zc2KGC%Fh1C$0>^M|6;gM>E<@OHjNH1H-BPy^wW3KF6;A~W&|!^xVh*-*8v(dCeTDh zSR=_cli>#*q)aCaz7Jxso4&EMvTMgQG(LHhJ}gyq=4M)q%#riUxGJBPn(QiP?h&ak zise=&(LLxdZP#88?^rwT1y`5)lG|D=-`Sh-KYP)=*xmBuI;K$KDQh9nVY2>bZGVqY z_MgEpmrwa>q{jv)tT-)R&DK;(ZCXg{aK}KbB|_XKK1}|v7yY-k2LEr24p^g>{1o#p z8f8t6gbenbJ|`|B!R*GAqvL*T;Q((4pyTur7bAr9ZLxm3ogEc`htV9a@CzjXXjmA zO{HRFMp-`fdgMQnXjd$uo?7Nf$k!%afJH6yL=8mz2zmbA$Ng&RHAN0K_xd+dC%jhW z&tk+a_qDXAx&ZCd|I;+Ye?IO0m3XwR{zazYHtcUcA2K2#O0r8;?VS%`m97$f{KU2NWiC{T^|MZC zcUw(5TeCe|00*?aLxb)|^6pkW==U(IwAv?Fr#&S*5b5KC3_NbBXe0*ckb+&sGxId* zO`{wKJN8qzDsSWKQt5(Xi|7HAkn4aaP>>o3wNk_NCQTYeG%TDm+uz{jkL!>AjAmV4 zp@{53C`AmQ7WY=g@f(tP67+78wl9)}lT;prCF<&at29lXdG_YqBhK6d=5NFtUeB$w z6y&d9-$02PCGdxgJcKwE-7iYXP)%wxDVTM`J35Vtng@71GCTQ^Ez51g{y2{zME!P- z45&7nF36?I4bwS@A)$!8#p|L~l&jdyLb5^RrEL3KXM1n0<2?8TzL*(*89lgAOxXtj z4(#y5RDf#Sm#;+iDf)`%ulE<4Ap)~U&uE~Qza4z#@>;7($Z44~-(0ZqKjgu;Ayh@4 zNPj&c$@dRXj~0$k2L$C(Ur*rHnbMqo;%WDqLYFu$N3&SQU2#CAM?5h321o)7Z$kK) zGXQNH>+_2x8Yej2PJ(ud@+8qUJWJ-?{0>+8j@k}tk`CubOGtIuYH@FIS9S#NZ(D}|Th4lD)Q~0R%gu|d- z9na}j&jLjkpV#xfKkw}iehah3lpi}bl;mMQihn)O2Vy~tLK=C9x+K5l{$|g`Ja0R4 zQoiyO${}CZFtij>tfQ_fY5O4hJUjd6G5sU^pl<-$!TuJqeIneC=85=_FGF69EhW{| z8K4(S+b3T>S2xAc?2aqLf;UtxFun8QH+9lr@8$duyK`J(uzVT|JL0!r1q-DVk#?cx1`i9_V|Q| zNNG>%nk{cj%N(9~<5HZOIdiD_+Trk7nhRnc1c(l-cw*$JzgWtxZgnWOg;{{=<{J7B z>FT`&LFZHS*P6bEiX42V`j~d~+TJ(f@gfVv%gcq+GPc8?P@YG-cFRl9)EYtJ_rQDVE%dt8*U zGW}zozemRi&^}oVs?)eHsaXXEO7$Hw)v41x`ii~c9J=2s1}n~FcS3gAcgVm-zx6u_ zIO)$s)(^u}bFDGXKC))~_hnisLM-iw>24#q^|se8v#LG!cUmnWM+b6S*()DW69TpG)$LAvXzQqQ+J z5`v?y=8GFRUK_A|lVZg0>}rS|_Q3VU01~4n=?-8*RQF9s56o%62a9oTvbTc7FNig1 z$-ciJ$*l{;{|xqD4ZfGKiX{|d8+dxa3BOqOZ6Q6jW~ZEM$=Fn;wAsN7&$6%CoM9^$ zCKbo@doH%$N_M|?Wa*sln+AvEuiLmBXIFef+dD=1KpSY7VmQu$VNLa1_Opsd9&Xbo zgRD}AqIyOBUzUnW1ed17`i(|2xqcW*Id#?F8RmH4Xld^F~b;EJHRuo?7Y@eR=@@=fwmLMi!qXrIn(rZxk^`8ZbtQysO%`rbH|tThXN~me5p7Cp+d8b4GJ% zi+FO&;3hDd>U!b+ne7~U68bT0X`!7wM==4+tRa2(clT=0B^PFDiJV_P^*t*MFJRHq z5$a?K91x_g(d_BMz=S}n6v70ap|&)?bQws3h)_|kPvvmvDsx4xYJ2%9Co))h&%+%Pr z9p(=#+`pw!EcWk?{$hFi)#Vq<$4qu+w%PB*tv}ymsP^>_F3DAU)kS1865w~%{bJDp zs3dDzBZwVHw)0<>2W zn&Z`UYr=@}jQx~K*J;<;%Nbqr*K9V@)odS~Na3+gSg5h;Two*F_o#B=U}B3489s$y zr&+UbL;Zr098qtAadG>S>V(c6Pqz$uD)jq}|5w=lJGv7c$3`=O(~N-_qyO2GF6b}R zrIlE^Ab!c@ku2jm8X@o%H?`7M1rq}Ycz32>3?(EZid@UGOi1ke#!BV|%m ziaXicyaAgfU+a8Jo!o5uR_^xl$@W(XEF^R+sCIQ@gcQ=t-iP8~io@KyTPiP1f7v#f zR8|T&q+;l?Eg3K7qoCH@)wxsAp@0BZ_d3jg{KMV5y)Pu^#+;u)by-)4jM<9~ zyG)UdFk{)h;`{M592W2iA+mpb(5^4G$W zqXXYfn(`9A*RTub0hc-U?$kuHG83{zj}s(r#-!PKn70CF^gy|Wza%X*VNT>>l6}#{ z`EFpya0tu?^9Jhh@cx&8RKIYou)t5hJqn2&}kP-&2r+ zjmZDZ!O6d3pv4LlW`{eD(B-Mxr5(wn;+}`lSmjdx?g2_FPlcjO1njxa=MSwL8uZ9L-k`n#6%u z*us88xX7<3Urqo(7r!46M1LJnFbk>_`cb}dZiL*~F7_Bbo7^LQiURnDc+@A%=(d&E zj9n&*6mb7>r6!>hke-luJm7d5&bBPvhZi*rT!gZ%^R2sylZY|-Clv3Jcl~5P4C|^# zv!1gx0?ll`lIJ&z2Hwu^gKXb_h3&t!)RXP6i!#7$`ELhU73;!~o3HbK25gIJXdgf@dap3Nz02Ls6Ug!AEdfb2qL! z^>RYp`6~3?qW{L@t^YsUz_S5RMLeW&3%K|dFSExoS%LiY*O)}QSs1hox0aPKqc)&C zrC_qUd!tG+QAMx2jQxar&R#bb&=B51%?=aFHppn^SPm3W|MSe<1_pf)k$Q{V*_j8~ zT57H4eWm#qCc!dn#w>8Vz{`U+_n3>4 zSgu3w^D$px9o0Z%ah~zy0l*--J@rla`|41zi9 z=!X5*!wn-1#QKn|`%15e3Ma;6?Cg&1=k416pbx?0v%osRltT1j*?;{H_TD?JskToS zje^qDh|*hBL=Xf7X;MX{i!=cNAu7_FG-)A`E;RxI3PO}#gh)qP=!o<#K}v!mNJ{`i zAjPwMXTI~j@7^=#`u5D3J+sRnT!~yEG09r%`8{_9J&-F3?HeZ{5-bp}@tLv7DG*xim}`UFZ}HxtCnnfHX|+y7F^-T}q@j0nXm_ zCd63GaDITs0Gt)_f7pZmYH#^B`&|xWlr3#-+kzee+gh z!kULWAdF%e@DRR#@%e?WKF|jSVY$;9QJ*QjHzzQ4ayDwv{>!vd=H>0#(k&YKp3FP)UDDIaDZ@tN9kC{KPGKOztpgY>?>%n0PuJ-=0I8h z0RG=es>IGx4aTYe)D3s_FEOt^bYR{}_Cf6B0y3$oe`X>6s+IZ>YDCu#m7vWcX-C|O z|5#;D{5k0LUL)XmT3Pt{6?4G*H)Yk|=YwgJzXX53Ib8MEcoVeMU$vs3KZ`{z5}kn4 zb(^L37pUSQKvc$!{_*nQkElc_!NThpjOPP+?+8F%ZlN<4D~Hb;2S@?4Hjr}SRXxXR!mI;(_^Y83~76gdE4{{>25 zTGAt`ZB~P+(huH(Pljd&T7CrnG*GOLa$$wPf3AjCb@+;CA(m3OcC!K5Q5ERhS#MaR zUl)y?`eyRTndid9<97-&w@)x*y~Ab9_} z%O&Zj824EOA9=51OJEOveDdok_PE)pTtm-v3yR3obw{OJ?|Tl}S=lJp11W6_ zgj>HrTyS8xV%o|l&>Q8{G|b*NXz2-knd|rJ5wrsLowc*bkdffz*I&a~uKteRo;=<~ zu(oNL>}O08xik=X=#CE{YIy~%-|L0MVOTU4GwjZj*9dEOQw@j?=@I#Jn#DcI)%nw> zZ7wBnP81CY#?1AqT7G~z0HTyDOEK%Kc^Z-MGe24xC%BE04mS7n!?9LUoz~f-N)2&Z ztOK*H*G}jNn0?4AD~q#{0FWH-UCWNGIK&CMJejK(@6{1%H)}_r7cJ9L=%e+WimAdk zDMpVg5-?GLMjK}-7A~mj`Y!1x3>fX_;;#op48_7Uj`dxR_24P|1(FZ5mk>zk; zsBAw;KSZ@^q$SWfV9*%+6ox6feF9h|A~hw~G1dA7KPMbi$Cu3@@e(Y9+AUOb$DnA8Qd*&zKlMnZJuqm<$kQGG9f892qih7UMU)5 zF6mUX0{>zHjX|8;0+buz&lplG`7HPu{IV;CoqCmMX4OC-eJFI}vUoz&x*92W1m34BiG+p`_rgjwP>PH7&q1X`lBnxmO< zwMoXtda9i+&lBE&DuOun6XEaQZPr@b7$qN+Yr$2h^2DtT777IZg$|}AtIGy%?%};6 zS}(Z-Cl1H>t2v6Do!H&b(LoM1gzKHTX@yTYm(K-?K6C8;W-oBnEvGut-eMkYvBM;3 zZ(G6S40Fu;NtkUu*>0DYxneXIJGy>7IC7?0AR0G0)B8j)(_OhsZ@ z$zDrF8Z+*Zy-CHu_|smtR&5 zC~~4P%^^U%p*%T}awAZKltE<7h=3Aqqe@)rWNxlVK8m@cDbVW5)1Okdr_dOd`rNt6 zO><|+d(XVqhBUr=b>VXascZ~LyhF^OHEH>NhFl2n%-WdUd5eHk@5aQc8&bZceB$sK zO;N(PR-*w)o`cs+SsSE^sm+jq+8;|6OxT|P;8klR(!b@r6bl}fuxD24 z4lLSeDTdGU!QjWdK1cW8YIdA>>9%BiIl%^&13g%V&V~L0UFjdl`!+LQ;!%<>kS0Ie zf@}gzq>f?GER7mS*A`Z|=NG6>A%-GEJwY_bJe6GN@C~d2wn`q#lKMZ4>k*G^oX?^5 zBqDaMaEdY|y{0GG&9U)c^wL)i=Wv?g+kAq(62(xW76q4qag%2qD0dL;Mv^eEH_na7 zh&+O2_+||y3w)|eZo_(SBY^qG=uFC^ZDFN>7zWi~JuRH z!q_9?HrpH;-nrA#Pi19o+rXbKci~qaEDhVaiqV{NF@nECwA#Hj9wHN3FGO_kQL!07 z?+LT+raT!J*Ht-u6o2v2-5yZCzOb<_FZwe-|C;3OPl5)9ucRa^*dN8+eJQJa`BPPL zJEITt5(jbLLYhJ3n5`(&*xL5$9vfTY+gPMLONsQkNe+{HOvb?Y@-Mr%P5Lic5ao8> z-_%TZR04s&O1viQB{uWor_xj}md&_2GSq3hsQS7KCkRF^aon|34i?J|`~6`a;aoxp z(bZsAXqj-Hd8!@xLm)|6D2LE{sq*?x-RhkEwNsakE_K!&2`)@7z3Y}~UQu6w0je-h z8L=%^tb9H6V)3cArU1K98kRJ2?-R8Ucuw8lW|IFfg61DYLJpA?0Sn%Ux;VLIX*kM) z&H~_tvUuqj%t=35h$)KB9)h}Hpr-cfURyuva-Ayqe6%R3o=&`u{EFf<_h9E(TBBrMzqeX4yYCLW23~u^ITL33O zzt(;2Lp*O@N%VX?0BcU1wj5cny_@>U=B4n9vpiTq%^tNf>*PCPta+fvpn^AVfcNu1 z-Kp^Z^_u^?yBPkp_=4ZV`bQ!Y^{E$PZ62^@O||@)VRJtGCyLElJ{u4i{4Li&Li?YD zs{3HlJ^|9b6$^xHqq-0=zd(l^17S9$E7k2q`=&v%y1o2(osZbD9zOZ2ATHiBmeVgx zonQ54N{MdI;X`ay@b%QwuHQ+Tv`ma6;`A!yBshApY61XkV={E>YZ|L=rYzq;JT4=> zDtP22Vq8afopwc0N8!BwD-P z`D?o#Plw43`xIr%HAzl!Cb`EY7qaGT>SA^tP%Hr>GatrHgM6V7O;Mr>k$H&>^i%e4 zRtauUY^Ge@Nh^gMg52or)=`_jS4(UH#@e@g=4YRz0R^+|)*=9~&g_Re;mS&?R!1JG ziCc?FOgN+~?j7Emw#s2gh~1=)IlQQK<(~AyL^JQKxmj?a40**H>4#ZyUdg@ckWVi61!|a>D`_;LH>fK6m z`C>Y8cw>u#psLdf%bR)8fj4ly?V(r9xwwVI-iIn|SxnY8L>?!FxTqt}@r>FG-dFd2 zs&*N(h^9*ulgjX@aG=#xx)Z}kt}O%Ftn)!#m{5LF|AUGdbyV?<${88? zW|ZoqjgL&F&x84P^~K7Rx!R#D^jS zVf)3ptf$H ZNURx!Fs>-_#1#v{< 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 literal 0 HcmV?d00001 diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx index 5797e5dc79..f104481136 100644 --- a/docs/source/routing/get-started.mdx +++ b/docs/source/routing/get-started.mdx @@ -258,7 +258,7 @@ query Query { Apollo Sandbox IDE showing successful query and response at the end of the router quickstart From 25289dd185309d71df4ad6ddd40f070c0c999c75 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Fri, 25 Apr 2025 22:20:06 -0700 Subject: [PATCH 18/47] split up authz pages --- .../security/authorization-overview.mdx | 108 ++++++++++++++++++ .../source/routing/security/authorization.mdx | 99 +--------------- 2 files changed, 110 insertions(+), 97 deletions(-) create mode 100644 docs/source/routing/security/authorization-overview.mdx diff --git a/docs/source/routing/security/authorization-overview.mdx b/docs/source/routing/security/authorization-overview.mdx new file mode 100644 index 0000000000..a92efb72e4 --- /dev/null +++ b/docs/source/routing/security/authorization-overview.mdx @@ -0,0 +1,108 @@ +--- +title: Overview of Authorization in the GraphOS Router +subtitle: Strengthen subgraph security with a centralized governance layer +description: Enforce authorization in the GraphOS Router with the @requireScopes, @authenticated, and @policy directives. +--- + + + +APIs provide access to business-critical data. Unrestricted access can result in data breaches, monetary losses, or potential denial of service. Even for internal services, checks can be essential to limit data to authorized parties. + +Services may have their own access controls, but enforcing authorization _in the Apollo Router_ is valuable for a few reasons: + +- **Optimal query execution**: Validating authorization _before_ processing requests enables the early termination of unauthorized requests. Stopping unauthorized requests at the edge of your graph reduces the load on your services and enhances performance. + + ```mermaid + flowchart LR; + clients(Client); + subgraph Router[" "] + router(["GraphOS Router"]); + serviceB[Users
API]; + serviceC[Posts
API]; + end + router -.->|"❌ Subquery"| serviceB & serviceC; + clients -->|"⚠️Unauthorized
request"| router; + ``` + + - If every field in a particular subquery requires authorization, the router's [query planner](/router/customizations/overview#request-path) can _eliminate entire subgraph requests_ for unauthorized requests. For example, a request may have permission to view a particular user's posts on a social media platform but not have permission to view any of that user's personally identifiable information (PII). Check out [How it works](/graphos/routing/security/authorization#how-it-works) to learn more. + + ```mermaid + flowchart LR; + clients(Client); + subgraph Router[" "] + router(["GraphOS Router"]); + serviceB[Users
API]; + serviceC[Posts
API]; + end + router -->|"✅ Authorized
subquery"| serviceC; + router -.->|"❌ Unauthorized
subquery"| serviceB; + clients -->|"⚠️ Partially authorized
request"| router; + ``` + + - Also, [query deduplication](/router/configuration/traffic-shaping/#query-deduplication) groups requested fields based on their required authorization. Entire groups can be eliminated from the query plan if they don't have the correct authorization. + +- **Declarative access rules**: You define access controls at the field level, and GraphOS [composes](/graphos/routing/security/authorization#composition-and-federation) them across your services. These rules create graph-native governance without the need for an extra orchestration layer. + +- **Principled architecture**: Through composition, the router centralizes authorization logic while allowing for auditing at the service level. This centralized authorization is an initial checkpoint that other service layers can reinforce. + + ```mermaid + flowchart LR; + clients(Client); + Level2:::padding + subgraph Level1["
🔐 Router layer                                                   "] + router(["GraphOS Router"]); + subgraph Level2["🔐 Service layer"] + serviceB[Users
API]; + serviceC[Posts
API]; + end + end + + router -->|"Subquery"| serviceB & serviceC; + clients -->|"Request"| router; + + classDef padding padding-left:1em, padding-right:1em + ``` + + + +To learn more about why authorization is ideal at the router layer, watch Andrew Carlson's talk at Austin API Summit 2024: [Centralize Data Access Control with GraphQL](https://www.youtube.com/watch?v=ETyAPY4bsYY). + + + + + + + + + +## How access control works + +The GraphOS Router provides access controls via **authorization directives** that define access to specific fields and types across your supergraph: + +- The [`@requiresScopes`](/graphos/routing/security/authorization#requiresscopes) directive allows granular access control through the scopes you define. +- The [`@authenticated`](/graphos/routing/security/authorization#authenticated) directive allows access to the annotated field or type for _authenticated requests only_. +- The [`@policy`](/graphos/routing/security/authorization#policy) directive offloads authorization validation to a [Rhai script](/graphos/routing/customization/rhai/) or a [coprocessor](/router/customizations/coprocessor) and integrates the result in the router. It's useful when your authorization policies go beyond simple authentication and scopes. + +For example, imagine you're building a social media platform that includes a `Users` subgraph. You can use the [`@requiresScopes`](/graphos/routing/security/authorization#requiresscopes) directive to declare that viewing other users' information requires the `read:user` scope: + +```graphql +type Query { + users: [User!]! @requiresScopes(scopes: [["read:users"]]) +} +``` + +You can use the [`@authenticated`](/graphos/routing/security/authorization#authenticated) directive to declare that users must be logged in to update their own information: + +```graphql +type Mutation { + updateUser(input: UpdateUserInput!): User! @authenticated +} +``` + +You can define both directives—together or separately—at the field level to fine-tune your access controls. When directives are declared both on a field and the field's type, they will all be tried, and the field will be removed if any of them does not authorize it. +GraphOS [composes](/graphos/routing/security/authorization#composition-and-federation) restrictions into the supergraph schema so that each subgraph's restrictions are respected. +The router then enforces these directives on all incoming requests. + +## Next steps + +- Learn how to use [authorization directives](/graphos/routing/security/authorization) in your GraphQL schemas to secure access to your graphs. diff --git a/docs/source/routing/security/authorization.mdx b/docs/source/routing/security/authorization.mdx index 26673ab279..5422c16e0d 100644 --- a/docs/source/routing/security/authorization.mdx +++ b/docs/source/routing/security/authorization.mdx @@ -1,107 +1,12 @@ --- title: Authorization in the GraphOS Router -subtitle: Strengthen subgraph security with a centralized governance layer +subtitle: Enforce authorization with schema directives description: Enforce authorization in the GraphOS Router with the @requireScopes, @authenticated, and @policy directives. --- -APIs provide access to business-critical data. Unrestricted access can result in data breaches, monetary losses, or potential denial of service. Even for internal services, checks can be essential to limit data to authorized parties. - -Services may have their own access controls, but enforcing authorization _in the Apollo Router_ is valuable for a few reasons: - -- **Optimal query execution**: Validating authorization _before_ processing requests enables the early termination of unauthorized requests. Stopping unauthorized requests at the edge of your graph reduces the load on your services and enhances performance. - - ```mermaid - flowchart LR; - clients(Client); - subgraph Router[" "] - router(["GraphOS Router"]); - serviceB[Users
API]; - serviceC[Posts
API]; - end - router -.->|"❌ Subquery"| serviceB & serviceC; - clients -->|"⚠️Unauthorized
request"| router; - ``` - - - If every field in a particular subquery requires authorization, the router's [query planner](/router/customizations/overview#request-path) can _eliminate entire subgraph requests_ for unauthorized requests. For example, a request may have permission to view a particular user's posts on a social media platform but not have permission to view any of that user's personally identifiable information (PII). Check out [How it works](#how-it-works) to learn more. - - ```mermaid - flowchart LR; - clients(Client); - subgraph Router[" "] - router(["GraphOS Router"]); - serviceB[Users
API]; - serviceC[Posts
API]; - end - router -->|"✅ Authorized
subquery"| serviceC; - router -.->|"❌ Unauthorized
subquery"| serviceB; - clients -->|"⚠️ Partially authorized
request"| router; - ``` - - - Also, [query deduplication](/router/configuration/traffic-shaping/#query-deduplication) groups requested fields based on their required authorization. Entire groups can be eliminated from the query plan if they don't have the correct authorization. - -- **Declarative access rules**: You define access controls at the field level, and GraphOS [composes](#composition-and-federation) them across your services. These rules create graph-native governance without the need for an extra orchestration layer. - -- **Principled architecture**: Through composition, the router centralizes authorization logic while allowing for auditing at the service level. This centralized authorization is an initial checkpoint that other service layers can reinforce. - - ```mermaid - flowchart LR; - clients(Client); - Level2:::padding - subgraph Level1["
🔐 Router layer                                                   "] - router(["GraphOS Router"]); - subgraph Level2["🔐 Service layer"] - serviceB[Users
API]; - serviceC[Posts
API]; - end - end - - router -->|"Subquery"| serviceB & serviceC; - clients -->|"Request"| router; - - classDef padding padding-left:1em, padding-right:1em - ``` - - - -To learn more about why authorization is ideal at the router layer, watch Andrew Carlson's talk at Austin API Summit 2024: [Centralize Data Access Control with GraphQL](https://www.youtube.com/watch?v=ETyAPY4bsYY). - - - - - - - - - -## How access control works - -The GraphOS Router provides access controls via **authorization directives** that define access to specific fields and types across your supergraph: - -- The [`@requiresScopes`](#requiresscopes) directive allows granular access control through the scopes you define. -- The [`@authenticated`](#authenticated) directive allows access to the annotated field or type for _authenticated requests only_. -- The [`@policy`](#policy) directive offloads authorization validation to a [Rhai script](/graphos/routing/customization/rhai/) or a [coprocessor](/router/customizations/coprocessor) and integrates the result in the router. It's useful when your authorization policies go beyond simple authentication and scopes. - -For example, imagine you're building a social media platform that includes a `Users` subgraph. You can use the [`@requiresScopes`](#requiresscopes) directive to declare that viewing other users' information requires the `read:user` scope: - -```graphql -type Query { - users: [User!]! @requiresScopes(scopes: [["read:users"]]) -} -``` - -You can use the [`@authenticated`](#authenticated) directive to declare that users must be logged in to update their own information: - -```graphql -type Mutation { - updateUser(input: UpdateUserInput!): User! @authenticated -} -``` - -You can define both directives—together or separately—at the field level to fine-tune your access controls. When directives are declared both on a field and the field's type, they will all be tried, and the field will be removed if any of them does not authorize it. -GraphOS [composes](#composition-and-federation) restrictions into the supergraph schema so that each subgraph's restrictions are respected. -The router then enforces these directives on all incoming requests. +Learn how to secure access to your graph via the router by using authorization directives in your GraphQL schemas. ## Prerequisites From 2d62549d5fdd5cb90a9dfe561867d80392baa5c1 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 28 Apr 2025 11:46:48 -0700 Subject: [PATCH 19/47] add Key Features overviews for defer, subscriptions --- docs/source/routing/get-started.mdx | 12 +- .../routing/operations/defer-overview.mdx | 137 ++++++++++++++++++ docs/source/routing/operations/defer.mdx | 131 +---------------- .../{index.mdx => configuration.mdx} | 39 +---- .../operations/subscriptions/overview.mdx | 41 ++++++ 5 files changed, 191 insertions(+), 169 deletions(-) create mode 100644 docs/source/routing/operations/defer-overview.mdx rename docs/source/routing/operations/subscriptions/{index.mdx => configuration.mdx} (95%) create mode 100644 docs/source/routing/operations/subscriptions/overview.mdx diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx index f104481136..d6bbbd7c45 100644 --- a/docs/source/routing/get-started.mdx +++ b/docs/source/routing/get-started.mdx @@ -4,7 +4,7 @@ subtitle: Run the router in dev mode for an example graph description: This quickstart tutorial walks you through installing an Apollo Router binary, running it with an example supergraph schema, and making test queries with Apollo Sandbox --- -import ElasticNotice from "../../../shared/elastic-notice.mdx"; +import ElasticNotice from "../../shared/elastic-notice.mdx"; Hello! Let's run an Apollo Router binary for the very first time. @@ -16,11 +16,13 @@ You will: - Run the router for your supergraph in development mode. - Make queries to the running router with the Apollo Sandbox IDE. -## 0. Apollo Router is the graph runtime +## Apollo Router is the graph runtime -Apollo Router is often called the runtime or execution engine of Apollo. That's because it runs a federated graph. It accepts incoming GraphQL client requests, plans how to efficiently call the APIs that make up the graph, orchestrates the API calls to fetch the requested data, and bundles the data into a response. +Apollo Router is called the graph runtime or execution engine of Apollo. That's because it receives requests to the graph and returns responses that fetch data from the different APIs that make up a graph. Specifically, It accepts incoming client requests, plans how to efficiently call the APIs that make up the graph, orchestrates the API calls to fetch the requested data, and bundles the data into a response. -You can run a router locally or scale up to deploy a fleet in your own infrastructure. Each router is an endpoint to a GraphQL API. It's the gateway for all client requests to a graph. Like API gateways in general, a router offers a central place to implement cross-cutting concerns, such as authentication, authorization, caching, logging, monitoring, rate limiting, and demand control. +Because Apollo uses GraphQL and Apollo Federation to define a graph, each router is an endpoint to a GraphQL API. It's the gateway for all client requests to a graph. Like API gateways in general, a router offers a central place to implement cross-cutting concerns, such as authentication, authorization, caching, logging, monitoring, rate limiting, and demand control. + +You can deploy the router locally or at scale in containers on your own infrastructure. This guide walks you through the basics of running the router locally. ## 1. Download and extract the router binary @@ -54,7 +56,7 @@ You can run a router locally or scale up to deploy a fleet in your own infrastru ## 2. Download a supergraph schema -A router needs a schema for the supergraph that it's orchestrating. For this guide, we're downloading an example supergraph schema that we'll provide to the router. +A router needs a schema for the graph that it's orchestrating. For this guide, we're downloading an example supergraph schema that we'll provide to the router. 1. From your project's root directory, run the following to download and save a supergraph schema to a file: diff --git a/docs/source/routing/operations/defer-overview.mdx b/docs/source/routing/operations/defer-overview.mdx new file mode 100644 index 0000000000..ed7f01c580 --- /dev/null +++ b/docs/source/routing/operations/defer-overview.mdx @@ -0,0 +1,137 @@ +--- +title: Overview of @defer directive support +subtitle: Improve performance by delivering fields incrementally +description: Improve your GraphQL query performance with GraphOS Router and Apollo Router Core's support for the @defer directive. Incrementally deliver response data by deferring certain fields. +minVersion: 1.8.0 +--- + +Apollo Router's support of the `@defer` directive helps client developers tackle the common challenge of how to create a responsive user experience when certain fields of a query take longer to resolve than others. `@defer` improves application performance by delivering response data incrementally. This is important for real-time applications like dashboards or reports. By deferring data for some fields, the router can resolve and return data for the query's _other_ fields more quickly, improving responsiveness. + +## What is `@defer`? + +The `@defer` directive enables a client query to specify sets of fields that it doesn't need to receive data for _immediately_. This is helpful whenever some fields in a query take much longer to resolve than others. + +The `@defer` directive is applied to a GraphQL query. Specifically, deferred fields are always contained within a GraphQL fragment, and the `@defer` directive is applied to that fragment. + +Here's an example query that uses `@defer`: + +```graphql +query GetTopProducts { + topProducts { + id + name + # highlight-start + ... @defer { + price + } + # highlight-end + } +} +``` + +To respond incrementally, the router uses a multipart-encoded HTTP response. To use `@defer` successfully with the router, a client's GraphQL library must _also_ support the directive by handling multipart HTTP responses correctly. + +The router's `@defer` support is compatible with all [federation-compatible subgraph libraries](/federation/building-supergraphs/supported-subgraphs/). That's because the router takes advantage of your supergraph's existing [entities](/federation/entities/) to fetch any deferred field data via followup queries to your subgraphs. + + +## Which fields can my router defer? + +Your router can defer the following fields in your schema: + +- Root fields of the `Query` type (along with their subfields) +- Fields of any entity type (along with their subfields) + - Deferring entity fields is extremely powerful but requires some setup if you aren't using entities already. This is covered in more detail [below](#entity-fields). + +See below for more information on each of these. + +### `Query` fields + +Your router can defer any field of your schema's `Query` type, along with any subfields of those fields: + +```graphql +query GetUsersAndDeferProducts { + users { + id + } + # highlight-start + ... @defer { + products { + id + } + } + # highlight-end +} +``` + +With the query above, the router first returns a list of `User` IDs, then later completes the response with a list of `Product` IDs. + +### Entity fields + +Your router supports deferring fields of the special object types in your supergraph called entities. + +Entities are object types that often define their fields across multiple subgraphs (but they don't have to). You can identify an entity by its use of the `@key` directive. In the example subgraph schemas below, the `Product` type is an entity: + + + +```graphql title="Products subgraph" +type Product @key(fields: "id") { + id: ID! + name: String! + price: Int! +} + +type Query { + topProducts: [Product!]! +} +``` + +```graphql title="Reviews subgraph" +type Product @key(fields: "id") { + id: ID! + reviews: [Review!]! +} + +type Review { + score: Int! +} +``` + + + +Entities are query entry points into your subgraphs, and this is what enables your router to defer their fields: the router can send a followup query to a subgraph to fetch any entity fields that it doesn't fetch initially. + +Here's an example query that defers entity fields using the subgraphs above: + +```graphql +query GetProductsAndDeferReviews { + topProducts { + id + name + # highlight-start + ... @defer { + reviews { + score + } + } + # highlight-end + } +} +``` + +To handle this query, the router first resolves and returns a list of `Product` objects with their IDs and names. Later, the router completes the response by returning review scores for each of those products. + + + +It doesn't matter which subgraph defines a particular entity field! Queries can defer entity fields that are defined across any number of different subgraphs. + + + +### Defining entities in your subgraphs + +If your subgraphs don't yet include any entities, you need to define some before clients can start deferring their fields in queries. + +To learn about creating entities, see [this guide](/graphos/schema-design/federated-schemas/entities). + +## Next steps + +- [Configure your router](/graphos/routing/operations/defer) and clients to enable and handle `@defer` diff --git a/docs/source/routing/operations/defer.mdx b/docs/source/routing/operations/defer.mdx index 7a21d412bb..014f1d8ea9 100644 --- a/docs/source/routing/operations/defer.mdx +++ b/docs/source/routing/operations/defer.mdx @@ -1,137 +1,14 @@ --- -title: Router Support for @defer +title: Configuring and applying @defer subtitle: Improve performance by delivering fields incrementally description: Improve your GraphQL query performance with GraphOS Router and Apollo Router Core's support for the @defer directive. Incrementally deliver response data by deferring certain fields. minVersion: 1.8.0 --- -Queries sent to GraphOS Router or Apollo Router Core can use the `@defer` directive to enable the incremental delivery of response data. By deferring data for some fields, the router can resolve and return data for the query's _other_ fields more quickly, improving responsiveness. +Learn about: -The router's `@defer` support is compatible with all [federation-compatible subgraph libraries](/federation/building-supergraphs/supported-subgraphs/). That's because the router takes advantage of your supergraph's existing [entities](/federation/entities/) to fetch any deferred field data via followup queries to your subgraphs. - -## What is `@defer`? - -The `@defer` directive enables a client query to specify sets of fields that it doesn't need to receive data for _immediately_. This is helpful whenever some fields in a query take much longer to resolve than others. - -Deferred fields are always contained within a GraphQL fragment, and the `@defer` directive is applied to that fragment (_not_ to the individual fields). - -Here's an example query that uses `@defer`: - -```graphql -query GetTopProducts { - topProducts { - id - name - # highlight-start - ... @defer { - price - } - # highlight-end - } -} -``` - -To respond incrementally, the router uses a multipart-encoded HTTP response. To use `@defer` successfully with the router, a client's GraphQL library must _also_ support the directive by handling multipart HTTP responses correctly. - -The router's `@defer` support is compatible with all [federation-compatible subgraph libraries](/federation/building-supergraphs/supported-subgraphs/), because the deferring logic exists entirely within the router itself. - -## Which fields can my router defer? - -Your router can defer the following fields in your schema: - -- Root fields of the `Query` type (along with their subfields) -- Fields of any entity type (along with their subfields) - - Deferring entity fields is extremely powerful but requires some setup if you aren't using entities already. This is covered in more detail [below](#entity-fields). - -See below for more information on each of these. - -### `Query` fields - -Your router can defer any field of your schema's `Query` type, along with any subfields of those fields: - -```graphql -query GetUsersAndDeferProducts { - users { - id - } - # highlight-start - ... @defer { - products { - id - } - } - # highlight-end -} -``` - -With the query above, the router first returns a list of `User` IDs, then later completes the response with a list of `Product` IDs. - -### Entity fields - -Your router supports deferring fields of the special object types in your supergraph called entities. - -Entities are object types that often define their fields across multiple subgraphs (but they don't have to). You can identify an entity by its use of the `@key` directive. In the example subgraph schemas below, the `Product` type is an entity: - - - -```graphql title="Products subgraph" -type Product @key(fields: "id") { - id: ID! - name: String! - price: Int! -} - -type Query { - topProducts: [Product!]! -} -``` - -```graphql title="Reviews subgraph" -type Product @key(fields: "id") { - id: ID! - reviews: [Review!]! -} - -type Review { - score: Int! -} -``` - - - -Entities are query entry points into your subgraphs, and this is what enables your router to defer their fields: the router can send a followup query to a subgraph to fetch any entity fields that it doesn't fetch initially. - -Here's an example query that defers entity fields using the subgraphs above: - -```graphql -query GetProductsAndDeferReviews { - topProducts { - id - name - # highlight-start - ... @defer { - reviews { - score - } - } - # highlight-end - } -} -``` - -To handle this query, the router first resolves and returns a list of `Product` objects with their IDs and names. Later, the router completes the response by returning review scores for each of those products. - - - -It doesn't matter which subgraph defines a particular entity field! Queries can defer entity fields that are defined across any number of different subgraphs. - - - -### Defining entities in your subgraphs - -If your subgraphs don't yet include any entities, you need to define some before clients can start deferring their fields in queries. - -To learn about creating entities, see [this guide](/graphos/schema-design/federated-schemas/entities). +- Configuring Apollo Router and clients to support the `@defer` directive. +- Writing subgraph schemas and queries that use `@defer`. ## Requirements for `@defer` diff --git a/docs/source/routing/operations/subscriptions/index.mdx b/docs/source/routing/operations/subscriptions/configuration.mdx similarity index 95% rename from docs/source/routing/operations/subscriptions/index.mdx rename to docs/source/routing/operations/subscriptions/configuration.mdx index 5d8cbfb2f8..5bb049c1f5 100644 --- a/docs/source/routing/operations/subscriptions/index.mdx +++ b/docs/source/routing/operations/subscriptions/configuration.mdx @@ -7,42 +7,7 @@ minVersion: 1.22.0 -GraphOS routers provides support for GraphQL subscription operations: - -```graphql -subscription OnStockPricesChanged { - stockPricesChanged { - symbol - price - } -} -``` - -With subscription support enabled, you can add `Subscription` fields to the schema of any subgraph that supports common WebSocket protocols for subscription communication: - -```graphql title="stocks.graphql" -type Subscription { - stockPricesChanged: [Stock!]! -} -``` - -## What are subscriptions for? - - - -## How subscriptions work - - - - - -[Walk through an example.](#example-execution) - - - -### Special considerations - -Whenever your router updates its supergraph schema at runtime, it terminates all active subscriptions. Clients can detect this special-case termination via an error code and execute a new subscription. See [Termination on schema update](#termination-on-schema-update). +Learn how to configure the router to enable GraphQL subscriptions. ## Prerequisites @@ -369,7 +334,7 @@ Disabling deduplication is useful if you need to create a separate connection to ### Termination on schema update -Whenever your router's supergraph schema is updated, **the router terminates all active subscriptions.** +Whenever your router's supergraph schema is updated, **the router terminates all active subscriptions.** Clients can detect this special-case termination via an error code and execute a new subscription. Your router's supergraph schema is updated in the following cases: diff --git a/docs/source/routing/operations/subscriptions/overview.mdx b/docs/source/routing/operations/subscriptions/overview.mdx new file mode 100644 index 0000000000..b0de64b6a3 --- /dev/null +++ b/docs/source/routing/operations/subscriptions/overview.mdx @@ -0,0 +1,41 @@ +--- +title: Overview of GraphQL Subscription Support +subtitle: Enable clients to receive real-time updates +description: Configure your router to support GraphQL subscriptions, enabling clients to receive real-time updates via WebSocket or HTTP callbacks. +minVersion: 1.22.0 +--- + + + +GraphQL subscriptions enable clients to manage real-time data updates effectively, without the need for constant polling. This is particularly crucial in applications that need live updates, such as notifications, stock tickers, or chat applications. Using subscriptions improves performance and user experience by ensuring that clients receive the latest information as soon as changes occur on the backend. + +```graphql title="Example GraphQL subscription" showLineNumbers=false +subscription OnStockPricesChanged { + stockPricesChanged { + symbol + price + } +} +``` + +The router supports both the callback and multipart protocols for handling subscriptions. With subscription support enabled, you can add `Subscription` fields to the schema of any subgraph that supports common WebSocket protocols for subscription communication: + +```graphql title="stocks.graphql" showLineNumbers=false +type Subscription { + stockPricesChanged: [Stock!]! +} +``` + +## What are subscriptions for? + + + +## How subscriptions work + + + +## Next steps + +- [Configure](/graphos/routing/operations/subscriptions/configuration) the router and update your subgraph schemas to enable and handle subscriptions. + +- Learn about the [callback](/graphos/routing/operations/subscriptions/callback-protocol) and [multipart](/graphos/routing/operations/subscriptions/multipart-protocol) protocols. From a2af4f3c779ed5fb5ccb2a2877a139ef87167ca0 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 28 Apr 2025 15:21:28 -0700 Subject: [PATCH 20/47] edits --- docs/source/routing/get-started.mdx | 56 ++++++++++++++++------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx index d6bbbd7c45..97c8187633 100644 --- a/docs/source/routing/get-started.mdx +++ b/docs/source/routing/get-started.mdx @@ -28,7 +28,7 @@ You can deploy the router locally or at scale in containers on your own infrastr -- Download and install the latest version of the router binary with a single command line: +1. Download and install the latest version of the router binary with a single command line: ```bash showLineNumbers=false curl -sSL https://router.apollo.dev/download/nix/latest | sh @@ -46,9 +46,9 @@ You can deploy the router locally or at scale in containers on your own infrastr - > Optionally, go to [router releases](https://github.com/apollographql/router/releases) in GitHub to download and extract a bundle. + Optionally, go to [router releases](https://github.com/apollographql/router/releases) in GitHub to download and extract a bundle. -- Check that your router installed successfully by running the `router` binary from your project's root directory: +1. Check that your router installed successfully by running the `router` binary from your project's root directory: ```bash showLineNumbers=false ./router --version @@ -199,18 +199,18 @@ type User -## 3. Run and test the router in dev mode +## 3. Run the router -You can run the router in development mode, where it enables some useful development-only features. This dev mode includes running its own [Apollo Sandbox](/graphos/explorer/sandbox/), a local GraphQL server that's running the router's supergraph and that has its own browser-based IDE that you make test queries with. +Running the router in development mode enables some useful development-only features. Let's now run the router in dev mode, using the supergraph schema you saved: -Let's now run the router in dev mode, using the supergraph schema you saved, and make some test queries in its Sandbox: - -1. Run the router with command-line options that enable dev mode and provide a path to a supergraph schema: +1. Run the router with command-line options, which enable dev mode and provide a path to your supergraph schema: ```sh ./router --dev --supergraph supergraph-schema.graphql ``` +1. Check that your router is running, with output similar to the example: + ```sh @@ -236,35 +236,41 @@ Let's now run the router in dev mode, using the supergraph schema you saved, and +## Make a query + +A router in dev mode runs its own [Apollo Sandbox](/graphos/explorer/sandbox/), a local GraphQL server running a development instance of your graph. Sandbox has a browser-based IDE, Explorer, that you can use to write and send real GraphQL queries to your development graph. + +Let's use Sandbox to write and send a query to your graph: + 1. Open a browser and go to the URL of the router's Sandbox, `http://127.0.0.1:4000`. 1. Copy and paste the example query into the **Operation** pane: -```graphql -query Query { - recommendedProducts { - inStock - name - price - reviews { - author { - name + ```graphql + query Query { + recommendedProducts { + inStock + name + price + reviews { + author { + name + } } } } -} ``` 1. Click **Query** to run the query, then check its response in the **Response** pane. -Apollo Sandbox IDE showing successful query and response at the end of the router quickstart + Apollo Sandbox IDE showing successful query and response at the end of the router quickstart -That's it! You've successfully run a router in dev mode for an example supergraph. +That's it! You've successfully sent a query to a router running a development graph and received a response. ## Next steps From ec87ce5eb80fd55d4b34312fc06c22fcf180625b Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 28 Apr 2025 16:29:43 -0700 Subject: [PATCH 21/47] edit get started, add caching overview --- docs/source/routing/get-started.mdx | 19 +++++------ .../routing/performance/caching/index.mdx | 32 +++++++++++++++---- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx index 97c8187633..85b07b24bc 100644 --- a/docs/source/routing/get-started.mdx +++ b/docs/source/routing/get-started.mdx @@ -16,17 +16,17 @@ You will: - Run the router for your supergraph in development mode. - Make queries to the running router with the Apollo Sandbox IDE. -## Apollo Router is the graph runtime +## Concept: Apollo Router is the graph runtime -Apollo Router is called the graph runtime or execution engine of Apollo. That's because it receives requests to the graph and returns responses that fetch data from the different APIs that make up a graph. Specifically, It accepts incoming client requests, plans how to efficiently call the APIs that make up the graph, orchestrates the API calls to fetch the requested data, and bundles the data into a response. +Apollo Router is the graph runtime of Apollo. It receives client requests, intelligently orchestrates calls to the various APIs that make up a graph, then bundles the fetched data into a client response. -Because Apollo uses GraphQL and Apollo Federation to define a graph, each router is an endpoint to a GraphQL API. It's the gateway for all client requests to a graph. Like API gateways in general, a router offers a central place to implement cross-cutting concerns, such as authentication, authorization, caching, logging, monitoring, rate limiting, and demand control. +Because Apollo uses GraphQL and Apollo Federation to define a graph, each router is an endpoint of a GraphQL API. It's the gateway for all client requests to a federated graph, or "supergraph." Like API gateways in general, a router offers a central place to implement cross-cutting concerns, such as authentication, authorization, caching, logging, monitoring, rate limiting, and demand control. These and other features of the router are configurable declaratively via YAML. You can deploy the router locally or at scale in containers on your own infrastructure. This guide walks you through the basics of running the router locally. ## 1. Download and extract the router binary - +Let's start by downloading a router binary. 1. Download and install the latest version of the router binary with a single command line: @@ -54,15 +54,16 @@ You can deploy the router locally or at scale in containers on your own infrastr ./router --version ``` + ## 2. Download a supergraph schema -A router needs a schema for the graph that it's orchestrating. For this guide, we're downloading an example supergraph schema that we'll provide to the router. +A router needs a schema for the federated graph, or "supergraph", that it's orchestrating. For this guide, we're downloading an example supergraph schema, which we'll provide to the router when running it. 1. From your project's root directory, run the following to download and save a supergraph schema to a file: -```bash -curl -sSL https://supergraph.demo.starstuff.dev/ > supergraph-schema.graphql -``` + ```bash showLineNumbers=false + curl -sSL https://supergraph.demo.starstuff.dev/ > supergraph-schema.graphql + ``` @@ -236,7 +237,7 @@ Running the router in development mode enables some useful development-only feat -## Make a query +## 4. Make a query A router in dev mode runs its own [Apollo Sandbox](/graphos/explorer/sandbox/), a local GraphQL server running a development instance of your graph. Sandbox has a browser-based IDE, Explorer, that you can use to write and send real GraphQL queries to your development graph. diff --git a/docs/source/routing/performance/caching/index.mdx b/docs/source/routing/performance/caching/index.mdx index 8a004e82cf..092cc3b09e 100644 --- a/docs/source/routing/performance/caching/index.mdx +++ b/docs/source/routing/performance/caching/index.mdx @@ -1,16 +1,36 @@ --- -title: Caching -subtitle: Accelerate query retrieval with GraphOS caching. +title: Caching in GraphOS Router +subtitle: Accelerate query retrieval with in-memory and distributed caching --- -By default, GraphOS Router stores the following data in its in-memory cache to improve performance: +Apollo Router supports multiple caching strategies, including in-memory caching, distributed caching with Redis, and entity caching, that allow you to reduce redundant subgraph requests and improve query latency. + +## In-memory caching + +By default, the router stores in its in-memory cache to improve performance: - Generated query plans - Automatic persisted queries (APQ) - Introspection responses -You can configure certain caching behaviors for generated query plans and APQ (but not introspection responses). For details, see In-memory caching in the Apollo Router. +You can configure certain caching behaviors for generated query plans and APQ (but not introspection responses). For details, see in-memory caching in the Apollo Router. + +Learn more about [in-memory caching](/graphos/routing/performance/caching/in-memory). + +## Distributed caching + + + +You can configure a Redis-backed distributed cache that enables multiple router instances to share cached values. Those instances can share a Redis-backed cache for their query plans and automatic persisted queries (APQ). If any of your router instances caches a particular value, all of your instances can look up that value to significantly improve responsiveness. + +Learn more about [distributed caching](/graphos/routing/performance/caching/distributed). + +## Entity-based caching + + + +Entity caching speeds up graph data retrieval by storing only the necessary data for entities, rather than entire client responses. It's helpful in scenarios where the same data is requested frequently, such as product information systems and user profile services. -If you have a GraphOS Enterprise plan, you can configure a Redis-backed distributed cache that enables multiple router instances to share cached values. For details, see Distributed caching in GraphOS Router. +Using Redis, the router stores subgraph responses and ensures that requests for the same entity from different clients are served from the cache, rather than fetching the data repeatedly from subgraphs. It can cache data at a fine-grained level and provides separate configurations for caching duration (TTL) and other caching behaviors per subgraph. -You can configure a Redis-backed entity cache that enables a client query to retrieve cached entity data split between subgraph responses. For details, see subgraph entity caching in GraphOS Router. +[Learn more about entity-based caching](/graphos/routing/performance/caching/entity). From 23b34e654a002af09f325d1a2f93d0a37198fd67 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 28 Apr 2025 17:03:12 -0700 Subject: [PATCH 22/47] edit containerization overview --- .../routing/self-hosted/containerization/index.mdx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/source/routing/self-hosted/containerization/index.mdx b/docs/source/routing/self-hosted/containerization/index.mdx index e1199c9527..dc737eb5cc 100644 --- a/docs/source/routing/self-hosted/containerization/index.mdx +++ b/docs/source/routing/self-hosted/containerization/index.mdx @@ -1,5 +1,5 @@ --- -title: Containerizing the GraphOS Router +title: Containerizing an Apollo Router subtitle: Run router images in containers description: Containerize the Apollo GraphOS Router for portability and scalability. Choose from default or debug images. Deploy in Kubernetes or run in Docker. --- @@ -24,11 +24,15 @@ A router image has the following layout: ## Next steps -The default behavior of a router image is suitable for a basic deployment or development scenario. +While the default behavior of a router image is largely suitable for a basic deployment or development scenario, running a containerized router usually requires configuring the router's HTTP endpoint (and optional health check endpoint) to listen on a non-localhost address. -For examples of customizing and deploying router images in specific environments, see the guides for: -* [Deploying in Kubernetes](/router/containerization/kubernetes/). -* [Running in Docker](/router/containerization/docker/) +To learn from examples of customizing and deploying router images in specific environments, see the deployment guides for: + +* [Docker](/router/containerization/docker/) +* [AWS](/graphos/routing/containerization/aws) +* [Azure](/graphos/routing/containerization/azure) +* [GCP](/graphos/routing/containerization/gcp) +* [Kubernetes](/router/containerization/kubernetes/). See the Apollo Solutions [example Cloud Foundry deployment](https://github.com/apollosolutions/example-pcf-deployment) for a minimal router configuration and Cloud Foundry manifest file. From 86725bbc2d2c70d5fca9db820205ff7304afb788 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Tue, 29 Apr 2025 08:31:33 -0700 Subject: [PATCH 23/47] update YAML table, various edits --- .../shared/router-config-properties-table.mdx | 11107 ++-------------- docs/source/routing/about-router.mdx | 40 +- docs/source/routing/configuration/cli.mdx | 79 + docs/source/routing/configuration/yaml.mdx | 6 + docs/source/routing/get-started.mdx | 6 +- .../security/request-limits-overview.mdx | 32 + .../routing/security/request-limits.mdx | 10 +- 7 files changed, 1290 insertions(+), 9990 deletions(-) create mode 100644 docs/source/routing/security/request-limits-overview.mdx diff --git a/docs/shared/router-config-properties-table.mdx b/docs/shared/router-config-properties-table.mdx index 71eb92b2d2..784305e315 100644 --- a/docs/shared/router-config-properties-table.mdx +++ b/docs/shared/router-config-properties-table.mdx @@ -1,5 +1,3 @@ -# Router Configuration Properties - ### `apq` Automatic Persisted Queries (APQ) configuration @@ -38,9839 +36,1396 @@ apq: --- -### `apq.enabled` +### `authentication` -Activates Automatic Persisted Queries (enabled by default) +Authentication -- **Type:** `boolean` -- **Default:** `True` +- **Type:** `object` -```yaml title="apq.enabled" -enabled: true +```yaml title="authentication" +authentication: + connector: + sources: {} + router: + jwt: + header_name: authorization + header_value_prefix: Bearer + ignore_other_prefixes: false + jwks: + - algorithms: null + headers: + - name: example_name + value: example_value + issuer: example_issuer + poll_interval: + nanos: 0 + secs: 60 + url: http://service.example.com/url + on_error: Continue + sources: + - name: authorization + type: header + value_prefix: Bearer + subgraph: + all: + aws_sig_v4: + hardcoded: + access_key_id: example_access_key_id + assume_role: + external_id: example_external_id + role_arn: example_role_arn + session_name: example_session_name + region: example_region + secret_access_key: example_secret_access_key + service_name: example_service_name + subgraphs: {} ``` --- -### `apq.router` +### `authorization` -Router level (APQ) configuration +Authorization plugin - **Type:** `object` -```yaml title="apq.router" -router: - cache: - in_memory: - limit: 1 - redis: - namespace: example_namespace - password: example_password - pool_size: 1 - required_to_start: false - reset_ttl: true - timeout: null - tls: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - ttl: null - urls: - - http://example.com/urls_item - username: example_username +```yaml title="authorization" +authorization: + directives: + dry_run: false + enabled: true + errors: + log: true + response: errors + reject_unauthorized: false + require_authentication: false ``` --- -### `apq.router.cache` +### `batching` -Cache configuration +Configuration for Batching - **Type:** `object` -```yaml title="apq.router.cache" -cache: - in_memory: - limit: 1 - redis: - namespace: example_namespace - password: example_password - pool_size: 1 - required_to_start: false - reset_ttl: true - timeout: null - tls: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - ttl: null - urls: - - http://example.com/urls_item - username: example_username +```yaml title="batching" +batching: + enabled: false + maximum_size: null + mode: batch_http_link + subgraph: + all: + enabled: false + subgraphs: {} ``` --- -### `apq.router.cache.in_memory` - -In memory cache configuration +### `connectors` - **Type:** `object` -```yaml title="apq.router.cache.in_memory" -in_memory: - limit: 1 +```yaml title="connectors" +connectors: + debug_extensions: false + expose_sources_in_context: false + max_requests_per_operation_per_source: null + sources: {} + subgraphs: {} ``` --- -### `apq.router.cache.in_memory.limit` +### `coprocessor` -Number of entries in the Least Recently Used cache +Configures the externalization plugin -- **Type:** `integer` -- **Minimum:** `1.0` +- **Type:** `object` -```yaml title="apq.router.cache.in_memory.limit" -limit: 1 +```yaml title="coprocessor" +coprocessor: + client: + dns_resolution_strategy: ipv4_only + experimental_http2: enable + execution: + request: + body: false + context: false + headers: false + method: false + query_plan: false + sdl: false + response: + body: false + context: false + headers: false + sdl: false + status_code: false + router: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + path: false + sdl: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + sdl: false + status_code: false + subgraph: + all: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + service_name: false + subgraph_request_id: false + uri: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + service_name: false + status_code: false + subgraph_request_id: false + supergraph: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + sdl: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + sdl: false + status_code: false + timeout: + nanos: 0 + secs: 1 + url: http://service.example.com/url ``` --- -### `apq.router.cache.redis` +### `cors` -Redis cache configuration +Cross origin request configuration. - **Type:** `object` -```yaml title="apq.router.cache.redis" -redis: - namespace: example_namespace - password: example_password - pool_size: 1 - required_to_start: false - reset_ttl: true - timeout: null - tls: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - ttl: null - urls: - - http://example.com/urls_item - username: example_username +```yaml title="cors" +cors: + allow_any_origin: false + allow_credentials: false + allow_headers: [] + expose_headers: null + match_origins: null + max_age: null + methods: + - GET + - POST + - OPTIONS + origins: + - https://studio.apollographql.com ``` --- -### `apq.router.cache.redis.namespace` +### `csrf` + +CSRF protection configuration. -namespace used to prefix Redis keys +See https://owasp.org/www-community/attacks/csrf for an explanation on CSRF attacks. -- **Type:** `string` +- **Type:** `object` -```yaml title="apq.router.cache.redis.namespace" -namespace: example_namespace +```yaml title="csrf" +csrf: + required_headers: + - x-apollo-operation-name + - apollo-require-preflight + unsafe_disabled: false ``` --- -### `apq.router.cache.redis.password` +### `demand_control` -Redis password if not provided in the URLs. This field takes precedence over the password in the URL +Demand control configuration -- **Type:** `string` +- **Type:** `object` -```yaml title="apq.router.cache.redis.password" -password: example_password +```yaml title="demand_control" +demand_control: + enabled: false + mode: measure + strategy: + static_estimated: + list_size: 0 + max: 0.0 ``` --- -### `apq.router.cache.redis.pool_size` +### `experimental_chaos` -The size of the Redis connection pool +Configuration for chaos testing, trying to reproduce bugs that require uncommon conditions. You probably don’t want this in production! -- **Type:** `integer` -- **Default:** `1` -- **Minimum:** `0.0` +- **Type:** `object` -```yaml title="apq.router.cache.redis.pool_size" -pool_size: 1 +```yaml title="experimental_chaos" +experimental_chaos: + force_reload: null ``` --- -### `apq.router.cache.redis.required_to_start` +### `experimental_type_conditioned_fetching` -Prevents the router from starting if it cannot connect to Redis +Type conditioned fetching configuration. - **Type:** `boolean` - **Default:** `False` -```yaml title="apq.router.cache.redis.required_to_start" -required_to_start: false +```yaml title="experimental_type_conditioned_fetching" +experimental_type_conditioned_fetching: false ``` --- -### `apq.router.cache.redis.reset_ttl` - -When a TTL is set on a key, reset it when reading the data from that key +### `fleet_detector` -- **Type:** `boolean` -- **Default:** `True` +- **Type:** `object` -```yaml title="apq.router.cache.redis.reset_ttl" -reset_ttl: true +```yaml title="fleet_detector" +fleet_detector: {} ``` --- -### `apq.router.cache.redis.timeout` +### `forbid_mutations` -Redis request timeout (default: 2ms) +Forbid mutations configuration -- **Type:** `string` -- **Default:** `None` +- **Type:** `boolean` -```yaml title="apq.router.cache.redis.timeout" -timeout: null +```yaml title="forbid_mutations" +forbid_mutations: false ``` --- -### `apq.router.cache.redis.tls` +### `headers` -Configuration options pertaining to the subgraph server component. +Configuration for header propagation - **Type:** `object` -```yaml title="apq.router.cache.redis.tls" -tls: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key +```yaml title="headers" +headers: + all: + request: + - insert: + name: example_name + value: example_value + subgraphs: {} ``` --- -### `apq.router.cache.redis.ttl` - -TTL for entries - -- **Type:** `string` -- **Default:** `None` - -```yaml title="apq.router.cache.redis.ttl" -ttl: null -``` - - ---- +### `health_check` -### `apq.router.cache.redis.urls` +Configuration options pertaining to the health component. -List of URLs to the Redis cluster +- **Type:** `object` -- **Type:** `array` - -```yaml title="apq.router.cache.redis.urls" -urls: -- http://example.com/urls_item +```yaml title="health_check" +health_check: + enabled: true + listen: example_listen + path: /health + readiness: + allowed: 100 + interval: + sampling: 0s + unready: null ``` --- -### `apq.router.cache.redis.username` +### `homepage` -Redis username if not provided in the URLs. This field takes precedence over the username in the URL +Configuration options pertaining to the home page. -- **Type:** `string` +- **Type:** `object` -```yaml title="apq.router.cache.redis.username" -username: example_username +```yaml title="homepage" +homepage: + enabled: true + graph_ref: null ``` --- -### `apq.subgraph` +### `include_subgraph_errors` -Configuration options pertaining to the subgraph server component. +Configuration for exposing errors that originate from subgraphs - **Type:** `object` -```yaml title="apq.subgraph" -subgraph: - all: - enabled: false +```yaml title="include_subgraph_errors" +include_subgraph_errors: + all: false subgraphs: {} ``` --- -### `apq.subgraph.all` - -Subgraph level Automatic Persisted Queries (APQ) configuration +### `license_enforcement` - **Type:** `object` -```yaml title="apq.subgraph.all" -all: - enabled: false +```yaml title="license_enforcement" +license_enforcement: {} ``` --- -### `apq.subgraph.all.enabled` +### `limits` -Enable +Configuration for operation limits, parser limits, HTTP limits, etc. -- **Type:** `boolean` -- **Default:** `False` +- **Type:** `object` -```yaml title="apq.subgraph.all.enabled" -enabled: false +```yaml title="limits" +limits: + http1_max_request_buf_size: null + http1_max_request_headers: null + http_max_request_bytes: 2000000 + introspection_max_depth: true + max_aliases: null + max_depth: null + max_height: null + max_root_fields: null + parser_max_recursion: 500 + parser_max_tokens: 15000 + warn_only: false ``` --- -### `apq.subgraph.subgraphs` +### `override_subgraph_url` -per subgraph options +Subgraph URL mappings -- **Type:** `object` -- **Default:** `{}` +- **Type:** `any` -```yaml title="apq.subgraph.subgraphs" -subgraphs: {} +```yaml title="override_subgraph_url" +override_subgraph_url: {} ``` --- -### `authentication` +### `persisted_queries` -Authentication +Persisted Queries (PQ) configuration - **Type:** `object` -```yaml title="authentication" -authentication: - connector: - sources: {} - router: - jwt: - header_name: authorization - header_value_prefix: Bearer - ignore_other_prefixes: false - jwks: - - algorithms: null - headers: - - name: example_name - value: example_value - issuer: example_issuer - poll_interval: - nanos: 0 - secs: 60 - url: http://service.example.com/url - on_error: Continue - sources: - - name: authorization - type: header - value_prefix: Bearer - subgraph: - all: - aws_sig_v4: - hardcoded: - access_key_id: example_access_key_id - assume_role: - external_id: example_external_id - role_arn: example_role_arn - session_name: example_session_name - region: example_region - secret_access_key: example_secret_access_key - service_name: example_service_name - subgraphs: {} +```yaml title="persisted_queries" +persisted_queries: + enabled: false + experimental_prewarm_query_plan_cache: + on_reload: true + on_startup: false + hot_reload: false + local_manifests: null + log_unknown: false + safelist: + enabled: false + require_id: false ``` --- -### `authentication.connector` - -Configure connector authentication +### `plugins` -- **Type:** `object` +- **Type:** `any` -```yaml title="authentication.connector" -connector: - sources: {} +```yaml title="plugins" +plugins: unknown_type_plugins ``` --- -### `authentication.connector.sources` +### `preview_entity_cache` -Create a configuration that will apply only to a specific source. +Configuration for entity caching - **Type:** `object` -- **Default:** `{}` -```yaml title="authentication.connector.sources" -sources: {} +```yaml title="preview_entity_cache" +preview_entity_cache: + enabled: false + expose_keys_in_context: false + invalidation: + concurrent_requests: 10 + listen: example_listen + path: example_path + scan_count: 1000 + metrics: + enabled: false + separate_per_type: false + ttl: 30s + subgraph: + all: + enabled: true + invalidation: + enabled: false + shared_key: '' + private_id: null + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: null + urls: + - http://example.com/urls_item + username: example_username + ttl: 30s + subgraphs: {} ``` --- -### `authentication.router` +### `preview_file_uploads` + +Configuration for File Uploads plugin - **Type:** `object` -```yaml title="authentication.router" -router: - jwt: - header_name: authorization - header_value_prefix: Bearer - ignore_other_prefixes: false - jwks: - - algorithms: null - headers: - - name: example_name - value: example_value - issuer: example_issuer - poll_interval: - nanos: 0 - secs: 60 - url: http://service.example.com/url - on_error: Continue - sources: - - name: authorization - type: header - value_prefix: Bearer +```yaml title="preview_file_uploads" +preview_file_uploads: + enabled: false + protocols: + multipart: + enabled: true + limits: + max_file_size: example_max_file_size + max_files: 0 + mode: stream ``` --- -### `authentication.router.jwt` +### `progressive_override` + +Configuration for the progressive override plugin - **Type:** `object` -```yaml title="authentication.router.jwt" -jwt: - header_name: authorization - header_value_prefix: Bearer - ignore_other_prefixes: false - jwks: - - algorithms: null - headers: - - name: example_name - value: example_value - issuer: example_issuer - poll_interval: - nanos: 0 - secs: 60 - url: http://service.example.com/url - on_error: Continue - sources: - - name: authorization - type: header - value_prefix: Bearer +```yaml title="progressive_override" +progressive_override: {} ``` --- -### `authentication.router.jwt.header_name` +### `rhai` -HTTP header expected to contain JWT +Configuration for the Rhai Plugin -- **Type:** `string` -- **Default:** `'authorization'` +- **Type:** `object` -```yaml title="authentication.router.jwt.header_name" -header_name: authorization +```yaml title="rhai" +rhai: + main: example_main + scripts: example_scripts ``` --- -### `authentication.router.jwt.header_value_prefix` +### `sandbox` -Header value prefix +Configuration options pertaining to the sandbox page. -- **Type:** `string` -- **Default:** `'Bearer'` +- **Type:** `object` -```yaml title="authentication.router.jwt.header_value_prefix" -header_value_prefix: Bearer +```yaml title="sandbox" +sandbox: + enabled: false ``` --- -### `authentication.router.jwt.ignore_other_prefixes` +### `subscription` -Whether to ignore any mismatched prefixes +Subscriptions configuration -- **Type:** `boolean` -- **Default:** `False` +- **Type:** `object` -```yaml title="authentication.router.jwt.ignore_other_prefixes" -ignore_other_prefixes: false +```yaml title="subscription" +subscription: + enable_deduplication: true + enabled: true + max_opened_subscriptions: null + mode: + callback: + heartbeat_interval: disabled + listen: example_listen + path: example_path + public_url: http://service.example.com/public_url + subgraphs: [] + passthrough: + all: + heartbeat_interval: disabled + path: null + protocol: graphql_ws + subgraphs: {} + queue_capacity: null ``` --- -### `authentication.router.jwt.jwks` +### `supergraph` -List of JWKS used to verify tokens +Configuration options pertaining to the supergraph server component. -- **Type:** `array` +- **Type:** `object` -```yaml title="authentication.router.jwt.jwks" -jwks: -- algorithms: null - headers: - - name: example_name - value: example_value - issuer: example_issuer - poll_interval: - nanos: 0 - secs: 60 - url: http://service.example.com/url +```yaml title="supergraph" +supergraph: + defer_support: true + early_cancel: false + experimental_log_on_broken_pipe: false + generate_query_fragments: true + introspection: false + listen: example_listen + path: / + query_planning: + cache: + in_memory: + limit: 1 + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: + nanos: 0 + secs: 2592000 + urls: + - http://example.com/urls_item + username: example_username + experimental_paths_limit: null + experimental_plans_limit: null + experimental_reuse_query_plans: false + warmed_up_queries: null ``` --- -### `authentication.router.jwt.on_error` - -- **Type:** `string` -- **Enum:** `Continue`, `Error` +### `telemetry` -```yaml title="authentication.router.jwt.on_error" -on_error: Continue -``` +Telemetry configuration +- **Type:** `object` ---- - -### `authentication.router.jwt.sources` - -Alternative sources to extract the JWT - -- **Type:** `array` - -```yaml title="authentication.router.jwt.sources" -sources: -- name: authorization - type: header - value_prefix: Bearer -``` - - ---- - -### `authentication.subgraph` - -Configure subgraph authentication - -- **Type:** `object` - -```yaml title="authentication.subgraph" -subgraph: - all: - aws_sig_v4: - hardcoded: - access_key_id: example_access_key_id - assume_role: - external_id: example_external_id - role_arn: example_role_arn - session_name: example_session_name - region: example_region - secret_access_key: example_secret_access_key - service_name: example_service_name - subgraphs: {} -``` - - ---- - -### `authentication.subgraph.all` - -- **Type:** `any` - -```yaml title="authentication.subgraph.all" -all: - aws_sig_v4: - hardcoded: - access_key_id: example_access_key_id - assume_role: - external_id: example_external_id - role_arn: example_role_arn - session_name: example_session_name - region: example_region - secret_access_key: example_secret_access_key - service_name: example_service_name -``` - - ---- - -### `authentication.subgraph.subgraphs` - -Create a configuration that will apply only to a specific subgraph. - -- **Type:** `object` -- **Default:** `{}` - -```yaml title="authentication.subgraph.subgraphs" -subgraphs: {} -``` - - ---- - -### `authorization` - -Authorization plugin - -- **Type:** `object` - -```yaml title="authorization" -authorization: - directives: - dry_run: false - enabled: true +```yaml title="telemetry" +telemetry: + apollo: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + buffer_size: 10000 + client_name_header: apollographql-client-name + client_version_header: apollographql-client-version + endpoint: https://usage-reporting.api.apollographql.com/api/ingress/traces errors: - log: true - response: errors - reject_unauthorized: false - require_authentication: false -``` - - ---- - -### `authorization.directives` - -- **Type:** `object` - -```yaml title="authorization.directives" -directives: - dry_run: false - enabled: true - errors: - log: true - response: errors - reject_unauthorized: false -``` - - ---- - -### `authorization.directives.dry_run` - -generates the authorization error messages without modying the query - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="authorization.directives.dry_run" -dry_run: false -``` - - ---- - -### `authorization.directives.enabled` - -enables the `@authenticated` and `@requiresScopes` directives - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="authorization.directives.enabled" -enabled: true -``` - - ---- - -### `authorization.directives.errors` - -- **Type:** `object` - -```yaml title="authorization.directives.errors" -errors: - log: true - response: errors -``` - - ---- - -### `authorization.directives.errors.log` - -log authorization errors - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="authorization.directives.errors.log" -log: true -``` - - ---- - -### `authorization.directives.errors.response` - -- **Type:** `any` - -```yaml title="authorization.directives.errors.response" -response: errors -``` - - ---- - -### `authorization.directives.reject_unauthorized` - -refuse a query entirely if any part would be filtered - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="authorization.directives.reject_unauthorized" -reject_unauthorized: false -``` - - ---- - -### `authorization.require_authentication` - -Reject unauthenticated requests - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="authorization.require_authentication" -require_authentication: false -``` - - ---- - -### `batching` - -Configuration for Batching - -- **Type:** `object` - -```yaml title="batching" -batching: - enabled: false - maximum_size: null - mode: batch_http_link - subgraph: - all: - enabled: false - subgraphs: {} -``` - - ---- - -### `batching.enabled` - -Activates Batching (disabled by default) - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="batching.enabled" -enabled: false -``` - - ---- - -### `batching.maximum_size` - -Maximum size for a batch - -- **Type:** `integer` -- **Default:** `None` -- **Minimum:** `0.0` - -```yaml title="batching.maximum_size" -maximum_size: null -``` - - ---- - -### `batching.mode` - -- **Type:** `any` - -```yaml title="batching.mode" -mode: batch_http_link -``` - - ---- - -### `batching.subgraph` - -Configuration options pertaining to the subgraph server component. - -- **Type:** `object` - -```yaml title="batching.subgraph" -subgraph: - all: - enabled: false - subgraphs: {} -``` - - ---- - -### `batching.subgraph.all` - -Common options for configuring subgraph batching - -- **Type:** `object` - -```yaml title="batching.subgraph.all" -all: - enabled: false -``` - - ---- - -### `batching.subgraph.all.enabled` - -Whether this batching config should be enabled - -- **Type:** `boolean` - -```yaml title="batching.subgraph.all.enabled" -enabled: false -``` - - ---- - -### `batching.subgraph.subgraphs` - -per subgraph options - -- **Type:** `object` -- **Default:** `{}` - -```yaml title="batching.subgraph.subgraphs" -subgraphs: {} -``` - - ---- - -### `connectors` - -- **Type:** `object` - -```yaml title="connectors" -connectors: - debug_extensions: false - expose_sources_in_context: false - max_requests_per_operation_per_source: null - sources: {} - subgraphs: {} -``` - - ---- - -### `connectors.debug_extensions` - -Enables connector debugging information on response extensions if the feature is enabled - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="connectors.debug_extensions" -debug_extensions: false -``` - - ---- - -### `connectors.expose_sources_in_context` - -When enabled, adds an entry to the context for use in coprocessors ```json { "context": { "entries": { "apollo_connectors::sources_in_query_plan": [ { "subgraph_name": "subgraph", "source_name": "source" } ] } } } ``` - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="connectors.expose_sources_in_context" -expose_sources_in_context: false -``` - - ---- - -### `connectors.max_requests_per_operation_per_source` - -The maximum number of requests for a connector source - -- **Type:** `integer` -- **Default:** `None` -- **Minimum:** `0.0` - -```yaml title="connectors.max_requests_per_operation_per_source" -max_requests_per_operation_per_source: null -``` - - ---- - -### `connectors.sources` - -Map of subgraph_name.connector_source_name to source configuration - -- **Type:** `object` -- **Default:** `{}` - -```yaml title="connectors.sources" -sources: {} -``` - - ---- - -### `connectors.subgraphs` - -A map of subgraph name to connectors config for that subgraph - -- **Type:** `object` -- **Default:** `{}` - -```yaml title="connectors.subgraphs" -subgraphs: {} -``` - - ---- - -### `coprocessor` - -Configures the externalization plugin - -- **Type:** `object` - -```yaml title="coprocessor" -coprocessor: - client: - dns_resolution_strategy: ipv4_only - experimental_http2: enable - execution: - request: - body: false - context: false - headers: false - method: false - query_plan: false - sdl: false - response: - body: false - context: false - headers: false - sdl: false - status_code: false - router: - request: - body: false - condition: - eq: - - false - - false - context: false - headers: false - method: false - path: false - sdl: false - response: - body: false - condition: - eq: - - false - - false - context: false - headers: false - sdl: false - status_code: false - subgraph: - all: - request: - body: false - condition: - eq: - - false - - false - context: false - headers: false - method: false - service_name: false - subgraph_request_id: false - uri: false - response: - body: false - condition: - eq: - - false - - false - context: false - headers: false - service_name: false - status_code: false - subgraph_request_id: false - supergraph: - request: - body: false - condition: - eq: - - false - - false - context: false - headers: false - method: false - sdl: false - response: - body: false - condition: - eq: - - false - - false - context: false - headers: false - sdl: false - status_code: false - timeout: - nanos: 0 - secs: 1 - url: http://service.example.com/url -``` - - ---- - -### `coprocessor.client` - -- **Type:** `object` - -```yaml title="coprocessor.client" -client: - dns_resolution_strategy: ipv4_only - experimental_http2: enable -``` - - ---- - -### `coprocessor.client.dns_resolution_strategy` - -- **Type:** `any` - -```yaml title="coprocessor.client.dns_resolution_strategy" -dns_resolution_strategy: ipv4_only -``` - - ---- - -### `coprocessor.client.experimental_http2` - -- **Type:** `any` - -```yaml title="coprocessor.client.experimental_http2" -experimental_http2: enable -``` - - ---- - -### `coprocessor.execution` - -- **Type:** `object` - -```yaml title="coprocessor.execution" -execution: - request: - body: false - context: false - headers: false - method: false - query_plan: false - sdl: false - response: - body: false - context: false - headers: false - sdl: false - status_code: false -``` - - ---- - -### `coprocessor.execution.request` - -What information is passed to a router request/response stage - -- **Type:** `object` - -```yaml title="coprocessor.execution.request" -request: - body: false - context: false - headers: false - method: false - query_plan: false - sdl: false -``` - - ---- - -### `coprocessor.execution.request.body` - -Send the body - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.execution.request.body" -body: false -``` - - ---- - -### `coprocessor.execution.request.context` - -Configures the context - -- **Type:** `any` - -```yaml title="coprocessor.execution.request.context" -context: false -``` - - ---- - -### `coprocessor.execution.request.headers` - -Send the headers - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.execution.request.headers" -headers: false -``` - - ---- - -### `coprocessor.execution.request.method` - -Send the method - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.execution.request.method" -method: false -``` - - ---- - -### `coprocessor.execution.request.query_plan` - -Send the query plan - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.execution.request.query_plan" -query_plan: false -``` - - ---- - -### `coprocessor.execution.request.sdl` - -Send the SDL - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.execution.request.sdl" -sdl: false -``` - - ---- - -### `coprocessor.execution.response` - -What information is passed to a router request/response stage - -- **Type:** `object` - -```yaml title="coprocessor.execution.response" -response: - body: false - context: false - headers: false - sdl: false - status_code: false -``` - - ---- - -### `coprocessor.execution.response.body` - -Send the body - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.execution.response.body" -body: false -``` - - ---- - -### `coprocessor.execution.response.context` - -Configures the context - -- **Type:** `any` - -```yaml title="coprocessor.execution.response.context" -context: false -``` - - ---- - -### `coprocessor.execution.response.headers` - -Send the headers - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.execution.response.headers" -headers: false -``` - - ---- - -### `coprocessor.execution.response.sdl` - -Send the SDL - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.execution.response.sdl" -sdl: false -``` - - ---- - -### `coprocessor.execution.response.status_code` - -Send the HTTP status - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.execution.response.status_code" -status_code: false -``` - - ---- - -### `coprocessor.router` - -- **Type:** `object` - -```yaml title="coprocessor.router" -router: - request: - body: false - condition: - eq: - - false - - false - context: false - headers: false - method: false - path: false - sdl: false - response: - body: false - condition: - eq: - - false - - false - context: false - headers: false - sdl: false - status_code: false -``` - - ---- - -### `coprocessor.router.request` - -What information is passed to a router request/response stage - -- **Type:** `object` - -```yaml title="coprocessor.router.request" -request: - body: false - condition: - eq: - - false - - false - context: false - headers: false - method: false - path: false - sdl: false -``` - - ---- - -### `coprocessor.router.request.body` - -Send the body - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.router.request.body" -body: false -``` - - ---- - -### `coprocessor.router.request.condition` - -- **Type:** `any` - -```yaml title="coprocessor.router.request.condition" -condition: - eq: - - false - - false -``` - - ---- - -### `coprocessor.router.request.context` - -Configures the context - -- **Type:** `any` - -```yaml title="coprocessor.router.request.context" -context: false -``` - - ---- - -### `coprocessor.router.request.headers` - -Send the headers - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.router.request.headers" -headers: false -``` - - ---- - -### `coprocessor.router.request.method` - -Send the method - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.router.request.method" -method: false -``` - - ---- - -### `coprocessor.router.request.path` - -Send the path - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.router.request.path" -path: false -``` - - ---- - -### `coprocessor.router.request.sdl` - -Send the SDL - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.router.request.sdl" -sdl: false -``` - - ---- - -### `coprocessor.router.response` - -What information is passed to a router request/response stage - -- **Type:** `object` - -```yaml title="coprocessor.router.response" -response: - body: false - condition: - eq: - - false - - false - context: false - headers: false - sdl: false - status_code: false -``` - - ---- - -### `coprocessor.router.response.body` - -Send the body - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.router.response.body" -body: false -``` - - ---- - -### `coprocessor.router.response.condition` - -- **Type:** `any` - -```yaml title="coprocessor.router.response.condition" -condition: - eq: - - false - - false -``` - - ---- - -### `coprocessor.router.response.context` - -Configures the context - -- **Type:** `any` - -```yaml title="coprocessor.router.response.context" -context: false -``` - - ---- - -### `coprocessor.router.response.headers` - -Send the headers - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.router.response.headers" -headers: false -``` - - ---- - -### `coprocessor.router.response.sdl` - -Send the SDL - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.router.response.sdl" -sdl: false -``` - - ---- - -### `coprocessor.router.response.status_code` - -Send the HTTP status - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.router.response.status_code" -status_code: false -``` - - ---- - -### `coprocessor.subgraph` - -What information is passed to a subgraph request/response stage - -- **Type:** `object` - -```yaml title="coprocessor.subgraph" -subgraph: - all: - request: - body: false - condition: - eq: - - false - - false - context: false - headers: false - method: false - service_name: false - subgraph_request_id: false - uri: false - response: - body: false - condition: - eq: - - false - - false - context: false - headers: false - service_name: false - status_code: false - subgraph_request_id: false -``` - - ---- - -### `coprocessor.subgraph.all` - -What information is passed to a subgraph request/response stage - -- **Type:** `object` - -```yaml title="coprocessor.subgraph.all" -all: - request: - body: false - condition: - eq: - - false - - false - context: false - headers: false - method: false - service_name: false - subgraph_request_id: false - uri: false - response: - body: false - condition: - eq: - - false - - false - context: false - headers: false - service_name: false - status_code: false - subgraph_request_id: false -``` - - ---- - -### `coprocessor.subgraph.all.request` - -What information is passed to a subgraph request/response stage - -- **Type:** `object` - -```yaml title="coprocessor.subgraph.all.request" -request: - body: false - condition: - eq: - - false - - false - context: false - headers: false - method: false - service_name: false - subgraph_request_id: false - uri: false -``` - - ---- - -### `coprocessor.subgraph.all.request.body` - -Send the body - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.subgraph.all.request.body" -body: false -``` - - ---- - -### `coprocessor.subgraph.all.request.condition` - -- **Type:** `any` - -```yaml title="coprocessor.subgraph.all.request.condition" -condition: - eq: - - false - - false -``` - - ---- - -### `coprocessor.subgraph.all.request.context` - -Configures the context - -- **Type:** `any` - -```yaml title="coprocessor.subgraph.all.request.context" -context: false -``` - - ---- - -### `coprocessor.subgraph.all.request.headers` - -Send the headers - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.subgraph.all.request.headers" -headers: false -``` - - ---- - -### `coprocessor.subgraph.all.request.method` - -Send the method URI - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.subgraph.all.request.method" -method: false -``` - - ---- - -### `coprocessor.subgraph.all.request.service_name` - -Send the service name - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.subgraph.all.request.service_name" -service_name: false -``` - - ---- - -### `coprocessor.subgraph.all.request.subgraph_request_id` - -Send the subgraph request id - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.subgraph.all.request.subgraph_request_id" -subgraph_request_id: false -``` - - ---- - -### `coprocessor.subgraph.all.request.uri` - -Send the subgraph URI - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.subgraph.all.request.uri" -uri: false -``` - - ---- - -### `coprocessor.subgraph.all.response` - -What information is passed to a subgraph request/response stage - -- **Type:** `object` - -```yaml title="coprocessor.subgraph.all.response" -response: - body: false - condition: - eq: - - false - - false - context: false - headers: false - service_name: false - status_code: false - subgraph_request_id: false -``` - - ---- - -### `coprocessor.subgraph.all.response.body` - -Send the body - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.subgraph.all.response.body" -body: false -``` - - ---- - -### `coprocessor.subgraph.all.response.condition` - -- **Type:** `any` - -```yaml title="coprocessor.subgraph.all.response.condition" -condition: - eq: - - false - - false -``` - - ---- - -### `coprocessor.subgraph.all.response.context` - -Configures the context - -- **Type:** `any` - -```yaml title="coprocessor.subgraph.all.response.context" -context: false -``` - - ---- - -### `coprocessor.subgraph.all.response.headers` - -Send the headers - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.subgraph.all.response.headers" -headers: false -``` - - ---- - -### `coprocessor.subgraph.all.response.service_name` - -Send the service name - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.subgraph.all.response.service_name" -service_name: false -``` - - ---- - -### `coprocessor.subgraph.all.response.status_code` - -Send the http status - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.subgraph.all.response.status_code" -status_code: false -``` - - ---- - -### `coprocessor.subgraph.all.response.subgraph_request_id` - -Send the subgraph request id - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.subgraph.all.response.subgraph_request_id" -subgraph_request_id: false -``` - - ---- - -### `coprocessor.supergraph` - -- **Type:** `object` - -```yaml title="coprocessor.supergraph" -supergraph: - request: - body: false - condition: - eq: - - false - - false - context: false - headers: false - method: false - sdl: false - response: - body: false - condition: - eq: - - false - - false - context: false - headers: false - sdl: false - status_code: false -``` - - ---- - -### `coprocessor.supergraph.request` - -What information is passed to a router request/response stage - -- **Type:** `object` - -```yaml title="coprocessor.supergraph.request" -request: - body: false - condition: - eq: - - false - - false - context: false - headers: false - method: false - sdl: false -``` - - ---- - -### `coprocessor.supergraph.request.body` - -Send the body - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.supergraph.request.body" -body: false -``` - - ---- - -### `coprocessor.supergraph.request.condition` - -- **Type:** `any` - -```yaml title="coprocessor.supergraph.request.condition" -condition: - eq: - - false - - false -``` - - ---- - -### `coprocessor.supergraph.request.context` - -Configures the context - -- **Type:** `any` - -```yaml title="coprocessor.supergraph.request.context" -context: false -``` - - ---- - -### `coprocessor.supergraph.request.headers` - -Send the headers - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.supergraph.request.headers" -headers: false -``` - - ---- - -### `coprocessor.supergraph.request.method` - -Send the method - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.supergraph.request.method" -method: false -``` - - ---- - -### `coprocessor.supergraph.request.sdl` - -Send the SDL - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.supergraph.request.sdl" -sdl: false -``` - - ---- - -### `coprocessor.supergraph.response` - -What information is passed to a router request/response stage - -- **Type:** `object` - -```yaml title="coprocessor.supergraph.response" -response: - body: false - condition: - eq: - - false - - false - context: false - headers: false - sdl: false - status_code: false -``` - - ---- - -### `coprocessor.supergraph.response.body` - -Send the body - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.supergraph.response.body" -body: false -``` - - ---- - -### `coprocessor.supergraph.response.condition` - -- **Type:** `any` - -```yaml title="coprocessor.supergraph.response.condition" -condition: - eq: - - false - - false -``` - - ---- - -### `coprocessor.supergraph.response.context` - -Configures the context - -- **Type:** `any` - -```yaml title="coprocessor.supergraph.response.context" -context: false -``` - - ---- - -### `coprocessor.supergraph.response.headers` - -Send the headers - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.supergraph.response.headers" -headers: false -``` - - ---- - -### `coprocessor.supergraph.response.sdl` - -Send the SDL - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.supergraph.response.sdl" -sdl: false -``` - - ---- - -### `coprocessor.supergraph.response.status_code` - -Send the HTTP status - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="coprocessor.supergraph.response.status_code" -status_code: false -``` - - ---- - -### `coprocessor.timeout` - -The timeout for external requests - -- **Type:** `string` -- **Default:** `{"secs": 1, "nanos": 0}` - -```yaml title="coprocessor.timeout" -timeout: - nanos: 0 - secs: 1 -``` - - ---- - -### `coprocessor.url` - -The url you'd like to offload processing to - -- **Type:** `string` - -```yaml title="coprocessor.url" -url: http://service.example.com/url -``` - - ---- - -### `cors` - -Cross origin request configuration. - -- **Type:** `object` - -```yaml title="cors" -cors: - allow_any_origin: false - allow_credentials: false - allow_headers: [] - expose_headers: null - match_origins: null - max_age: null - methods: - - GET - - POST - - OPTIONS - origins: - - https://studio.apollographql.com -``` - - ---- - -### `cors.allow_any_origin` - -Set to true to allow any origin. - -Defaults to false Having this set to true is the only way to allow Origin: null. - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="cors.allow_any_origin" -allow_any_origin: false -``` - - ---- - -### `cors.allow_credentials` - -Set to true to add the `Access-Control-Allow-Credentials` header. - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="cors.allow_credentials" -allow_credentials: false -``` - - ---- - -### `cors.allow_headers` - -The headers to allow. - -If this value is not set, the router will mirror client's `Access-Control-Request-Headers`. - -Note that if you set headers here, you also want to have a look at your `CSRF` plugins configuration, and make sure you either: - accept `x-apollo-operation-name` AND / OR `apollo-require-preflight` - defined `csrf` required headers in your yml configuration, as shown in the `examples/cors-and-csrf/custom-headers.router.yaml` files. - -- **Type:** `array` -- **Default:** `[]` - -```yaml title="cors.allow_headers" -allow_headers: [] -``` - - ---- - -### `cors.expose_headers` - -Which response headers should be made available to scripts running in the browser, in response to a cross-origin request. - -- **Type:** `array` -- **Default:** `None` - -```yaml title="cors.expose_headers" -expose_headers: null -``` - - ---- - -### `cors.match_origins` - -`Regex`es you want to match the origins against to determine if they're allowed. Defaults to an empty list. Note that `origins` will be evaluated before `match_origins` - -- **Type:** `array` -- **Default:** `None` - -```yaml title="cors.match_origins" -match_origins: null -``` - - ---- - -### `cors.max_age` - -The `Access-Control-Max-Age` header value in time units - -- **Type:** `string` -- **Default:** `None` - -```yaml title="cors.max_age" -max_age: null -``` - - ---- - -### `cors.methods` - -Allowed request methods. Defaults to GET, POST, OPTIONS. - -- **Type:** `array` -- **Default:** `["GET", "POST", "OPTIONS"]` - -```yaml title="cors.methods" -methods: -- GET -- POST -- OPTIONS -``` - - ---- - -### `cors.origins` - -The origin(s) to allow requests from. Defaults to `https://studio.apollographql.com/` for Apollo Studio. - -- **Type:** `array` -- **Default:** `["https://studio.apollographql.com"]` - -```yaml title="cors.origins" -origins: -- https://studio.apollographql.com -``` - - ---- - -### `csrf` - -CSRF protection configuration. - -See https://owasp.org/www-community/attacks/csrf for an explanation on CSRF attacks. - -- **Type:** `object` - -```yaml title="csrf" -csrf: - required_headers: - - x-apollo-operation-name - - apollo-require-preflight - unsafe_disabled: false -``` - - ---- - -### `csrf.required_headers` - -Override the headers to check for by setting custom_headers Note that if you set required_headers here, you may also want to have a look at your `CORS` configuration, and make sure you either: - did not set any `allow_headers` list (so it defaults to `mirror_request`) - added your required headers to the allow_headers list, as shown in the `examples/cors-and-csrf/custom-headers.router.yaml` files. - -- **Type:** `array` -- **Default:** `["x-apollo-operation-name", "apollo-require-preflight"]` - -```yaml title="csrf.required_headers" -required_headers: -- x-apollo-operation-name -- apollo-require-preflight -``` - - ---- - -### `csrf.unsafe_disabled` - -The CSRF plugin is enabled by default. - -Setting `unsafe_disabled: true` *disables* CSRF protection. - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="csrf.unsafe_disabled" -unsafe_disabled: false -``` - - ---- - -### `demand_control` - -Demand control configuration - -- **Type:** `object` - -```yaml title="demand_control" -demand_control: - enabled: false - mode: measure - strategy: - static_estimated: - list_size: 0 - max: 0.0 -``` - - ---- - -### `demand_control.enabled` - -Enable demand control - -- **Type:** `boolean` - -```yaml title="demand_control.enabled" -enabled: false -``` - - ---- - -### `demand_control.mode` - -- **Type:** `string` -- **Enum:** `measure`, `enforce` - -```yaml title="demand_control.mode" -mode: measure -``` - - ---- - -### `demand_control.strategy` - -Algorithm for calculating the cost of an incoming query. - -- **Type:** `any` - -```yaml title="demand_control.strategy" -strategy: - static_estimated: - list_size: 0 - max: 0.0 -``` - - ---- - -### `experimental_chaos` - -Configuration for chaos testing, trying to reproduce bugs that require uncommon conditions. You probably don’t want this in production! - -- **Type:** `object` - -```yaml title="experimental_chaos" -experimental_chaos: - force_reload: null -``` - - ---- - -### `experimental_chaos.force_reload` - -Force a hot reload of the Router (as if the schema or configuration had changed) at a regular time interval. - -- **Type:** `string` -- **Default:** `None` - -```yaml title="experimental_chaos.force_reload" -force_reload: null -``` - - ---- - -### `experimental_type_conditioned_fetching` - -Type conditioned fetching configuration. - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="experimental_type_conditioned_fetching" -experimental_type_conditioned_fetching: false -``` - - ---- - -### `fleet_detector` - -- **Type:** `object` - -```yaml title="fleet_detector" -fleet_detector: {} -``` - - ---- - -### `forbid_mutations` - -Forbid mutations configuration - -- **Type:** `boolean` - -```yaml title="forbid_mutations" -forbid_mutations: false -``` - - ---- - -### `headers` - -Configuration for header propagation - -- **Type:** `object` - -```yaml title="headers" -headers: - all: - request: - - insert: - name: example_name - value: example_value - subgraphs: {} -``` - - ---- - -### `headers.all` - -- **Type:** `object` - -```yaml title="headers.all" -all: - request: - - insert: - name: example_name - value: example_value -``` - - ---- - -### `headers.all.request` - -Propagate/Insert/Remove headers from request - -- **Type:** `array` - -```yaml title="headers.all.request" -request: -- insert: - name: example_name - value: example_value -``` - - ---- - -### `headers.subgraphs` - -Rules to specific subgraphs - -- **Type:** `object` - -```yaml title="headers.subgraphs" -subgraphs: {} -``` - - ---- - -### `health_check` - -Configuration options pertaining to the health component. - -- **Type:** `object` - -```yaml title="health_check" -health_check: - enabled: true - listen: example_listen - path: /health - readiness: - allowed: 100 - interval: - sampling: 0s - unready: null -``` - - ---- - -### `health_check.enabled` - -Set to false to disable the health check - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="health_check.enabled" -enabled: true -``` - - ---- - -### `health_check.listen` - -Listening address. - -- **Type:** `any` - -```yaml title="health_check.listen" -listen: example_listen -``` - - ---- - -### `health_check.path` - -Optionally set a custom healthcheck path Defaults to /health - -- **Type:** `string` -- **Default:** `'/health'` - -```yaml title="health_check.path" -path: /health -``` - - ---- - -### `health_check.readiness` - -Configuration options pertaining to the readiness health sub-component. - -- **Type:** `object` - -```yaml title="health_check.readiness" -readiness: - allowed: 100 - interval: - sampling: 0s - unready: null -``` - - ---- - -### `health_check.readiness.allowed` - -How many rejections are allowed in an interval (default: 100) If this number is exceeded, the router will start to report unready. - -- **Type:** `integer` -- **Default:** `100` -- **Minimum:** `0.0` - -```yaml title="health_check.readiness.allowed" -allowed: 100 -``` - - ---- - -### `health_check.readiness.interval` - -Configuration options pertaining to the readiness health interval sub-component. - -- **Type:** `object` - -```yaml title="health_check.readiness.interval" -interval: - sampling: 0s - unready: null -``` - - ---- - -### `health_check.readiness.interval.sampling` - -The sampling interval (default: 5s) - -- **Type:** `string` -- **Default:** `'0s'` - -```yaml title="health_check.readiness.interval.sampling" -sampling: 0s -``` - - ---- - -### `health_check.readiness.interval.unready` - -The unready interval (default: 2 * sampling interval) - -- **Type:** `string` -- **Default:** `None` - -```yaml title="health_check.readiness.interval.unready" -unready: null -``` - - ---- - -### `homepage` - -Configuration options pertaining to the home page. - -- **Type:** `object` - -```yaml title="homepage" -homepage: - enabled: true - graph_ref: null -``` - - ---- - -### `homepage.enabled` - -Set to false to disable the homepage - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="homepage.enabled" -enabled: true -``` - - ---- - -### `homepage.graph_ref` - -Graph reference This will allow you to redirect from the Apollo Router landing page back to Apollo Studio Explorer - -- **Type:** `string` -- **Default:** `None` - -```yaml title="homepage.graph_ref" -graph_ref: null -``` - - ---- - -### `include_subgraph_errors` - -Configuration for exposing errors that originate from subgraphs - -- **Type:** `object` - -```yaml title="include_subgraph_errors" -include_subgraph_errors: - all: false - subgraphs: {} -``` - - ---- - -### `include_subgraph_errors.all` - -Include errors from all subgraphs - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="include_subgraph_errors.all" -all: false -``` - - ---- - -### `include_subgraph_errors.subgraphs` - -Include errors from specific subgraphs - -- **Type:** `object` -- **Default:** `{}` - -```yaml title="include_subgraph_errors.subgraphs" -subgraphs: {} -``` - - ---- - -### `license_enforcement` - -- **Type:** `object` - -```yaml title="license_enforcement" -license_enforcement: {} -``` - - ---- - -### `limits` - -Configuration for operation limits, parser limits, HTTP limits, etc. - -- **Type:** `object` - -```yaml title="limits" -limits: - http1_max_request_buf_size: null - http1_max_request_headers: null - http_max_request_bytes: 2000000 - introspection_max_depth: true - max_aliases: null - max_depth: null - max_height: null - max_root_fields: null - parser_max_recursion: 500 - parser_max_tokens: 15000 - warn_only: false -``` - - ---- - -### `limits.http1_max_request_buf_size` - -Limit the maximum buffer size for the HTTP1 connection. - -Default is ~400kib. - -- **Type:** `string` -- **Default:** `None` - -```yaml title="limits.http1_max_request_buf_size" -http1_max_request_buf_size: null -``` - - ---- - -### `limits.http1_max_request_headers` - -Limit the maximum number of headers of incoming HTTP1 requests. Default is 100. - -If router receives more headers than the buffer size, it responds to the client with "431 Request Header Fields Too Large". - -- **Type:** `integer` -- **Default:** `None` -- **Minimum:** `0.0` - -```yaml title="limits.http1_max_request_headers" -http1_max_request_headers: null -``` - - ---- - -### `limits.http_max_request_bytes` - -Limit the size of incoming HTTP requests read from the network, to protect against running out of memory. Default: 2000000 (2 MB) - -- **Type:** `integer` -- **Default:** `2000000` -- **Minimum:** `0.0` - -```yaml title="limits.http_max_request_bytes" -http_max_request_bytes: 2000000 -``` - - ---- - -### `limits.introspection_max_depth` - -Limit the depth of nested list fields in introspection queries to protect avoid generating huge responses. Returns a GraphQL error with `{ message: "Maximum introspection depth exceeded" }` when nested fields exceed the limit. Default: true - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="limits.introspection_max_depth" -introspection_max_depth: true -``` - - ---- - -### `limits.max_aliases` - -If set, requests with operations with more aliases than this maximum are rejected with a HTTP 400 Bad Request response and GraphQL error with `"extensions": {"code": "MAX_ALIASES_LIMIT"}` - -- **Type:** `integer` -- **Default:** `None` -- **Minimum:** `0.0` - -```yaml title="limits.max_aliases" -max_aliases: null -``` - - ---- - -### `limits.max_depth` - -If set, requests with operations deeper than this maximum are rejected with a HTTP 400 Bad Request response and GraphQL error with `"extensions": {"code": "MAX_DEPTH_LIMIT"}` - -Counts depth of an operation, looking at its selection sets,˛ including fields in fragments and inline fragments. The following example has a depth of 3. - -```graphql -query getProduct { - book { - # 1 ...bookDetails - } -} - -fragment bookDetails on Book { - details { - # 2 ... on ProductDetailsBook - { country # 3 } } } -``` - -- **Type:** `integer` -- **Default:** `None` -- **Minimum:** `0.0` - -```yaml title="limits.max_depth" -max_depth: null -``` - - ---- - -### `limits.max_height` - -If set, requests with operations higher than this maximum are rejected with a HTTP 400 Bad Request response and GraphQL error with `"extensions": {"code": "MAX_DEPTH_LIMIT"}` - -Height is based on simple merging of fields using the same name or alias, but only within the same selection set. For example `name` here is only counted once and the query has height 3, not 4: - -```graphql -query { name { first } name { last } } -``` - -This may change in a future version of Apollo Router to do [full field merging across fragments](https://spec.graphql.org/October2021/#sec-Field-Selection-Merging) instead. - -- **Type:** `integer` -- **Default:** `None` -- **Minimum:** `0.0` - -```yaml title="limits.max_height" -max_height: null -``` - - ---- - -### `limits.max_root_fields` - -If set, requests with operations with more root fields than this maximum are rejected with a HTTP 400 Bad Request response and GraphQL error with `"extensions": {"code": "MAX_ROOT_FIELDS_LIMIT"}` - -This limit counts only the top level fields in a selection set, including fragments and inline fragments. - -- **Type:** `integer` -- **Default:** `None` -- **Minimum:** `0.0` - -```yaml title="limits.max_root_fields" -max_root_fields: null -``` - - ---- - -### `limits.parser_max_recursion` - -Limit recursion in the GraphQL parser to protect against stack overflow. default: 500 - -- **Type:** `integer` -- **Default:** `500` -- **Minimum:** `0.0` - -```yaml title="limits.parser_max_recursion" -parser_max_recursion: 500 -``` - - ---- - -### `limits.parser_max_tokens` - -Limit the number of tokens the GraphQL parser processes before aborting. - -- **Type:** `integer` -- **Default:** `15000` -- **Minimum:** `0.0` - -```yaml title="limits.parser_max_tokens" -parser_max_tokens: 15000 -``` - - ---- - -### `limits.warn_only` - -If set to true (which is the default is dev mode), requests that exceed a `max_*` limit are *not* rejected. Instead they are executed normally, and a warning is logged. - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="limits.warn_only" -warn_only: false -``` - - ---- - -### `override_subgraph_url` - -Subgraph URL mappings - -- **Type:** `any` - -```yaml title="override_subgraph_url" -override_subgraph_url: {} -``` - - ---- - -### `persisted_queries` - -Persisted Queries (PQ) configuration - -- **Type:** `object` - -```yaml title="persisted_queries" -persisted_queries: - enabled: false - experimental_prewarm_query_plan_cache: - on_reload: true - on_startup: false - hot_reload: false - local_manifests: null - log_unknown: false - safelist: - enabled: false - require_id: false -``` - - ---- - -### `persisted_queries.enabled` - -Activates Persisted Queries (disabled by default) - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="persisted_queries.enabled" -enabled: false -``` - - ---- - -### `persisted_queries.experimental_prewarm_query_plan_cache` - -Persisted Queries (PQ) query plan cache prewarm configuration - -- **Type:** `object` - -```yaml title="persisted_queries.experimental_prewarm_query_plan_cache" -experimental_prewarm_query_plan_cache: - on_reload: true - on_startup: false -``` - - ---- - -### `persisted_queries.experimental_prewarm_query_plan_cache.on_reload` - -Enabling this field uses the persisted query list to pre-warm the query planner cache on schema and config changes (enabled by default) - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="persisted_queries.experimental_prewarm_query_plan_cache.on_reload" -on_reload: true -``` - - ---- - -### `persisted_queries.experimental_prewarm_query_plan_cache.on_startup` - -Enabling this field uses the persisted query list to pre-warm the query planner cache on startup (disabled by default) - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="persisted_queries.experimental_prewarm_query_plan_cache.on_startup" -on_startup: false -``` - - ---- - -### `persisted_queries.hot_reload` - -Enables hot reloading of the local persisted query manifests - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="persisted_queries.hot_reload" -hot_reload: false -``` - - ---- - -### `persisted_queries.local_manifests` - -Enables using a local copy of the persisted query manifest to safelist operations - -- **Type:** `array` -- **Default:** `None` - -```yaml title="persisted_queries.local_manifests" -local_manifests: null -``` - - ---- - -### `persisted_queries.log_unknown` - -Enabling this field configures the router to log any freeform GraphQL request that is not in the persisted query list - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="persisted_queries.log_unknown" -log_unknown: false -``` - - ---- - -### `persisted_queries.safelist` - -Persisted Queries (PQ) Safelisting configuration - -- **Type:** `object` - -```yaml title="persisted_queries.safelist" -safelist: - enabled: false - require_id: false -``` - - ---- - -### `persisted_queries.safelist.enabled` - -Enables using the persisted query list as a safelist (disabled by default) - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="persisted_queries.safelist.enabled" -enabled: false -``` - - ---- - -### `persisted_queries.safelist.require_id` - -Enabling this field configures the router to reject any request that does not include the persisted query ID - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="persisted_queries.safelist.require_id" -require_id: false -``` - - ---- - -### `plugins` - -- **Type:** `any` - -```yaml title="plugins" -plugins: unknown_type_plugins -``` - - ---- - -### `preview_entity_cache` - -Configuration for entity caching - -- **Type:** `object` - -```yaml title="preview_entity_cache" -preview_entity_cache: - enabled: false - expose_keys_in_context: false - invalidation: - concurrent_requests: 10 - listen: example_listen - path: example_path - scan_count: 1000 - metrics: - enabled: false - separate_per_type: false - ttl: 30s - subgraph: - all: - enabled: true - invalidation: - enabled: false - shared_key: '' - private_id: null - redis: - namespace: example_namespace - password: example_password - pool_size: 1 - required_to_start: false - reset_ttl: true - timeout: null - tls: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - ttl: null - urls: - - http://example.com/urls_item - username: example_username - ttl: 30s - subgraphs: {} -``` - - ---- - -### `preview_entity_cache.enabled` - -Enable or disable the entity caching feature - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="preview_entity_cache.enabled" -enabled: false -``` - - ---- - -### `preview_entity_cache.expose_keys_in_context` - -Expose cache keys in context - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="preview_entity_cache.expose_keys_in_context" -expose_keys_in_context: false -``` - - ---- - -### `preview_entity_cache.invalidation` - -- **Type:** `object` - -```yaml title="preview_entity_cache.invalidation" -invalidation: - concurrent_requests: 10 - listen: example_listen - path: example_path - scan_count: 1000 -``` - - ---- - -### `preview_entity_cache.invalidation.concurrent_requests` - -Number of concurrent invalidation requests - -- **Type:** `integer` -- **Default:** `10` -- **Minimum:** `0.0` - -```yaml title="preview_entity_cache.invalidation.concurrent_requests" -concurrent_requests: 10 -``` - - ---- - -### `preview_entity_cache.invalidation.listen` - -Listening address. - -- **Type:** `any` - -```yaml title="preview_entity_cache.invalidation.listen" -listen: example_listen -``` - - ---- - -### `preview_entity_cache.invalidation.path` - -Specify on which path you want to listen for invalidation endpoint. - -- **Type:** `string` - -```yaml title="preview_entity_cache.invalidation.path" -path: example_path -``` - - ---- - -### `preview_entity_cache.invalidation.scan_count` - -Number of keys to return at once from a redis SCAN command - -- **Type:** `integer` -- **Default:** `1000` -- **Minimum:** `0.0` - -```yaml title="preview_entity_cache.invalidation.scan_count" -scan_count: 1000 -``` - - ---- - -### `preview_entity_cache.metrics` - -Per subgraph configuration for entity caching - -- **Type:** `object` - -```yaml title="preview_entity_cache.metrics" -metrics: - enabled: false - separate_per_type: false - ttl: 30s -``` - - ---- - -### `preview_entity_cache.metrics.enabled` - -enables metrics evaluating the benefits of entity caching - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="preview_entity_cache.metrics.enabled" -enabled: false -``` - - ---- - -### `preview_entity_cache.metrics.separate_per_type` - -Adds the entity type name to attributes. This can greatly increase the cardinality - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="preview_entity_cache.metrics.separate_per_type" -separate_per_type: false -``` - - ---- - -### `preview_entity_cache.metrics.ttl` - -Per subgraph configuration for entity caching - -- **Type:** `string` - -```yaml title="preview_entity_cache.metrics.ttl" -ttl: 30s -``` - - ---- - -### `preview_entity_cache.subgraph` - -Configuration options pertaining to the subgraph server component. - -- **Type:** `object` - -```yaml title="preview_entity_cache.subgraph" -subgraph: - all: - enabled: true - invalidation: - enabled: false - shared_key: '' - private_id: null - redis: - namespace: example_namespace - password: example_password - pool_size: 1 - required_to_start: false - reset_ttl: true - timeout: null - tls: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - ttl: null - urls: - - http://example.com/urls_item - username: example_username - ttl: 30s - subgraphs: {} -``` - - ---- - -### `preview_entity_cache.subgraph.all` - -Per subgraph configuration for entity caching - -- **Type:** `object` - -```yaml title="preview_entity_cache.subgraph.all" -all: - enabled: true - invalidation: - enabled: false - shared_key: '' - private_id: null - redis: - namespace: example_namespace - password: example_password - pool_size: 1 - required_to_start: false - reset_ttl: true - timeout: null - tls: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - ttl: null - urls: - - http://example.com/urls_item - username: example_username - ttl: 30s -``` - - ---- - -### `preview_entity_cache.subgraph.all.enabled` - -activates caching for this subgraph, overrides the global configuration - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="preview_entity_cache.subgraph.all.enabled" -enabled: true -``` - - ---- - -### `preview_entity_cache.subgraph.all.invalidation` - -- **Type:** `object` - -```yaml title="preview_entity_cache.subgraph.all.invalidation" -invalidation: - enabled: false - shared_key: '' -``` - - ---- - -### `preview_entity_cache.subgraph.all.invalidation.enabled` - -Enable the invalidation - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="preview_entity_cache.subgraph.all.invalidation.enabled" -enabled: false -``` - - ---- - -### `preview_entity_cache.subgraph.all.invalidation.shared_key` - -Shared key needed to request the invalidation endpoint - -- **Type:** `string` -- **Default:** `''` - -```yaml title="preview_entity_cache.subgraph.all.invalidation.shared_key" -shared_key: '' -``` - - ---- - -### `preview_entity_cache.subgraph.all.private_id` - -Context key used to separate cache sections per user - -- **Type:** `string` -- **Default:** `None` - -```yaml title="preview_entity_cache.subgraph.all.private_id" -private_id: null -``` - - ---- - -### `preview_entity_cache.subgraph.all.redis` - -Redis cache configuration - -- **Type:** `object` - -```yaml title="preview_entity_cache.subgraph.all.redis" -redis: - namespace: example_namespace - password: example_password - pool_size: 1 - required_to_start: false - reset_ttl: true - timeout: null - tls: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - ttl: null - urls: - - http://example.com/urls_item - username: example_username -``` - - ---- - -### `preview_entity_cache.subgraph.all.redis.namespace` - -namespace used to prefix Redis keys - -- **Type:** `string` - -```yaml title="preview_entity_cache.subgraph.all.redis.namespace" -namespace: example_namespace -``` - - ---- - -### `preview_entity_cache.subgraph.all.redis.password` - -Redis password if not provided in the URLs. This field takes precedence over the password in the URL - -- **Type:** `string` - -```yaml title="preview_entity_cache.subgraph.all.redis.password" -password: example_password -``` - - ---- - -### `preview_entity_cache.subgraph.all.redis.pool_size` - -The size of the Redis connection pool - -- **Type:** `integer` -- **Default:** `1` -- **Minimum:** `0.0` - -```yaml title="preview_entity_cache.subgraph.all.redis.pool_size" -pool_size: 1 -``` - - ---- - -### `preview_entity_cache.subgraph.all.redis.required_to_start` - -Prevents the router from starting if it cannot connect to Redis - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="preview_entity_cache.subgraph.all.redis.required_to_start" -required_to_start: false -``` - - ---- - -### `preview_entity_cache.subgraph.all.redis.reset_ttl` - -When a TTL is set on a key, reset it when reading the data from that key - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="preview_entity_cache.subgraph.all.redis.reset_ttl" -reset_ttl: true -``` - - ---- - -### `preview_entity_cache.subgraph.all.redis.timeout` - -Redis request timeout (default: 2ms) - -- **Type:** `string` -- **Default:** `None` - -```yaml title="preview_entity_cache.subgraph.all.redis.timeout" -timeout: null -``` - - ---- - -### `preview_entity_cache.subgraph.all.redis.tls` - -Configuration options pertaining to the subgraph server component. - -- **Type:** `object` - -```yaml title="preview_entity_cache.subgraph.all.redis.tls" -tls: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key -``` - - ---- - -### `preview_entity_cache.subgraph.all.redis.ttl` - -TTL for entries - -- **Type:** `string` -- **Default:** `None` - -```yaml title="preview_entity_cache.subgraph.all.redis.ttl" -ttl: null -``` - - ---- - -### `preview_entity_cache.subgraph.all.redis.urls` - -List of URLs to the Redis cluster - -- **Type:** `array` - -```yaml title="preview_entity_cache.subgraph.all.redis.urls" -urls: -- http://example.com/urls_item -``` - - ---- - -### `preview_entity_cache.subgraph.all.redis.username` - -Redis username if not provided in the URLs. This field takes precedence over the username in the URL - -- **Type:** `string` - -```yaml title="preview_entity_cache.subgraph.all.redis.username" -username: example_username -``` - - ---- - -### `preview_entity_cache.subgraph.all.ttl` - -Per subgraph configuration for entity caching - -- **Type:** `string` - -```yaml title="preview_entity_cache.subgraph.all.ttl" -ttl: 30s -``` - - ---- - -### `preview_entity_cache.subgraph.subgraphs` - -per subgraph options - -- **Type:** `object` -- **Default:** `{}` - -```yaml title="preview_entity_cache.subgraph.subgraphs" -subgraphs: {} -``` - - ---- - -### `preview_file_uploads` - -Configuration for File Uploads plugin - -- **Type:** `object` - -```yaml title="preview_file_uploads" -preview_file_uploads: - enabled: false - protocols: - multipart: - enabled: true - limits: - max_file_size: example_max_file_size - max_files: 0 - mode: stream -``` - - ---- - -### `preview_file_uploads.enabled` - -Whether the file upload plugin should be enabled (default: false) - -- **Type:** `boolean` - -```yaml title="preview_file_uploads.enabled" -enabled: false -``` - - ---- - -### `preview_file_uploads.protocols` - -Configuration for the various protocols supported by the file upload plugin - -- **Type:** `object` - -```yaml title="preview_file_uploads.protocols" -protocols: - multipart: - enabled: true - limits: - max_file_size: example_max_file_size - max_files: 0 - mode: stream -``` - - ---- - -### `preview_file_uploads.protocols.multipart` - -Configuration for a multipart request for file uploads. - -This protocol conforms to [jaydenseric's multipart spec](https://github.com/jaydenseric/graphql-multipart-request-spec) - -- **Type:** `object` - -```yaml title="preview_file_uploads.protocols.multipart" -multipart: - enabled: true - limits: - max_file_size: example_max_file_size - max_files: 0 - mode: stream -``` - - ---- - -### `preview_file_uploads.protocols.multipart.enabled` - -Whether to enable the multipart protocol for file uploads (default: true) - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="preview_file_uploads.protocols.multipart.enabled" -enabled: true -``` - - ---- - -### `preview_file_uploads.protocols.multipart.limits` - -Request limits for a multipart request - -- **Type:** `object` - -```yaml title="preview_file_uploads.protocols.multipart.limits" -limits: - max_file_size: example_max_file_size - max_files: 0 -``` - - ---- - -### `preview_file_uploads.protocols.multipart.limits.max_file_size` - -The maximum size of each file, in bytes (default: 5MB) - -- **Type:** `string` - -```yaml title="preview_file_uploads.protocols.multipart.limits.max_file_size" -max_file_size: example_max_file_size -``` - - ---- - -### `preview_file_uploads.protocols.multipart.limits.max_files` - -The maximum amount of files allowed for a single query (default: 4) - -- **Type:** `integer` -- **Minimum:** `0.0` - -```yaml title="preview_file_uploads.protocols.multipart.limits.max_files" -max_files: 0 -``` - - ---- - -### `preview_file_uploads.protocols.multipart.mode` - -Supported mode for a multipart request - -- **Type:** `any` - -```yaml title="preview_file_uploads.protocols.multipart.mode" -mode: stream -``` - - ---- - -### `progressive_override` - -Configuration for the progressive override plugin - -- **Type:** `object` - -```yaml title="progressive_override" -progressive_override: {} -``` - - ---- - -### `rhai` - -Configuration for the Rhai Plugin - -- **Type:** `object` - -```yaml title="rhai" -rhai: - main: example_main - scripts: example_scripts -``` - - ---- - -### `rhai.main` - -The main entry point for Rhai script evaluation - -- **Type:** `string` - -```yaml title="rhai.main" -main: example_main -``` - - ---- - -### `rhai.scripts` - -The directory where Rhai scripts can be found - -- **Type:** `string` - -```yaml title="rhai.scripts" -scripts: example_scripts -``` - - ---- - -### `sandbox` - -Configuration options pertaining to the sandbox page. - -- **Type:** `object` - -```yaml title="sandbox" -sandbox: - enabled: false -``` - - ---- - -### `sandbox.enabled` - -Set to true to enable sandbox - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="sandbox.enabled" -enabled: false -``` - - ---- - -### `subscription` - -Subscriptions configuration - -- **Type:** `object` - -```yaml title="subscription" -subscription: - enable_deduplication: true - enabled: true - max_opened_subscriptions: null - mode: - callback: - heartbeat_interval: disabled - listen: example_listen - path: example_path - public_url: http://service.example.com/public_url - subgraphs: [] - passthrough: - all: - heartbeat_interval: disabled - path: null - protocol: graphql_ws - subgraphs: {} - queue_capacity: null -``` - - ---- - -### `subscription.enable_deduplication` - -Enable the deduplication of subscription (for example if we detect the exact same request to subgraph we won't open a new websocket to the subgraph in passthrough mode) (default: true) - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="subscription.enable_deduplication" -enable_deduplication: true -``` - - ---- - -### `subscription.enabled` - -Enable subscription - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="subscription.enabled" -enabled: true -``` - - ---- - -### `subscription.max_opened_subscriptions` - -This is a limit to only have maximum X opened subscriptions at the same time. By default if it's not set there is no limit. - -- **Type:** `integer` -- **Default:** `None` -- **Minimum:** `0.0` - -```yaml title="subscription.max_opened_subscriptions" -max_opened_subscriptions: null -``` - - ---- - -### `subscription.mode` - -- **Type:** `object` - -```yaml title="subscription.mode" -mode: - callback: - heartbeat_interval: disabled - listen: example_listen - path: example_path - public_url: http://service.example.com/public_url - subgraphs: [] - passthrough: - all: - heartbeat_interval: disabled - path: null - protocol: graphql_ws - subgraphs: {} -``` - - ---- - -### `subscription.mode.callback` - -Using a callback url - -- **Type:** `object` - -```yaml title="subscription.mode.callback" -callback: - heartbeat_interval: disabled - listen: example_listen - path: example_path - public_url: http://service.example.com/public_url - subgraphs: [] -``` - - ---- - -### `subscription.mode.callback.heartbeat_interval` - -- **Type:** `any` - -```yaml title="subscription.mode.callback.heartbeat_interval" -heartbeat_interval: disabled -``` - - ---- - -### `subscription.mode.callback.listen` - -Listening address. - -- **Type:** `any` - -```yaml title="subscription.mode.callback.listen" -listen: example_listen -``` - - ---- - -### `subscription.mode.callback.path` - -Specify on which path you want to listen for callbacks (default: /callback) - -- **Type:** `string` - -```yaml title="subscription.mode.callback.path" -path: example_path -``` - - ---- - -### `subscription.mode.callback.public_url` - -URL used to access this router instance, including the path configured on the Router - -- **Type:** `string` - -```yaml title="subscription.mode.callback.public_url" -public_url: http://service.example.com/public_url -``` - - ---- - -### `subscription.mode.callback.subgraphs` - -Specify on which subgraph we enable the callback mode for subscription If empty it applies to all subgraphs (passthrough mode takes precedence) - -- **Type:** `array` -- **Default:** `[]` - -```yaml title="subscription.mode.callback.subgraphs" -subgraphs: [] -``` - - ---- - -### `subscription.mode.passthrough` - -- **Type:** `object` - -```yaml title="subscription.mode.passthrough" -passthrough: - all: - heartbeat_interval: disabled - path: null - protocol: graphql_ws - subgraphs: {} -``` - - ---- - -### `subscription.mode.passthrough.all` - -WebSocket configuration for a specific subgraph - -- **Type:** `object` - -```yaml title="subscription.mode.passthrough.all" -all: - heartbeat_interval: disabled - path: null - protocol: graphql_ws -``` - - ---- - -### `subscription.mode.passthrough.all.heartbeat_interval` - -- **Type:** `any` - -```yaml title="subscription.mode.passthrough.all.heartbeat_interval" -heartbeat_interval: disabled -``` - - ---- - -### `subscription.mode.passthrough.all.path` - -Path on which WebSockets are listening - -- **Type:** `string` -- **Default:** `None` - -```yaml title="subscription.mode.passthrough.all.path" -path: null -``` - - ---- - -### `subscription.mode.passthrough.all.protocol` - -- **Type:** `string` -- **Enum:** `graphql_ws`, `graphql_transport_ws` - -```yaml title="subscription.mode.passthrough.all.protocol" -protocol: graphql_ws -``` - - ---- - -### `subscription.mode.passthrough.subgraphs` - -Configuration for specific subgraphs - -- **Type:** `object` -- **Default:** `{}` - -```yaml title="subscription.mode.passthrough.subgraphs" -subgraphs: {} -``` - - ---- - -### `subscription.queue_capacity` - -It represent the capacity of the in memory queue to know how many events we can keep in a buffer - -- **Type:** `integer` -- **Default:** `None` -- **Minimum:** `0.0` - -```yaml title="subscription.queue_capacity" -queue_capacity: null -``` - - ---- - -### `supergraph` - -Configuration options pertaining to the supergraph server component. - -- **Type:** `object` - -```yaml title="supergraph" -supergraph: - defer_support: true - early_cancel: false - experimental_log_on_broken_pipe: false - generate_query_fragments: true - introspection: false - listen: example_listen - path: / - query_planning: - cache: - in_memory: - limit: 1 - redis: - namespace: example_namespace - password: example_password - pool_size: 1 - required_to_start: false - reset_ttl: true - timeout: null - tls: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - ttl: - nanos: 0 - secs: 2592000 - urls: - - http://example.com/urls_item - username: example_username - experimental_paths_limit: null - experimental_plans_limit: null - experimental_reuse_query_plans: false - warmed_up_queries: null -``` - - ---- - -### `supergraph.defer_support` - -Set to false to disable defer support - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="supergraph.defer_support" -defer_support: true -``` - - ---- - -### `supergraph.early_cancel` - -abort request handling when the client drops the connection. Default: false. When set to true, some parts of the request pipeline like telemetry will not work properly, but request handling will stop immediately when the client connection is closed. - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="supergraph.early_cancel" -early_cancel: false -``` - - ---- - -### `supergraph.experimental_log_on_broken_pipe` - -Log a message if the client closes the connection before the response is sent. Default: false. - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="supergraph.experimental_log_on_broken_pipe" -experimental_log_on_broken_pipe: false -``` - - ---- - -### `supergraph.generate_query_fragments` - -Enable QP generation of fragments for subgraph requests Default: true - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="supergraph.generate_query_fragments" -generate_query_fragments: true -``` - - ---- - -### `supergraph.introspection` - -Enable introspection Default: false - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="supergraph.introspection" -introspection: false -``` - - ---- - -### `supergraph.listen` - -Listening address. - -- **Type:** `any` - -```yaml title="supergraph.listen" -listen: example_listen -``` - - ---- - -### `supergraph.path` - -The HTTP path on which GraphQL requests will be served. default: "/" - -- **Type:** `string` -- **Default:** `'/'` - -```yaml title="supergraph.path" -path: / -``` - - ---- - -### `supergraph.query_planning` - -Query planning cache configuration - -- **Type:** `object` - -```yaml title="supergraph.query_planning" -query_planning: - cache: - in_memory: - limit: 1 - redis: - namespace: example_namespace - password: example_password - pool_size: 1 - required_to_start: false - reset_ttl: true - timeout: null - tls: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - ttl: - nanos: 0 - secs: 2592000 - urls: - - http://example.com/urls_item - username: example_username - experimental_paths_limit: null - experimental_plans_limit: null - experimental_reuse_query_plans: false - warmed_up_queries: null -``` - - ---- - -### `supergraph.query_planning.cache` - -Cache configuration - -- **Type:** `object` - -```yaml title="supergraph.query_planning.cache" -cache: - in_memory: - limit: 1 - redis: - namespace: example_namespace - password: example_password - pool_size: 1 - required_to_start: false - reset_ttl: true - timeout: null - tls: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - ttl: - nanos: 0 - secs: 2592000 - urls: - - http://example.com/urls_item - username: example_username -``` - - ---- - -### `supergraph.query_planning.cache.in_memory` - -In memory cache configuration - -- **Type:** `object` - -```yaml title="supergraph.query_planning.cache.in_memory" -in_memory: - limit: 1 -``` - - ---- - -### `supergraph.query_planning.cache.in_memory.limit` - -Number of entries in the Least Recently Used cache - -- **Type:** `integer` -- **Minimum:** `1.0` - -```yaml title="supergraph.query_planning.cache.in_memory.limit" -limit: 1 -``` - - ---- - -### `supergraph.query_planning.cache.redis` - -Redis cache configuration - -- **Type:** `object` - -```yaml title="supergraph.query_planning.cache.redis" -redis: - namespace: example_namespace - password: example_password - pool_size: 1 - required_to_start: false - reset_ttl: true - timeout: null - tls: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - ttl: - nanos: 0 - secs: 2592000 - urls: - - http://example.com/urls_item - username: example_username -``` - - ---- - -### `supergraph.query_planning.cache.redis.namespace` - -namespace used to prefix Redis keys - -- **Type:** `string` - -```yaml title="supergraph.query_planning.cache.redis.namespace" -namespace: example_namespace -``` - - ---- - -### `supergraph.query_planning.cache.redis.password` - -Redis password if not provided in the URLs. This field takes precedence over the password in the URL - -- **Type:** `string` - -```yaml title="supergraph.query_planning.cache.redis.password" -password: example_password -``` - - ---- - -### `supergraph.query_planning.cache.redis.pool_size` - -The size of the Redis connection pool - -- **Type:** `integer` -- **Default:** `1` -- **Minimum:** `0.0` - -```yaml title="supergraph.query_planning.cache.redis.pool_size" -pool_size: 1 -``` - - ---- - -### `supergraph.query_planning.cache.redis.required_to_start` - -Prevents the router from starting if it cannot connect to Redis - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="supergraph.query_planning.cache.redis.required_to_start" -required_to_start: false -``` - - ---- - -### `supergraph.query_planning.cache.redis.reset_ttl` - -When a TTL is set on a key, reset it when reading the data from that key - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="supergraph.query_planning.cache.redis.reset_ttl" -reset_ttl: true -``` - - ---- - -### `supergraph.query_planning.cache.redis.timeout` - -Redis request timeout (default: 2ms) - -- **Type:** `string` -- **Default:** `None` - -```yaml title="supergraph.query_planning.cache.redis.timeout" -timeout: null -``` - - ---- - -### `supergraph.query_planning.cache.redis.tls` - -Configuration options pertaining to the subgraph server component. - -- **Type:** `object` - -```yaml title="supergraph.query_planning.cache.redis.tls" -tls: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key -``` - - ---- - -### `supergraph.query_planning.cache.redis.ttl` - -TTL for entries - -- **Type:** `string` -- **Default:** `{"secs": 2592000, "nanos": 0}` - -```yaml title="supergraph.query_planning.cache.redis.ttl" -ttl: - nanos: 0 - secs: 2592000 -``` - - ---- - -### `supergraph.query_planning.cache.redis.urls` - -List of URLs to the Redis cluster - -- **Type:** `array` - -```yaml title="supergraph.query_planning.cache.redis.urls" -urls: -- http://example.com/urls_item -``` - - ---- - -### `supergraph.query_planning.cache.redis.username` - -Redis username if not provided in the URLs. This field takes precedence over the username in the URL - -- **Type:** `string` - -```yaml title="supergraph.query_planning.cache.redis.username" -username: example_username -``` - - ---- - -### `supergraph.query_planning.experimental_paths_limit` - -Before creating query plans, for each path of fields in the query we compute all the possible options to traverse that path via the subgraphs. Multiple options can arise because fields in the path can be provided by multiple subgraphs, and abstract types (i.e. unions and interfaces) returned by fields sometimes require the query planner to traverse through each constituent object type. The number of options generated in this computation can grow large if the schema or query are sufficiently complex, and that will increase the time spent planning. - -This config allows specifying a per-path limit to the number of options considered. If any path's options exceeds this limit, query planning will abort and the operation will fail. - -The default value is None, which specifies no limit. - -- **Type:** `integer` -- **Default:** `None` -- **Minimum:** `0.0` - -```yaml title="supergraph.query_planning.experimental_paths_limit" -experimental_paths_limit: null -``` - - ---- - -### `supergraph.query_planning.experimental_plans_limit` - -Sets a limit to the number of generated query plans. The planning process generates many different query plans as it explores the graph, and the list can grow large. By using this limit, we prevent that growth and still get a valid query plan, but it may not be the optimal one. - -The default limit is set to 10000, but it may change in the future - -- **Type:** `integer` -- **Default:** `None` -- **Minimum:** `0.0` - -```yaml title="supergraph.query_planning.experimental_plans_limit" -experimental_plans_limit: null -``` - - ---- - -### `supergraph.query_planning.experimental_reuse_query_plans` - -If cache warm up is configured, this will allow the router to keep a query plan created with the old schema, if it determines that the schema update does not affect the corresponding query - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="supergraph.query_planning.experimental_reuse_query_plans" -experimental_reuse_query_plans: false -``` - - ---- - -### `supergraph.query_planning.warmed_up_queries` - -Warms up the cache on reloads by running the query plan over a list of the most used queries (from the in memory cache) Configures the number of queries warmed up. Defaults to 1/3 of the in memory cache - -- **Type:** `integer` -- **Default:** `None` -- **Minimum:** `0.0` - -```yaml title="supergraph.query_planning.warmed_up_queries" -warmed_up_queries: null -``` - - ---- - -### `telemetry` - -Telemetry configuration - -- **Type:** `object` - -```yaml title="telemetry" -telemetry: - apollo: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - buffer_size: 10000 - client_name_header: apollographql-client-name - client_version_header: apollographql-client-version - endpoint: https://usage-reporting.api.apollographql.com/api/ingress/traces - errors: - preview_extended_error_metrics: disabled - subgraph: - all: - redact: true - redaction_policy: strict - send: true - subgraphs: {} - experimental_local_field_metrics: false - experimental_otlp_endpoint: https://usage-reporting.api.apollographql.com/ - experimental_otlp_tracing_protocol: grpc - field_level_instrumentation_sampler: 0.0 - metrics_reference_mode: extended - otlp_tracing_sampler: 0.0 - send_headers: - only: - - example_only_item - send_variable_values: - only: - - example_only_item - signature_normalization_algorithm: legacy - exporters: - logging: - common: - resource: {} - service_name: null - service_namespace: null - stdout: - enabled: true - format: - json: - display_current_span: false - display_filename: false - display_level: true - display_line_number: false - display_resource: true - display_span_id: true - display_span_list: true - display_target: true - display_thread_id: false - display_thread_name: false - display_timestamp: true - display_trace_id: hexadecimal - span_attributes: [] - rate_limit: - capacity: 1 - enabled: false - interval: - nanos: 0 - secs: 1 - tty_format: - json: - display_current_span: false - display_filename: false - display_level: true - display_line_number: false - display_resource: true - display_span_id: true - display_span_list: true - display_target: true - display_thread_id: false - display_thread_name: false - display_timestamp: true - display_trace_id: hexadecimal - span_attributes: [] - metrics: - common: - buckets: - - 0.001 - - 0.005 - - 0.015 - - 0.05 - - 0.1 - - 0.2 - - 0.3 - - 0.4 - - 0.5 - - 1.0 - - 5.0 - - 10.0 - resource: {} - service_name: null - service_namespace: null - views: - - aggregation: - histogram: - buckets: - - 0.0 - allowed_attribute_keys: - - example_allowed_attribute_keys_item - description: example_description - name: example_name - unit: example_unit - otlp: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enabled: false - endpoint: example_endpoint - grpc: - ca: null - cert: null - domain_name: null - key: null - metadata: {} - http: - headers: {} - protocol: grpc - temporality: cumulative - prometheus: - enabled: false - listen: example_listen - path: /metrics - tracing: - common: - max_attributes_per_event: 128 - max_attributes_per_link: 128 - max_attributes_per_span: 128 - max_events_per_span: 128 - max_links_per_span: 128 - parent_based_sampler: true - preview_datadog_agent_sampling: null - resource: {} - sampler: 0.0 - service_name: null - service_namespace: null - datadog: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enable_span_mapping: true - enabled: false - endpoint: example_endpoint - fixed_span_names: true - resource_mapping: {} - span_metrics: - connect: true - connect_request: true - execution: true - http_request: true - parse_query: true - query_planning: true - request: true - router: true - subgraph: true - subgraph_request: true - supergraph: true - experimental_response_trace_id: - enabled: false - format: hexadecimal - header_name: example_header_name - otlp: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enabled: false - endpoint: example_endpoint - grpc: - ca: null - cert: null - domain_name: null - key: null - metadata: {} - http: - headers: {} - protocol: grpc - temporality: cumulative - propagation: - aws_xray: false - baggage: false - datadog: false - jaeger: false - request: - format: hexadecimal - header_name: example_header_name - trace_context: false - zipkin: false - zipkin: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enabled: false - endpoint: example_endpoint - instrumentation: - events: - connector: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info - router: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info - subgraph: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info - supergraph: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info - instruments: - cache: - apollo.router.operations.entity.cache: - attributes: - graphql.type.name: - alias: example_alias - connector: - http.client.request.body.size: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.request.duration: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.response.body.size: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias - default_requirement_level: none - graphql: - field.execution: - attributes: - graphql.field.name: - alias: example_alias - graphql.field.type: - alias: example_alias - graphql.list.length: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.type.name: - alias: example_alias - list.length: - attributes: - graphql.field.name: - alias: example_alias - graphql.field.type: - alias: example_alias - graphql.list.length: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.type.name: - alias: example_alias - router: - http.server.active_requests: - attributes: - http.request.method: false - server.address: false - server.port: false - url.scheme: false - http.server.request.body.size: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias - http.server.request.duration: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias - http.server.response.body.size: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias - subgraph: - http.client.request.body.size: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.request.duration: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.response.body.size: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias - supergraph: - cost.actual: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias - cost.delta: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias - cost.estimated: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias - spans: - connector: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias - default_attribute_requirement_level: none - mode: deprecated - router: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias - subgraph: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias - supergraph: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias -``` - - ---- - -### `telemetry.apollo` - -- **Type:** `object` - -```yaml title="telemetry.apollo" -apollo: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - buffer_size: 10000 - client_name_header: apollographql-client-name - client_version_header: apollographql-client-version - endpoint: https://usage-reporting.api.apollographql.com/api/ingress/traces - errors: - preview_extended_error_metrics: disabled - subgraph: - all: - redact: true - redaction_policy: strict - send: true - subgraphs: {} - experimental_local_field_metrics: false - experimental_otlp_endpoint: https://usage-reporting.api.apollographql.com/ - experimental_otlp_tracing_protocol: grpc - field_level_instrumentation_sampler: 0.0 - metrics_reference_mode: extended - otlp_tracing_sampler: 0.0 - send_headers: - only: - - example_only_item - send_variable_values: - only: - - example_only_item - signature_normalization_algorithm: legacy -``` - - ---- - -### `telemetry.apollo.batch_processor` - -Batch processor configuration - -- **Type:** `object` - -```yaml title="telemetry.apollo.batch_processor" -batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 -``` - - ---- - -### `telemetry.apollo.batch_processor.max_concurrent_exports` - -Maximum number of concurrent exports - -Limits the number of spawned tasks for exports and thus memory consumed by an exporter. A value of 1 will cause exports to be performed synchronously on the BatchSpanProcessor task. The default is 1. - -- **Type:** `integer` -- **Default:** `1` -- **Minimum:** `0.0` - -```yaml title="telemetry.apollo.batch_processor.max_concurrent_exports" -max_concurrent_exports: 1 -``` - - ---- - -### `telemetry.apollo.batch_processor.max_export_batch_size` - -The maximum number of spans to process in a single batch. If there are more than one batch worth of spans then it processes multiple batches of spans one batch after the other without any delay. The default value is 512. - -- **Type:** `integer` -- **Default:** `512` -- **Minimum:** `0.0` - -```yaml title="telemetry.apollo.batch_processor.max_export_batch_size" -max_export_batch_size: 512 -``` - - ---- - -### `telemetry.apollo.batch_processor.max_export_timeout` - -The maximum duration to export a batch of data. The default value is 30 seconds. - -- **Type:** `string` -- **Default:** `{"secs": 30, "nanos": 0}` - -```yaml title="telemetry.apollo.batch_processor.max_export_timeout" -max_export_timeout: - nanos: 0 - secs: 30 -``` - - ---- - -### `telemetry.apollo.batch_processor.max_queue_size` - -The maximum queue size to buffer spans for delayed processing. If the queue gets full it drops the spans. The default value of is 2048. - -- **Type:** `integer` -- **Default:** `2048` -- **Minimum:** `0.0` - -```yaml title="telemetry.apollo.batch_processor.max_queue_size" -max_queue_size: 2048 -``` - - ---- - -### `telemetry.apollo.batch_processor.scheduled_delay` - -The delay interval in milliseconds between two consecutive processing of batches. The default value is 5 seconds. - -- **Type:** `string` -- **Default:** `{"secs": 5, "nanos": 0}` - -```yaml title="telemetry.apollo.batch_processor.scheduled_delay" -scheduled_delay: - nanos: 0 - secs: 5 -``` - - ---- - -### `telemetry.apollo.buffer_size` - -The buffer size for sending traces to Apollo. Increase this if you are experiencing lost traces. - -- **Type:** `integer` -- **Default:** `10000` -- **Minimum:** `1.0` - -```yaml title="telemetry.apollo.buffer_size" -buffer_size: 10000 -``` - - ---- - -### `telemetry.apollo.client_name_header` - -The name of the header to extract from requests when populating 'client name' for traces and metrics in Apollo Studio. - -- **Type:** `string` -- **Default:** `'apollographql-client-name'` - -```yaml title="telemetry.apollo.client_name_header" -client_name_header: apollographql-client-name -``` - - ---- - -### `telemetry.apollo.client_version_header` - -The name of the header to extract from requests when populating 'client version' for traces and metrics in Apollo Studio. - -- **Type:** `string` -- **Default:** `'apollographql-client-version'` - -```yaml title="telemetry.apollo.client_version_header" -client_version_header: apollographql-client-version -``` - - ---- - -### `telemetry.apollo.endpoint` - -The Apollo Studio endpoint for exporting traces and metrics. - -- **Type:** `string` -- **Default:** `'https://usage-reporting.api.apollographql.com/api/ingress/traces'` - -```yaml title="telemetry.apollo.endpoint" -endpoint: https://usage-reporting.api.apollographql.com/api/ingress/traces -``` - - ---- - -### `telemetry.apollo.errors` - -- **Type:** `object` - -```yaml title="telemetry.apollo.errors" -errors: - preview_extended_error_metrics: disabled - subgraph: - all: - redact: true - redaction_policy: strict - send: true - subgraphs: {} -``` - - ---- - -### `telemetry.apollo.errors.preview_extended_error_metrics` - -Extended Open Telemetry error metrics mode - -- **Type:** `any` - -```yaml title="telemetry.apollo.errors.preview_extended_error_metrics" -preview_extended_error_metrics: disabled -``` - - ---- - -### `telemetry.apollo.errors.subgraph` - -- **Type:** `object` - -```yaml title="telemetry.apollo.errors.subgraph" -subgraph: - all: - redact: true - redaction_policy: strict - send: true - subgraphs: {} -``` - - ---- - -### `telemetry.apollo.errors.subgraph.all` - -- **Type:** `object` - -```yaml title="telemetry.apollo.errors.subgraph.all" -all: - redact: true - redaction_policy: strict - send: true -``` - - ---- - -### `telemetry.apollo.errors.subgraph.subgraphs` - -Handling of errors coming from specified subgraphs - -- **Type:** `object` - -```yaml title="telemetry.apollo.errors.subgraph.subgraphs" -subgraphs: {} -``` - - ---- - -### `telemetry.apollo.experimental_local_field_metrics` - -Enable field metrics that are generated without FTV1 to be sent to Apollo Studio. - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="telemetry.apollo.experimental_local_field_metrics" -experimental_local_field_metrics: false -``` - - ---- - -### `telemetry.apollo.experimental_otlp_endpoint` - -The Apollo Studio endpoint for exporting traces and metrics. - -- **Type:** `string` -- **Default:** `'https://usage-reporting.api.apollographql.com/'` - -```yaml title="telemetry.apollo.experimental_otlp_endpoint" -experimental_otlp_endpoint: https://usage-reporting.api.apollographql.com/ -``` - - ---- - -### `telemetry.apollo.experimental_otlp_tracing_protocol` - -- **Type:** `string` -- **Enum:** `grpc`, `http` - -```yaml title="telemetry.apollo.experimental_otlp_tracing_protocol" -experimental_otlp_tracing_protocol: grpc -``` - - ---- - -### `telemetry.apollo.field_level_instrumentation_sampler` - -- **Type:** `any` - -```yaml title="telemetry.apollo.field_level_instrumentation_sampler" -field_level_instrumentation_sampler: 0.0 -``` - - ---- - -### `telemetry.apollo.metrics_reference_mode` - -Apollo usage report reference generation modes. - -- **Type:** `any` - -```yaml title="telemetry.apollo.metrics_reference_mode" -metrics_reference_mode: extended -``` - - ---- - -### `telemetry.apollo.otlp_tracing_sampler` - -- **Type:** `any` - -```yaml title="telemetry.apollo.otlp_tracing_sampler" -otlp_tracing_sampler: 0.0 -``` - - ---- - -### `telemetry.apollo.send_headers` - -Forward headers - -- **Type:** `any` - -```yaml title="telemetry.apollo.send_headers" -send_headers: - only: - - example_only_item -``` - - ---- - -### `telemetry.apollo.send_variable_values` - -Forward GraphQL variables - -- **Type:** `any` - -```yaml title="telemetry.apollo.send_variable_values" -send_variable_values: - only: - - example_only_item -``` - - ---- - -### `telemetry.apollo.signature_normalization_algorithm` - -Signature normalization algorithm for Apollo's usage report. - -- **Type:** `any` -- **Default:** `legacy` - -Apollo's legacy operation signature algorithm removes information about certain fields, such as input objects and aliases. -This removal means some operations may have the same normalized signature though they are distinct operations. - -Enhanced normalization incorporates [input types](#input-types) and [aliases](#aliases) in signature generation. -It also includes other improvements that make it more likely that two operations that only vary slightly have the same signature. - - - -The router supports enhanced operation signature normalization in the following versions: - -- [General availability](/resources/product-launch-stages/#general-availability) in v1.54.0 and later -- [Experimental](/resources/product-launch-stages/#experimental-features) in v1.49.0 to v1.53.0 - - - -Configure enhanced operation signature normalization in `router.yaml` with the `telemetry.apollo.signature_normalization_algorithm` option: - -```yaml title="router.yaml" -telemetry: - apollo: - signature_normalization_algorithm: enhanced # Default is legacy -``` - -Once you enable this configuration, operations with enhanced signatures might appear with different operation IDs than they did previously in GraphOS Studio. - - ---- - -### `telemetry.exporters` - -Exporter configuration - -- **Type:** `object` - -```yaml title="telemetry.exporters" -exporters: - logging: - common: - resource: {} - service_name: null - service_namespace: null - stdout: - enabled: true - format: - json: - display_current_span: false - display_filename: false - display_level: true - display_line_number: false - display_resource: true - display_span_id: true - display_span_list: true - display_target: true - display_thread_id: false - display_thread_name: false - display_timestamp: true - display_trace_id: hexadecimal - span_attributes: [] - rate_limit: - capacity: 1 - enabled: false - interval: - nanos: 0 - secs: 1 - tty_format: - json: - display_current_span: false - display_filename: false - display_level: true - display_line_number: false - display_resource: true - display_span_id: true - display_span_list: true - display_target: true - display_thread_id: false - display_thread_name: false - display_timestamp: true - display_trace_id: hexadecimal - span_attributes: [] - metrics: - common: - buckets: - - 0.001 - - 0.005 - - 0.015 - - 0.05 - - 0.1 - - 0.2 - - 0.3 - - 0.4 - - 0.5 - - 1.0 - - 5.0 - - 10.0 - resource: {} - service_name: null - service_namespace: null - views: - - aggregation: - histogram: - buckets: - - 0.0 - allowed_attribute_keys: - - example_allowed_attribute_keys_item - description: example_description - name: example_name - unit: example_unit - otlp: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enabled: false - endpoint: example_endpoint - grpc: - ca: null - cert: null - domain_name: null - key: null - metadata: {} - http: - headers: {} - protocol: grpc - temporality: cumulative - prometheus: - enabled: false - listen: example_listen - path: /metrics - tracing: - common: - max_attributes_per_event: 128 - max_attributes_per_link: 128 - max_attributes_per_span: 128 - max_events_per_span: 128 - max_links_per_span: 128 - parent_based_sampler: true - preview_datadog_agent_sampling: null - resource: {} - sampler: 0.0 - service_name: null - service_namespace: null - datadog: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enable_span_mapping: true - enabled: false - endpoint: example_endpoint - fixed_span_names: true - resource_mapping: {} - span_metrics: - connect: true - connect_request: true - execution: true - http_request: true - parse_query: true - query_planning: true - request: true - router: true - subgraph: true - subgraph_request: true - supergraph: true - experimental_response_trace_id: - enabled: false - format: hexadecimal - header_name: example_header_name - otlp: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enabled: false - endpoint: example_endpoint - grpc: - ca: null - cert: null - domain_name: null - key: null - metadata: {} - http: - headers: {} - protocol: grpc - temporality: cumulative - propagation: - aws_xray: false - baggage: false - datadog: false - jaeger: false - request: - format: hexadecimal - header_name: example_header_name - trace_context: false - zipkin: false - zipkin: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enabled: false - endpoint: example_endpoint -``` - - ---- - -### `telemetry.exporters.logging` - -Logging configuration. - -- **Type:** `object` - -```yaml title="telemetry.exporters.logging" -logging: - common: - resource: {} - service_name: null - service_namespace: null - stdout: - enabled: true - format: - json: - display_current_span: false - display_filename: false - display_level: true - display_line_number: false - display_resource: true - display_span_id: true - display_span_list: true - display_target: true - display_thread_id: false - display_thread_name: false - display_timestamp: true - display_trace_id: hexadecimal - span_attributes: [] - rate_limit: - capacity: 1 - enabled: false - interval: - nanos: 0 - secs: 1 - tty_format: - json: - display_current_span: false - display_filename: false - display_level: true - display_line_number: false - display_resource: true - display_span_id: true - display_span_list: true - display_target: true - display_thread_id: false - display_thread_name: false - display_timestamp: true - display_trace_id: hexadecimal - span_attributes: [] -``` - - ---- - -### `telemetry.exporters.logging.common` - -- **Type:** `object` - -```yaml title="telemetry.exporters.logging.common" -common: - resource: {} - service_name: null - service_namespace: null -``` - - ---- - -### `telemetry.exporters.logging.common.resource` - -The Open Telemetry resource - -- **Type:** `object` -- **Default:** `{}` - -```yaml title="telemetry.exporters.logging.common.resource" -resource: {} -``` - - ---- - -### `telemetry.exporters.logging.common.service_name` - -Set a service.name resource in your metrics - -- **Type:** `string` -- **Default:** `None` - -```yaml title="telemetry.exporters.logging.common.service_name" -service_name: null -``` - - ---- - -### `telemetry.exporters.logging.common.service_namespace` - -Set a service.namespace attribute in your metrics - -- **Type:** `string` -- **Default:** `None` - -```yaml title="telemetry.exporters.logging.common.service_namespace" -service_namespace: null -``` - - ---- - -### `telemetry.exporters.logging.stdout` - -- **Type:** `object` - -```yaml title="telemetry.exporters.logging.stdout" -stdout: - enabled: true - format: - json: - display_current_span: false - display_filename: false - display_level: true - display_line_number: false - display_resource: true - display_span_id: true - display_span_list: true - display_target: true - display_thread_id: false - display_thread_name: false - display_timestamp: true - display_trace_id: hexadecimal - span_attributes: [] - rate_limit: - capacity: 1 - enabled: false - interval: - nanos: 0 - secs: 1 - tty_format: - json: - display_current_span: false - display_filename: false - display_level: true - display_line_number: false - display_resource: true - display_span_id: true - display_span_list: true - display_target: true - display_thread_id: false - display_thread_name: false - display_timestamp: true - display_trace_id: hexadecimal - span_attributes: [] -``` - - ---- - -### `telemetry.exporters.logging.stdout.enabled` - -Set to true to log to stdout. - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="telemetry.exporters.logging.stdout.enabled" -enabled: true -``` - - ---- - -### `telemetry.exporters.logging.stdout.format` - -- **Type:** `any` - -```yaml title="telemetry.exporters.logging.stdout.format" -format: - json: - display_current_span: false - display_filename: false - display_level: true - display_line_number: false - display_resource: true - display_span_id: true - display_span_list: true - display_target: true - display_thread_id: false - display_thread_name: false - display_timestamp: true - display_trace_id: hexadecimal - span_attributes: [] -``` - - ---- - -### `telemetry.exporters.logging.stdout.rate_limit` - -- **Type:** `object` - -```yaml title="telemetry.exporters.logging.stdout.rate_limit" -rate_limit: - capacity: 1 - enabled: false - interval: - nanos: 0 - secs: 1 -``` - - ---- - -### `telemetry.exporters.logging.stdout.tty_format` - -- **Type:** `any` - -```yaml title="telemetry.exporters.logging.stdout.tty_format" -tty_format: - json: - display_current_span: false - display_filename: false - display_level: true - display_line_number: false - display_resource: true - display_span_id: true - display_span_list: true - display_target: true - display_thread_id: false - display_thread_name: false - display_timestamp: true - display_trace_id: hexadecimal - span_attributes: [] -``` - - ---- - -### `telemetry.exporters.metrics` - -Metrics configuration - -- **Type:** `object` - -```yaml title="telemetry.exporters.metrics" -metrics: - common: - buckets: - - 0.001 - - 0.005 - - 0.015 - - 0.05 - - 0.1 - - 0.2 - - 0.3 - - 0.4 - - 0.5 - - 1.0 - - 5.0 - - 10.0 - resource: {} - service_name: null - service_namespace: null - views: - - aggregation: - histogram: - buckets: - - 0.0 - allowed_attribute_keys: - - example_allowed_attribute_keys_item - description: example_description - name: example_name - unit: example_unit - otlp: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enabled: false - endpoint: example_endpoint - grpc: - ca: null - cert: null - domain_name: null - key: null - metadata: {} - http: - headers: {} - protocol: grpc - temporality: cumulative - prometheus: - enabled: false - listen: example_listen - path: /metrics -``` - - ---- - -### `telemetry.exporters.metrics.common` - -- **Type:** `object` - -```yaml title="telemetry.exporters.metrics.common" -common: - buckets: - - 0.001 - - 0.005 - - 0.015 - - 0.05 - - 0.1 - - 0.2 - - 0.3 - - 0.4 - - 0.5 - - 1.0 - - 5.0 - - 10.0 - resource: {} - service_name: null - service_namespace: null - views: - - aggregation: - histogram: - buckets: - - 0.0 - allowed_attribute_keys: - - example_allowed_attribute_keys_item - description: example_description - name: example_name - unit: example_unit -``` - - ---- - -### `telemetry.exporters.metrics.common.buckets` - -Custom buckets for all histograms - -- **Type:** `array` -- **Default:** `[0.001, 0.005, 0.015, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 1.0, 5.0, 10.0]` - -```yaml title="telemetry.exporters.metrics.common.buckets" -buckets: -- 0.001 -- 0.005 -- 0.015 -- 0.05 -- 0.1 -- 0.2 -- 0.3 -- 0.4 -- 0.5 -- 1.0 -- 5.0 -- 10.0 -``` - - ---- - -### `telemetry.exporters.metrics.common.resource` - -The Open Telemetry resource - -- **Type:** `object` -- **Default:** `{}` - -```yaml title="telemetry.exporters.metrics.common.resource" -resource: {} -``` - - ---- - -### `telemetry.exporters.metrics.common.service_name` - -Set a service.name resource in your metrics - -- **Type:** `string` -- **Default:** `None` - -```yaml title="telemetry.exporters.metrics.common.service_name" -service_name: null -``` - - ---- - -### `telemetry.exporters.metrics.common.service_namespace` - -Set a service.namespace attribute in your metrics - -- **Type:** `string` -- **Default:** `None` - -```yaml title="telemetry.exporters.metrics.common.service_namespace" -service_namespace: null -``` - - ---- - -### `telemetry.exporters.metrics.common.views` - -Views applied on metrics - -- **Type:** `array` - -```yaml title="telemetry.exporters.metrics.common.views" -views: -- aggregation: - histogram: - buckets: - - 0.0 - allowed_attribute_keys: - - example_allowed_attribute_keys_item - description: example_description - name: example_name - unit: example_unit -``` - - ---- - -### `telemetry.exporters.metrics.otlp` - -- **Type:** `object` - -```yaml title="telemetry.exporters.metrics.otlp" -otlp: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enabled: false - endpoint: example_endpoint - grpc: - ca: null - cert: null - domain_name: null - key: null - metadata: {} - http: - headers: {} - protocol: grpc - temporality: cumulative -``` - - ---- - -### `telemetry.exporters.metrics.otlp.batch_processor` - -Batch processor configuration - -- **Type:** `object` - -```yaml title="telemetry.exporters.metrics.otlp.batch_processor" -batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 -``` - - ---- - -### `telemetry.exporters.metrics.otlp.enabled` - -Enable otlp - -- **Type:** `boolean` - -```yaml title="telemetry.exporters.metrics.otlp.enabled" -enabled: false -``` - - ---- - -### `telemetry.exporters.metrics.otlp.endpoint` - -- **Type:** `string` - -```yaml title="telemetry.exporters.metrics.otlp.endpoint" -endpoint: example_endpoint -``` - - ---- - -### `telemetry.exporters.metrics.otlp.grpc` - -- **Type:** `object` - -```yaml title="telemetry.exporters.metrics.otlp.grpc" -grpc: - ca: null - cert: null - domain_name: null - key: null - metadata: {} -``` - - ---- - -### `telemetry.exporters.metrics.otlp.http` - -- **Type:** `object` - -```yaml title="telemetry.exporters.metrics.otlp.http" -http: - headers: {} -``` - - ---- - -### `telemetry.exporters.metrics.otlp.protocol` - -- **Type:** `string` -- **Enum:** `grpc`, `http` - -```yaml title="telemetry.exporters.metrics.otlp.protocol" -protocol: grpc -``` - - ---- - -### `telemetry.exporters.metrics.otlp.temporality` - -- **Type:** `any` - -```yaml title="telemetry.exporters.metrics.otlp.temporality" -temporality: cumulative -``` - - ---- - -### `telemetry.exporters.metrics.prometheus` - -Prometheus configuration - -- **Type:** `object` - -```yaml title="telemetry.exporters.metrics.prometheus" -prometheus: - enabled: false - listen: example_listen - path: /metrics -``` - - ---- - -### `telemetry.exporters.metrics.prometheus.enabled` - -Set to true to enable - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="telemetry.exporters.metrics.prometheus.enabled" -enabled: false -``` - - ---- - -### `telemetry.exporters.metrics.prometheus.listen` - -Listening address. - -- **Type:** `any` - -```yaml title="telemetry.exporters.metrics.prometheus.listen" -listen: example_listen -``` - - ---- - -### `telemetry.exporters.metrics.prometheus.path` - -The path where prometheus will be exposed - -- **Type:** `string` -- **Default:** `'/metrics'` - -```yaml title="telemetry.exporters.metrics.prometheus.path" -path: /metrics -``` - - ---- - -### `telemetry.exporters.tracing` - -Tracing configuration - -- **Type:** `object` - -```yaml title="telemetry.exporters.tracing" -tracing: - common: - max_attributes_per_event: 128 - max_attributes_per_link: 128 - max_attributes_per_span: 128 - max_events_per_span: 128 - max_links_per_span: 128 - parent_based_sampler: true - preview_datadog_agent_sampling: null - resource: {} - sampler: 0.0 - service_name: null - service_namespace: null - datadog: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enable_span_mapping: true - enabled: false - endpoint: example_endpoint - fixed_span_names: true - resource_mapping: {} - span_metrics: - connect: true - connect_request: true - execution: true - http_request: true - parse_query: true - query_planning: true - request: true - router: true - subgraph: true - subgraph_request: true - supergraph: true - experimental_response_trace_id: - enabled: false - format: hexadecimal - header_name: example_header_name - otlp: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enabled: false - endpoint: example_endpoint - grpc: - ca: null - cert: null - domain_name: null - key: null - metadata: {} - http: - headers: {} - protocol: grpc - temporality: cumulative - propagation: - aws_xray: false - baggage: false - datadog: false - jaeger: false - request: - format: hexadecimal - header_name: example_header_name - trace_context: false - zipkin: false - zipkin: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enabled: false - endpoint: example_endpoint -``` - - ---- - -### `telemetry.exporters.tracing.common` - -- **Type:** `object` - -```yaml title="telemetry.exporters.tracing.common" -common: - max_attributes_per_event: 128 - max_attributes_per_link: 128 - max_attributes_per_span: 128 - max_events_per_span: 128 - max_links_per_span: 128 - parent_based_sampler: true - preview_datadog_agent_sampling: null - resource: {} - sampler: 0.0 - service_name: null - service_namespace: null -``` - - ---- - -### `telemetry.exporters.tracing.common.max_attributes_per_event` - -The maximum attributes per event before discarding - -- **Type:** `integer` -- **Default:** `128` -- **Minimum:** `0.0` - -```yaml title="telemetry.exporters.tracing.common.max_attributes_per_event" -max_attributes_per_event: 128 -``` - - ---- - -### `telemetry.exporters.tracing.common.max_attributes_per_link` - -The maximum attributes per link before discarding - -- **Type:** `integer` -- **Default:** `128` -- **Minimum:** `0.0` - -```yaml title="telemetry.exporters.tracing.common.max_attributes_per_link" -max_attributes_per_link: 128 -``` - - ---- - -### `telemetry.exporters.tracing.common.max_attributes_per_span` - -The maximum attributes per span before discarding - -- **Type:** `integer` -- **Default:** `128` -- **Minimum:** `0.0` - -```yaml title="telemetry.exporters.tracing.common.max_attributes_per_span" -max_attributes_per_span: 128 -``` - - ---- - -### `telemetry.exporters.tracing.common.max_events_per_span` - -The maximum events per span before discarding - -- **Type:** `integer` -- **Default:** `128` -- **Minimum:** `0.0` - -```yaml title="telemetry.exporters.tracing.common.max_events_per_span" -max_events_per_span: 128 -``` - - ---- - -### `telemetry.exporters.tracing.common.max_links_per_span` - -The maximum links per span before discarding - -- **Type:** `integer` -- **Default:** `128` -- **Minimum:** `0.0` - -```yaml title="telemetry.exporters.tracing.common.max_links_per_span" -max_links_per_span: 128 -``` - - ---- - -### `telemetry.exporters.tracing.common.parent_based_sampler` - -Whether to use parent based sampling - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="telemetry.exporters.tracing.common.parent_based_sampler" -parent_based_sampler: true -``` - - ---- - -### `telemetry.exporters.tracing.common.preview_datadog_agent_sampling` - -Use datadog agent sampling. This means that all spans will be sent to the Datadog agent and the `sampling.priority` attribute will be used to control if the span will then be sent to Datadog - -- **Type:** `boolean` -- **Default:** `None` - -```yaml title="telemetry.exporters.tracing.common.preview_datadog_agent_sampling" -preview_datadog_agent_sampling: null -``` - - ---- - -### `telemetry.exporters.tracing.common.resource` - -The Open Telemetry resource - -- **Type:** `object` -- **Default:** `{}` - -```yaml title="telemetry.exporters.tracing.common.resource" -resource: {} -``` - - ---- - -### `telemetry.exporters.tracing.common.sampler` - -- **Type:** `any` - -```yaml title="telemetry.exporters.tracing.common.sampler" -sampler: 0.0 -``` - - ---- - -### `telemetry.exporters.tracing.common.service_name` - -The trace service name - -- **Type:** `string` -- **Default:** `None` - -```yaml title="telemetry.exporters.tracing.common.service_name" -service_name: null -``` - - ---- - -### `telemetry.exporters.tracing.common.service_namespace` - -The trace service namespace - -- **Type:** `string` -- **Default:** `None` - -```yaml title="telemetry.exporters.tracing.common.service_namespace" -service_namespace: null -``` - - ---- - -### `telemetry.exporters.tracing.datadog` - -- **Type:** `object` - -```yaml title="telemetry.exporters.tracing.datadog" -datadog: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enable_span_mapping: true - enabled: false - endpoint: example_endpoint - fixed_span_names: true - resource_mapping: {} - span_metrics: - connect: true - connect_request: true - execution: true - http_request: true - parse_query: true - query_planning: true - request: true - router: true - subgraph: true - subgraph_request: true - supergraph: true -``` - - ---- - -### `telemetry.exporters.tracing.datadog.batch_processor` - -Batch processor configuration - -- **Type:** `object` - -```yaml title="telemetry.exporters.tracing.datadog.batch_processor" -batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 -``` - - ---- - -### `telemetry.exporters.tracing.datadog.enable_span_mapping` - -Enable datadog span mapping for span name and resource name. - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="telemetry.exporters.tracing.datadog.enable_span_mapping" -enable_span_mapping: true -``` - - ---- - -### `telemetry.exporters.tracing.datadog.enabled` - -Enable datadog - -- **Type:** `boolean` - -```yaml title="telemetry.exporters.tracing.datadog.enabled" -enabled: false -``` - - ---- - -### `telemetry.exporters.tracing.datadog.endpoint` - -- **Type:** `string` - -```yaml title="telemetry.exporters.tracing.datadog.endpoint" -endpoint: example_endpoint -``` - - ---- - -### `telemetry.exporters.tracing.datadog.fixed_span_names` - -Fixes the span names, this means that the APM view will show the original span names in the operation dropdown. - -- **Type:** `boolean` -- **Default:** `True` - -```yaml title="telemetry.exporters.tracing.datadog.fixed_span_names" -fixed_span_names: true -``` - - ---- - -### `telemetry.exporters.tracing.datadog.resource_mapping` - -Custom mapping to be used as the resource field in spans, defaults to: router -> http.route supergraph -> graphql.operation.name query_planning -> graphql.operation.name subgraph -> subgraph.name subgraph_request -> subgraph.name http_request -> http.route - -- **Type:** `object` -- **Default:** `{}` - -```yaml title="telemetry.exporters.tracing.datadog.resource_mapping" -resource_mapping: {} -``` - - ---- - -### `telemetry.exporters.tracing.datadog.span_metrics` - -Which spans will be eligible for span stats to be collected for viewing in the APM view. Defaults to true for `request`, `router`, `query_parsing`, `supergraph`, `execution`, `query_planning`, `subgraph`, `subgraph_request`, `connect`, `connect_request` and `http_request`. - -- **Type:** `object` -- **Default:** `{"parse_query": true, "connect": true, "execution": true, "http_request": true, "request": true, "query_planning": true, "connect_request": true, "subgraph": true, "router": true, "supergraph": true, "subgraph_request": true}` - -```yaml title="telemetry.exporters.tracing.datadog.span_metrics" -span_metrics: - connect: true - connect_request: true - execution: true - http_request: true - parse_query: true - query_planning: true - request: true - router: true - subgraph: true - subgraph_request: true - supergraph: true -``` - - ---- - -### `telemetry.exporters.tracing.experimental_response_trace_id` - -- **Type:** `object` - -```yaml title="telemetry.exporters.tracing.experimental_response_trace_id" -experimental_response_trace_id: - enabled: false - format: hexadecimal - header_name: example_header_name -``` - - ---- - -### `telemetry.exporters.tracing.experimental_response_trace_id.enabled` - -Expose the trace_id in response headers - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="telemetry.exporters.tracing.experimental_response_trace_id.enabled" -enabled: false -``` - - ---- - -### `telemetry.exporters.tracing.experimental_response_trace_id.format` - -- **Type:** `any` - -```yaml title="telemetry.exporters.tracing.experimental_response_trace_id.format" -format: hexadecimal -``` - - ---- - -### `telemetry.exporters.tracing.experimental_response_trace_id.header_name` - -Choose the header name to expose trace_id (default: apollo-trace-id) - -- **Type:** `string` - -```yaml title="telemetry.exporters.tracing.experimental_response_trace_id.header_name" -header_name: example_header_name -``` - - ---- - -### `telemetry.exporters.tracing.otlp` - -- **Type:** `object` - -```yaml title="telemetry.exporters.tracing.otlp" -otlp: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enabled: false - endpoint: example_endpoint - grpc: - ca: null - cert: null - domain_name: null - key: null - metadata: {} - http: - headers: {} - protocol: grpc - temporality: cumulative -``` - - ---- - -### `telemetry.exporters.tracing.otlp.batch_processor` - -Batch processor configuration - -- **Type:** `object` - -```yaml title="telemetry.exporters.tracing.otlp.batch_processor" -batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 -``` - - ---- - -### `telemetry.exporters.tracing.otlp.enabled` - -Enable otlp - -- **Type:** `boolean` - -```yaml title="telemetry.exporters.tracing.otlp.enabled" -enabled: false -``` - - ---- - -### `telemetry.exporters.tracing.otlp.endpoint` - -- **Type:** `string` - -```yaml title="telemetry.exporters.tracing.otlp.endpoint" -endpoint: example_endpoint -``` - - ---- - -### `telemetry.exporters.tracing.otlp.grpc` - -- **Type:** `object` - -```yaml title="telemetry.exporters.tracing.otlp.grpc" -grpc: - ca: null - cert: null - domain_name: null - key: null - metadata: {} -``` - - ---- - -### `telemetry.exporters.tracing.otlp.http` - -- **Type:** `object` - -```yaml title="telemetry.exporters.tracing.otlp.http" -http: - headers: {} -``` - - ---- - -### `telemetry.exporters.tracing.otlp.protocol` - -- **Type:** `string` -- **Enum:** `grpc`, `http` - -```yaml title="telemetry.exporters.tracing.otlp.protocol" -protocol: grpc -``` - - ---- - -### `telemetry.exporters.tracing.otlp.temporality` - -- **Type:** `any` - -```yaml title="telemetry.exporters.tracing.otlp.temporality" -temporality: cumulative -``` - - ---- - -### `telemetry.exporters.tracing.propagation` - -Configure propagation of traces. In general you won't have to do this as these are automatically configured along with any exporter you configure. - -- **Type:** `object` - -```yaml title="telemetry.exporters.tracing.propagation" -propagation: - aws_xray: false - baggage: false - datadog: false - jaeger: false - request: - format: hexadecimal - header_name: example_header_name - trace_context: false - zipkin: false -``` - - ---- - -### `telemetry.exporters.tracing.propagation.aws_xray` - -Propagate AWS X-Ray - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="telemetry.exporters.tracing.propagation.aws_xray" -aws_xray: false -``` - - ---- - -### `telemetry.exporters.tracing.propagation.baggage` - -Propagate baggage https://www.w3.org/TR/baggage/ - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="telemetry.exporters.tracing.propagation.baggage" -baggage: false -``` - - ---- - -### `telemetry.exporters.tracing.propagation.datadog` - -Propagate Datadog - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="telemetry.exporters.tracing.propagation.datadog" -datadog: false -``` - - ---- - -### `telemetry.exporters.tracing.propagation.jaeger` - -Propagate Jaeger - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="telemetry.exporters.tracing.propagation.jaeger" -jaeger: false -``` - - ---- - -### `telemetry.exporters.tracing.propagation.request` - -- **Type:** `object` - -```yaml title="telemetry.exporters.tracing.propagation.request" -request: - format: hexadecimal - header_name: example_header_name -``` - - ---- - -### `telemetry.exporters.tracing.propagation.trace_context` - -Propagate trace context https://www.w3.org/TR/trace-context/ - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="telemetry.exporters.tracing.propagation.trace_context" -trace_context: false -``` - - ---- - -### `telemetry.exporters.tracing.propagation.zipkin` - -Propagate Zipkin - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="telemetry.exporters.tracing.propagation.zipkin" -zipkin: false -``` - - ---- - -### `telemetry.exporters.tracing.zipkin` - -- **Type:** `object` - -```yaml title="telemetry.exporters.tracing.zipkin" -zipkin: - batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 - enabled: false - endpoint: example_endpoint -``` - - ---- - -### `telemetry.exporters.tracing.zipkin.batch_processor` - -Batch processor configuration - -- **Type:** `object` - -```yaml title="telemetry.exporters.tracing.zipkin.batch_processor" -batch_processor: - max_concurrent_exports: 1 - max_export_batch_size: 512 - max_export_timeout: - nanos: 0 - secs: 30 - max_queue_size: 2048 - scheduled_delay: - nanos: 0 - secs: 5 -``` - - ---- - -### `telemetry.exporters.tracing.zipkin.enabled` - -Enable zipkin - -- **Type:** `boolean` - -```yaml title="telemetry.exporters.tracing.zipkin.enabled" -enabled: false -``` - - ---- - -### `telemetry.exporters.tracing.zipkin.endpoint` - -- **Type:** `string` - -```yaml title="telemetry.exporters.tracing.zipkin.endpoint" -endpoint: example_endpoint -``` - - ---- - -### `telemetry.instrumentation` - -Instrumentation configuration - -- **Type:** `object` - -```yaml title="telemetry.instrumentation" -instrumentation: - events: - connector: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info - router: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info - subgraph: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info - supergraph: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info - instruments: - cache: - apollo.router.operations.entity.cache: - attributes: - graphql.type.name: - alias: example_alias - connector: - http.client.request.body.size: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.request.duration: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.response.body.size: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias - default_requirement_level: none - graphql: - field.execution: - attributes: - graphql.field.name: - alias: example_alias - graphql.field.type: - alias: example_alias - graphql.list.length: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.type.name: - alias: example_alias - list.length: - attributes: - graphql.field.name: - alias: example_alias - graphql.field.type: - alias: example_alias - graphql.list.length: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.type.name: - alias: example_alias - router: - http.server.active_requests: - attributes: - http.request.method: false - server.address: false - server.port: false - url.scheme: false - http.server.request.body.size: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias - http.server.request.duration: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias - http.server.response.body.size: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias - subgraph: - http.client.request.body.size: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.request.duration: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.response.body.size: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias - supergraph: - cost.actual: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias - cost.delta: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias - cost.estimated: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias - spans: - connector: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias - default_attribute_requirement_level: none - mode: deprecated - router: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias - subgraph: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias - supergraph: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.events` - -Events are - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.events" -events: - connector: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info - router: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info - subgraph: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info - supergraph: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.connector` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.events.connector" -connector: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.connector.error` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.events.connector.error" -error: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.connector.request` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.events.connector.request" -request: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.connector.response` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.events.connector.response" -response: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.router` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.events.router" -router: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.router.error` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.events.router.error" -error: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.router.request` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.events.router.request" -request: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.router.response` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.events.router.response" -response: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.subgraph` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.events.subgraph" -subgraph: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.subgraph.error` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.events.subgraph.error" -error: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.subgraph.request` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.events.subgraph.request" -request: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.subgraph.response` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.events.subgraph.response" -response: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.supergraph` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.events.supergraph" -supergraph: - error: - condition: - eq: - - false - - false - level: info - request: - condition: - eq: - - false - - false - level: info - response: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.supergraph.error` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.events.supergraph.error" -error: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.supergraph.request` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.events.supergraph.request" -request: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.events.supergraph.response` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.events.supergraph.response" -response: - condition: - eq: - - false - - false - level: info -``` - - ---- - -### `telemetry.instrumentation.instruments` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.instruments" -instruments: - cache: - apollo.router.operations.entity.cache: - attributes: - graphql.type.name: - alias: example_alias - connector: - http.client.request.body.size: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.request.duration: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.response.body.size: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias - default_requirement_level: none - graphql: - field.execution: - attributes: - graphql.field.name: - alias: example_alias - graphql.field.type: - alias: example_alias - graphql.list.length: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.type.name: - alias: example_alias - list.length: - attributes: - graphql.field.name: - alias: example_alias - graphql.field.type: - alias: example_alias - graphql.list.length: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.type.name: - alias: example_alias - router: - http.server.active_requests: - attributes: - http.request.method: false - server.address: false - server.port: false - url.scheme: false - http.server.request.body.size: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias - http.server.request.duration: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias - http.server.response.body.size: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias - subgraph: - http.client.request.body.size: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.request.duration: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.response.body.size: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias - supergraph: - cost.actual: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias - cost.delta: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias - cost.estimated: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.instruments.cache` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.instruments.cache" -cache: - apollo.router.operations.entity.cache: - attributes: - graphql.type.name: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.instruments.cache.apollo.router.operations.entity.cache` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.cache.apollo.router.operations.entity.cache" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.connector` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.instruments.connector" -connector: - http.client.request.body.size: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.request.duration: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.response.body.size: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.instruments.connector.http.client.request.body.size` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.connector.http.client.request.body.size" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.connector.http.client.request.duration` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.connector.http.client.request.duration" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.connector.http.client.response.body.size` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.connector.http.client.response.body.size" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.default_requirement_level` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.default_requirement_level" -default_requirement_level: none -``` - - ---- - -### `telemetry.instrumentation.instruments.graphql` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.instruments.graphql" -graphql: - field.execution: - attributes: - graphql.field.name: - alias: example_alias - graphql.field.type: - alias: example_alias - graphql.list.length: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.type.name: - alias: example_alias - list.length: - attributes: - graphql.field.name: - alias: example_alias - graphql.field.type: - alias: example_alias - graphql.list.length: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.type.name: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.instruments.graphql.field.execution` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.graphql.field.execution" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.graphql.list.length` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.graphql.list.length" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.router` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.instruments.router" -router: - http.server.active_requests: - attributes: - http.request.method: false - server.address: false - server.port: false - url.scheme: false - http.server.request.body.size: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias - http.server.request.duration: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias - http.server.response.body.size: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.instruments.router.http.server.active_requests` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.router.http.server.active_requests" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.router.http.server.request.body.size` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.router.http.server.request.body.size" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.router.http.server.request.duration` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.router.http.server.request.duration" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.router.http.server.response.body.size` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.router.http.server.response.body.size" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.subgraph` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.instruments.subgraph" -subgraph: - http.client.request.body.size: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.request.duration: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias - http.client.response.body.size: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.instruments.subgraph.http.client.request.body.size` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.subgraph.http.client.request.body.size" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.subgraph.http.client.request.duration` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.subgraph.http.client.request.duration" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.subgraph.http.client.response.body.size` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.subgraph.http.client.response.body.size" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.supergraph` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.instruments.supergraph" -supergraph: - cost.actual: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias - cost.delta: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias - cost.estimated: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.instruments.supergraph.cost.actual` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.supergraph.cost.actual" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.supergraph.cost.delta` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.supergraph.cost.delta" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.instruments.supergraph.cost.estimated` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.instruments.supergraph.cost.estimated" -# Value not generated in example data -``` - - ---- - -### `telemetry.instrumentation.spans` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.spans" -spans: - connector: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias - default_attribute_requirement_level: none - mode: deprecated - router: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias - subgraph: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias - supergraph: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.spans.connector` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.spans.connector" -connector: - attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.spans.connector.attributes` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.spans.connector.attributes" -attributes: - connector.http.method: - alias: example_alias - connector.source.name: - alias: example_alias - connector.url.template: - alias: example_alias - subgraph.name: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.spans.default_attribute_requirement_level` - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.spans.default_attribute_requirement_level" -default_attribute_requirement_level: none -``` - - ---- - -### `telemetry.instrumentation.spans.mode` - -Span mode to create new or deprecated spans - -- **Type:** `any` - -```yaml title="telemetry.instrumentation.spans.mode" -mode: deprecated -``` - - ---- - -### `telemetry.instrumentation.spans.router` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.spans.router" -router: - attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.spans.router.attributes` - -Common attributes for http server and client. See https://opentelemetry.io/docs/specs/semconv/http/http-spans/#common-attributes - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.spans.router.attributes" -attributes: - baggage: null - dd.trace_id: - alias: example_alias - error.type: - alias: example_alias - http.request.body.size: - alias: example_alias - http.request.method: - alias: example_alias - http.response.body.size: - alias: example_alias - http.response.status_code: - alias: example_alias - http.route: - alias: example_alias - network.local.address: - alias: example_alias - network.local.port: - alias: example_alias - network.peer.address: - alias: example_alias - network.peer.port: - alias: example_alias - network.protocol.name: - alias: example_alias - network.protocol.version: - alias: example_alias - network.transport: - alias: example_alias - network.type: - alias: example_alias - server.address: - alias: example_alias - server.port: - alias: example_alias - trace_id: - alias: example_alias - url.path: - alias: example_alias - url.query: - alias: example_alias - url.scheme: - alias: example_alias - user_agent.original: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.spans.subgraph` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.spans.subgraph" -subgraph: - attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.spans.subgraph.attributes` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.spans.subgraph.attributes" -attributes: - http.request.resend_count: - alias: example_alias - subgraph.graphql.document: - alias: example_alias - subgraph.graphql.operation.name: - alias: example_alias - subgraph.graphql.operation.type: - alias: example_alias - subgraph.name: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.spans.supergraph` - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.spans.supergraph" -supergraph: - attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias -``` - - ---- - -### `telemetry.instrumentation.spans.supergraph.attributes` - -Attributes for Cost - -- **Type:** `object` - -```yaml title="telemetry.instrumentation.spans.supergraph.attributes" -attributes: - cost.actual: - alias: example_alias - cost.delta: - alias: example_alias - cost.estimated: - alias: example_alias - cost.result: - alias: example_alias - graphql.document: - alias: example_alias - graphql.operation.name: - alias: example_alias - graphql.operation.type: - alias: example_alias -``` - - ---- - -### `tls` - -TLS related configuration options. - -- **Type:** `object` - -```yaml title="tls" -tls: - connector: - all: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - sources: {} - subgraph: - all: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - subgraphs: {} - supergraph: - certificate: example_certificate - certificate_chain: example_certificate_chain - key: example_key -``` - - ---- - -### `tls.connector` - -- **Type:** `object` - -```yaml title="tls.connector" -connector: - all: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - sources: {} -``` - - ---- - -### `tls.connector.all` - -Configuration options pertaining to the subgraph server component. - -- **Type:** `object` - -```yaml title="tls.connector.all" -all: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key -``` - - ---- - -### `tls.connector.all.certificate_authorities` - -list of certificate authorities in PEM format - -- **Type:** `string` -- **Default:** `None` - -```yaml title="tls.connector.all.certificate_authorities" -certificate_authorities: null -``` - - ---- - -### `tls.connector.all.client_authentication` - -TLS client authentication - -- **Type:** `object` - -```yaml title="tls.connector.all.client_authentication" -client_authentication: - certificate_chain: example_certificate_chain - key: example_key -``` - - ---- - -### `tls.connector.all.client_authentication.certificate_chain` - -list of certificates in PEM format - -- **Type:** `string` - -```yaml title="tls.connector.all.client_authentication.certificate_chain" -certificate_chain: example_certificate_chain -``` - - ---- - -### `tls.connector.all.client_authentication.key` - -key in PEM format - -- **Type:** `string` - -```yaml title="tls.connector.all.client_authentication.key" -key: example_key -``` - - ---- - -### `tls.connector.sources` - -Map of subgraph_name.connector_source_name to configuration - -- **Type:** `object` -- **Default:** `{}` - -```yaml title="tls.connector.sources" -sources: {} -``` - - ---- - -### `tls.subgraph` - -Configuration options pertaining to the subgraph server component. - -- **Type:** `object` - -```yaml title="tls.subgraph" -subgraph: - all: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key - subgraphs: {} -``` - - ---- - -### `tls.subgraph.all` - -Configuration options pertaining to the subgraph server component. - -- **Type:** `object` - -```yaml title="tls.subgraph.all" -all: - certificate_authorities: null - client_authentication: - certificate_chain: example_certificate_chain - key: example_key -``` - - ---- - -### `tls.subgraph.all.certificate_authorities` - -list of certificate authorities in PEM format - -- **Type:** `string` -- **Default:** `None` - -```yaml title="tls.subgraph.all.certificate_authorities" -certificate_authorities: null -``` - - ---- - -### `tls.subgraph.all.client_authentication` - -TLS client authentication - -- **Type:** `object` - -```yaml title="tls.subgraph.all.client_authentication" -client_authentication: - certificate_chain: example_certificate_chain - key: example_key -``` - - ---- - -### `tls.subgraph.all.client_authentication.certificate_chain` - -list of certificates in PEM format - -- **Type:** `string` - -```yaml title="tls.subgraph.all.client_authentication.certificate_chain" -certificate_chain: example_certificate_chain -``` - - ---- - -### `tls.subgraph.all.client_authentication.key` - -key in PEM format - -- **Type:** `string` - -```yaml title="tls.subgraph.all.client_authentication.key" -key: example_key -``` - - ---- - -### `tls.subgraph.subgraphs` - -per subgraph options - -- **Type:** `object` -- **Default:** `{}` - -```yaml title="tls.subgraph.subgraphs" -subgraphs: {} -``` - - ---- - -### `tls.supergraph` - -Configuration options pertaining to the supergraph server component. - -- **Type:** `object` - -```yaml title="tls.supergraph" -supergraph: - certificate: example_certificate - certificate_chain: example_certificate_chain - key: example_key -``` - - ---- - -### `tls.supergraph.certificate` - -server certificate in PEM format - -- **Type:** `string` - -```yaml title="tls.supergraph.certificate" -certificate: example_certificate -``` - - ---- - -### `tls.supergraph.certificate_chain` - -list of certificate authorities in PEM format - -- **Type:** `string` - -```yaml title="tls.supergraph.certificate_chain" -certificate_chain: example_certificate_chain + preview_extended_error_metrics: disabled + subgraph: + all: + redact: true + redaction_policy: strict + send: true + subgraphs: {} + experimental_local_field_metrics: false + experimental_otlp_endpoint: https://usage-reporting.api.apollographql.com/ + experimental_otlp_tracing_protocol: grpc + field_level_instrumentation_sampler: 0.0 + metrics_reference_mode: extended + otlp_tracing_sampler: 0.0 + send_headers: + only: + - example_only_item + send_variable_values: + only: + - example_only_item + signature_normalization_algorithm: legacy + exporters: + logging: + common: + resource: {} + service_name: null + service_namespace: null + stdout: + enabled: true + format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] + rate_limit: + capacity: 1 + enabled: false + interval: + nanos: 0 + secs: 1 + tty_format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] + metrics: + common: + buckets: + - 0.001 + - 0.005 + - 0.015 + - 0.05 + - 0.1 + - 0.2 + - 0.3 + - 0.4 + - 0.5 + - 1.0 + - 5.0 + - 10.0 + resource: {} + service_name: null + service_namespace: null + views: + - aggregation: + histogram: + buckets: + - 0.0 + allowed_attribute_keys: + - example_allowed_attribute_keys_item + description: example_description + name: example_name + unit: example_unit + otlp: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} + http: + headers: {} + protocol: grpc + temporality: cumulative + prometheus: + enabled: false + listen: example_listen + path: /metrics + tracing: + common: + max_attributes_per_event: 128 + max_attributes_per_link: 128 + max_attributes_per_span: 128 + max_events_per_span: 128 + max_links_per_span: 128 + parent_based_sampler: true + preview_datadog_agent_sampling: null + resource: {} + sampler: 0.0 + service_name: null + service_namespace: null + datadog: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enable_span_mapping: true + enabled: false + endpoint: example_endpoint + fixed_span_names: true + resource_mapping: {} + span_metrics: + connect: true + connect_request: true + execution: true + http_request: true + parse_query: true + query_planning: true + request: true + router: true + subgraph: true + subgraph_request: true + supergraph: true + experimental_response_trace_id: + enabled: false + format: hexadecimal + header_name: example_header_name + otlp: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} + http: + headers: {} + protocol: grpc + temporality: cumulative + propagation: + aws_xray: false + baggage: false + datadog: false + jaeger: false + request: + format: hexadecimal + header_name: example_header_name + trace_context: false + zipkin: false + zipkin: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + instrumentation: + events: + connector: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + router: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + subgraph: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + supergraph: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + instruments: + cache: + apollo.router.operations.entity.cache: + attributes: + graphql.type.name: + alias: example_alias + connector: + http.client.request.body.size: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.request.duration: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.response.body.size: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + default_requirement_level: none + graphql: + field.execution: + attributes: + graphql.field.name: + alias: example_alias + graphql.field.type: + alias: example_alias + graphql.list.length: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.type.name: + alias: example_alias + list.length: + attributes: + graphql.field.name: + alias: example_alias + graphql.field.type: + alias: example_alias + graphql.list.length: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.type.name: + alias: example_alias + router: + http.server.active_requests: + attributes: + http.request.method: false + server.address: false + server.port: false + url.scheme: false + http.server.request.body.size: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + http.server.request.duration: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + http.server.response.body.size: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + subgraph: + http.client.request.body.size: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.request.duration: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.response.body.size: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + supergraph: + cost.actual: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + cost.delta: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + cost.estimated: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + spans: + connector: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + default_attribute_requirement_level: none + mode: deprecated + router: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + subgraph: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + supergraph: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias ``` --- -### `tls.supergraph.key` +### `tls` -server key in PEM format +TLS related configuration options. -- **Type:** `string` +- **Type:** `object` -```yaml title="tls.supergraph.key" -key: example_key +```yaml title="tls" +tls: + connector: + all: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + sources: {} + subgraph: + all: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + subgraphs: {} + supergraph: + certificate: example_certificate + certificate_chain: example_certificate_chain + key: example_key ``` @@ -9912,373 +1467,3 @@ traffic_shaping: timeout: null subgraphs: {} ``` - - ---- - -### `traffic_shaping.all` - -Traffic shaping options - -- **Type:** `object` - -```yaml title="traffic_shaping.all" -all: - compression: gzip - deduplicate_query: false - dns_resolution_strategy: ipv4_only - experimental_http2: enable - global_rate_limit: - capacity: 1 - interval: 30s - timeout: null -``` - - ---- - -### `traffic_shaping.all.compression` - -- **Type:** `any` - -```yaml title="traffic_shaping.all.compression" -compression: gzip -``` - - ---- - -### `traffic_shaping.all.deduplicate_query` - -Enable query deduplication - -- **Type:** `boolean` - -```yaml title="traffic_shaping.all.deduplicate_query" -deduplicate_query: false -``` - - ---- - -### `traffic_shaping.all.dns_resolution_strategy` - -- **Type:** `any` - -```yaml title="traffic_shaping.all.dns_resolution_strategy" -dns_resolution_strategy: ipv4_only -``` - - ---- - -### `traffic_shaping.all.experimental_http2` - -- **Type:** `any` - -```yaml title="traffic_shaping.all.experimental_http2" -experimental_http2: enable -``` - - ---- - -### `traffic_shaping.all.global_rate_limit` - -- **Type:** `object` - -```yaml title="traffic_shaping.all.global_rate_limit" -global_rate_limit: - capacity: 1 - interval: 30s -``` - - ---- - -### `traffic_shaping.all.global_rate_limit.capacity` - -Number of requests allowed - -- **Type:** `integer` -- **Minimum:** `1.0` - -```yaml title="traffic_shaping.all.global_rate_limit.capacity" -capacity: 1 -``` - - ---- - -### `traffic_shaping.all.global_rate_limit.interval` - -Per interval - -- **Type:** `string` - -```yaml title="traffic_shaping.all.global_rate_limit.interval" -interval: 30s -``` - - ---- - -### `traffic_shaping.all.timeout` - -Enable timeout for incoming requests - -- **Type:** `string` -- **Default:** `None` - -```yaml title="traffic_shaping.all.timeout" -timeout: null -``` - - ---- - -### `traffic_shaping.connector` - -- **Type:** `object` - -```yaml title="traffic_shaping.connector" -connector: - all: - compression: gzip - dns_resolution_strategy: ipv4_only - experimental_http2: enable - global_rate_limit: - capacity: 1 - interval: 30s - timeout: null - sources: {} -``` - - ---- - -### `traffic_shaping.connector.all` - -- **Type:** `object` - -```yaml title="traffic_shaping.connector.all" -all: - compression: gzip - dns_resolution_strategy: ipv4_only - experimental_http2: enable - global_rate_limit: - capacity: 1 - interval: 30s - timeout: null -``` - - ---- - -### `traffic_shaping.connector.all.compression` - -- **Type:** `any` - -```yaml title="traffic_shaping.connector.all.compression" -compression: gzip -``` - - ---- - -### `traffic_shaping.connector.all.dns_resolution_strategy` - -- **Type:** `any` - -```yaml title="traffic_shaping.connector.all.dns_resolution_strategy" -dns_resolution_strategy: ipv4_only -``` - - ---- - -### `traffic_shaping.connector.all.experimental_http2` - -- **Type:** `any` - -```yaml title="traffic_shaping.connector.all.experimental_http2" -experimental_http2: enable -``` - - ---- - -### `traffic_shaping.connector.all.global_rate_limit` - -- **Type:** `object` - -```yaml title="traffic_shaping.connector.all.global_rate_limit" -global_rate_limit: - capacity: 1 - interval: 30s -``` - - ---- - -### `traffic_shaping.connector.all.global_rate_limit.capacity` - -Number of requests allowed - -- **Type:** `integer` -- **Minimum:** `1.0` - -```yaml title="traffic_shaping.connector.all.global_rate_limit.capacity" -capacity: 1 -``` - - ---- - -### `traffic_shaping.connector.all.global_rate_limit.interval` - -Per interval - -- **Type:** `string` - -```yaml title="traffic_shaping.connector.all.global_rate_limit.interval" -interval: 30s -``` - - ---- - -### `traffic_shaping.connector.all.timeout` - -Enable timeout for connectors requests - -- **Type:** `string` -- **Default:** `None` - -```yaml title="traffic_shaping.connector.all.timeout" -timeout: null -``` - - ---- - -### `traffic_shaping.connector.sources` - -Applied on specific connector sources - -- **Type:** `object` - -```yaml title="traffic_shaping.connector.sources" -sources: {} -``` - - ---- - -### `traffic_shaping.deduplicate_variables` - -DEPRECATED, now always enabled: Enable variable deduplication optimization when sending requests to subgraphs (https://github.com/apollographql/router/issues/87) - -- **Type:** `boolean` -- **Default:** `None` - -```yaml title="traffic_shaping.deduplicate_variables" -deduplicate_variables: null -``` - - ---- - -### `traffic_shaping.router` - -- **Type:** `object` - -```yaml title="traffic_shaping.router" -router: - concurrency_limit: 0 - global_rate_limit: - capacity: 1 - interval: 30s - timeout: null -``` - - ---- - -### `traffic_shaping.router.concurrency_limit` - -The global concurrency limit - -- **Type:** `integer` -- **Minimum:** `0.0` - -```yaml title="traffic_shaping.router.concurrency_limit" -concurrency_limit: 0 -``` - - ---- - -### `traffic_shaping.router.global_rate_limit` - -- **Type:** `object` - -```yaml title="traffic_shaping.router.global_rate_limit" -global_rate_limit: - capacity: 1 - interval: 30s -``` - - ---- - -### `traffic_shaping.router.global_rate_limit.capacity` - -Number of requests allowed - -- **Type:** `integer` -- **Minimum:** `1.0` - -```yaml title="traffic_shaping.router.global_rate_limit.capacity" -capacity: 1 -``` - - ---- - -### `traffic_shaping.router.global_rate_limit.interval` - -Per interval - -- **Type:** `string` - -```yaml title="traffic_shaping.router.global_rate_limit.interval" -interval: 30s -``` - - ---- - -### `traffic_shaping.router.timeout` - -Enable timeout for incoming requests - -- **Type:** `string` -- **Default:** `None` - -```yaml title="traffic_shaping.router.timeout" -timeout: null -``` - - ---- - -### `traffic_shaping.subgraphs` - -Applied on specific subgraphs - -- **Type:** `object` - -```yaml title="traffic_shaping.subgraphs" -subgraphs: {} -``` diff --git a/docs/source/routing/about-router.mdx b/docs/source/routing/about-router.mdx index a12dcaa6f6..40ef4c2caa 100644 --- a/docs/source/routing/about-router.mdx +++ b/docs/source/routing/about-router.mdx @@ -8,7 +8,7 @@ redirectFrom: ## What is GraphOS Router? -GraphOS Router is the high-performance runtime of the GraphOS platform. It's the single entry point to a graph that's composed via Apollo Federation. GraphOS Router accepts incoming GraphQL client operations, intelligently plans their execution by the different "subgraph" APIs and services, and combines the fetched data into a single client response. +GraphOS Router is the runtime of the GraphOS platform. It's the single entry point to a graph that's composed via Apollo Federation. GraphOS Router accepts incoming GraphQL client operations, intelligently plans their execution by the different APIs and services, and combines the fetched data into a single client response. @@ -54,22 +54,6 @@ The GraphOS Router is the gateway and entry point to a federated supergraph. Cli As the entry point to your supergraph, a GraphOS Router must be able to process the expected load of client operations. The scalability and performance of a router, or a fleet or router instances, can be influenced by their deployment infrastructure. -### Cloud-hosted routers - -You can choose for Apollo to provision and manage the runtime infrastructure for your routers. Apollo hosts and deploys each instance of router in the cloud. Each _cloud-hosted router_ instance is fully integrated and configurable within GraphOS. - - - - - - -While cloud routers are hosted in the cloud, GraphQL subgraph servers are still hosted in your infrastructure. - - - ### Self-hosted routers You can choose to manage the runtime infrastructure for your routers by yourself. Using container images of router, you can host and deploy your router instances from your own infrastructure. These _self-hosted router_ instances allow you full control over their deployment. @@ -88,10 +72,28 @@ For requests in excess of this limit, the router returns an HTTP 503 (Service Un -### Common router core +### Cloud-hosted routers + +You can choose for Apollo to provision and manage the runtime infrastructure for your routers. Apollo hosts and deploys each instance of router in the cloud. Each _cloud-hosted router_ instance is fully integrated and configurable within GraphOS. + + + + + + +While cloud routers are hosted in the cloud, GraphQL subgraph servers are still hosted in your infrastructure. + + + +## Common router core Both cloud-hosted and self-hosted routers are powered by the [Apollo Router Core](https://github.com/apollographql/router)—a high-performance router packaged as a standalone binary. +A GraphOS Router is an Apollo Router Core binary with a [licensed GraphOS plan](https://www.apollographql.com/pricing). + ### Router type comparison Apollo offers the following router options, in increasing order of configurability: diff --git a/docs/source/routing/configuration/cli.mdx b/docs/source/routing/configuration/cli.mdx index fba74b1c31..46e2375347 100644 --- a/docs/source/routing/configuration/cli.mdx +++ b/docs/source/routing/configuration/cli.mdx @@ -234,3 +234,82 @@ If set, the router prints its version number, then exits. + +### Development mode + +The router can be run in development mode by using the `--dev` command-line option. + +The `--dev` option is equivalent to running the router with the `--hot-reload` option the following configuration options: + +```yaml +sandbox: + enabled: true +homepage: + enabled: false +supergraph: + introspection: true +include_subgraph_errors: + all: true +plugins: + # Enable with the header, Apollo-Expose-Query-Plan: true + experimental.expose_query_plan: true +``` + + + +**Don't set the `--dev` option in production.** If you want to replicate any specific dev mode functionality in production, set the corresponding option in your [YAML config file](#yaml-config-file). + + + + +## Configuration schema for IDE validation + +The router can generate a JSON schema for config validation in your text editor. This schema helps you format the YAML file correctly and also provides content assist. + +Generate the schema with the following command: + +```bash +./router config schema > configuration_schema.json +``` + +After you generate the schema, configure your text editor. Here are the instructions for some commonly used editors: + +- [Visual Studio Code](https://code.visualstudio.com/docs/languages/json#_json-schemas-and-settings) +- [Emacs](https://emacs-lsp.github.io/lsp-mode/page/lsp-yaml) +- [IntelliJ](https://www.jetbrains.com/help/idea/json.html#ws_json_using_schemas) +- [Sublime](https://github.com/sublimelsp/LSP-yaml) +- [Vim](https://github.com/Quramy/vison) + +## Upgrading your router configuration + +New releases of the router might introduce breaking changes to the [YAML config file's](#yaml-config-file) expected format, usually to extend existing functionality or improve usability. + +**If you run a new version of your router with a configuration file that it no longer supports, it emits a warning on startup and terminates.** + +If you encounter this warning, you can use the `router config upgrade` command to see the new expected format for your existing configuration file: + +```bash +./router config upgrade +``` + +You can also view a diff of exactly which changes are necessary to upgrade your existing configuration file: + +```bash +./router config upgrade --diff +``` + +## Validating your router configuration + +The router can be used to validate an existing configuration file. This can be useful if you want to have a validate step as part of your CI pipeline. + +``` +./router config validate +``` + +This command takes a config file and validates it against the router's full supported configuration format. + + + +This is a static validation that checks if it is syntactically correct using the JSON schema. The router does additional logical checks on startup against the config that this command does not capture. + + diff --git a/docs/source/routing/configuration/yaml.mdx b/docs/source/routing/configuration/yaml.mdx index 4e6b7bb294..940e0c9a03 100644 --- a/docs/source/routing/configuration/yaml.mdx +++ b/docs/source/routing/configuration/yaml.mdx @@ -18,6 +18,12 @@ At startup, you set the config file for your router by providing its path with t ./router --config router.yaml ``` + + +Enable your text editor to validate the format and content of your router YAML configuration file by [configuring it with the router's configuration schema](/graphos/routing/configuration/cli#configuration-schema-for-ide-validation). + + + ### Example YAML config file Expand the code block to view an example YAML config file containing all properties. diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx index 85b07b24bc..e016cc1fc0 100644 --- a/docs/source/routing/get-started.mdx +++ b/docs/source/routing/get-started.mdx @@ -1,12 +1,12 @@ --- title: Apollo Router Quickstart -subtitle: Run the router in dev mode for an example graph +subtitle: Run a router binary locally description: This quickstart tutorial walks you through installing an Apollo Router binary, running it with an example supergraph schema, and making test queries with Apollo Sandbox --- import ElasticNotice from "../../shared/elastic-notice.mdx"; -Hello! Let's run an Apollo Router binary for the very first time. +Hello! Let's run Apollo Router for the very first time. You will: @@ -14,7 +14,7 @@ You will: - Download a router binary. - Download a supergraph schema. - Run the router for your supergraph in development mode. -- Make queries to the running router with the Apollo Sandbox IDE. +- Make a query to the running router. ## Concept: Apollo Router is the graph runtime diff --git a/docs/source/routing/security/request-limits-overview.mdx b/docs/source/routing/security/request-limits-overview.mdx new file mode 100644 index 0000000000..c8dbb1e7d3 --- /dev/null +++ b/docs/source/routing/security/request-limits-overview.mdx @@ -0,0 +1,32 @@ +--- +title: Request Limits +subtitle: Protect your router from requests exceeding network, parser, and operation-based limits +redirectFrom: + - /router/configuration/operation-limits/ +--- + +For enhanced security, the GraphOS Router can reject requests that violate any of the following kinds of limits: + +- Operation-based semantic limits +- Network-based limits +- Parser-based lexical limits + +```yaml title="router.yaml" +limits: + # Network-based limits + http_max_request_bytes: 2000000 # Default value: 2 MB + http1_max_request_headers: 200 # Default value: 100 + http1_max_request_buf_size: 800kb # Default value: 400kib + + # Parser-based limits + parser_max_tokens: 15000 # Default value + parser_max_recursion: 500 # Default value + + # Operation-based limits (Enterprise only) + max_depth: 100 + max_height: 200 + max_aliases: 30 + max_root_fields: 20 +``` + +Learn more about [configuring request limits](/graphos/routing/security/request-limits). diff --git a/docs/source/routing/security/request-limits.mdx b/docs/source/routing/security/request-limits.mdx index c081f350be..a2cf045fd5 100644 --- a/docs/source/routing/security/request-limits.mdx +++ b/docs/source/routing/security/request-limits.mdx @@ -1,15 +1,11 @@ --- -title: Request Limits -subtitle: Protect your router from requests exceeding network, parser, and operation-based limits +title: Request Limits Configuration +subtitle: Configure network, parser, and operation-based limits redirectFrom: - /router/configuration/operation-limits/ --- -For enhanced security, the GraphOS Router can reject requests that violate any of the following kinds of limits: - -- Operation-based semantic limits -- Network-based limits -- Parser-based lexical limits +Learn how to configure network, parser, and operation-based request limits. ```yaml title="router.yaml" limits: From 0bb6c50861065274cb567f057fbba1fe9bc994de Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Tue, 29 Apr 2025 13:51:12 -0700 Subject: [PATCH 24/47] copyedits --- docs/source/routing/about-router.mdx | 22 ++++++++++------------ docs/source/routing/get-started.mdx | 23 ++++++----------------- docs/source/routing/security/tls.mdx | 21 ++++++++++++++++----- 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/docs/source/routing/about-router.mdx b/docs/source/routing/about-router.mdx index 40ef4c2caa..90ddad9b43 100644 --- a/docs/source/routing/about-router.mdx +++ b/docs/source/routing/about-router.mdx @@ -1,6 +1,6 @@ --- -title: Supergraph Routing with GraphOS Router -subtitle: Learn the basics about router features and deployment types +title: What's a Router? +subtitle: Runtime for graph-based API orchestration description: Apollo provides cloud and self-hosted GraphOS Router options. The router acts as an entry point to your GraphQL APIs and provides a unified interface for clients to interact with. redirectFrom: - /graphos/routing @@ -8,7 +8,7 @@ redirectFrom: ## What is GraphOS Router? -GraphOS Router is the runtime of the GraphOS platform. It's the single entry point to a graph that's composed via Apollo Federation. GraphOS Router accepts incoming GraphQL client operations, intelligently plans their execution by the different APIs and services, and combines the fetched data into a single client response. +GraphOS Router is a graph runtime. It's a gateway from GraphQL clients to a federated graph ("supergraph") that's managed by the GraphOS platform. A router receives client requests, orchestrates calls to the various APIs that make up a graph (the "subgraphs") to efficiently fetch the requested data, and bundles the fetched data into a client response. +Because Apollo uses GraphQL and Apollo Federation to define a graph, each router is an endpoint of a GraphQL API. Like API gateways in general, a router offers a central place to implement cross-cutting concerns, such as authentication, authorization, caching, logging, monitoring, rate limiting, and demand control. These and other features of the router are configurable declaratively via YAML. + ### Runtime of GraphOS platform As the runtime of the [GraphOS platform](/graphos/get-started/concepts/graphos), a GraphOS Router gets the supergraph schema—the blueprint of the federated graphs—from the GraphOS control plane. It then executes incoming clients operations based on that schema. Unlike API gateways that offer capabilities to manage API endpoints, the router isn't based on URLs or REST endpoints. Rather, the router is a GraphQL-native solution for handling client APIs. -### Enables Apollo Connectors - -Apollo Connectors are a core feature of the router, enabling API orchestration with REST APIs. - - - - ### Subgraph query planner Whenever your router receives an incoming GraphQL operation, it needs to figure out how to use your subgraphs to populate data for each of that operation's fields. To do this, the router generates a _query plan_: @@ -36,7 +31,7 @@ Whenever your router receives an incoming GraphQL operation, it needs to figure -A query plan is a blueprint for dividing a single incoming operation into one or more operations that are each resolvable by a single subgraph. Some of these operations depend on the results of other operations, so the query plan also defines any required ordering for their execution. The router's query planner determines the optimal set of subgraph queries for each client operation, then it merges the subgraph responses into a single response for the client. +A query plan is a blueprint for dividing a single incoming operation into one or more operations that are each resolvable by a single subgraph. Some of these operations depend on the results of other operations, so the query plan also defines any required ordering for their execution. The router's _query planner_ determines the optimal set of subgraph queries for each client operation, then merges the subgraph responses into a single response for the client. You can use the following tools for inspecting query plans: @@ -49,7 +44,6 @@ You can use the following tools for inspecting query plans: The GraphOS Router is the gateway and entry point to a federated supergraph. Clients send GraphQL operations to your router's public endpoint instead of directly to your APIs. - ## GraphOS Router deployment types As the entry point to your supergraph, a GraphOS Router must be able to process the expected load of client operations. The scalability and performance of a router, or a fleet or router instances, can be influenced by their deployment infrastructure. @@ -92,8 +86,12 @@ While cloud routers are hosted in the cloud, GraphQL subgraph servers are still Both cloud-hosted and self-hosted routers are powered by the [Apollo Router Core](https://github.com/apollographql/router)—a high-performance router packaged as a standalone binary. + + A GraphOS Router is an Apollo Router Core binary with a [licensed GraphOS plan](https://www.apollographql.com/pricing). + + ### Router type comparison Apollo offers the following router options, in increasing order of configurability: diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx index e016cc1fc0..59eeb3bfcd 100644 --- a/docs/source/routing/get-started.mdx +++ b/docs/source/routing/get-started.mdx @@ -6,24 +6,13 @@ description: This quickstart tutorial walks you through installing an Apollo Rou import ElasticNotice from "../../shared/elastic-notice.mdx"; -Hello! Let's run Apollo Router for the very first time. +Hello! Let's run Apollo Router for the very first time. You will: -You will: - -- Learn why the router is a graph's runtime. - Download a router binary. - Download a supergraph schema. - Run the router for your supergraph in development mode. - Make a query to the running router. -## Concept: Apollo Router is the graph runtime - -Apollo Router is the graph runtime of Apollo. It receives client requests, intelligently orchestrates calls to the various APIs that make up a graph, then bundles the fetched data into a client response. - -Because Apollo uses GraphQL and Apollo Federation to define a graph, each router is an endpoint of a GraphQL API. It's the gateway for all client requests to a federated graph, or "supergraph." Like API gateways in general, a router offers a central place to implement cross-cutting concerns, such as authentication, authorization, caching, logging, monitoring, rate limiting, and demand control. These and other features of the router are configurable declaratively via YAML. - -You can deploy the router locally or at scale in containers on your own infrastructure. This guide walks you through the basics of running the router locally. - ## 1. Download and extract the router binary Let's start by downloading a router binary. @@ -243,7 +232,7 @@ A router in dev mode runs its own [Apollo Sandbox](/graphos/explorer/sandbox/), Let's use Sandbox to write and send a query to your graph: -1. Open a browser and go to the URL of the router's Sandbox, `http://127.0.0.1:4000`. +1. Go to the URL of the router's Sandbox, [`http://127.0.0.1:4000`](http://127.0.0.1:4000). 1. Copy and paste the example query into the **Operation** pane: @@ -276,8 +265,8 @@ That's it! You've successfully sent a query to a router running a development gr ## Next steps -Now that you know how to run the router in dev mode with a supergraph schema, you can: +Now that you know how to run the router locally in dev mode with a supergraph schema, you can: -- Explore router's [GraphOS features](/graphos/routing/features) -- Deploy the router [in your own infrastructure](/graphos/routing/self-hosted/containerization/overview) -- Learn how to [configure the router](/router/configuration/overview) +- Understand concepts [about the router](/graphos/routing/about-router). +- Learn how to [configure the router](/router/configuration/overview). +- Deploy the router [in your own infrastructure](/graphos/routing/self-hosted/containerization/overview). diff --git a/docs/source/routing/security/tls.mdx b/docs/source/routing/security/tls.mdx index 97d1af2187..7f21e938a3 100644 --- a/docs/source/routing/security/tls.mdx +++ b/docs/source/routing/security/tls.mdx @@ -7,17 +7,27 @@ redirectFrom: The GraphOS Router supports TLS to authenticate and encrypt communications, both on the client side and the subgraph side. It works automatically on the subgraph side if the subgraph URL starts with `https://`. +```yaml title="Example TLS configuration" +tls: + supergraph: + certificate: ${file./path/to/certificate.pem} + certificate_chain: ${file./path/to/certificate_chain.pem} + key: ${file./path/to/key.pem} +``` + ## Configuring TLS TLS support is configured in the `tls` section, under the `supergraph` key for the client side, and the `subgraph` key for the subgraph side, with configuration possible for all subgraphs and overriding per subgraph. -The list of supported TLS versions and algorithms is static, it cannot be configured. +The list of supported TLS versions and algorithms is static. + +### Supported TLS versions -Supported TLS versions: * TLS 1.2 * TLS 1.3 -Supported cipher suites: +### Supported TLS cipher suites + * TLS13_AES_256_GCM_SHA384 * TLS13_AES_128_GCM_SHA256 * TLS13_CHACHA20_POLY1305_SHA256 @@ -28,14 +38,15 @@ Supported cipher suites: * TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 * TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 -Supported key exchange groups: +### Supported key exchange groups + * X25519 * SECP256R1 * SECP384R1 ## TLS termination -Clients can connect to the router directly over HTTPS, without terminating TLS in an intermediary. You can configure this in the `tls` configuration section: +Clients can connect to the router directly over HTTPS, without terminating TLS in an intermediary. You can configure this in the `tls` configuration section: ```yaml tls: From 2bcb4126aee3e3dd52fcc1c64c4dcada4543d82c Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Tue, 29 Apr 2025 14:33:32 -0700 Subject: [PATCH 25/47] edit get started --- docs/source/routing/get-started.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx index 59eeb3bfcd..3fa501df93 100644 --- a/docs/source/routing/get-started.mdx +++ b/docs/source/routing/get-started.mdx @@ -8,14 +8,14 @@ import ElasticNotice from "../../shared/elastic-notice.mdx"; Hello! Let's run Apollo Router for the very first time. You will: -- Download a router binary. +- Download and install a router binary. - Download a supergraph schema. - Run the router for your supergraph in development mode. - Make a query to the running router. -## 1. Download and extract the router binary +## 1. Install router binary -Let's start by downloading a router binary. +Let's start by downloading and installing a router binary. 1. Download and install the latest version of the router binary with a single command line: @@ -44,7 +44,7 @@ Let's start by downloading a router binary. ``` -## 2. Download a supergraph schema +## 2. Download supergraph schema A router needs a schema for the federated graph, or "supergraph", that it's orchestrating. For this guide, we're downloading an example supergraph schema, which we'll provide to the router when running it. From a1869cf7941c4ec3391de1e31d76a6b6774b7122 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Wed, 30 Apr 2025 11:28:39 -0700 Subject: [PATCH 26/47] generate changelog --- docs/source/routing/changelog.mdx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/source/routing/changelog.mdx b/docs/source/routing/changelog.mdx index 44a2abcbb6..29fb4991f7 100644 --- a/docs/source/routing/changelog.mdx +++ b/docs/source/routing/changelog.mdx @@ -1,9 +1,16 @@ --- title: Apollo Router Changelogs subtitle: "" -description: Changelogs of Apollo Router releases +description: Changelog of latest Apollo Router release --- -Apollo maintains a changelog for each router release in GitHub. +This page contains the changelog for the latest release of Apollo Router. -Go to [router releases in GitHub](https://github.com/apollographql/router/releases) to view changelogs. +> Go to [GitHub](https://github.com/apollographql/router/releases) to view changelogs for all router releases. + + + +## {release.version} + + + From 5649e3900ad2322b434026614933a559bfb41e37 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Wed, 30 Apr 2025 21:03:33 -0700 Subject: [PATCH 27/47] shared config property pages --- docs/shared/config/apq.mdx | 34 + docs/shared/config/authentication.mdx | 44 + docs/shared/config/authorization.mdx | 17 + docs/shared/config/batching.mdx | 16 + docs/shared/config/connectors.mdx | 12 + docs/shared/config/coprocessor.mdx | 98 ++ docs/shared/config/cors.mdx | 21 + docs/shared/config/csrf.mdx | 15 + docs/shared/config/demand_control.mdx | 15 + docs/shared/config/experimental.mdx | 22 + ...experimental_type_conditioned_fetching.mdx | 10 + docs/shared/config/fleet_detector.mdx | 7 + docs/shared/config/forbid_mutations.mdx | 9 + docs/shared/config/headers.mdx | 15 + docs/shared/config/health_check.mdx | 17 + docs/shared/config/homepage.mdx | 11 + .../shared/config/include_subgraph_errors.mdx | 11 + docs/shared/config/license_enforcement.mdx | 7 + docs/shared/config/limits.mdx | 20 + docs/shared/config/override_subgraph_url.mdx | 9 + docs/shared/config/persisted_queries.mdx | 19 + docs/shared/config/plugins.mdx | 7 + docs/shared/config/preview.mdx | 63 ++ docs/shared/config/preview_file_uploads.mdx | 17 + docs/shared/config/progressive_override.mdx | 9 + docs/shared/config/rhai.mdx | 11 + docs/shared/config/sandbox.mdx | 10 + docs/shared/config/subscription.mdx | 26 + docs/shared/config/supergraph.mdx | 42 + docs/shared/config/telemetry.mdx | 698 +++++++++++++ docs/shared/config/tls.mdx | 27 + docs/shared/config/traffic_shaping.mdx | 36 + docs/source/routing/configuration/envvars.mdx | 2 +- docs/source/routing/configuration/yaml.mdx | 920 ++---------------- 34 files changed, 1440 insertions(+), 857 deletions(-) create mode 100644 docs/shared/config/apq.mdx create mode 100644 docs/shared/config/authentication.mdx create mode 100644 docs/shared/config/authorization.mdx create mode 100644 docs/shared/config/batching.mdx create mode 100644 docs/shared/config/connectors.mdx create mode 100644 docs/shared/config/coprocessor.mdx create mode 100644 docs/shared/config/cors.mdx create mode 100644 docs/shared/config/csrf.mdx create mode 100644 docs/shared/config/demand_control.mdx create mode 100644 docs/shared/config/experimental.mdx create mode 100644 docs/shared/config/experimental_type_conditioned_fetching.mdx create mode 100644 docs/shared/config/fleet_detector.mdx create mode 100644 docs/shared/config/forbid_mutations.mdx create mode 100644 docs/shared/config/headers.mdx create mode 100644 docs/shared/config/health_check.mdx create mode 100644 docs/shared/config/homepage.mdx create mode 100644 docs/shared/config/include_subgraph_errors.mdx create mode 100644 docs/shared/config/license_enforcement.mdx create mode 100644 docs/shared/config/limits.mdx create mode 100644 docs/shared/config/override_subgraph_url.mdx create mode 100644 docs/shared/config/persisted_queries.mdx create mode 100644 docs/shared/config/plugins.mdx create mode 100644 docs/shared/config/preview.mdx create mode 100644 docs/shared/config/preview_file_uploads.mdx create mode 100644 docs/shared/config/progressive_override.mdx create mode 100644 docs/shared/config/rhai.mdx create mode 100644 docs/shared/config/sandbox.mdx create mode 100644 docs/shared/config/subscription.mdx create mode 100644 docs/shared/config/supergraph.mdx create mode 100644 docs/shared/config/telemetry.mdx create mode 100644 docs/shared/config/tls.mdx create mode 100644 docs/shared/config/traffic_shaping.mdx diff --git a/docs/shared/config/apq.mdx b/docs/shared/config/apq.mdx new file mode 100644 index 0000000000..1a377c49a3 --- /dev/null +++ b/docs/shared/config/apq.mdx @@ -0,0 +1,34 @@ +### `apq` + +Automatic Persisted Queries (APQ) configuration + + + +```yaml title="apq" +apq: + enabled: true + router: + cache: + in_memory: + limit: 1 + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: null + urls: + - http://example.com/urls_item + username: example_username + subgraph: + all: + enabled: false + subgraphs: {} +``` diff --git a/docs/shared/config/authentication.mdx b/docs/shared/config/authentication.mdx new file mode 100644 index 0000000000..a62f8358cb --- /dev/null +++ b/docs/shared/config/authentication.mdx @@ -0,0 +1,44 @@ +### `authentication` + +Authentication + + + +```yaml title="authentication" +authentication: + connector: + sources: {} + router: + jwt: + header_name: authorization + header_value_prefix: Bearer + ignore_other_prefixes: false + jwks: + - algorithms: null + headers: + - name: example_name + value: example_value + issuer: example_issuer + poll_interval: + nanos: 0 + secs: 60 + url: http://service.example.com/url + on_error: Continue + sources: + - name: authorization + type: header + value_prefix: Bearer + subgraph: + all: + aws_sig_v4: + hardcoded: + access_key_id: example_access_key_id + assume_role: + external_id: example_external_id + role_arn: example_role_arn + session_name: example_session_name + region: example_region + secret_access_key: example_secret_access_key + service_name: example_service_name + subgraphs: {} +``` diff --git a/docs/shared/config/authorization.mdx b/docs/shared/config/authorization.mdx new file mode 100644 index 0000000000..ffbb4c64c9 --- /dev/null +++ b/docs/shared/config/authorization.mdx @@ -0,0 +1,17 @@ +### `authorization` + +Authorization plugin + + + +```yaml title="authorization" +authorization: + directives: + dry_run: false + enabled: true + errors: + log: true + response: errors + reject_unauthorized: false + require_authentication: false +``` diff --git a/docs/shared/config/batching.mdx b/docs/shared/config/batching.mdx new file mode 100644 index 0000000000..ca48b58ebf --- /dev/null +++ b/docs/shared/config/batching.mdx @@ -0,0 +1,16 @@ +### `batching` + +Configuration for Batching + + + +```yaml title="batching" +batching: + enabled: false + maximum_size: null + mode: batch_http_link + subgraph: + all: + enabled: false + subgraphs: {} +``` diff --git a/docs/shared/config/connectors.mdx b/docs/shared/config/connectors.mdx new file mode 100644 index 0000000000..88355585bc --- /dev/null +++ b/docs/shared/config/connectors.mdx @@ -0,0 +1,12 @@ +### `connectors` + + + +```yaml title="connectors" +connectors: + debug_extensions: false + expose_sources_in_context: false + max_requests_per_operation_per_source: null + sources: {} + subgraphs: {} +``` diff --git a/docs/shared/config/coprocessor.mdx b/docs/shared/config/coprocessor.mdx new file mode 100644 index 0000000000..647fb9c21d --- /dev/null +++ b/docs/shared/config/coprocessor.mdx @@ -0,0 +1,98 @@ +### `coprocessor` + +Configures the externalization plugin + + + +```yaml title="coprocessor" +coprocessor: + client: + dns_resolution_strategy: ipv4_only + experimental_http2: enable + execution: + request: + body: false + context: false + headers: false + method: false + query_plan: false + sdl: false + response: + body: false + context: false + headers: false + sdl: false + status_code: false + router: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + path: false + sdl: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + sdl: false + status_code: false + subgraph: + all: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + service_name: false + subgraph_request_id: false + uri: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + service_name: false + status_code: false + subgraph_request_id: false + supergraph: + request: + body: false + condition: + eq: + - false + - false + context: false + headers: false + method: false + sdl: false + response: + body: false + condition: + eq: + - false + - false + context: false + headers: false + sdl: false + status_code: false + timeout: + nanos: 0 + secs: 1 + url: http://service.example.com/url +``` diff --git a/docs/shared/config/cors.mdx b/docs/shared/config/cors.mdx new file mode 100644 index 0000000000..8607391123 --- /dev/null +++ b/docs/shared/config/cors.mdx @@ -0,0 +1,21 @@ +### `cors` + +Cross origin request configuration. + + + +```yaml title="cors" +cors: + allow_any_origin: false + allow_credentials: false + allow_headers: [] + expose_headers: null + match_origins: null + max_age: null + methods: + - GET + - POST + - OPTIONS + origins: + - https://studio.apollographql.com +``` diff --git a/docs/shared/config/csrf.mdx b/docs/shared/config/csrf.mdx new file mode 100644 index 0000000000..9b0a832b44 --- /dev/null +++ b/docs/shared/config/csrf.mdx @@ -0,0 +1,15 @@ +### `csrf` + +CSRF protection configuration. + +See https://owasp.org/www-community/attacks/csrf for an explanation on CSRF attacks. + + + +```yaml title="csrf" +csrf: + required_headers: + - x-apollo-operation-name + - apollo-require-preflight + unsafe_disabled: false +``` diff --git a/docs/shared/config/demand_control.mdx b/docs/shared/config/demand_control.mdx new file mode 100644 index 0000000000..8bb087ee61 --- /dev/null +++ b/docs/shared/config/demand_control.mdx @@ -0,0 +1,15 @@ +### `demand_control` + +Demand control configuration + + + +```yaml title="demand_control" +demand_control: + enabled: false + mode: measure + strategy: + static_estimated: + list_size: 0 + max: 0.0 +``` diff --git a/docs/shared/config/experimental.mdx b/docs/shared/config/experimental.mdx new file mode 100644 index 0000000000..12581f9814 --- /dev/null +++ b/docs/shared/config/experimental.mdx @@ -0,0 +1,22 @@ +### `experimental_chaos` + +Configuration for chaos testing, trying to reproduce bugs that require uncommon conditions. You probably don’t want this in production! + + + +```yaml title="experimental_chaos" +experimental_chaos: + force_reload: null +``` + +### `experimental_type_conditioned_fetching` + +Type conditioned fetching configuration. + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="experimental_type_conditioned_fetching" +experimental_type_conditioned_fetching: false +``` + diff --git a/docs/shared/config/experimental_type_conditioned_fetching.mdx b/docs/shared/config/experimental_type_conditioned_fetching.mdx new file mode 100644 index 0000000000..b6db2871d6 --- /dev/null +++ b/docs/shared/config/experimental_type_conditioned_fetching.mdx @@ -0,0 +1,10 @@ +### `experimental_type_conditioned_fetching` + +Type conditioned fetching configuration. + +- **Type:** `boolean` +- **Default:** `False` + +```yaml title="experimental_type_conditioned_fetching" +experimental_type_conditioned_fetching: false +``` diff --git a/docs/shared/config/fleet_detector.mdx b/docs/shared/config/fleet_detector.mdx new file mode 100644 index 0000000000..ca6662241b --- /dev/null +++ b/docs/shared/config/fleet_detector.mdx @@ -0,0 +1,7 @@ +### `fleet_detector` + + + +```yaml title="fleet_detector" +fleet_detector: {} +``` diff --git a/docs/shared/config/forbid_mutations.mdx b/docs/shared/config/forbid_mutations.mdx new file mode 100644 index 0000000000..03337cd8c4 --- /dev/null +++ b/docs/shared/config/forbid_mutations.mdx @@ -0,0 +1,9 @@ +### `forbid_mutations` + +Forbid mutations configuration + +- **Type:** `boolean` + +```yaml title="forbid_mutations" +forbid_mutations: false +``` diff --git a/docs/shared/config/headers.mdx b/docs/shared/config/headers.mdx new file mode 100644 index 0000000000..f665c2859f --- /dev/null +++ b/docs/shared/config/headers.mdx @@ -0,0 +1,15 @@ +### `headers` + +Configuration for header propagation + + + +```yaml title="headers" +headers: + all: + request: + - insert: + name: example_name + value: example_value + subgraphs: {} +``` diff --git a/docs/shared/config/health_check.mdx b/docs/shared/config/health_check.mdx new file mode 100644 index 0000000000..a69e93eb32 --- /dev/null +++ b/docs/shared/config/health_check.mdx @@ -0,0 +1,17 @@ +### `health_check` + +Configuration options pertaining to the health component. + + + +```yaml title="health_check" +health_check: + enabled: true + listen: example_listen + path: /health + readiness: + allowed: 100 + interval: + sampling: 0s + unready: null +``` diff --git a/docs/shared/config/homepage.mdx b/docs/shared/config/homepage.mdx new file mode 100644 index 0000000000..a6eefcac40 --- /dev/null +++ b/docs/shared/config/homepage.mdx @@ -0,0 +1,11 @@ +### `homepage` + +Configuration options pertaining to the home page. + + + +```yaml title="homepage" +homepage: + enabled: true + graph_ref: null +``` diff --git a/docs/shared/config/include_subgraph_errors.mdx b/docs/shared/config/include_subgraph_errors.mdx new file mode 100644 index 0000000000..2294e67660 --- /dev/null +++ b/docs/shared/config/include_subgraph_errors.mdx @@ -0,0 +1,11 @@ +### `include_subgraph_errors` + +Configuration for exposing errors that originate from subgraphs + + + +```yaml title="include_subgraph_errors" +include_subgraph_errors: + all: false + subgraphs: {} +``` diff --git a/docs/shared/config/license_enforcement.mdx b/docs/shared/config/license_enforcement.mdx new file mode 100644 index 0000000000..0704c226ad --- /dev/null +++ b/docs/shared/config/license_enforcement.mdx @@ -0,0 +1,7 @@ +### `license_enforcement` + + + +```yaml title="license_enforcement" +license_enforcement: {} +``` diff --git a/docs/shared/config/limits.mdx b/docs/shared/config/limits.mdx new file mode 100644 index 0000000000..ec982d96e7 --- /dev/null +++ b/docs/shared/config/limits.mdx @@ -0,0 +1,20 @@ +### `limits` + +Configuration for operation limits, parser limits, HTTP limits, etc. + + + +```yaml title="limits" +limits: + http1_max_request_buf_size: null + http1_max_request_headers: null + http_max_request_bytes: 2000000 + introspection_max_depth: true + max_aliases: null + max_depth: null + max_height: null + max_root_fields: null + parser_max_recursion: 500 + parser_max_tokens: 15000 + warn_only: false +``` diff --git a/docs/shared/config/override_subgraph_url.mdx b/docs/shared/config/override_subgraph_url.mdx new file mode 100644 index 0000000000..a1e8daed81 --- /dev/null +++ b/docs/shared/config/override_subgraph_url.mdx @@ -0,0 +1,9 @@ +### `override_subgraph_url` + +Subgraph URL mappings + +- **Type:** `any` + +```yaml title="override_subgraph_url" +override_subgraph_url: {} +``` diff --git a/docs/shared/config/persisted_queries.mdx b/docs/shared/config/persisted_queries.mdx new file mode 100644 index 0000000000..9f3e8f3bfc --- /dev/null +++ b/docs/shared/config/persisted_queries.mdx @@ -0,0 +1,19 @@ +### `persisted_queries` + +Persisted Queries (PQ) configuration + + + +```yaml title="persisted_queries" +persisted_queries: + enabled: false + experimental_prewarm_query_plan_cache: + on_reload: true + on_startup: false + hot_reload: false + local_manifests: null + log_unknown: false + safelist: + enabled: false + require_id: false +``` diff --git a/docs/shared/config/plugins.mdx b/docs/shared/config/plugins.mdx new file mode 100644 index 0000000000..e3a2a6366f --- /dev/null +++ b/docs/shared/config/plugins.mdx @@ -0,0 +1,7 @@ +### `plugins` + +- **Type:** `any` + +```yaml title="plugins" +plugins: unknown_type_plugins +``` diff --git a/docs/shared/config/preview.mdx b/docs/shared/config/preview.mdx new file mode 100644 index 0000000000..82ccdad1fd --- /dev/null +++ b/docs/shared/config/preview.mdx @@ -0,0 +1,63 @@ +### `preview_entity_cache` + +Configuration for entity caching + + + +```yaml title="preview_entity_cache" +preview_entity_cache: + enabled: false + expose_keys_in_context: false + invalidation: + concurrent_requests: 10 + listen: example_listen + path: example_path + scan_count: 1000 + metrics: + enabled: false + separate_per_type: false + ttl: 30s + subgraph: + all: + enabled: true + invalidation: + enabled: false + shared_key: '' + private_id: null + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: null + urls: + - http://example.com/urls_item + username: example_username + ttl: 30s + subgraphs: {} +``` + +### `preview_file_uploads` + +Configuration for File Uploads plugin + + + +```yaml title="preview_file_uploads" +preview_file_uploads: + enabled: false + protocols: + multipart: + enabled: true + limits: + max_file_size: example_max_file_size + max_files: 0 + mode: stream +``` diff --git a/docs/shared/config/preview_file_uploads.mdx b/docs/shared/config/preview_file_uploads.mdx new file mode 100644 index 0000000000..1e2945900a --- /dev/null +++ b/docs/shared/config/preview_file_uploads.mdx @@ -0,0 +1,17 @@ +### `preview_file_uploads` + +Configuration for File Uploads plugin + +- **Type:** `object` + +```yaml title="preview_file_uploads" +preview_file_uploads: + enabled: false + protocols: + multipart: + enabled: true + limits: + max_file_size: example_max_file_size + max_files: 0 + mode: stream +``` diff --git a/docs/shared/config/progressive_override.mdx b/docs/shared/config/progressive_override.mdx new file mode 100644 index 0000000000..b09ffb7314 --- /dev/null +++ b/docs/shared/config/progressive_override.mdx @@ -0,0 +1,9 @@ +### `progressive_override` + +Configuration for the progressive override plugin + + + +```yaml title="progressive_override" +progressive_override: {} +``` diff --git a/docs/shared/config/rhai.mdx b/docs/shared/config/rhai.mdx new file mode 100644 index 0000000000..26623822d3 --- /dev/null +++ b/docs/shared/config/rhai.mdx @@ -0,0 +1,11 @@ +### `rhai` + +Configuration for the Rhai Plugin + + + +```yaml title="rhai" +rhai: + main: example_main + scripts: example_scripts +``` diff --git a/docs/shared/config/sandbox.mdx b/docs/shared/config/sandbox.mdx new file mode 100644 index 0000000000..5b5bd9726b --- /dev/null +++ b/docs/shared/config/sandbox.mdx @@ -0,0 +1,10 @@ +### `sandbox` + +Configuration options pertaining to the sandbox page. + + + +```yaml title="sandbox" +sandbox: + enabled: false +``` diff --git a/docs/shared/config/subscription.mdx b/docs/shared/config/subscription.mdx new file mode 100644 index 0000000000..35d03506f0 --- /dev/null +++ b/docs/shared/config/subscription.mdx @@ -0,0 +1,26 @@ +### `subscription` + +Subscriptions configuration + + + +```yaml title="subscription" +subscription: + enable_deduplication: true + enabled: true + max_opened_subscriptions: null + mode: + callback: + heartbeat_interval: disabled + listen: example_listen + path: example_path + public_url: http://service.example.com/public_url + subgraphs: [] + passthrough: + all: + heartbeat_interval: disabled + path: null + protocol: graphql_ws + subgraphs: {} + queue_capacity: null +``` diff --git a/docs/shared/config/supergraph.mdx b/docs/shared/config/supergraph.mdx new file mode 100644 index 0000000000..826834c224 --- /dev/null +++ b/docs/shared/config/supergraph.mdx @@ -0,0 +1,42 @@ +### `supergraph` + +Configuration options pertaining to the supergraph server component. + + + +```yaml title="supergraph" +supergraph: + defer_support: true + early_cancel: false + experimental_log_on_broken_pipe: false + generate_query_fragments: true + introspection: false + listen: example_listen + path: / + query_planning: + cache: + in_memory: + limit: 1 + redis: + namespace: example_namespace + password: example_password + pool_size: 1 + required_to_start: false + reset_ttl: true + timeout: null + tls: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + ttl: + nanos: 0 + secs: 2592000 + urls: + - http://example.com/urls_item + username: example_username + experimental_paths_limit: null + experimental_plans_limit: null + experimental_reuse_query_plans: false + warmed_up_queries: null +``` diff --git a/docs/shared/config/telemetry.mdx b/docs/shared/config/telemetry.mdx new file mode 100644 index 0000000000..51f47d7186 --- /dev/null +++ b/docs/shared/config/telemetry.mdx @@ -0,0 +1,698 @@ +### `telemetry` + +Telemetry configuration + + + +```yaml title="telemetry" +telemetry: + apollo: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + buffer_size: 10000 + client_name_header: apollographql-client-name + client_version_header: apollographql-client-version + endpoint: https://usage-reporting.api.apollographql.com/api/ingress/traces + errors: + preview_extended_error_metrics: disabled + subgraph: + all: + redact: true + redaction_policy: strict + send: true + subgraphs: {} + experimental_local_field_metrics: false + experimental_otlp_endpoint: https://usage-reporting.api.apollographql.com/ + experimental_otlp_tracing_protocol: grpc + field_level_instrumentation_sampler: 0.0 + metrics_reference_mode: extended + otlp_tracing_sampler: 0.0 + send_headers: + only: + - example_only_item + send_variable_values: + only: + - example_only_item + signature_normalization_algorithm: legacy + exporters: + logging: + common: + resource: {} + service_name: null + service_namespace: null + stdout: + enabled: true + format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] + rate_limit: + capacity: 1 + enabled: false + interval: + nanos: 0 + secs: 1 + tty_format: + json: + display_current_span: false + display_filename: false + display_level: true + display_line_number: false + display_resource: true + display_span_id: true + display_span_list: true + display_target: true + display_thread_id: false + display_thread_name: false + display_timestamp: true + display_trace_id: hexadecimal + span_attributes: [] + metrics: + common: + buckets: + - 0.001 + - 0.005 + - 0.015 + - 0.05 + - 0.1 + - 0.2 + - 0.3 + - 0.4 + - 0.5 + - 1.0 + - 5.0 + - 10.0 + resource: {} + service_name: null + service_namespace: null + views: + - aggregation: + histogram: + buckets: + - 0.0 + allowed_attribute_keys: + - example_allowed_attribute_keys_item + description: example_description + name: example_name + unit: example_unit + otlp: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} + http: + headers: {} + protocol: grpc + temporality: cumulative + prometheus: + enabled: false + listen: example_listen + path: /metrics + tracing: + common: + max_attributes_per_event: 128 + max_attributes_per_link: 128 + max_attributes_per_span: 128 + max_events_per_span: 128 + max_links_per_span: 128 + parent_based_sampler: true + preview_datadog_agent_sampling: null + resource: {} + sampler: 0.0 + service_name: null + service_namespace: null + datadog: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enable_span_mapping: true + enabled: false + endpoint: example_endpoint + fixed_span_names: true + resource_mapping: {} + span_metrics: + connect: true + connect_request: true + execution: true + http_request: true + parse_query: true + query_planning: true + request: true + router: true + subgraph: true + subgraph_request: true + supergraph: true + experimental_response_trace_id: + enabled: false + format: hexadecimal + header_name: example_header_name + otlp: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + grpc: + ca: null + cert: null + domain_name: null + key: null + metadata: {} + http: + headers: {} + protocol: grpc + temporality: cumulative + propagation: + aws_xray: false + baggage: false + datadog: false + jaeger: false + request: + format: hexadecimal + header_name: example_header_name + trace_context: false + zipkin: false + zipkin: + batch_processor: + max_concurrent_exports: 1 + max_export_batch_size: 512 + max_export_timeout: + nanos: 0 + secs: 30 + max_queue_size: 2048 + scheduled_delay: + nanos: 0 + secs: 5 + enabled: false + endpoint: example_endpoint + instrumentation: + events: + connector: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + router: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + subgraph: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + supergraph: + error: + condition: + eq: + - false + - false + level: info + request: + condition: + eq: + - false + - false + level: info + response: + condition: + eq: + - false + - false + level: info + instruments: + cache: + apollo.router.operations.entity.cache: + attributes: + graphql.type.name: + alias: example_alias + connector: + http.client.request.body.size: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.request.duration: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.response.body.size: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + default_requirement_level: none + graphql: + field.execution: + attributes: + graphql.field.name: + alias: example_alias + graphql.field.type: + alias: example_alias + graphql.list.length: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.type.name: + alias: example_alias + list.length: + attributes: + graphql.field.name: + alias: example_alias + graphql.field.type: + alias: example_alias + graphql.list.length: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.type.name: + alias: example_alias + router: + http.server.active_requests: + attributes: + http.request.method: false + server.address: false + server.port: false + url.scheme: false + http.server.request.body.size: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + http.server.request.duration: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + http.server.response.body.size: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + subgraph: + http.client.request.body.size: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.request.duration: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + http.client.response.body.size: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + supergraph: + cost.actual: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + cost.delta: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + cost.estimated: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias + spans: + connector: + attributes: + connector.http.method: + alias: example_alias + connector.source.name: + alias: example_alias + connector.url.template: + alias: example_alias + subgraph.name: + alias: example_alias + default_attribute_requirement_level: none + mode: deprecated + router: + attributes: + baggage: null + dd.trace_id: + alias: example_alias + error.type: + alias: example_alias + http.request.body.size: + alias: example_alias + http.request.method: + alias: example_alias + http.response.body.size: + alias: example_alias + http.response.status_code: + alias: example_alias + http.route: + alias: example_alias + network.local.address: + alias: example_alias + network.local.port: + alias: example_alias + network.peer.address: + alias: example_alias + network.peer.port: + alias: example_alias + network.protocol.name: + alias: example_alias + network.protocol.version: + alias: example_alias + network.transport: + alias: example_alias + network.type: + alias: example_alias + server.address: + alias: example_alias + server.port: + alias: example_alias + trace_id: + alias: example_alias + url.path: + alias: example_alias + url.query: + alias: example_alias + url.scheme: + alias: example_alias + user_agent.original: + alias: example_alias + subgraph: + attributes: + http.request.resend_count: + alias: example_alias + subgraph.graphql.document: + alias: example_alias + subgraph.graphql.operation.name: + alias: example_alias + subgraph.graphql.operation.type: + alias: example_alias + subgraph.name: + alias: example_alias + supergraph: + attributes: + cost.actual: + alias: example_alias + cost.delta: + alias: example_alias + cost.estimated: + alias: example_alias + cost.result: + alias: example_alias + graphql.document: + alias: example_alias + graphql.operation.name: + alias: example_alias + graphql.operation.type: + alias: example_alias +``` diff --git a/docs/shared/config/tls.mdx b/docs/shared/config/tls.mdx new file mode 100644 index 0000000000..27073688db --- /dev/null +++ b/docs/shared/config/tls.mdx @@ -0,0 +1,27 @@ +### `tls` + +TLS related configuration options. + + + +```yaml title="tls" +tls: + connector: + all: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + sources: {} + subgraph: + all: + certificate_authorities: null + client_authentication: + certificate_chain: example_certificate_chain + key: example_key + subgraphs: {} + supergraph: + certificate: example_certificate + certificate_chain: example_certificate_chain + key: example_key +``` diff --git a/docs/shared/config/traffic_shaping.mdx b/docs/shared/config/traffic_shaping.mdx new file mode 100644 index 0000000000..e3b257fb3b --- /dev/null +++ b/docs/shared/config/traffic_shaping.mdx @@ -0,0 +1,36 @@ +### `traffic_shaping` + +Configuration for the experimental traffic shaping plugin + + + +```yaml title="traffic_shaping" +traffic_shaping: + all: + compression: gzip + deduplicate_query: false + dns_resolution_strategy: ipv4_only + experimental_http2: enable + global_rate_limit: + capacity: 1 + interval: 30s + timeout: null + connector: + all: + compression: gzip + dns_resolution_strategy: ipv4_only + experimental_http2: enable + global_rate_limit: + capacity: 1 + interval: 30s + timeout: null + sources: {} + deduplicate_variables: null + router: + concurrency_limit: 0 + global_rate_limit: + capacity: 1 + interval: 30s + timeout: null + subgraphs: {} +``` diff --git a/docs/source/routing/configuration/envvars.mdx b/docs/source/routing/configuration/envvars.mdx index 4549a6e64e..f0b6102e17 100644 --- a/docs/source/routing/configuration/envvars.mdx +++ b/docs/source/routing/configuration/envvars.mdx @@ -4,7 +4,7 @@ subtitle: "" description: Reference of YAML configuration properties for Apollo GraphOS Router and Apollo Router Core. --- -This reference covers the environment variables, command-line options, and YAML configuration file properties for configuring an Apollo Router. +This reference covers the environment variables for configuring an Apollo Router. ## Environment variables diff --git a/docs/source/routing/configuration/yaml.mdx b/docs/source/routing/configuration/yaml.mdx index 05654cc36b..e386469f14 100644 --- a/docs/source/routing/configuration/yaml.mdx +++ b/docs/source/routing/configuration/yaml.mdx @@ -6,6 +6,37 @@ description: Reference of YAML configuration properties for Apollo GraphOS Route import RouterYaml from '../../../shared/router-yaml-complete.mdx'; import RouterConfigTable from '../../../shared/router-config-properties-table.mdx'; +import Apq from '../../../shared/config/apq.mdx'; +import Authn from '../../../shared/config/authentication.mdx'; +import Authz from '../../../shared/config/authorization.mdx'; +import Batching from '../../../shared/config/batching.mdx'; +import Connectors from '../../../shared/config/connectors.mdx'; +import Coproc from '../../../shared/config/coprocessor.mdx'; +import Cors from '../../../shared/config/cors.mdx'; +import Csrf from '../../../shared/config/csrf.mdx'; +import DemandCtrl from '../../../shared/config/demand_control.mdx'; +import Experimental from '../../../shared/config/experimental.mdx'; +import FleetDetector from '../../../shared/config/fleet_detector.mdx'; +import ForbidtMut from '../../../shared/config/forbid_mutations.mdx'; +import Headers from '../../../shared/config/headers.mdx'; +import HealthChk from '../../../shared/config/health_check.mdx'; +import Homepage from '../../../shared/config/homepage.mdx'; +import IncludeSubErr from '../../../shared/config/include_subgraph_errors.mdx'; +import LicenseEnf from '../../../shared/config/license_enforcement.mdx'; +import Limits from '../../../shared/config/limits.mdx'; +import OverrideSubUrl from '../../../shared/config/override_subgraph_url.mdx'; +import PersistedQueries from '../../../shared/config/persisted_queries.mdx'; +import Plugins from '../../../shared/config/plugins.mdx'; +import Preview from '../../../shared/config/preview.mdx'; +import ProgOverride from '../../../shared/config/progressive_override.mdx'; +import Rhai from '../../../shared/config/rhai.mdx'; +import Sandbox from '../../../shared/config/sandbox.mdx'; +import Subscription from '../../../shared/config/subscription.mdx'; +import Supergraph from '../../../shared/config/supergraph.mdx'; +import Telemetry from '../../../shared/config/telemetry.mdx'; +import Tls from '../../../shared/config/tls.mdx'; +import TrafficShaping from '../../../shared/config/traffic_shaping.mdx'; + This reference covers the YAML configuration file properties for configuring an Apollo Router. ## YAML configuration properties @@ -24,7 +55,7 @@ Enable your text editor to validate the format and content of your router YAML c -### Example YAML config file +## Example YAML with all properties Expand the code block to view an example YAML config file containing all properties. @@ -34,858 +65,35 @@ Expand the code block to view an example YAML config file containing all propert - - -## TODO - -### Endpoint path - -### Introspection - -### Debugging - -- To configure logging, see [Logging in the router](/router/configuration/telemetry/exporters/logging/overview). - -- To configure the inclusion of subgraph errors, see [Subgraph error inclusion](/router/configuration/subgraph-error-inclusion). - -### Landing pages - - - -### Subgraph routing URLs - - - -### Caching - -By default, the router stores the following data in its in-memory cache to improve performance: - -- Generated query plans -- Automatic persisted queries (APQ) -- Introspection responses - -You can configure certain caching behaviors for generated query plans and APQ (but not introspection responses). For details, see [In-Memory Caching in the router](/router/configuration/in-memory-caching/). - -**If you have a GraphOS Enterprise plan:** - -- You can configure a Redis-backed _distributed_ cache that enables multiple router instances to share cached values. For details, see [Distributed caching in the GraphOS Router](/router/configuration/distributed-caching/). -- You can configure a Redis-backed _entity_ cache that enables a client query to retrieve cached entity data split between subgraph reponses. For details, see [Subgraph entity caching in the GraphOS Router](/router/configuration/entity-caching/). - - - -### Enhanced operation signature normalization - - - - - -The router supports enhanced operation signature normalization in the following versions: - -- [General availability](/resources/product-launch-stages/#general-availability) in v1.54.0 and later -- [Experimental](/resources/product-launch-stages/#experimental-features) in v1.49.0 to v1.53.0 - - - - - -#### Input types - -Enhanced signatures include input object type shapes, while still redacting any actual values. -Legacy signatures [replace input object type with `{}`](/graphos/metrics/operation-signatures/#1-transform-in-line-argument-values). - -Given the following example operation: - -```graphql showLineNumbers=false -query InlineInputTypeQuery { - inputTypeQuery( - input: { - inputString: "foo" - inputInt: 42 - inputBoolean: null - nestedType: { someFloat: 4.2 } - enumInput: SOME_VALUE_1 - nestedTypeList: [{ someFloat: 4.2, someNullableFloat: null }] - listInput: [1, 2, 3] - } - ) { - enumResponse - } -} -``` - -The legacy normalization algorithm generates the following signature: - -```graphql showLineNumbers=false -query InlineInputTypeQuery { - inputTypeQuery(input: {}) { - enumResponse - } -} -``` - -The enhanced normalization algorithm generates the following signature: - -```graphql {3-11} showLineNumbers=false -query InlineInputTypeQuery { - inputTypeQuery( - input: { - inputString: "" - inputInt: 0 - inputBoolean: null - nestedType: { someFloat: 0 } - enumInput: SOME_VALUE_1 - nestedTypeList: [{ someFloat: 0, someNullableFloat: null }] - listInput: [] - } - ) { - enumResponse - } -} -``` - -#### Aliases - -Enhanced signatures include any field aliases used in an operation. -Legacy signatures [remove aliases completely](/graphos/metrics/operation-signatures/#field-aliases), meaning the signature may be invalid if the same field was used with multiple aliases. - -Given the following example operation: - -```graphql showLineNumbers=false -query AliasedQuery { - noInputQuery { - interfaceAlias1: interfaceResponse { - sharedField - } - interfaceAlias2: interfaceResponse { - ... on InterfaceImplementation1 { - implementation1Field - } - ... on InterfaceImplementation2 { - implementation2Field - } - } - inputFieldAlias1: objectTypeWithInputField(boolInput: true) { - stringField - } - inputFieldAlias2: objectTypeWithInputField(boolInput: false) { - intField - } - } -} -``` - -The legacy normalization algorithm generates the following signature: - -```graphql showLineNumbers=false -query AliasedQuery { - noInputQuery { - interfaceResponse { - sharedField - } - interfaceResponse { - ... on InterfaceImplementation1 { - implementation1Field - } - ... on InterfaceImplementation2 { - implementation2Field - } - } - objectTypeWithInputField(boolInput: true) { - stringField - } - objectTypeWithInputField(boolInput: false) { - intField - } - } -} -``` - -The enhanced normalization algorithm generates the following signature: - -```graphql showLineNumbers=false -query AliasedQuery { - noInputQuery { - interfaceAlias1: interfaceResponse { - sharedField - } - interfaceAlias2: interfaceResponse { - ... on InterfaceImplementation1 { - implementation1Field - } - ... on InterfaceImplementation2 { - implementation2Field - } - } - inputFieldAlias1: objectTypeWithInputField(boolInput: true) { - stringField - } - inputFieldAlias2: objectTypeWithInputField(boolInput: false) { - intField - } - } -} -``` - - - -### Extended reference reporting - - - - - -The router supports extended reference reporting in the following versions: - -- [General availability](/resources/product-launch-stages/#general-availability) in v1.54.0 and later -- [Experimental](/resources/product-launch-stages/#experimental-features) in v1.50.0 to v1.53.0 - - - - - -You can configure the router to report enum and input object references for enhanced insights and operation checks. -Apollo's legacy reference reporting doesn't include data about enum values and input object fields, meaning you can't view enum and input object field usage in GraphOS Studio. -Legacy reporting can also cause [inaccurate operation checks](#enhanced-operation-checks). - -Configure extended reference reporting in `router.yaml` with the `telemetry.apollo.metrics_reference_mode` option like so: - -```yaml title="router.yaml" -telemetry: - apollo: - metrics_reference_mode: extended # Default is legacy -``` - - - -### Extended error reporting - - - - - - - -The router supports extended error reporting in the following versions: - -- [Preview](/resources/product-launch-stages/#preview) in v2.1.2 and later -- [Experimental](/resources/product-launch-stages/#experimental-features) in v2.0.0 - - - -You can configure the router to report extended error information for improved diagnostics. -Apollo's legacy error reporting doesn't include the service or error code, meaning you can't easily attribute errors to their root cause in GraphOS Studio. - -Configure extended reference reporting in `router.yaml` with the `telemetry.apollo.errors.preview_extended_error_metrics` option like so: - -```yaml title="router.yaml" -telemetry: - apollo: - errors: - preview_extended_error_metrics: enabled # Default is disabled -``` - -[Learn more.](/graphos/routing/graphos-reporting#errors) - -#### Configuration effect timing - -Once you configure extended reference reporting, you can view enum value and input field usage alongside object [field usage in GraphOS Studio](/graphos/metrics/field-usage) for all subsequent operations. - -Configuring extended reference reporting automatically turns on [enhanced operation checks](#enhanced-operation-checks), though you won't see an immediate change in your operations check behavior. - -This delay is because operation checks rely on historical operation data. -To ensure sufficient data to distinguish between genuinely unused values and those simply not reported in legacy data, enhanced checks require some operations with extended reference reporting turned on. - -#### Enhanced operation checks - -Thanks to extended reference reporting, operation checks can more accurately flag issues for changes to enum values and input object fields. See the comparison table below for differences between standard operation checks based on legacy reference reporting and enhanced checks based on extended reference reporting. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Standard Check Behavior
- (Legacy reference reporting) -
- Enhanced Check Behavior
- (Extended reference reporting) -
- -##### Enum value removal - - Removing any enum values is considered a breaking change if any operations use the enum.Removing enum values is only a breaking change if historical operations use the specific enum value(s) that were removed.
- -##### Default argument changes for input object fields - - - Changing or removing a default argument is generally considered a breaking change, but changing or removing default values for input object fields isn't. - - Changing or removing default values for input object fields is considered a breaking change. - -You can [configure checks to ignore default values changes](/graphos/platform/schema-management/checks#ignored-conditions-settings). - -
- -##### Nullable input object field removal - - Removing a nullable input object field is always considered a breaking change.Removing a nullable input object field is only considered a breaking change if the nullable field is present in historical operations. If the nullable field is always omitted in historical operations, its removal isn't considered a breaking change.
- -##### Changing nullable input object fields to non-nullable - - Changing a nullable input object field to non-nullable is considered a breaking change.Changing a nullable input object field to non-nullable is only considered a breaking change if the field had a null value in historical operations. If the field was always a non-null value in historical operations, changing it to non-nullable isn't considered a breaking change.
- - - -You won't see an immediate change in checks behavior when you first turn on extended reference reporting. -[Learn more.](#configuration-effect-timing) - - - -### Safelisting with persisted queries - -You can enhance your graph's security with GraphOS Router by maintaining a persisted query list (PQL), an operation safelist made by your first-party apps. As opposed to automatic persisted queries (APQ) where operations are automatically cached, operations must be preregistered to the PQL. Once configured, the router checks incoming requests against the PQL. - -See [Safelisting with persisted queries](/router/configuration/persisted-queries) for more information. - -### HTTP header rules - -See [Sending HTTP headers to subgraphs](/graphos/routing/header-propagation/). - -### Traffic shaping - -To configure the shape of traffic between clients, routers, and subgraphs, see [Traffic shaping in the router](/router/configuration/traffic-shaping). - -### Cross-Origin Resource Sharing (CORS) - -See [Configuring CORS in the router](/router/configuration/cors). - -### Connectors support - -See [Working with Router](/graphos/schema-design/connectors/router) in the Apollo Connectors documentation. - -### Defer support - -See [router support for `@defer`](/router/executing-operations/defer-support/#disabling-defer). - -### Query batching support - -See [GraphOS Router's support for query batching](/router/executing-operations/query-batching). - -### Subscription support - -See [GraphQL subscriptions in the GraphOS Router](/router/executing-operations/subscription-support/#router-setup). - -### Authorization support - -- To configure authorization directives, see [Authorization directives](/router/configuration/authorization/#authorization-directives). - -- To configure the authorization plugin, see [Configuration options](/router/configuration/authorization/#configuration-options). - -### JWT authentication - -To enable and configure JWT authentication, see [JWT authentication in the GraphOS Router](/router/configuration/authn-jwt). - -### Cross-site request forgery (CSRF) prevention - -To configure CSRF prevention, see [CSRF prevention in the router](/router/configuration/csrf). - -### Subgraph authentication - -To configure subgraph authentication with AWS SigV4, see a [configuration example](/router/configuration/authn-subgraph/#configuration-example). - -### External coprocessing - -See [External coprocessing in the GraphOS Router](/router/customizations/coprocessor/). - -### Telemetry and monitoring - -The router supports standard and custom instrumentation to collect telemetry data from its request and response processing pipeline to produce logs, metrics and traces to export. - -See the [router telemetry overview](/router/configuration/telemetry/overview). - -### TLS - -The router supports TLS to authenticate and encrypt communications, both on the client side and the subgraph side. It works automatically on the subgraph side if the subgraph URL starts with `https://`. - -TLS support is configured in the `tls` section, under the `supergraph` key for the client side, and the `subgraph` key for the subgraph side, with configuration possible for all subgraphs and overriding per subgraph. - -The list of supported TLS versions and algorithms is static, it cannot be configured. - -Supported TLS versions: - -- TLS 1.2 -- TLS 1.3 - -Supported cipher suites: - -- TLS13_AES_256_GCM_SHA384 -- TLS13_AES_128_GCM_SHA256 -- TLS13_CHACHA20_POLY1305_SHA256 -- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 -- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 -- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 -- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 -- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 -- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 - -Supported key exchange groups: - -- X25519 -- SECP256R1 -- SECP384R1 - -#### TLS termination - -Clients can connect to the router directly over HTTPS, without terminating TLS in an intermediary. You can configure this in the `tls` configuration section: - -```yaml -tls: - supergraph: - certificate: ${file./path/to/certificate.pem} - certificate_chain: ${file./path/to/certificate_chain.pem} - key: ${file./path/to/key.pem} -``` - -To set the file paths in your configuration with Unix-style expansion, you can follow the examples in the [variable expansion](#variable-expansion) guide. - -The router expects the file referenced in the `certificate_chain` value to be a combination of several PEM certificates concatenated together into a single file (as is commonplace with Apache TLS configuration). - -#### Overriding certificate authorities for subgraphs - -The router verifies TLS connections to subgraphs using the list of certificate authorities the system provides. You can override this list with a combination of global and per-subgraph settings: - -```yaml -tls: - subgraph: - # Use these certificate authorities unless overridden per-subgraph - all: - certificate_authorities: "${file./path/to/ca.crt}" - # Override global setting for individual subgraphs - subgraphs: - products: - certificate_authorities: "${file./path/to/product_ca.crt}" -``` - -The router expects the file referenced in the `certificate_chain` value to be a combination of several PEM certificates concatenated together into a single file (as is commonplace with Apache TLS configuration). - -You can only configure these certificates via the router's configuration since using `SSL_CERT_FILE` also overrides certificates for sending telemetry and communicating with Apollo Uplink. - -If the subgraph is presenting a self-signed certificate, it must be generated with the proper file extension and with `basicConstraints` disabled. You can generate it with the following command line command from a certificate signing request, in this example, `server.csr`: - -``` -openssl x509 -req -in server.csr -signkey server.key -out server.crt -extfile v3.ext -``` - -You can generate a `v3.ext` extension file like so: - -``` -subjectKeyIdentifier = hash -authorityKeyIdentifier = keyid:always,issuer:always -# this has to be disabled -# basicConstraints = CA:TRUE -keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign -subjectAltName = DNS:local.apollo.dev -issuerAltName = issuer:copy -``` - - - -Make sure to change the `subjectAltName` field to the subgraph's name. - - - -This produces the file as `server.crt` which can be used in `certificate_authorities`. - -#### TLS client authentication for subgraph requests - -The router supports mutual TLS authentication (mTLS) with the subgraphs. This means that it can authenticate itself to the subgraph using a certificate chain and a cryptographic key. It can be configured as follows: - -```yaml -tls: - subgraph: - # Use these certificates and key unless overridden per-subgraph - all: - client_authentication: - certificate_chain: ${file./path/to/certificate_chain.pem} - key: ${file./path/to/key.pem} - # Override global setting for individual subgraphs - subgraphs: - products: - client_authentication: - certificate_chain: ${file./path/to/certificate_chain.pem} - key: ${file./path/to/key.pem} -``` - -#### Redis TLS configuration - -For Redis TLS connections, you can set up a client certificate or override the root certificate authority by configuring `tls` in your router's [YAML config file](https://www.apollographql.com/docs/router/overview/#yaml-config-file). For example: - -```yaml -apq: - router: - cache: - redis: - urls: ["rediss://redis.example.com:6379"] - #highlight-start - tls: - certificate_authorities: ${file./path/to/ca.crt} - client_authentication: - certificate_chain: ${file./path/to/certificate_chain.pem} - key: ${file./path/to/key.pem} - #highlight-end -``` - -### Request limits - -The GraphOS Router supports enforcing three types of request limits for enhanced security: - -- Network-based limits -- Lexical, parser-based limits -- Semantic, operation-based limits (this is an [Enterprise feature](/router/enterprise-features/)) - -The router rejects any request that violates at least one of these limits. - -```yaml title="router.yaml" -limits: - # Network-based limits - http_max_request_bytes: 2000000 # Default value: 2 MB - http1_max_request_headers: 200 # Default value: 100 - http1_max_request_buf_size: 800kib # Default value: 400kib - - # Parser-based limits - parser_max_tokens: 15000 # Default value - parser_max_recursion: 500 # Default value - - # Operation-based limits (Enterprise only) - max_depth: 100 - max_height: 200 - max_aliases: 30 - max_root_fields: 20 -``` - -#### Operation-based limits (Enterprise only) - -See [this article](/router/configuration/operation-limits/). - -#### Network-based limits - -##### `http_max_request_bytes` - -Limits the amount of data read from the network for the body of HTTP requests, -to protect against unbounded memory consumption. -This limit is checked before JSON parsing. -Both the GraphQL document and associated variables count toward it. - -The default value is `2000000` bytes, 2 MB. - -Before increasing this limit significantly consider testing performance -in an environment similar to your production, especially if some clients are untrusted. -Many concurrent large requests could cause the router to run out of memory. - -##### `http1_max_request_headers` - -Limit the maximum number of headers of incoming HTTP1 requests. -The default value is 100 headers. - -If router receives more headers than the buffer size, it responds to the client with `431 Request Header Fields Too Large`. - -##### `http1_max_request_buf_size` - -Limit the maximum buffer size for the HTTP1 connection. Default is ~400kib. - -#### Parser-based limits - -##### `parser_max_tokens` - -Limits the number of tokens a query document can include. This counts _all_ tokens, including both [lexical and ignored tokens](https://spec.graphql.org/October2021/#sec-Language.Source-Text.Lexical-Tokens). - -The default value is `15000`. - -##### `parser_max_recursion` - -Limits the deepest level of recursion allowed by the router's GraphQL parser to prevent stack overflows. This corresponds to the deepest nesting level of any single GraphQL operation or fragment defined in a query document. - -The default value is `500`. - -In the example below, the `GetProducts` operation has a recursion of three, and the `ProductVariation` fragment has a recursion of two. Therefore, the _max_ recursion of the query document is three. - -```graphql -query GetProducts { - allProducts { - #1 - ...productVariation - delivery { - #2 - fastestDelivery #3 - } - } -} - -fragment ProductVariation on Product { - variation { - #1 - name #2 - } -} -``` - -Note that the router calculates the recursion depth for each operation and fragment _separately_. Even if a fragment is included in an operation, that fragment's recursion depth does not contribute to the _operation's_ recursion depth. - -### Demand control - -See [Demand Control](/router/executing-operations/demand-control) to learn how to analyze the cost of operations and to reject requests with operations that exceed customizable cost limits. - -### Early cancel - -Up until [Apollo Router Core v1.43.1](https://github.com/apollographql/router/releases/tag/v1.43.1), when the client closed the connection without waiting for the response, the entire request was cancelled and did not go through the entire pipeline. Since this causes issues with request monitoring, the router introduced a new behavior in 1.43.1. Now, the entire pipeline is executed if the request is detected as cancelled, but subgraph requests are not actually done. The response will be reported with the `499` status code, but not actually sent to the client. -To go back to the previous behavior of immediately cancelling the request, the following configuration can be used: - -```yaml -supergraph: - early_cancel: true -``` - -Additionally, since v1.43.1, the router can show a log when it detects that the client canceled the request. This log can be activated with: - -```yaml title="router.yaml" -supergraph: - experimental_log_on_broken_pipe: true -``` - -### Connection shutdown timeout - -When the Router schema or configuration updates all connections must be closed for resources to be freed. -To ensure that long-lived connections do not hang on to resources, a maximum graceful shutdown timeout can be configured. - -```yaml title="router.yaml" -supergraph: - connection_shutdown_timeout: 60s -``` - -The default value is 60 seconds. - -Note that if `early_cancel` is `false` (default), then requests in progress will still hold onto pipeline resources. -Traffic shaping request timeouts should be used to prevent long-running requests. - -```yaml title="router.yaml" -traffic_shaping: - router: - timeout: 60s -``` - -### Header Read Timeout - -The header read timeout is the amount of time the Router will wait to receive the complete request headers from a client before timing out. It applies both when the connection is fully idle and when a request has been started but sending the headers has not been completed. - -By default, the header read timeout is set to 10 seconds. A longer timeout can be configured using the `server.http.header_read_timeout` configuration option. - -```yaml title="router.yaml" -server: - http: - header_read_timeout: 30s -``` - -### Plugins - -You can customize the router's behavior with [plugins](/router/customizations/overview). Each plugin can have its own section in the configuration file with arbitrary values: - -```yaml {4,8} title="example-plugin-router.yaml" -plugins: - example.plugin: - var1: "hello" - var2: 1 -``` - -### Variable expansion - -You can reference variables directly in your YAML config file. This is useful for referencing secrets without including them in the file. - -Currently, the router supports expansion of environment variables and file paths. Corresponding variables are prefixed with `env.` and `file.`, respectively. - -The router uses Unix-style expansion. Here are some examples: - -- `${env.ENV_VAR_NAME}` expands to the value of environment variable `ENV_VAR_NAME`. -- `${env.ENV_VAR_NAME:-some_default}` expands to the value of environment variable `ENV_VAR_NAME`, or falls back to the value `some_default` if the environment variable is not defined. -- `${file.a.txt}` expands to the contents of the file `a.txt`. -- `${file.a.txt:-some_default}` expands to the contents of the file `a.txt`, or falls back to the value `some_default` if the file does not exist. - -Variable expansions are valid only for YAML _values_, not keys: - - - -```yaml -supergraph: - listen: "${env.MY_LISTEN_ADDRESS}" #highlight-line -example: - password: "${env.MY_PASSWORD}" #highlight-line -``` - - - - -### Automatic fragment generation - -By default, the router compresses subgraph requests by generating fragment -definitions based on the shape of the subgraph operation. In many cases this -significantly reduces the size of the query sent to subgraphs. - -You can explicitly opt-out of this behavior by specifying: - -```yaml -supergraph: - generate_query_fragments: false -``` - -### Reusing configuration - -You can reuse parts of your configuration file in multiple places using standard YAML aliasing syntax: - -```yaml title="router.yaml" -headers: - subgraphs: - products: - request: - - insert: &insert_custom_header - name: "custom-header" - value: "something" - reviews: - request: - - insert: *insert_custom_header -``` - -Here, the `name` and `value` entries under `&insert_custom_header` are reused under `*insert_custom_header`. - -## Self-hosted and cloud configuration differences - -You can configure a router in multiple ways. Because cloud-hosted and self-hosted routers share the common foundation of Apollo Router Core, all routers support declarative configuration with a YAML file, usually named `router.yaml`. Differences between configuring cloud-hosted and self-hosted routers: - -- A cloud-hosted router is managed by Apollo and fully integrated with GraphOS, so its configuration is provided via the GraphOS Studio IDE. -- A self-hosted router is launched via command line, so its configuration includes command-line options and environment variables. - -| | Cloud-Hosted Router | Self-Hosted Router | -| --- | :---: | :---: | -| Studio IDE | ✅ | ❌ | -| YAML file | ✅ | ✅ | -| Command-line options | ❌ | ✅ | -| Environment variables | ❌ | ✅ | - -## Developing router configuration - -Here are some tips and best practices for developing and updating the configuration for your router. - -### Dev mode defaults - - - -**Do not set the `--dev` option in production.** If you want to replicate any specific dev mode functionality in production, instead make the corresponding modifications to your [YAML config file](#yaml-config-file). - - - -Setting the [`--dev`](#--dev) flag is equivalent to running `./router --hot-reload` with the following configuration options: - -```yaml -sandbox: - enabled: true -homepage: - enabled: false -supergraph: - introspection: true -include_subgraph_errors: - all: true -plugins: - # Enable with the header, Apollo-Expose-Query-Plan: true - experimental.expose_query_plan: true -``` - -### Configuration awareness in your text editor - -The router can generate a JSON schema for config validation in your text editor. This schema helps you format the YAML file correctly and also provides content assist. - -Generate the schema with the following command: - -```bash -./router config schema > configuration_schema.json -``` - -After you generate the schema, configure your text editor. Here are the instructions for some commonly used editors: - -- [Visual Studio Code](https://code.visualstudio.com/docs/languages/json#_json-schemas-and-settings) -- [Emacs](https://emacs-lsp.github.io/lsp-mode/page/lsp-yaml) -- [IntelliJ](https://www.jetbrains.com/help/idea/json.html#ws_json_using_schemas) -- [Sublime](https://github.com/sublimelsp/LSP-yaml) -- [Vim](https://github.com/Quramy/vison) - -### Upgrading your router configuration - -New releases of the router might introduce breaking changes to the [YAML config file's](#yaml-config-file) expected format, usually to extend existing functionality or improve usability. - -**If you run a new version of your router with a configuration file that it no longer supports, it emits a warning on startup and terminates.** - -If you encounter this warning, you can use the `router config upgrade` command to see the new expected format for your existing configuration file: - -```bash -./router config upgrade -``` - -You can also view a diff of exactly which changes are necessary to upgrade your existing configuration file: - -```bash -./router config upgrade --diff -``` - -### Validating your router configuration - -The router can be used to validate an existing configuration file. This can be useful if you want to have a validate step as part of your CI pipeline. - -``` -./router config validate -``` - -This command takes a config file and validates it against the router's full supported configuration format. - - - -This is a static validation that checks if it is syntactically correct using the JSON schema. The router does additional logical checks on startup against the config that this command does not capture. - - - -## Todo asides - -If you pass the [`--hot-reload`](#--hr----hot-reload) flag to the `router` command, your router automatically restarts whenever changes are made to its configuration file. - - - -Enable your text editor to validate the format and content of your router YAML configuration file by [configuring it with the router's configuration schema](#configuration-awareness-in-your-text-editor). - - - -## Related topics - -- [Checklist for configuring the router for production](/technotes/TN0008-production-readiness-checklist/#apollo-router) \ No newline at end of file +## Properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From ec79c125d2ae786a9829db4530796831b0928158 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Thu, 1 May 2025 10:58:27 -0700 Subject: [PATCH 28/47] add YAML config step to get started --- docs/source/routing/get-started.mdx | 44 +++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx index 3fa501df93..287a11130d 100644 --- a/docs/source/routing/get-started.mdx +++ b/docs/source/routing/get-started.mdx @@ -1,7 +1,7 @@ --- title: Apollo Router Quickstart -subtitle: Run a router binary locally -description: This quickstart tutorial walks you through installing an Apollo Router binary, running it with an example supergraph schema, and making test queries with Apollo Sandbox +subtitle: Run a router binary +description: This quickstart tutorial walks you through installing an Apollo Router binary, running it with an example supergraph schema and a YAML configuration file, and making test queries with Apollo Sandbox. --- import ElasticNotice from "../../shared/elastic-notice.mdx"; @@ -10,7 +10,8 @@ Hello! Let's run Apollo Router for the very first time. You will: - Download and install a router binary. - Download a supergraph schema. -- Run the router for your supergraph in development mode. +- Create and edit a YAML configuration file. +- Run the router in development mode, with your configuration and for your supergraph. - Make a query to the running router. ## 1. Install router binary @@ -189,14 +190,33 @@ type User -## 3. Run the router +## 3. Create and edit YAML configuration file -Running the router in development mode enables some useful development-only features. Let's now run the router in dev mode, using the supergraph schema you saved: +The router's many features are configurable via a YAML configuration file. You set your options declaratively in YAML, then point your router to it at startup. -1. Run the router with command-line options, which enable dev mode and provide a path to your supergraph schema: +Let's customize a common setting: the router's _supergraph listen address_. It's the network address and port on which the router receives client requests. By default the address is `127.0.0.1:4000`. For this guide, let's change the port to `5555`. + +1. Create a file named `router.yaml`. Open it for editing. +1. Add the following configuration for `supergraph.listen` that sets it to `127.0.0.1:5555`: + + ```yaml title="router.yaml" + supergraph: + listen: 127.0.0.1:5555 + ``` + +## 4. Run the router + +When you're developing with the router locally and in non-production environments, it's useful to run the router in _development mode_, or dev mode. Dev mode is a collection of router configuration settings that make development easier. + +Let's run the router in dev mode. We'll use both the supergraph schema and YAML configuration files you saved: + +1. Run the router with command-line options: + - `--dev` enables dev mode + - `--config` provides the path to your YAML configuration file + - `--supergraph` provides the path to your supergraph schema ```sh - ./router --dev --supergraph supergraph-schema.graphql + ./router --dev --supergraph supergraph-schema.graphql --config router.yaml ``` 1. Check that your router is running, with output similar to the example: @@ -212,7 +232,7 @@ Running the router in development mode enables some useful development-only feat 2025-04-25T21:54:05.988144Z INFO state machine transitioned event="NoMoreLicense" state=Startup previous_state="Startup" 2025-04-25T21:54:06.010232Z INFO Health check exposed at http://127.0.0.1:8088/health 2025-04-25T21:54:06.010717Z WARN Connector debugging is enabled, this may expose sensitive information. - 2025-04-25T21:54:06.405064Z INFO GraphQL endpoint exposed at http://127.0.0.1:4000/ 🚀 + 2025-04-25T21:54:06.405064Z INFO GraphQL endpoint exposed at http://127.0.0.1:5555/ 🚀 2025-04-25T21:54:06.405628Z INFO You're using some "experimental" features of the Apollo Router (those which have their configuration prefixed by "experimental_"). We may make breaking changes in future releases. To help us design the stable version we need your feedback. Here is a list of links where you can give your opinion: @@ -230,11 +250,11 @@ Running the router in development mode enables some useful development-only feat A router in dev mode runs its own [Apollo Sandbox](/graphos/explorer/sandbox/), a local GraphQL server running a development instance of your graph. Sandbox has a browser-based IDE, Explorer, that you can use to write and send real GraphQL queries to your development graph. -Let's use Sandbox to write and send a query to your graph: +Let's use Sandbox and its Explorer IDE to write a query and send it to your graph: -1. Go to the URL of the router's Sandbox, [`http://127.0.0.1:4000`](http://127.0.0.1:4000). +1. Go to the URL of the router's Sandbox, [`http://127.0.0.1:5555`](http://127.0.0.1:5555). The Explorer IDE should be running. -1. Copy and paste the example query into the **Operation** pane: +1. Copy and paste the example query into the **Operation** pane of Explorer: ```graphql query Query { @@ -251,7 +271,7 @@ Let's use Sandbox to write and send a query to your graph: } ``` -1. Click **Query** to run the query, then check its response in the **Response** pane. +1. Click **Query** to run the query, then check for its response in the **Response** pane. Date: Thu, 1 May 2025 20:47:26 -0700 Subject: [PATCH 29/47] add descriptions to config properties --- docs/source/routing/configuration/yaml.mdx | 641 ++++++++++++++++++ docs/source/routing/get-started.mdx | 44 +- .../security/request-limits-overview.mdx | 32 - .../routing/security/request-limits.mdx | 10 +- 4 files changed, 670 insertions(+), 57 deletions(-) delete mode 100644 docs/source/routing/security/request-limits-overview.mdx diff --git a/docs/source/routing/configuration/yaml.mdx b/docs/source/routing/configuration/yaml.mdx index e386469f14..479ed57e08 100644 --- a/docs/source/routing/configuration/yaml.mdx +++ b/docs/source/routing/configuration/yaml.mdx @@ -67,33 +67,674 @@ Expand the code block to view an example YAML config file containing all propert ## Properties +--- + + +--- + + +- To learn about JWT authentication, go to [JWT authentication in the GraphOS Router](/router/configuration/authn-jwt). + +- To learn about subgraph authentication with AWS SigV4, go to a [subgraph authentication configuration example](/router/configuration/authn-subgraph/#configuration-example). + +--- + + +- To configure authorization directives, see [Authorization directives](/router/configuration/authorization/#authorization-directives). + +- To configure the authorization plugin, see [Configuration options](/router/configuration/authorization/#configuration-options). + +--- + + +Learn more in [query batching](/router/executing-operations/query-batching). + +--- + + +--- + + +Learn more in [External coprocessing in the GraphOS Router](/router/customizations/coprocessor/). + +--- + + +y default, the router only allows GraphOS Studio to initiate browser connections to it. If your supergraph serves data to other browser-based applications, you need to update its Cross-Origin Resource Sharing (CORS) configuration. Learn more in [CORS](/graphos/routing/security/cors). + +--- + + +Learn more in [CSRF prevention in the router](/router/configuration/csrf). + +--- + + +With demand control, the router analyzes the cost of operations and rejects requests with operations that exceed customizable cost limits. + +Learn more in [Demand Control](/router/executing-operations/demand-control) + +--- + + +--- + + +--- + + +--- + + +Learn more in [Sending HTTP headers to subgraphs](/graphos/routing/header-propagation/). + +--- + + +--- + + +--- + + +--- + + +--- + + +Learn more in [Request Limits](/graphos/routing/security/request-limits). + +--- + + +By default, the router obtains the routing URL for each of your subgraphs from the composed supergraph schema you provide it. In most cases, no additional configuration is required. The URL can use HTTP and HTTPS for network access to subgraph, or have the following shape for Unix sockets usage: `unix:///path/to/subgraph.sock` + +However, if you _do_ need to override a particular subgraph's routing URL (for example, to handle changing network topography), you can do so with the `override_subgraph_url` option: + +```yaml +override_subgraph_url: + organizations: http://localhost:8080 + accounts: "${env.ACCOUNTS_SUBGRAPH_HOST_URL}" +``` + +In this example, the `organizations` subgraph URL is overridden to point to `http://localhost:8080`, and the `accounts` subgraph URL is overridden to point to a new URL using [variable expansion](#variable-expansion). The URL specified in the supergraph schema is ignored. + +Any subgraphs that are _omitted_ from `override_subgraph_url` continue to use the routing URL specified in the supergraph schema. + +If you need to override the subgraph URL at runtime on a per-request basis, you can use [request customizations](/router/customizations/overview/#request-path) in the `SubgraphService` layer. + + +You can enhance your graph's security with GraphOS Router by maintaining a persisted query list (PQL), an operation safelist made by your first-party apps. As opposed to automatic persisted queries (APQ) where operations are automatically cached, operations must be preregistered to the PQL. Once configured, the router checks incoming requests against the PQL. + +See [Safelisting with persisted queries](/router/configuration/persisted-queries) for more information. + +--- + + +You can customize the router's behavior with [plugins](/router/customizations/overview). Each plugin can have its own section in the configuration file with arbitrary values: + +```yaml {4,8} title="example-plugin-router.yaml" +plugins: + example.plugin: + var1: "hello" + var2: 1 +``` + +--- + + +--- + + +--- + + +--- + + +--- + + +--- + + +#### Supergraph listen address + +As the gateway and single endpoint to your supergraph, an Apollo Router has a socket address and port that it listens for client requests. This listen address is configurable in YAML as `supergraph.listen`. + +By default, the router starts an HTTP server that listens on `127.0.0.1:4000`. You can specify a different address by setting `supergraph.listen` for IPv4, IPv6, or Unix sockets. + +##### IPv4 + +```yaml title="router.yaml" +supergraph: + # The socket address and port to listen on (default: 127.0.0.1:400) + listen: 127.0.0.1:4000 +``` + +##### IPv6 + +```yaml title="router.yaml" +supergraph: + # The socket address and port to listen on. (default: [::1]:4000) + # Note that this must be quoted to avoid interpretation as an array in YAML. + listen: "[::1]:4000" +``` + +##### Unix socket + +```yaml title="router_unix.yaml" +supergraph: + # Absolute path to a Unix socket + listen: /tmp/router.sock +``` + + + +Listening on a Unix socket is not supported on Windows. + + + +#### Supergraph endpoint path + +The path of the HTTP endpoint of the supergraph that the router runs is configured by `supergraph.path`. + +By default, the router starts an HTTP server that exposes a `POST`/`GET` endpoint at path `/`. + +```yaml title="router.yaml" +supergraph: + # The path for GraphQL execution + # (Defaults to /) + path: /graphql +``` + +The path must start with `/`. + +A path can contain parameters and wildcards: + +- `/{parameter}` matches a single segment. For example: + + - `/abc/{my_param}/def` matches `/abc/1/def` and `/abc/whatever/def`, but it doesn't match `/abc/1/2/def` or `/abc/def` + +- `/{*parameter}` matches all segments in the rest of a path. For example: + - `/abc/{*wildcard}` matches `/abc/1/def` and `/abc/w/h/a/t/e/v/e/r`, but it doesn't match `/abc/` or `/not_abc_at_all` + + + +- Both parameters and wildcards require a name, even though you can’t use those names anywhere. + +- The router doesn't support wildcards in the _middle_ of a path (e.g., `/{*wild}/graphql`). Instead, use a path parameter (e.g., `/{parameter}/graphql`). + + + +#### Introspection + +In GraphQL, introspection queries are used during development to learn about a GraphQL API's schema. The router can resolve introspection queries, based on the configuration of `supergraph.introspection`. + +By default, the router doesn't resolve introspection queries. + +To enable introspection queries during development, set the `supergraph.introspection` flag: + +```yaml title="router.yaml" +# Do not enable introspection in production! +supergraph: + introspection: true +``` + +##### Introspection recursion limit + +The [schema-introspection schema](https://spec.graphql.org/draft/#sec-Schema-Introspection.Schema-Introspection-Schema) is recursive: a client can query the fields of the types of some other fields, and so on arbitrarily deep. This can produce responses that grow much faster than the size of the request. + +To prevent this, the router is configured by default to not execute introspection queries that nest list fields that are too deep, instead returning an error. The criteria matches `MaxIntrospectionDepthRule` in graphql-js, and it may change in future versions. + +In case the router rejects legitimate queries, you can disable the limit by setting the `limits.introspection_max_depth` flag: + +```yaml title="router.yaml" +# Do not enable introspection in production! +supergraph: + introspection: true +limits: + introspection_max_depth: false +``` + +#### Early cancel + +Up until [Apollo Router Core v1.43.1](https://github.com/apollographql/router/releases/tag/v1.43.1), when the client closed the connection without waiting for the response, the entire request was cancelled and did not go through the entire pipeline. Since this causes issues with request monitoring, the router introduced a new behavior in 1.43.1. Now, the entire pipeline is executed if the request is detected as cancelled, but subgraph requests are not actually done. The response will be reported with the `499` status code, but not actually sent to the client. + +To go back to the previous behavior of immediately cancelling the request, the following configuration can be used for `supergraph.early_cancel`: + +```yaml +supergraph: + early_cancel: true +``` + +Additionally, since v1.43.1, the router can show a log when it detects that the client canceled the request. This log can be activated with: + +```yaml title="router.yaml" +supergraph: + experimental_log_on_broken_pipe: true +``` + +#### Connection shutdown timeout + +When the Router schema or configuration updates all connections must be closed for resources to be freed. +To ensure that long-lived connections do not hang on to resources, a maximum graceful shutdown timeout can be configured with `supergraph.connection_shutdown_timeout`: + +```yaml title="router.yaml" +supergraph: + connection_shutdown_timeout: 60s +``` + +The default value is 60 seconds. + +Note that if `early_cancel` is `false` (default), then requests in progress will still hold onto pipeline resources. +In that case, traffic shaping request timeouts should be used to prevent long-running requests: + +```yaml title="router.yaml" +traffic_shaping: + router: + timeout: 60s +``` + +#### Automatic fragment generation + +By default, the router compresses subgraph requests by generating fragment definitions based on the shape of the subgraph operation. In many cases this significantly reduces the size of the query sent to subgraphs. + +You can explicitly opt-out of this behavior by specifying `supergraph.generate_query_fragments`: + +```yaml +supergraph: + generate_query_fragments: false +``` + +--- + + + + +#### Enhanced operation signature normalization + + + + + +The router supports enhanced operation signature normalization in the following versions: + +- [General availability](/resources/product-launch-stages/#general-availability) in v1.54.0 and later +- [Experimental](/resources/product-launch-stages/#experimental-features) in v1.49.0 to v1.53.0 + + + +Apollo's legacy operation signature algorithm removes information about certain fields, such as input objects and aliases. +This removal means some operations may have the same normalized signature though they are distinct operations. + +Enhanced normalization incorporates [input types](#input-types) and [aliases](#aliases) in signature generation. +It also includes other improvements that make it more likely that two operations that only vary slightly have the same signature. + +Configure enhanced operation signature normalization in `router.yaml` with the `telemetry.apollo.signature_normalization_algorithm` option: + +```yaml title="router.yaml" +telemetry: + apollo: + signature_normalization_algorithm: enhanced # Default is legacy +``` + +Once you enable this configuration, operations with enhanced signatures might appear with different operation IDs than they did previously in GraphOS Studio. + +##### Input types + +Enhanced signatures include input object type shapes, while still redacting any actual values. +Legacy signatures [replace input object type with `{}`](/graphos/metrics/operation-signatures/#1-transform-in-line-argument-values). + +Given the following example operation: + +```graphql showLineNumbers=false +query InlineInputTypeQuery { + inputTypeQuery( + input: { + inputString: "foo" + inputInt: 42 + inputBoolean: null + nestedType: { someFloat: 4.2 } + enumInput: SOME_VALUE_1 + nestedTypeList: [{ someFloat: 4.2, someNullableFloat: null }] + listInput: [1, 2, 3] + } + ) { + enumResponse + } +} +``` + +The legacy normalization algorithm generates the following signature: + +```graphql showLineNumbers=false +query InlineInputTypeQuery { + inputTypeQuery(input: {}) { + enumResponse + } +} +``` + +The enhanced normalization algorithm generates the following signature: + +```graphql {3-11} showLineNumbers=false +query InlineInputTypeQuery { + inputTypeQuery( + input: { + inputString: "" + inputInt: 0 + inputBoolean: null + nestedType: { someFloat: 0 } + enumInput: SOME_VALUE_1 + nestedTypeList: [{ someFloat: 0, someNullableFloat: null }] + listInput: [] + } + ) { + enumResponse + } +} +``` + +##### Aliases + +Enhanced signatures include any field aliases used in an operation. +Legacy signatures [remove aliases completely](/graphos/metrics/operation-signatures/#field-aliases), meaning the signature may be invalid if the same field was used with multiple aliases. + +Given the following example operation: + +```graphql showLineNumbers=false +query AliasedQuery { + noInputQuery { + interfaceAlias1: interfaceResponse { + sharedField + } + interfaceAlias2: interfaceResponse { + ... on InterfaceImplementation1 { + implementation1Field + } + ... on InterfaceImplementation2 { + implementation2Field + } + } + inputFieldAlias1: objectTypeWithInputField(boolInput: true) { + stringField + } + inputFieldAlias2: objectTypeWithInputField(boolInput: false) { + intField + } + } +} +``` + +The legacy normalization algorithm generates the following signature: + +```graphql showLineNumbers=false +query AliasedQuery { + noInputQuery { + interfaceResponse { + sharedField + } + interfaceResponse { + ... on InterfaceImplementation1 { + implementation1Field + } + ... on InterfaceImplementation2 { + implementation2Field + } + } + objectTypeWithInputField(boolInput: true) { + stringField + } + objectTypeWithInputField(boolInput: false) { + intField + } + } +} +``` + +The enhanced normalization algorithm generates the following signature: + +```graphql showLineNumbers=false +query AliasedQuery { + noInputQuery { + interfaceAlias1: interfaceResponse { + sharedField + } + interfaceAlias2: interfaceResponse { + ... on InterfaceImplementation1 { + implementation1Field + } + ... on InterfaceImplementation2 { + implementation2Field + } + } + inputFieldAlias1: objectTypeWithInputField(boolInput: true) { + stringField + } + inputFieldAlias2: objectTypeWithInputField(boolInput: false) { + intField + } + } +} +``` + + + +#### Extended reference reporting + + + + + +The router supports extended reference reporting in the following versions: + +- [General availability](/resources/product-launch-stages/#general-availability) in v1.54.0 and later +- [Experimental](/resources/product-launch-stages/#experimental-features) in v1.50.0 to v1.53.0 + + + + + +You can configure the router to report enum and input object references for enhanced insights and operation checks. +Apollo's legacy reference reporting doesn't include data about enum values and input object fields, meaning you can't view enum and input object field usage in GraphOS Studio. +Legacy reporting can also cause [inaccurate operation checks](#enhanced-operation-checks). + +Configure extended reference reporting in `router.yaml` with the `telemetry.apollo.metrics_reference_mode` option like so: + +```yaml title="router.yaml" +telemetry: + apollo: + metrics_reference_mode: extended # Default is legacy +``` + + + +#### Extended error reporting + + + + + + + +The router supports extended error reporting in the following versions: + +- [Preview](/resources/product-launch-stages/#preview) in v2.1.2 and later +- [Experimental](/resources/product-launch-stages/#experimental-features) in v2.0.0 + + + +You can configure the router to report extended error information for improved diagnostics. +Apollo's legacy error reporting doesn't include the service or error code, meaning you can't easily attribute errors to their root cause in GraphOS Studio. + +Configure extended reference reporting in `router.yaml` with the `telemetry.apollo.errors.preview_extended_error_metrics` option like so: + +```yaml title="router.yaml" +telemetry: + apollo: + errors: + preview_extended_error_metrics: enabled # Default is disabled +``` + +[Learn more.](/graphos/routing/graphos-reporting#errors) + +##### Configuration effect timing + +Once you configure extended reference reporting, you can view enum value and input field usage alongside object [field usage in GraphOS Studio](/graphos/metrics/field-usage) for all subsequent operations. + +Configuring extended reference reporting automatically turns on [enhanced operation checks](#enhanced-operation-checks), though you won't see an immediate change in your operations check behavior. + +This delay is because operation checks rely on historical operation data. +To ensure sufficient data to distinguish between genuinely unused values and those simply not reported in legacy data, enhanced checks require some operations with extended reference reporting turned on. + +##### Enhanced operation checks + +Thanks to extended reference reporting, operation checks can more accurately flag issues for changes to enum values and input object fields. See the comparison table below for differences between standard operation checks based on legacy reference reporting and enhanced checks based on extended reference reporting. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Standard Check Behavior
+ (Legacy reference reporting) +
+ Enhanced Check Behavior
+ (Extended reference reporting) +
+ +###### Enum value removal + + Removing any enum values is considered a breaking change if any operations use the enum.Removing enum values is only a breaking change if historical operations use the specific enum value(s) that were removed.
+ +###### Default argument changes for input object fields + + + Changing or removing a default argument is generally considered a breaking change, but changing or removing default values for input object fields isn't. + + Changing or removing default values for input object fields is considered a breaking change. + +You can [configure checks to ignore default values changes](/graphos/platform/schema-management/checks#ignored-conditions-settings). + +
+ +###### Nullable input object field removal + + Removing a nullable input object field is always considered a breaking change.Removing a nullable input object field is only considered a breaking change if the nullable field is present in historical operations. If the nullable field is always omitted in historical operations, its removal isn't considered a breaking change.
+ +###### Changing nullable input object fields to non-nullable + + Changing a nullable input object field to non-nullable is considered a breaking change.Changing a nullable input object field to non-nullable is only considered a breaking change if the field had a null value in historical operations. If the field was always a non-null value in historical operations, changing it to non-nullable isn't considered a breaking change.
+ + + +You won't see an immediate change in checks behavior when you first turn on extended reference reporting. +[Learn more.](#configuration-effect-timing) + + + +--- + + +--- + + +## YAML configuration utilities + +### Variable expansion + +You can reference variables directly in your YAML config file. This is useful for referencing secrets without including them in the file. + +Currently, the router supports expansion of environment variables and file paths. Corresponding variables are prefixed with `env.` and `file.`, respectively. + +The router uses Unix-style expansion. Here are some examples: + +- `${env.ENV_VAR_NAME}` expands to the value of environment variable `ENV_VAR_NAME`. +- `${env.ENV_VAR_NAME:-some_default}` expands to the value of environment variable `ENV_VAR_NAME`, or falls back to the value `some_default` if the environment variable is not defined. +- `${file.a.txt}` expands to the contents of the file `a.txt`. +- `${file.a.txt:-some_default}` expands to the contents of the file `a.txt`, or falls back to the value `some_default` if the file does not exist. + +Variable expansions are valid only for YAML _values_, not keys. + + +### Reusing configurations with YAML aliases + +You can reuse parts of your configuration file in multiple places using standard YAML aliasing syntax: + +```yaml title="router.yaml" +headers: + subgraphs: + products: + request: + - insert: &insert_custom_header + name: "custom-header" + value: "something" + reviews: + request: + - insert: *insert_custom_header +``` + +Here, the `name` and `value` entries under `&insert_custom_header` are reused under `*insert_custom_header`. + +## Related topics + +- [Checklist for configuring the router for production](/technotes/TN0008-production-readiness-checklist/#apollo-router) \ No newline at end of file diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx index 287a11130d..bc24821a2e 100644 --- a/docs/source/routing/get-started.mdx +++ b/docs/source/routing/get-started.mdx @@ -10,8 +10,8 @@ Hello! Let's run Apollo Router for the very first time. You will: - Download and install a router binary. - Download a supergraph schema. -- Create and edit a YAML configuration file. -- Run the router in development mode, with your configuration and for your supergraph. +- Create a router YAML configuration file. +- Run the router in development mode. - Make a query to the running router. ## 1. Install router binary @@ -206,9 +206,9 @@ Let's customize a common setting: the router's _supergraph listen address_. It's ## 4. Run the router -When you're developing with the router locally and in non-production environments, it's useful to run the router in _development mode_, or dev mode. Dev mode is a collection of router configuration settings that make development easier. +When you're developing with the router locally, it's useful to run the router in _development mode_, or dev mode. Dev mode is a collection of router configuration settings that enable development and debugging features. -Let's run the router in dev mode. We'll use both the supergraph schema and YAML configuration files you saved: +Let's run the router in dev mode. We'll also run the router using both the supergraph schema and YAML configuration files you saved: 1. Run the router with command-line options: - `--dev` enables dev mode @@ -246,7 +246,7 @@ Let's run the router in dev mode. We'll use both the supergraph schema and YAML -## 4. Make a query +## 5. Make a query A router in dev mode runs its own [Apollo Sandbox](/graphos/explorer/sandbox/), a local GraphQL server running a development instance of your graph. Sandbox has a browser-based IDE, Explorer, that you can use to write and send real GraphQL queries to your development graph. @@ -256,29 +256,29 @@ Let's use Sandbox and its Explorer IDE to write a query and send it to your grap 1. Copy and paste the example query into the **Operation** pane of Explorer: - ```graphql - query Query { - recommendedProducts { - inStock - name - price - reviews { - author { - name + ```graphql + query Query { + recommendedProducts { + inStock + name + price + reviews { + author { + name + } } } } - } -``` + ``` 1. Click **Query** to run the query, then check for its response in the **Response** pane. - Apollo Sandbox IDE showing successful query and response at the end of the router quickstart + Apollo Sandbox IDE showing successful query and response at the end of the router quickstart That's it! You've successfully sent a query to a router running a development graph and received a response. diff --git a/docs/source/routing/security/request-limits-overview.mdx b/docs/source/routing/security/request-limits-overview.mdx deleted file mode 100644 index c8dbb1e7d3..0000000000 --- a/docs/source/routing/security/request-limits-overview.mdx +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Request Limits -subtitle: Protect your router from requests exceeding network, parser, and operation-based limits -redirectFrom: - - /router/configuration/operation-limits/ ---- - -For enhanced security, the GraphOS Router can reject requests that violate any of the following kinds of limits: - -- Operation-based semantic limits -- Network-based limits -- Parser-based lexical limits - -```yaml title="router.yaml" -limits: - # Network-based limits - http_max_request_bytes: 2000000 # Default value: 2 MB - http1_max_request_headers: 200 # Default value: 100 - http1_max_request_buf_size: 800kb # Default value: 400kib - - # Parser-based limits - parser_max_tokens: 15000 # Default value - parser_max_recursion: 500 # Default value - - # Operation-based limits (Enterprise only) - max_depth: 100 - max_height: 200 - max_aliases: 30 - max_root_fields: 20 -``` - -Learn more about [configuring request limits](/graphos/routing/security/request-limits). diff --git a/docs/source/routing/security/request-limits.mdx b/docs/source/routing/security/request-limits.mdx index a2cf045fd5..c081f350be 100644 --- a/docs/source/routing/security/request-limits.mdx +++ b/docs/source/routing/security/request-limits.mdx @@ -1,11 +1,15 @@ --- -title: Request Limits Configuration -subtitle: Configure network, parser, and operation-based limits +title: Request Limits +subtitle: Protect your router from requests exceeding network, parser, and operation-based limits redirectFrom: - /router/configuration/operation-limits/ --- -Learn how to configure network, parser, and operation-based request limits. +For enhanced security, the GraphOS Router can reject requests that violate any of the following kinds of limits: + +- Operation-based semantic limits +- Network-based limits +- Parser-based lexical limits ```yaml title="router.yaml" limits: From 92e5c24ef122a1b96d25412d3fc11e2ba6eeb2f0 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Fri, 2 May 2025 16:21:01 -0700 Subject: [PATCH 30/47] update config descriptions --- docs/shared/config/apq.mdx | 4 - docs/shared/config/authentication.mdx | 6 +- docs/shared/config/authorization.mdx | 4 - docs/shared/config/batching.mdx | 4 - docs/shared/config/connectors.mdx | 2 - docs/shared/config/coprocessor.mdx | 6 +- docs/shared/config/cors.mdx | 4 - docs/shared/config/csrf.mdx | 6 -- docs/shared/config/demand_control.mdx | 4 - docs/shared/config/experimental.mdx | 22 ---- docs/shared/config/experimental_chaos.mdx | 6 ++ ...experimental_type_conditioned_fetching.mdx | 5 - docs/shared/config/fleet_detector.mdx | 2 - docs/shared/config/forbid_mutations.mdx | 4 - docs/shared/config/headers.mdx | 4 - docs/shared/config/health_check.mdx | 4 - docs/shared/config/homepage.mdx | 4 - .../shared/config/include_subgraph_errors.mdx | 4 - docs/shared/config/license_enforcement.mdx | 2 - docs/shared/config/limits.mdx | 4 - docs/shared/config/override_subgraph_url.mdx | 4 - docs/shared/config/persisted_queries.mdx | 4 - docs/shared/config/plugins.mdx | 2 - .../{preview.mdx => preview_entity_cache.mdx} | 22 +--- docs/shared/config/preview_file_uploads.mdx | 4 - docs/shared/config/progressive_override.mdx | 4 - docs/shared/config/rhai.mdx | 4 - docs/shared/config/sandbox.mdx | 4 - docs/shared/config/subscription.mdx | 4 - docs/shared/config/supergraph.mdx | 6 +- docs/shared/config/telemetry.mdx | 6 +- docs/shared/config/tls.mdx | 4 - docs/shared/config/traffic_shaping.mdx | 4 - .../images/router-quickstart-sandbox.jpg | Bin 292321 -> 552843 bytes docs/source/routing/configuration/yaml.mdx | 98 ++++++++++++++++-- 35 files changed, 108 insertions(+), 163 deletions(-) delete mode 100644 docs/shared/config/experimental.mdx create mode 100644 docs/shared/config/experimental_chaos.mdx rename docs/shared/config/{preview.mdx => preview_entity_cache.mdx} (74%) diff --git a/docs/shared/config/apq.mdx b/docs/shared/config/apq.mdx index 1a377c49a3..fab7cb309f 100644 --- a/docs/shared/config/apq.mdx +++ b/docs/shared/config/apq.mdx @@ -1,9 +1,5 @@ ### `apq` -Automatic Persisted Queries (APQ) configuration - - - ```yaml title="apq" apq: enabled: true diff --git a/docs/shared/config/authentication.mdx b/docs/shared/config/authentication.mdx index a62f8358cb..323ef3c8d0 100644 --- a/docs/shared/config/authentication.mdx +++ b/docs/shared/config/authentication.mdx @@ -1,8 +1,6 @@ ### `authentication` -Authentication - - + ```yaml title="authentication" authentication: @@ -42,3 +40,5 @@ authentication: service_name: example_service_name subgraphs: {} ``` + + diff --git a/docs/shared/config/authorization.mdx b/docs/shared/config/authorization.mdx index ffbb4c64c9..a26d2b8a93 100644 --- a/docs/shared/config/authorization.mdx +++ b/docs/shared/config/authorization.mdx @@ -1,9 +1,5 @@ ### `authorization` -Authorization plugin - - - ```yaml title="authorization" authorization: directives: diff --git a/docs/shared/config/batching.mdx b/docs/shared/config/batching.mdx index ca48b58ebf..6f2bea7318 100644 --- a/docs/shared/config/batching.mdx +++ b/docs/shared/config/batching.mdx @@ -1,9 +1,5 @@ ### `batching` -Configuration for Batching - - - ```yaml title="batching" batching: enabled: false diff --git a/docs/shared/config/connectors.mdx b/docs/shared/config/connectors.mdx index 88355585bc..a4a679902b 100644 --- a/docs/shared/config/connectors.mdx +++ b/docs/shared/config/connectors.mdx @@ -1,7 +1,5 @@ ### `connectors` - - ```yaml title="connectors" connectors: debug_extensions: false diff --git a/docs/shared/config/coprocessor.mdx b/docs/shared/config/coprocessor.mdx index 647fb9c21d..49c37e5fea 100644 --- a/docs/shared/config/coprocessor.mdx +++ b/docs/shared/config/coprocessor.mdx @@ -1,8 +1,6 @@ ### `coprocessor` -Configures the externalization plugin - - + ```yaml title="coprocessor" coprocessor: @@ -96,3 +94,5 @@ coprocessor: secs: 1 url: http://service.example.com/url ``` + + diff --git a/docs/shared/config/cors.mdx b/docs/shared/config/cors.mdx index 8607391123..69a0bf05e5 100644 --- a/docs/shared/config/cors.mdx +++ b/docs/shared/config/cors.mdx @@ -1,9 +1,5 @@ ### `cors` -Cross origin request configuration. - - - ```yaml title="cors" cors: allow_any_origin: false diff --git a/docs/shared/config/csrf.mdx b/docs/shared/config/csrf.mdx index 9b0a832b44..9591056a28 100644 --- a/docs/shared/config/csrf.mdx +++ b/docs/shared/config/csrf.mdx @@ -1,11 +1,5 @@ ### `csrf` -CSRF protection configuration. - -See https://owasp.org/www-community/attacks/csrf for an explanation on CSRF attacks. - - - ```yaml title="csrf" csrf: required_headers: diff --git a/docs/shared/config/demand_control.mdx b/docs/shared/config/demand_control.mdx index 8bb087ee61..b94def2bf3 100644 --- a/docs/shared/config/demand_control.mdx +++ b/docs/shared/config/demand_control.mdx @@ -1,9 +1,5 @@ ### `demand_control` -Demand control configuration - - - ```yaml title="demand_control" demand_control: enabled: false diff --git a/docs/shared/config/experimental.mdx b/docs/shared/config/experimental.mdx deleted file mode 100644 index 12581f9814..0000000000 --- a/docs/shared/config/experimental.mdx +++ /dev/null @@ -1,22 +0,0 @@ -### `experimental_chaos` - -Configuration for chaos testing, trying to reproduce bugs that require uncommon conditions. You probably don’t want this in production! - - - -```yaml title="experimental_chaos" -experimental_chaos: - force_reload: null -``` - -### `experimental_type_conditioned_fetching` - -Type conditioned fetching configuration. - -- **Type:** `boolean` -- **Default:** `False` - -```yaml title="experimental_type_conditioned_fetching" -experimental_type_conditioned_fetching: false -``` - diff --git a/docs/shared/config/experimental_chaos.mdx b/docs/shared/config/experimental_chaos.mdx new file mode 100644 index 0000000000..0b50502cfd --- /dev/null +++ b/docs/shared/config/experimental_chaos.mdx @@ -0,0 +1,6 @@ +### `experimental_chaos` + +```yaml title="experimental_chaos" +experimental_chaos: + force_reload: null +``` diff --git a/docs/shared/config/experimental_type_conditioned_fetching.mdx b/docs/shared/config/experimental_type_conditioned_fetching.mdx index b6db2871d6..2902967d69 100644 --- a/docs/shared/config/experimental_type_conditioned_fetching.mdx +++ b/docs/shared/config/experimental_type_conditioned_fetching.mdx @@ -1,10 +1,5 @@ ### `experimental_type_conditioned_fetching` -Type conditioned fetching configuration. - -- **Type:** `boolean` -- **Default:** `False` - ```yaml title="experimental_type_conditioned_fetching" experimental_type_conditioned_fetching: false ``` diff --git a/docs/shared/config/fleet_detector.mdx b/docs/shared/config/fleet_detector.mdx index ca6662241b..eb30000b57 100644 --- a/docs/shared/config/fleet_detector.mdx +++ b/docs/shared/config/fleet_detector.mdx @@ -1,7 +1,5 @@ ### `fleet_detector` - - ```yaml title="fleet_detector" fleet_detector: {} ``` diff --git a/docs/shared/config/forbid_mutations.mdx b/docs/shared/config/forbid_mutations.mdx index 03337cd8c4..ffab6b2f68 100644 --- a/docs/shared/config/forbid_mutations.mdx +++ b/docs/shared/config/forbid_mutations.mdx @@ -1,9 +1,5 @@ ### `forbid_mutations` -Forbid mutations configuration - -- **Type:** `boolean` - ```yaml title="forbid_mutations" forbid_mutations: false ``` diff --git a/docs/shared/config/headers.mdx b/docs/shared/config/headers.mdx index f665c2859f..8ae504126d 100644 --- a/docs/shared/config/headers.mdx +++ b/docs/shared/config/headers.mdx @@ -1,9 +1,5 @@ ### `headers` -Configuration for header propagation - - - ```yaml title="headers" headers: all: diff --git a/docs/shared/config/health_check.mdx b/docs/shared/config/health_check.mdx index a69e93eb32..7e49924a48 100644 --- a/docs/shared/config/health_check.mdx +++ b/docs/shared/config/health_check.mdx @@ -1,9 +1,5 @@ ### `health_check` -Configuration options pertaining to the health component. - - - ```yaml title="health_check" health_check: enabled: true diff --git a/docs/shared/config/homepage.mdx b/docs/shared/config/homepage.mdx index a6eefcac40..3bfe701c5a 100644 --- a/docs/shared/config/homepage.mdx +++ b/docs/shared/config/homepage.mdx @@ -1,9 +1,5 @@ ### `homepage` -Configuration options pertaining to the home page. - - - ```yaml title="homepage" homepage: enabled: true diff --git a/docs/shared/config/include_subgraph_errors.mdx b/docs/shared/config/include_subgraph_errors.mdx index 2294e67660..34d3a2a2a5 100644 --- a/docs/shared/config/include_subgraph_errors.mdx +++ b/docs/shared/config/include_subgraph_errors.mdx @@ -1,9 +1,5 @@ ### `include_subgraph_errors` -Configuration for exposing errors that originate from subgraphs - - - ```yaml title="include_subgraph_errors" include_subgraph_errors: all: false diff --git a/docs/shared/config/license_enforcement.mdx b/docs/shared/config/license_enforcement.mdx index 0704c226ad..d926504cb1 100644 --- a/docs/shared/config/license_enforcement.mdx +++ b/docs/shared/config/license_enforcement.mdx @@ -1,7 +1,5 @@ ### `license_enforcement` - - ```yaml title="license_enforcement" license_enforcement: {} ``` diff --git a/docs/shared/config/limits.mdx b/docs/shared/config/limits.mdx index ec982d96e7..b617c36d7c 100644 --- a/docs/shared/config/limits.mdx +++ b/docs/shared/config/limits.mdx @@ -1,9 +1,5 @@ ### `limits` -Configuration for operation limits, parser limits, HTTP limits, etc. - - - ```yaml title="limits" limits: http1_max_request_buf_size: null diff --git a/docs/shared/config/override_subgraph_url.mdx b/docs/shared/config/override_subgraph_url.mdx index a1e8daed81..cb42d11fe9 100644 --- a/docs/shared/config/override_subgraph_url.mdx +++ b/docs/shared/config/override_subgraph_url.mdx @@ -1,9 +1,5 @@ ### `override_subgraph_url` -Subgraph URL mappings - -- **Type:** `any` - ```yaml title="override_subgraph_url" override_subgraph_url: {} ``` diff --git a/docs/shared/config/persisted_queries.mdx b/docs/shared/config/persisted_queries.mdx index 9f3e8f3bfc..2661245424 100644 --- a/docs/shared/config/persisted_queries.mdx +++ b/docs/shared/config/persisted_queries.mdx @@ -1,9 +1,5 @@ ### `persisted_queries` -Persisted Queries (PQ) configuration - - - ```yaml title="persisted_queries" persisted_queries: enabled: false diff --git a/docs/shared/config/plugins.mdx b/docs/shared/config/plugins.mdx index e3a2a6366f..39c73550c9 100644 --- a/docs/shared/config/plugins.mdx +++ b/docs/shared/config/plugins.mdx @@ -1,7 +1,5 @@ ### `plugins` -- **Type:** `any` - ```yaml title="plugins" plugins: unknown_type_plugins ``` diff --git a/docs/shared/config/preview.mdx b/docs/shared/config/preview_entity_cache.mdx similarity index 74% rename from docs/shared/config/preview.mdx rename to docs/shared/config/preview_entity_cache.mdx index 82ccdad1fd..4a0ad27456 100644 --- a/docs/shared/config/preview.mdx +++ b/docs/shared/config/preview_entity_cache.mdx @@ -1,8 +1,6 @@ ### `preview_entity_cache` -Configuration for entity caching - - + ```yaml title="preview_entity_cache" preview_entity_cache: @@ -44,20 +42,4 @@ preview_entity_cache: subgraphs: {} ``` -### `preview_file_uploads` - -Configuration for File Uploads plugin - - - -```yaml title="preview_file_uploads" -preview_file_uploads: - enabled: false - protocols: - multipart: - enabled: true - limits: - max_file_size: example_max_file_size - max_files: 0 - mode: stream -``` + diff --git a/docs/shared/config/preview_file_uploads.mdx b/docs/shared/config/preview_file_uploads.mdx index 1e2945900a..b598822fab 100644 --- a/docs/shared/config/preview_file_uploads.mdx +++ b/docs/shared/config/preview_file_uploads.mdx @@ -1,9 +1,5 @@ ### `preview_file_uploads` -Configuration for File Uploads plugin - -- **Type:** `object` - ```yaml title="preview_file_uploads" preview_file_uploads: enabled: false diff --git a/docs/shared/config/progressive_override.mdx b/docs/shared/config/progressive_override.mdx index b09ffb7314..5265cb86a1 100644 --- a/docs/shared/config/progressive_override.mdx +++ b/docs/shared/config/progressive_override.mdx @@ -1,9 +1,5 @@ ### `progressive_override` -Configuration for the progressive override plugin - - - ```yaml title="progressive_override" progressive_override: {} ``` diff --git a/docs/shared/config/rhai.mdx b/docs/shared/config/rhai.mdx index 26623822d3..a4e44353d3 100644 --- a/docs/shared/config/rhai.mdx +++ b/docs/shared/config/rhai.mdx @@ -1,9 +1,5 @@ ### `rhai` -Configuration for the Rhai Plugin - - - ```yaml title="rhai" rhai: main: example_main diff --git a/docs/shared/config/sandbox.mdx b/docs/shared/config/sandbox.mdx index 5b5bd9726b..0cf620f23d 100644 --- a/docs/shared/config/sandbox.mdx +++ b/docs/shared/config/sandbox.mdx @@ -1,9 +1,5 @@ ### `sandbox` -Configuration options pertaining to the sandbox page. - - - ```yaml title="sandbox" sandbox: enabled: false diff --git a/docs/shared/config/subscription.mdx b/docs/shared/config/subscription.mdx index 35d03506f0..33b1fa84ad 100644 --- a/docs/shared/config/subscription.mdx +++ b/docs/shared/config/subscription.mdx @@ -1,9 +1,5 @@ ### `subscription` -Subscriptions configuration - - - ```yaml title="subscription" subscription: enable_deduplication: true diff --git a/docs/shared/config/supergraph.mdx b/docs/shared/config/supergraph.mdx index 826834c224..289f8660cc 100644 --- a/docs/shared/config/supergraph.mdx +++ b/docs/shared/config/supergraph.mdx @@ -1,8 +1,6 @@ ### `supergraph` -Configuration options pertaining to the supergraph server component. - - + ```yaml title="supergraph" supergraph: @@ -40,3 +38,5 @@ supergraph: experimental_reuse_query_plans: false warmed_up_queries: null ``` + + diff --git a/docs/shared/config/telemetry.mdx b/docs/shared/config/telemetry.mdx index 51f47d7186..715b3d5c66 100644 --- a/docs/shared/config/telemetry.mdx +++ b/docs/shared/config/telemetry.mdx @@ -1,8 +1,6 @@ ### `telemetry` -Telemetry configuration - - + ```yaml title="telemetry" telemetry: @@ -696,3 +694,5 @@ telemetry: graphql.operation.type: alias: example_alias ``` + + diff --git a/docs/shared/config/tls.mdx b/docs/shared/config/tls.mdx index 27073688db..562517fd75 100644 --- a/docs/shared/config/tls.mdx +++ b/docs/shared/config/tls.mdx @@ -1,9 +1,5 @@ ### `tls` -TLS related configuration options. - - - ```yaml title="tls" tls: connector: diff --git a/docs/shared/config/traffic_shaping.mdx b/docs/shared/config/traffic_shaping.mdx index e3b257fb3b..202aba9661 100644 --- a/docs/shared/config/traffic_shaping.mdx +++ b/docs/shared/config/traffic_shaping.mdx @@ -1,9 +1,5 @@ ### `traffic_shaping` -Configuration for the experimental traffic shaping plugin - - - ```yaml title="traffic_shaping" traffic_shaping: all: diff --git a/docs/source/images/router-quickstart-sandbox.jpg b/docs/source/images/router-quickstart-sandbox.jpg index 98e67f0688cd19f5d6d15370798df033c4458579..c26adceed6e13b64768b0d4a8583b447f8854b71 100644 GIT binary patch literal 552843 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盆(ovApNyJZE0L}P(y{U+hrG+ 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⁢t3n zyOvjAs0qO6?Ty$mRkp_fS}GI-rQUnTQjVWzg|^fpEVpK+nlv9}A9zN3Y7kVm=%zTA zMj|bzZ%4Q00D8uiscLs9_f(hl4!M~gg9fI1W!~pgWh>v6ejR*v;*NhvgqbRlDxV72 zvN-H)z?@?T2(hhrq_qYKvZNPda()R;)JY%Zq+wmd3JOH5!Mp3AT zfhgJ_^j)8hx{+u9Ci1|9d7;h|_lQi_)v|?1l`*$vt6l_`CO%3&B(x+U9G;VXP-vr3XF!>dQ zOW4B{b!XQNqFxi`SOt}tm6&;tJpuC=Evz7WY5^93Q$4isohd&i&cETROl+(b!W0Yf z-uWPi#jlrUw#+W!O(>~ zb6iG`4{oZ|B(#q!LYrGzylqN^P0rcwA8 zIM~!EGgS8AkHMHuu|RhLU}6Q}AuY(U%E4A9YR`B32Bv3E&UNN&o5UHooOH5Ff=&cN z88*mR*&O%Obo?G7E2RTji676b&6Lt8kn68{sZHv3W>dA1h{{Et|GPzf!S<h*@prqPmOTJFAWU_q&FNK z-jJ!44K>kQ*?OVg+V{1ba;D2n7acV8w-)fP7@#$ z%@4g|{1MD9JUfU9YqXW}H@rA(D30l#)MXaN<+DaX!_^|ObTQ2>{V88Z*mK)(J#VlLbf)Ov}87|)U;|Aw2`1_ey&nGtdc|FyRo(zesFX)Ml$kL3@ zpa5VOsI*Cu1(g7)J%P6-Od#?pH5g{T+ZhT z%N@c-8=gpR)5j$c4P*|I-wDH8=oVxSXUICxNKC=_Y>pM-Qw?*-^vQrbgL+GB;s=>e z{$ubO`|QG8mFm<2&o30uwBR6VzTn1LlpR{*T_4xH5HP1lfb>~w1QXc;Qv5EJ0#(*; z0VJHYf0lnZeS~`vQTk24p8tGOBHm%p;DmT3(HoA;!3%pXwt0%mTq(5qGO@wg;8x1Y zA-&~5W%yP&%vyUfcm3UW!REE`1^#|3a6$eElBKdZhNz$!++z?Fc%*qsyuA%8_XQmN z3O-qDP~=)O8>;B;YeMKVye!Ny(@^>;Un=9Y8D{C+LP6XO{qD zh1|V>$&Aqs3;%mFJV8%hp`jYet$Y66$n7fs?Zo&QqLBxMC6O0d@Ih^jo4J>KlrXS* zXJotE-ML1U_p!gb=`g}8a4yb0q8lT`2Xn$@xskkj>WxcKFzE$H8waoc-wbszpmpLf z|0K$L2HWx-WQ=V+HP}a|MoIq^NPITpCB@Qs98rRbzgEFYf3OnrW}qF0cO$rIO;yG9mjy*1F5+6bjI43oz5%f zLg}7IK4jo<(?c3{JHY~|kt(tgk357n2cqfmm*nQB9ETvr{dZBg?dqbsguR|^)}u4%<_f~#gf5yKW16&R=l!0Jq{LpCsp)Cjt#0}daH$@4~e5n zt#PGT@-w&?o!(d)ad>6wKrnzdotcsZWE_XNriEs=4eIs3o3JDvmzo^RLxzU=zwxVy zY)v`mWnWoIZ2~3FA3Htx17HsJR@STF#R}M0%nPnHkAOLeGUxA?2sKxLRySR~_jyPOpqi$yKcid)>iG3Qbb3`XFApZm* zKcBn70QY1ehq3;!C)wc6anut`559cY&F52tl66F5MTgw; zj9YIqo;jywM4T3(jCU1ybe!$!m|0QGTc`5?$p6if< z88XxYeq-r1p7q;~9DT@*WHvV&sxt)>H7H{mU*jDH(5}<zm4VN_QvQe|RhQdos^8C3209A25Z>!B{(i^|cKihOj^^jXM2s5uK;o!7?=@cy z+kCNIvxzEJ*RW$}lY|zPtF|cFZrO05Cl0YP$`LlujQ{qvc3#;qR%d$!_6WqQ14TgRg;aV~;&mf4oKo?A$YLTpxaO(xn{H|rWoy<9EOm_QK zob8}e|7Nc!P|TinjJ+1`TwOh6mM3<^ebUWc@fE`FyRCGvvo21jem;}GR9@9x@m;0~ zLS6$2NuHQK2t~3PJGKU*OJ+F+e$)z)R-*6BB~lbd0VU)LWU=6MHNHd|+}f%=V7xu9+|!lfS1z#1xpj;NghL zB0@U?`)1L>Hu7L*s6pCu*o66^q~t2=guHHK_$Z&j0Pv?U{YGGyS9$sS5*66|O8uTr#NSQcDP-(%MfWDu_TYq-?pzIA5%eJ!hC5Sg*zY=8p1Ld9jPS=B zm9j^8b87=52CDr1^#y3relY09{`<67*0d00T-pe z_uR8zm(Ky$epgFlkWx2*5W#`;U`$Z#(#+xwf`iz*I~84+BKKvliH<(YNk)BPHA9a= zsnYY#d@}p^v6_67S==XnwaF45`ZZA=8v$Ux7s9>xOXxxn4#~8`CHxeSGrEP0(u0si znyisCU*#l$ps*Z~CzBGa^hY7sLvXoMWL78+Ej&G;fPy&A!j77(RnSpWec0@8wzg@_Ph zh$tmMAc_dmmsF)iYD5T8ARsM~z5wY>f|La5EkOtYl6dCY`}_9TXPj~F9cPSv@7{Oc zKlmdsGA47*_nq^3o?mObpDKDxXrjLi|Eb6<-&MvtOC|+W5fh%dU414c6IIGHxcyTq z_KT~$j)<;MmY^uwlBi;7D+wD!n2dH@3X4?I&!|be90episc?X&%>Dx`d@FeLMH}rv z%+%U`{#VdRii(kk=rcO=2$_M83W7G|_pRz*bDb8Aso5<_w-3`s%X<3v_z)Zs_QMxA z0M)^|SF6hwkns39N!J<{C0RGQ&3D*(O*7y4kE2mCzKT(^KYTwjCrS|Jj3?0S3mFNj zGsuLcz@d9~aM)3TIk<%(##W8}U>_m%x?9`l634Tn#J=_fdHDxj`l;aqUek11+ggG= zn3unddjKAVp?~ARTXv+HDmX+|5@W47OW2BK961F)ycm=WgTBP-(b0zyHQA}!J<`Z3 zZ#2OIHY=hzaD%seE*Ni65_tZNzM{JD*Yf>#1uDZk6j_n$fEjPMT6+GRj`S0ou)Zh7 z)reg34h!?u{oa$#i)(I{CCci?YT_X_W*`jdySgU0I!pR<<#B;<>v$#+ZZ^ymjXfUkSAPJIAZzQqlFA1pPn{iRz+mnZka= zSbZ+@%6C}nP{&VEclDdf>b8fC4t7W^(Z3H}eR|y*o8oF96N3PV2dV4RTwB&O8xKrT zEU~s6!CmDg++n^9=MvlJ6O&ABp+@7y>OdbbvrBN!OU9BZIRxAwFUs7EsLi3psaf`; z3ZTcls_gGfHiRabJaUbCM%>rb)Q-4svu><{xuXsRZ&niK<>T{I51_jT&^Ci1qo*tMxw!`=!_QK3~1!y#9TshpokXR~N{dyUQb% zaD9%ykbvx?A}3?0d+TI*k%aFK`q{!vy#?Xi_L8@2YcJUqjcjz~vjcXd7>%4xyIsu$cbv~TSX%}9zL-)1WvGEdZm)a13d zcloaw_<41rj{fcGS0R;PXb9c4Z<&5maWHMFY9*4DF=hV(Kp84_>`a+md~~N% zz~N$9rxQOFZLfvcXthi&JTYq9(z<%}YU%jgnjZPVuEH1YRe*fm$RpJuS>{%}6rd-I znVS0o3Fqq$hn_&VT;XI)Wue-jPUkvPlKA730|J;B*w@+x zzw3J9T~ROf0du=bqaZTg^{}Oq^s54))fAymc~B8ET$6QDY=J7#YpB|ehEVZol6pJq z=Oe0_Ei3$@$u3o1+eg9!R(g)Cp?amo^1@4rl@rvcHQqPgr>V~nM8;&86dQ7Mjelew zRB_=W>o~q}i7!&dvZFFT`5pAuB-Vi$YFWZCyb0@ARb7?2g^7Ky_+62`or(n%Lfb00 zh9vOG%GWI_RfzfIrHSQ<7)RYdZK9L4LYF-{XBj~isRnczlDhhZ%1k$1vwY^3{oPr* z(xK5}vpd!U?h3&5ab@CHs84qv;u>z0a6zmDHm<)8pzX!51K`oHi7IAf3yl!LHTCmh z&cTx!%P=>L$eb5$!Sug;#}&O%ey_-K<_;+1^;@N=?CvWxshxWvw+r0gUMh}gHH#s{ z?$o(P5u_VbS#!2$=gF66JmekPQao3&t#GJLV4;7}{f|~enK$4PGYqVZaGANz4((8_ zd2AIonDnG}$k8*Dk5~wnd>I>*$#nL*FgkWF#}By|Hg<0!U%AR=j8;)jt`N7Bzx57L z=;`Jj+j-i#ZF;A?j-cqxoydq!uD(M303dKw=SMyFlq{AI_SR| z3ijV#79>=qQ#t(b+r9RgjN13hM7}BLYjuiqUd)!~n2x%40Oecj_v8DX{XVv?@$Web z|CNx+|1Ih9|2V#euZEi{gNyp%pW&ERpAB^;IC{n`&4#< z`Nhsq7UdouqOdAy zM+Vv$=ie+B0oa{tX{V%dn$H7T12Xpv^BO^T=$CZkE!o?NyGC^Lk$m4 zJTek;h)sJb7vy&VbC^+{R1CdTaL6UwIkh`^?z#&~B1O*uDXoj-Hc z47$#JcuD-t{o-k#6vC^P`yV>UK|>l{*7@T&lSs4ERf7cZF*GG56ofto5eO(Y)i`VLM6#q!l70uEd(wd z-|R}boa0sDbzSu?T_}l9Viv2AQXa>Hmb40tOWmVMZ+EXwX4w#Bw9c<5!|r8|h(;9H zU9jI$lGZb`4#&ZYS>hXi%YPtQ@Z+IllVu(+aZ{B6d_5MpH9-hLkznGM^@{o3>9e(d zh*E>fI98`IuTWc$Xiw*cX~;W0FNGmGpRD%)2wJQ78O7aIRbMM?WtB5zZwBp}{Wt=e z#Gjb^#@pbeOmX<9fkFnLX`ZVNR>nS^B1vKlo&L(c^`j!8nI_5ppQD6gpB0`E>O#2X z6c^SOheocGcQ0Z9`{E*|9$g=|4~OR2GbX>lX@n`_L_Hn%YC^n@)3$5p8Ke|LL}_15c<_ch856+i@?iKM6mW1%!mY*5cHKU zE?O(jW?D32bIBCVy(ZOco^_*DH!#C~h%%|Kli-6eD9*@`s2f0^PMp;x)}SgQ7LT#L z&)@r$46~=Cxdh>Xka-Z(8i@1Ci-fep}FgOhh2ELLP(!v)y?qNy zuRdo!6cypbKv_!9O4qn1IpY|B)5GwkrN$jdql@L}D!AUvCs;im6*u(?B+95p{>2rUN*J?g=o_zX zR~T1{z`0ZR&lf%EH{TsW3^$v(KqoFdqJFi2nsTWZ+F=FzNAJRYkFoet?+IPvTO z?o2Zm1q|{*jlMfg{bxgBp`3zkka1`iZarD_8HD`;`VzO(n=T^i!PnWA6lJvW8-S-k zfx=V_bo+Wj1a6r}q;8VXDm?1a_HDo`qm9=L!~yk`L8jj04}{8baDc2blZwRC6q=|< zH*uqu;FsxZUqG=GRSuGYi;_7|#7wYBYu0UxsoOJ+KMHQFN8V&%n5fwz;^YF1Hxn~C zdh?@G!RE_upz1p~RKSSu3Y7!gX}NK#`Gi9q+|(I=N|wzQ%%5K?H@A$NqH+`k6Q~IE zL4Zh5mYoCOZ*48qa2F5@9IFMFha^C}psygJ+&!RIzGP+up>WaVH0K3r(Qxm_kveED zvg#AfGcEMd)?>to=7I<>6@T(YjgwK(5&4$(C(fS<9)T4#e*Qx^C;3QbIo}4pYl9n2 z#RB-jU`K!2w_gHP)N7>aPJTVDop)mm5i{=#n*OeVkmJ2{MEKX zT*G;6Aewc9-36@EV(fJw*(e69QNXEf1Nar^$T>iV)r-~#GZ0ukKW0;lM^id5F^eQi zCfM{%u`I)Da8Vn@a&{9vc9AB->QZ+y<7+E&bikHSiXw=qVfo>Nk%n^B z99PB|M7WDVJO{6G;FPsaTb2zOZLsamh1lCw4!s)~8y+_0R{jzIFXd#~Ub$*qz}U`+ znN74b(CApfDQs4;12}tk)iFQW%Dj9n$hWE+thq>iDFFL*V{Ap@n;~N0&x@y2w?ZUKc$YysFL?D^SOH3bDL1tpvIrcSwIPd!_Yi2bm$ zfrg^IiMU{=Akb-k>m>6IG>j@ty$=`Wx8slHuu3y_U9s{2zlJa11u2&Y7@6XWlM+~y z>5%=}U9wF;4_h|iTjYye5lAU+;ZJ_wYcY4Y0Y>sj^buWKr{aWvz`<^J4n{Ui6j5K5n_mE?0rAaU?`(d zeP?5!vCoA9qzUH+CU-t*AsPl=_{8{+lV0ztvCJ9xCfsw-ko$dj()@-zWkcTpLXhpu0FL0AmN)&~wPpeU(*%3d0(8QaG00U!PbS&HWBWgm$DZ zCbFr|_&D4AW7_chUe#8HTH;ur!eRZ~>5lBGq^cBvkCTuOnJU4H)**}jcJHMaVx$_= z+u~PoZap+AU35hSD5C^D4|;Fbqv`nPrGCd*Rc!g>J^a35t);+a?JGljvPaA+hBZ+Q z50pC$?EL@?#`(dv+gVckmG**BG-1>2N6%OcyO1LZOfJHgu+HzMRzj9Vb}^hhi(yUv zKJM8%P8Bm@I-8o0*s7Vv>h)7JIMx<|jq+NQzKyZqu4`Jt2KIM`&an;!*D@}SHjpX|IpI_ruf}q z$|;W27hoZUUKm}1NIt65E?vMM(X6u~alv7jI!XH4(WOe6`<$faAmg{d*bj+`Hjojn zhZvEEv^+Jn_r4#$=jd2bQZPS6B|#S(lc%rt&kU&;pa@N68|%HBJ!2$>QUv7TBu7PO zS$fx$`$tVRlknv|UzQupfigs+5*KPxwj#I+j1`>mu16$F-_$V8BSbSxzE+({L#&$~ zX&ZeHzvVXI8)CQErIBB+C1;#xmzn*#B4tNuU62k9(h zGP4%?FVj1rPc@fzTNAvEuyh!QnE_$ghV}2+TK<>$j3CU1Tfrw1c|lNT}fN6 z+BFL84l-!~i*aoSv{3fVJLpDIOsE)3yO5ZBjj<$mq{n917cR_+Y@!*EOYwg0uKM;n zY=WO&^PiqIDg7GL?tLp9a3Ai=#~-{bmjI^ON#cez6l&zQafuzo`;2=Cz{KS(E*ebg zGH+VMjd9cPQ2!&c2Cfwbe_n@jW3CFvj8&4MqBPDV449Vxw%hzkDJgVEyWo43*h0B% zErhHX|3PaL8EX8x=+L;)#DwK!ND0;gSme+l!A5E{aOI$2+KU$5&`$uCBFZ>K zxqvA)>Dx32#O?>q6@-C}T_4~&5)m|w0{(l7{KuNIOfM<_Vf({njjmF|HnXzlCEF&kWeQtYOZRt zmmAA_Pq~0=IL^O{sco&PTG8ymm;=a-_LSKEdG6y1t6-Gr?+3X67jSj>(Z5hib$^w`vs&R+KxT zMq3~RfR-v^p}W@rhjP7MZ7}T&?v-w8v1lCE!qHC;_F9p=c!X{lX*qccXtFuSvq{vs%G%+ zF|Ok;fkN4x;Yikdz{r7y+p)e#;tEY}E)w{E_QX-AQbFqpJ)<%FW+dQzZH_f@Asog1 zH3tHev~Iu`i?Z#H0G#wRFaVSTKbE(F0RcxXEn)*Kje)Zjm_Ye325dJMK!6hVoGSnT z#J<6R0@i)VSL3NAt2M0{QDtb;rZl=%qFJi(aQ%nL`V1U~R*}W$?rdmm z=Gm&)992z?z``UGDe>!)u7KyIq^jSg%#%t|6*-F57h~2D6(Q}+1ojOeDQd4*9-MQ7 zsYWL~*S}f0bsWJ!ftoHWHM1PYpJ^`BS&9s2?>7J6RRmIYV41sUC#_D$X>9RFf}aF3j`g& zHJ~V}TmvR)S&t=44|s*OaxLHh6@C@>bRv)!)4br12E0X|17^eLNA&H6MI`G|-)lLa zb6E4HjQF5x&iy8;&A+z%xKy5edpHhb^CT~l{ef)c4GSF+ba}r;!f2k7;_%D~}FFqM{`W|1p0?LE`W_X!plUFifv?^_sdeZP_ceLQel-+ zN>?#e@tjx%uNr(mrzR4c`+@G&NyU|!p#+8kw zrLQF@g{ESQ!eCzn^isPr{d{Fn%$NHg1~I{{02oz22}E4n<0kbHfhT&E4YSxb!ZzEk z_5K=E@QthIK>WGxy96ywpi2b7@p8 z6Yli=E`zRKr5F!?RpIld#H+>fc_?R zZr-vlk426Y*$yTWz9uEBG?10542acpa6pBR)#tr{pc2NQP4J4!Dy1gefzUpR60@fb z{sMQD?5yK3hy^oV8D|vHIGs&+T8#@Hr&w5>w-{iGLgamK#n+alxPH?XIpl|0az#Ge zwzId{D~ht&Yl*pSapH5U?`90a&`}#>rsfC`mdDdHB`)}0#Exha64E{v#1}!OUlNtu z2Z~ld4-vXf)LLGoiB{qzuGWISf!f$0NgNu?Q88%_ku_o&MgmWHsc-zh(i0+bS)ngO z=tPgZ%oze;N;$uy6Gi=`ePwEJS&Jk&ig=Al`aQv>vV1V(#*o&6wy>~pTXy&1pV45^ zq#wSD%4WU=Z;V5`&3s~c6^hDF!G0YX*uA}9q=>$3@RbCF(JdnB8%2(li;wy3= zG7X;x(D9O9G(rMaoTXjSuCL}dRS)^SPum=S%z08H*~K;@Gikg7eP%t!J#6LO80cB^ z?3H`jlp{i9)j;>d+Kxp7v7Uo@p?qTk71zprRF|pQDsJRl+@lqNRKpozApy9C`awJw^SHwcku=MGPJXD;Zzow!UWe_!o&gJv8%s3aL|rb07Y?YYs6 zb6cZ<=}@kCCzM0lRRH*ar)oJjh#YgqNCFncq_()6>g8T50tCbO#>o?tB5o!lbr67p zWj1u0Iz&7xbqsk~=7rNFpz=i)-qh4K*MK#dFMR#z5IaNvd9p@WT(qk#(FQt*g_966V;rYen8$MpXt72xM&prRoSp@R9AnkD8E5oJ zvAhPOm>L{7EQw;{5j#R}bhooDl6l4;hiuU$UmuAaW!2At+!8Yd_eWolHQ+)nEr)ANP6gn}>twGl4C6{nM4W$zuL zR$=8BJk?1UbCtxFGr!I69q@ko>IK{AWJQEAE7;Icxjje=|9bo9F3=6Mcj6kf zaLY4wroRL}?CjKM5_nAp00Jz7+Xad(UPIyc0_IFCciaA1~@! z@KTEi-y<(?(fkIbDxbc}$2?f~MrGepJl1vcwP717(U?^!eM>;ifb3#q5YX%bVpe8p zk{GA}6XtBv9@~t&BYt`s3YIVNtLjxX;cRwaY6DH?cgrgazh{_w^}7TqT<>1*u_9Md z23CorlG0q$6}0+X^z87gl(Z>o^^`}1XXcYc;-thEdq?yX{-T*Dzmx{5hf)&pdui1fRG zAGMTdB+(Ew+SlH0^w}ic+;iOcmw-WPWGufER56sW0;VU(I^W}nH^YSu zPhnL#FNj!m4uLt@Jd*y97)*!C%-?Zz9(Qs?($o_XE@%2mHT;AFeOJ8O|A_ecX!q1H zlau9_i96DLA3hWXmx_gFDhZ;{G=B`u8B|f9|LM)*8+|ot%s{4iZQu z)&u-r);!O_J-E02HI`T?D2|t%M40qS4_`tO7E%Lrwnj9i6DPX61wU73rD}Vq9llT( ze&*8A&$ddx#Zj)Kj4p3jSy0cWy$jzaTg6l_`kkxZNA zRN8vND;Vh+>5qXrSNB}$4b1iScP`%>&_QT^+X=*;s2_J69v0hRE7RKi zbe)$BB`&khr;R9DUqPzyckaS$CD4-0%SrWh2_?lh>i)T4_I7Hm#o>kh&@uco96q1cgJ6a!r_c#>mPZB4@2>LZ*L1^i}AI zKG{1%SOYp#z|{RcC#kit%{IfVPg}O7rgvr8GFKbC5p%Ojs&p8hc$MxvSfqSC!*`** z(eGZOnGfuJTOiWCe`MY8d%o}g?3eWa?5905L6KbCByMD;haVqwSbl9NdH(1f!C(L9 zF=U-U41G%Ik-T z2wP`Bl{u|HS$cdN|ZgS>jFem(M2v+L3T`{q>5$a&K;W(hOpi2@#5jR#KXfsiGT5#!ye$Ofu`b7LS_7~-4_=(u1+eA z(4!h{$q^faxK*yew5R3YH9z^c{Gx~B4p}@0^h4(8OLc15l0$XJ^gT< zF6Pja)x%!~>0E;#m+n$jOqOnSOJQ0?{E;jrea$^%>FLcXj8Cc>c1=)0m-Cs184=i% zU;a?DX<;2XCryOe%o3jGNDp+bNv-PNEX;F~ph)k^!z7$sx=VZ{GV{RmUewecTH`-o zNh;97g%SJ9RcV)x+e@XYce(o+l!$#FEiWBGI{t_&sPeG3ja7e{JjME5%JaA68t*KF znaUi4m&qe+uLVSiMv0gUEdN=Q7;R?y((h%z-6*lld4Br&JK>5w#v+$2$hFnf%7JCn z8p%JV^P7eSqqg?Y*8Z+$pOS%PK1h2E{pimA#eaP@%FHJ!n4D2-U9{>Oyr_Gg_E*QX z!zG9I-)cB{ELwo*?&?-JrkI`Ojv&yC9omrYXc1zC`?uQUuzm4oHGh<&tg54wl72rv z50pb`moMwYJ=*g3uY!8$jyu+O)mw?`;OWq@=^=F^M=N!zpT`7N5zZ3TThYo*_@xbi?->sU|Cg`WK#2t8rOFIIA zezcV|E$=tbB%|H@dHQQ|?R0GK{-QJSoKaz55vO02r%PGq_GO z*V{Emj+s7lBzjLp&(du79WA?dQQvZpz_X6uPstDN`9t8H>a!2;_TLc@*z-)_q=2Bn z5rKCHXCq`^d867)~$dN0K#lLRar~3Nli?ZAg31$Ls`_3B2-?Wb#di`%V($3EMhRO+runWISmXxUb zc0MQ{ctq6Ny;VL#8+E#YK*>)hl^qnjlBASGHil{mq{)Qh1GEde#^bVvTEgQrVz-X> zc4;S<)XF%SJ}?drls2@(m|cJ;XZrjurTp8u2&qIB7v*dRoo%rS&;A>;n(g`o1>fL- zA0gr1@Z=vpzl-(m`CS?|`x?a%5qIcC!#tNa>%n*WH77=2Yl@9oSEP3PR|P7hYQ4Sx zHug5_Ry5t*cu^=lJX29x&E=xCJ&lDZrFq`YB}iXeQT|+uen=#6F97eq<)vK#jt%?a zh`x026q=^SCXWDtp5`c*o|_!gX>`o647Kqbd1zzY9_k6!KUT=mGb&G16OMzS(6{3! zg71wH4Kg03~vh_Q=X>}*SlId-jZ7Fz; z@GM2iME0#^ilpLU?R#daGX1f69>!Yl>LwV8QI^wVn(y{znMmvG1df6M+z9MP<#d7VG;MukavY zUGx6cXa-1I7U*2RJ}Dfz(ebe`!|5_9ue>s=LNbZm?;ikrG~DIyo_<5kAS*xZ{6stQ z(N=2vS-UOtK8vUOp8jEe@>0sh=ESMMSFs;Bvd>%eYGJG6H6dd{9Sft*k5)cxsP{`- zFE%!EuLIp0cz<2H4?r8u`Fs>A{qAt!^)E;a zsg^a-vs4qK5u`xd$~gGlk=Kl-vjr!OLC0+5-riS?C|W_>I2IKL^GULV2i?HboOa`L7F;_Eb+!nc^-fXN~M5NH1>X7i+Yoyng1 znkw80?#=Q{%%2?avb+(16NXiMTRAmYkg$^I_4xLm+bBKXk@XD|120V?$=a$gss2iE z-P&$HZ2gyjpF9+R=KTSM<70rQvN^|s{1ULYZw`9$H{`0Ym%m^Fn10?%_-$n4?^3N| zYh_{A1qrVhq9idAMt`#RbDWv0O-+1ZRlQwn^bXsEl&|ng1C2UtkjQ-Ei22D# zK*=Mn9WoU)BaVqEZZ46Geq%7Z4TDE%n>@scb9CzhwI_{_9ikuq62SW; zr_bzWqRCks-+2>72B-d&P`h_lbWDkFG13ZnOG9|eS|vj4D$_FOez}8Zu^ z{Y+sv=aOZJv9r8SjtNQhSQ|aO(j1vK0Jm|Ea-WHiw_?k*ZCQHTEqz@j5}*Kn1Ag(B z&k4*ARX=5&l)<)cs#+Fdv*@Y~TZbUKzFWuTrk0bJ6Gli0@=AbX3@CC$m-I#SrOQc9 z6H9K>;$mZ4W2hP@Qm{!wXcAhVl0#+f-+EQpTX%inS`H~KKr;^MCdVcSW=LjzwHKB# z?bFe!|EtKbYrQyN+u!hoq`rl&{x`Fu&33cVcjp}ML_-6s*P-;u6g6_Wp%4?gQo9Sq zUghN*9^rQbqVk^QIpEz*F9B6J_e5==UjURw5v)};YwHCG3#VJiX^%|`V)BfKH#B6M zbq$7QV%ftq|B?mC`r)Fpk73{LjgmL{Nr}Z*y3ZF|nBeKj&O;-{RFdU{t$vTJiF9Pc ztb^`dy9?b{9vREj7F!GwW=CduA;Ooi#SWdzfur@`Mv zfz105dKxqRWha9Aln5>Sj=2avh;iv`zTkBnhK2e42>P1V8IrgTt)n^NPsA^s)6_FPJPO_+PPU*9BgRnom&YXO8rHqngcC@q)fS3hes;P8PoI}v=eFyD$+Kpu!z-u_;Bed_-wZujK_+>m z2^XtNYToTaTBQb#+^HH|L30n$4{pRD^&V6uO7{nk)TBNIrHC~;SG{=8zhbObP|&rb zCO>hc&{YRgO8>~g6o4Mi-&b^OU-BI&fTk!S(V=ZK;3&Xw&yFd|Js!!9E8{3JUDl@U zo8ia#Z8*V=ECus=mO=(6R@LPw3Q?Qn3k&d`w;1y~yZX?uJXYM6rEA^P8cFCVdO9x1ll@EWJ`> z5T-i1L$IXSS^fmA^ zeUE_Ygvbefrd0fC4cAf*&T4Q2C2m`hbh|oOPwyL8<9nwzJ+>fjC~o{6Ez8u*hH&M5 z$MGP&Li{#B-phu+86g3VjThc{y0RP`28wn+#1mC3K4>T&m_AvMrzl) zHS?8XZdW2UL#+48C%l`Ovm6{&I@;xVzD`dE4D@M+d5W5unc^RN|(7}=mmFtTxpkWOn!||q6<)S8Pg-A9q zUbxGSn$RzMF_Rn&Szq>ZuZ|qafoUt(T?QYr?Q3z(tmb8I&Llrfv>{ljHJbV&?2W3;#%Hnvi9QHjBzFroUtp^EsEA9?@p|#r8|9AHke9voUWso2qD5S7Z}sqU!Tf^odxpoyF(=@Uy%X z(MP;z5U(|w9y@_$vSKwgNzCC~!HM^D!dYJ)_mugEdZ zP^(%|w?JN&M*w{(M$XARk)}5@w2IR74bgR0hQ7CzNy>Onkd!)*nhuzg9w{M!Vq2kd zQ0d6L$m}C^$^~ZL1!Iv~NobP?Q-gWPpIVG+Kh7E(V7i4_a_u>_bR0*eJApoV0;@UT zCprdaj4V&G_R(O-Gb5y>k>J^4@EVL>WJqe=hZErS!q) za+$d9H|6(aAI(K3ry#HJ*YEh$Z_G^WAZC!<1U;!g?VE4t#j4(k`C2^np|`Fu`MA94 zAiJ_~d3>(@ufmL(T4zY0YqTCFH%#JK%VC6s6-nrIYtAtVf1wWoY{}seYr8(*UXCp= zT5>)E8Eb@mbEimP=DqqkN_;U6UztD8aeT(Cqo}#E_jq~8{5A&AMGyWG;GQky8UcZp zscT2FuHJGQ@$cUW!oi2)(Iwy#o>QXz3>7j8jEw@!e+gVpHC)a2eJSviqRPUB*9qs| zZV>aITMEtsV;h-eEYJIZrJO#SlG(+`Uym;EoV=y(6wsF-y)@nY+#ZDIqW4Vg*@-02xmvCs)%+GpFbgcHKL?|N{4wi@nb#YNwmkY}MQLo zfg(Q;&XQD-&8 zWB2@G4Ww<2qXJri?wVo^D4$rMMrb7bfc~D{OBiHZ(9M`&I_U%^)fv{-#y_9XnBMX! z2|Bb~cOlsIKt_?X<85}2;>6ph54SGc|9S5(lmrDw*aZ5mi5OcSzYne5M+q_)5=U!) znx|}<&hzbhd8mKujQ-=I4goXLAA-wD%nbS*AO?toSK?bCF%+o*iURft$79!*3uoGg z0eAgnQZo(z3_!b`edSE(l_^uo}l5mrzM#f2g4||N6?Yx#6^da61$1)D9u#( zz;66W{nNT{qLZRiZrxWp(E`@JTVO#K93w93R4Cy2s4rFQUd_Y=uWBbU!SNhps_ zJL{n>ZR(wthUN(N%zdl*=APC^aHcCyUwEDKs-^Vqyme(?=DVDy$0A@P0Kx;713+T22ojQ&$U+cnx z1Qf}M+Hs5+24=D+To;4PczHX=>D4IT31HnwK?QaG_w zxgPvrXk|WV!{^OylQTI{Ikw#=nQ^)mGfMlBWJyh=TJgf_@^a{7F2Ht8p5PC`*$?ms z01q0iiV`>eCS+$5)Fpoz#5a4?#BceG=4l*aCh%?icAapeX`(ug_!wm8w-+V>)T5^t?t=w3&@wv zc8z^G+FafKMl0XN!56z$vmAGj-}q=PVs7FzCyi+ZnX0RSz5-ryuW*N5KQR-y;!gnf z6muzv5UURsNsA0U+p=rMd2yS{>|wv`&QIMz#{ud;3t0EkjllcExdSA$n3GY2R%=}-XNtT*Y-hD;wDoUW3lzR2h`34UU zq~h1g;mYCl33GN#^{FuB{F=-&ZFBePyomY~*xAqr1^D|P=DeQi_7F_fMioPrs}@L| z*Si4M_-#Yz7-Z@sj*NwTDn_OgxZtaG`n2ysm|kz-p8qB)LXCrbasr+Y)-~lA%X6%Q zRqK@IM}tP}zW0)4n%yJwZYvAH=;Fz()Oup!_hD+NbBJh(itK&?pKL>p-xMf1`$Rp{ zzPV>V$El5fbTFId1PEL>ZPy2|Mmgga?z+y7(93T>j5)&$T2cnBzSE#Hfx}hD+O$MZ zzAE|6{b1LV?hDDmrspWLp-+MJrlnO2NVRZPQcY_IyWTrtPjlRNT{vxD0Ck$m)1pP0 z?2M_55UHk}eG>}IwMfgnrvaK-Ib(}ypV|@m4a(#)kJpLXiGgp&78Z8O(+*aLeme0> z;E3eR2@@ydc4y6wwVMfpHUC9Q@Bd~AynEXzXSn+~Qmn9_7K5Q0Tq%wP%j8ZUv9PQk z4E*IP6BkF)D%Oj-`I81P@fG_vua=+)Z|xB8$e7$jTQOZJfxb%GG1a?s-a(JED(>~h z5*Pe(Ql{Xe8EiDinQ^er5!hFu9N@OMoOil6dW`}9jjPNAg=4RYWGx;fX`C7M6%m9E zx>eT39$fvy{I$gVZ)UM|R{qL;1%eoBf*^VNU<+?SfdFjfV7f^wN=8%^>%>7$!K2a@ z^H&1g3o%QLHQ;Csbl%X<{pY#~KBC|Sur&oPbLw?#?(8B2(D#yZj$Zp*{u)rf) zC#vy5LC2s>Y|Z7;v=24HqzW%Rw`e-LktJ`9&`96yE`Y=?sq;_I1sh0KDJTyI!nf|-E4g> zb9U}3Yy_qFphgjOY%@gRkAL5f{%2Lz|5o1rcMsKk!aujmmjT`gd6t0hT`=uX8c@TE z{cC36-xuLZ4~TmesNCR3XykWJpE? zyK1ElTo0fKYqF^si8tIrHGt2Vw9wFEr z%hasImRUFhW4@CC;kbthqXS=#%Zm=^A7jc+&4rhQ$}a@~q6|f9Bt-_JV+t3<;B5x% zjfeCt=&9v>xgk=`>4k}T7K58S1L7vixQ%z5y^b+8OR*Fh4!0%SMfYvNygi`%U*s0G zrb>xgSS4jC{txorJetil>>KUg9TaUzzE>$%XC6d%UB~+v&>3Q}$t@EvQ-t(Pzt@Ew*uJ8LRf5;@y{oMC; z{jT32q{UdBXY?)zn@s1WwJIu`;-rj{Zx63(`wLGi+t)RW{Ae>9qIX&khYI^5RMb}k zX_1kw%2S4!=`+hi%Yrh($#4epe(a3C=*y%$14$dp%cfoB`7Rb(qq*?KVHa&e+5wI` z!29om9zdB!Fw|p!aLA8VaWX2Tq{zs$6C5#G(R1*n+Nku!-$K0*Rd7iQ++23i!+l#n z_Vi!ZXFj?2G(lXn%<>rP`CWF4>Dk81++&h~JR1Fg-#GZ@Q>wr9ENnBx5;?d+_6&)7qf*!9!gecd9WP`c<;zCl2@p4QngZVmbQ!a?JWDlRrSx&r_J8DeNirT ztzUdLOrv)4pxwJ9a-YcW9D_c(G3m`D65+v#fzwh?Om**4<3m1O-wk|P&8d|-IZjZO zuqtryS5@2O`%9VHnH~^*cj$$EhTQvBqwsVgk@=TniC3<1s(Cl_6WYtk14?? zLArR2T5F{}>?;x9f8H8=usKmF_&r`1dLd#hFwnj~@Y`4$@x|`Hq)2ldY5!!+>dra> z0CWOhkK@HE0($LOVOBFeEvfx7%8H{-FWPq{x^|L#l@*rA4nVjtp=5WcOI=~_l;gO{ z57!l(y5m>GYr=3N_3c!@Tt6A}W8=-{@Z4f>M@pq#ezA3=K}MG8@WW9vbH_8~&0&K* z-d^ifCV&37K!X1_3|#*YH2WW%=oR!q(NA3%(Bn?PXw7_p8D&4r!IYAIWIysEP5V6_ z2JGG5LW(L3{;9%>Aq5A!*hLkFX7a^GmBt?(cMDJd9If8BZp-(w1wC_DOx`&s>L%T*Vet+#B zx}0YB`acNmG3-yj_GN^!NW56SRP^!?)7~AL_!tY^2V?@D9>>J(r!%6KldKY z_Se3bMIEH=9-ws`ay1Z)K8cQgIdc1-@b|OrF9C(TL~`^>6EIFJuUM2r+5ANR8!_h* zUt%wJhnFfzQ*XZ72Eqsu3dwG0BdTv34H83WzbU(|>s zIoQ6w@+aum|7JPg`{zLv6LuR%Zci2NaDr?(X;3XIA%`@~?far$_OYNp2gC%ns#T0F61~xbS96 zm*h>Nh;&j3Rv)5&Lq#%cV{176f3mn9=P*`-;6K@y{n)ad?JDC$*@x;N%fk7;bJl+d zCs%-TsHcXnf*uqP8slCsj@Varzp+sC__SU_Sz3&UUbEjrq7L%XYkV46<=84tC;ieO zaJ<1uhaqPt(!{veS_ea_g;Q;B1HKq#AC+7=jvbV+9C$>PpNt&KXbcFbE1&R_IE9Fo z%WwK27rk;-`7Zpn$JV2QJiA%EvRoKt?~=J|tFl5s+Us^<)a@a@4(dDy&WgT1jQ9}+ zq9dMxwHXDPW}}kR1XY6`a*KTvF2EZ#mTuuU9>#L3vCWIP_xx|%T&vnq)kbZsw$1Te z2iv4{tFqAn%h&&K<$$g5zsRl=+Q+Ts2mra6VzY=fKxU4gG=`=YNkBBY=SHFT`qb01 z8I15Gi5|fC1)AzeA42|aq=unt{NL-MCFQ^e(!M|on(w;3dFAJ$e3^ap_KakYKvj4VwXH40955JqO03I z(pSG~d^z)+O-NK$v0(+lU}VW~b8@kq`uFC*(B)myme?DeEg&89;_m z9934>0GVR9+qcpTOx^)t;wTbOB53))L#W*w29yS&(lGL=CYx(Q(_qQaq9WP9eSBWo zWmfg(nO^L;+_F9rvNk&P>9nV&(nLz1=+gqFAnY~4II?0-UQTbLVzWeepxvCZtLp`H z#@Isr|NY%Yy+@eq-^>H{U&vi?m0iwS#h28#tggEKOWhJ7vbLWk?8Gr;f*6in2$7|1 zgR%F_9vYNvmEdBWTB+Ruu*^zkNr#vDvW>&)GNbhO=Ken$M+jN3U&`5KW_sT_8sR)| zQ0tgJ|FcjgU)iCr{&Sc?mL%qOHCX->4mpfbwz1B`_WpEvyckJT&$>OJhl#JhW$*V2 zr4v*z=WLIx*^J@w(y!h;>#C7xP<|d3;wzOgA`X<#xduHwG%7Z)< zAPaoS>h{jP&sD^XeYmq^O+O}8S$J2;HY*Tibkj=g^x&H^1qq9)5ViUIwx9mYscnb? zvsLbIPGnjG3KHejMan>(A)HMyn%Bx{tq9>K*yJ>`h&L!KnGg`@cQX zguP(|g}xsv!YB?74TxDVs~eOO|Dg9=IM<28zxrb?j1Z?RY| zC&e4-x!804N2t<`fHx2qULwFAEBc*3g%)7J0K-%oNCE{VF?|vm*F;>H@h@zxlF6bI zD>J7DiO#gN6Fo9Os_JiFiRPut^A<9+=?m}o4t}c!O{NluQB(m|oN$T;GT%W$IO)TH zphtn^JGZ;fYKmbZ=3;SVIZKr&q)FYn8q7 zRHAEexP(!pqpffX{%N>SLk)i$nZ|o zZ(YdG*gw8#s;PYpl0m#8ii@m%J7nc3|J)DCj<6%&4SLz#)mYRt*I{vE>ZPe)R0%V! zTQ^!1eG+wv6I0>h3g6)y0G%f3^vr~FV=CM`oF092sb#vqtol~JrmL&PW9EmUhMRY9 zsCCu*uWSVDpLf06Gc$k5QcWk(abC3@}lsV(hoM7e- zxm}C7)43szvKtGLa&=xs{Wkj)+nj{DxwWhlX5$LqZ`V@)R@3!buzayDMXeZCKRM8t zqoe%rKC*Y>$RSyYYx@&FSA9)!)6j!h)zGE#|6rI?%#IW7@~K*wR)K&AkKfC?$M-kf zl5tP!*Kk$?iRpKg!(Z*$KkK+SRB*$9-z~1R*?Zfr!DmrWLR8$bTAep#v9XTZ7e=Z_{EnL%MS@WLfuhqyPar1CV2s50 z$2Cw4vTp|dc*U1pD8(t&5+5Vv*$=PcEt@@Mo>uyWG0ZPdw><-InP|FCPG3yBtE~I& zo^zABZs#aI`IF|^7a=Q=7inASUTc0`w$FKu;zC)ns~c)J!iu!y%3l7AKl%OiF_~^p z=KE-|dt7VFrZbL(>T(9?)lD?{_KacD{CN{Z21?;MKqMt0D#b z!yrlsrZU zylpk0A+{$q@kzXwRy<$+=q_m#V1OG9zL}d@Z5C zEad0Og~O4iN+Bb2r?>jo4!hUF4GoQT11Yj*A%3Iw(n|J9N?Ow{wfS<|W|z=6YHjPgu|T+Z>%Rwl99|>(r6F z2azF~uL-L7BvD-7t85>2o(?^bdweYHyF67(_wOJDQTnDE<9Yq6&Z*ePZdY=hr^KvguHf z7wvthB2N8B(SBEC$c<|E0-MOh4D0u#QSH-eva#8dUWAywRHwhqXKQ73}Z)y3UZ3jwl~ zlOqeR?a9}W^41+?3lX%^wc%VdXl%}6vgitt&CK&9s9P1VXnY2JSeGD(o_@P1ZZIku(uv9 zg{+g*|5D1`{Gyh(6#1yFDSe1 zwO6oyO32(3>5E4Vq>ui4P_AesNna z%<=ep8Y?bkgw-(h((~~3QgcL5#WkcIB58Vf{tZQFNm~Z*z4*A`-_z^=b%%S2mgkSP zfS!|lL23QUo1^Ml zsT%$+xbnQH;IhSTwzQTX<@u@lKJRjAW7>u0;Vxe94S)6|0~vs#LayISsoeJy%eLcH zgBA8}BVEbr$6~6vx>r)aWG-Lg?;bA6?>~{+pwuk>DXGLP*3t5X{OO8|U3)GM z^UqJsfE&y_Hp*J1kuIbDgZ9dv*yjZlwziz$C%J|;9R@t4;p?g#t2st>TVP0m6(0A; zs27mS22Wq1*gbw8zMt=8lrgQ^+YeX+q<8}M(KVw=xL~EwvyZg}U1pl<@PyJL^~UnD zW_2(EJ=XT+)$u=N4~YI{a@Ej_(x7$fUzyCu1nAK~BlsKlG*ck~B9F3Q9VI>I3e%h( ztZV<;cYJ!vPa>OgPhvMK`z8Fs*sgoo_Eu@ji(;RESE}BdT$)PjInxV3+T-JQRd0*0 z$_(MmE3W9(`rr6e`hAF^j!(ZtzI&18`=u?SDg<7-pp$29X{LO$dyCE(1+Gf7E_c=6!N_>RJvj9SX02`r+fza;#qDem9O! zG!2x9R_D0lk>+HB@|@~r2bptB>)|(J2QV!ryZdXx!w29A9`;+R_d>F7PD?g^ekh`j zvrKD>4Yi2{Uk7ZuQrwiN7*qdx(tsDZS*Af!47chNAF?vq`6YkujG1PMx2os*`Wn`2 z*=1|sPXKBDHyGwWdH8<~UJ=n^VV@Euf^?c$#~2+RQbj#2(N72fOgMoY3J|lzbUDbJ zEu3MqqlEfABEv>iwGubv(wCzkGxLVdSTB`2&8;hHmpJboFDIKhIGPi7nt>TKS9FSR z{c%qRP@NV5ON-|Y6J0K2K{4Nh??g{u+%*R%bT0w8tjQ7hV6Qz*z}M-x3Q>;MY9;MY zs*mrE5^!OqHYH-O(W6|i51~&ZJKQx*M?xpo#%+niH5cAxt*I=$k3>4xzf7$rsE$`@ zk&TsJoHtX>`C9Q$YE4W%B2q1(VedDN*gky`75?#Mf`%NKX_Nh{^b>* zBx<7wSv`Sz5RlXM4m}iHiT(I{BA_=Ra9P|BL?ie<~?^Zk%so3SIpt*2}W_ zq!^pDMjiQAcPSBd&H$hy$F2!8d%B_z@ijPip=VG!tTsYwQ4&~N4U1c>ta4pyA;i7+ zIy1u6uk_s=&1oJDX%!}%s*;7S?FibZ{nlAE;>=e#j; z^eEVd2_aAEpJUek6_VHHz_?m(p`_@3aIBz=0-L#brNZ6)r}cxA=S#n5l@3{~)K6J7 zii724vL3&BWowOhC@`=snA@-|#aV)DEtRuEtu3|#|K^tQsu~B9pa9c$wg!l>{2hs4 zP`jdIijH#q_fB)DPMlyHGg%XZuTRGZU6bFs%tm)j=enI)1_SC%WkI3%&_Jccxgcj%P#Vy4%J-T2jbz+*YA zHo9=I4^Xjod0?&))gI5%?S!3B(+Xojo>p?k?Z!fr6*qoVYl<^<~tDF^(FQa$l#GXPn&2t`%ssE92wA)MwT-3qMM@jeH-YbF2sw_P3@aiCtVs*>6oA;D5OM7X z$7&%L{VAAOuJ~+#D?5=D9uq2k0C|E>j}}If{lq*5s{M5NM#Dt&3U|tlawPbh!m}Sy z(5vwW`&Y9pBes-?$?hlS*BYp}UDd3#V-snsDUiE$@4AxW?kx^snlrGLnRQu;y)vKn zveYA+?JXKhtT@)Up{~&TB8UAz4e?xYb@~nvrc#s$l^`OR!(G%m^{4HS^f} zzhCid-^l=oIu!*OAzB~&wJ&i4A!XIdI+WfI!5_-ZMHk5RWQez=oYHX#EyLW-ym zsJLg#?|~7<$!TfOQ=|a=R7np=;2+6)H|Px4ke81>3{ceuSz? zmXUXkfs3Z4?79y;-4?tzjI#34c@m=kBS4?uPjl8XG&2A6GBh%ByQS6nM+m(A9)s05 zSM3-y<%8|*iMoZ~@1R#P(pjnUV9Dy_`(?bp(lND+A^(i5F1S?|w6S1vI~7P$7a)C% zrfl)0deu`eaifN#X)j4M0sh~4vtH&^QAGb_TB6pd=;BHVFx%gNsD`i-Suy@aQ>6O> z9pxXE{7*hz@^|%E&~3nP7s1yY-_AAHZxNaZ%{%Y$(GC6}q>aJVCmLW!T9iPK%qf<_ zGomfFwi?()7A1RPxh7@c9f!(FUju$YQ0ek+q}#+mKxANZZq#&FgOyJ(BJ_Ah6p>|C zvGUK+aVCy@hXn`^q{Oe*N{O0nCIMd1`Zm>8xyLlqwDrw&pO?r*c46;_-U)h@-z*jL zS;IamPV+Yaq14FA^wc#Gi>(&=p;Td)veY*@iWPh`^1N8t#X6`39Mb`+-}sRB8z-3- zoeWl(J*|~?oO_yc=hwbN?UH`VwVZMmQIkoz<~KlVjJZ9owx)f%`^$bFuJ%gh3Q3t^ zD}&GO;d{O-3(&td}|`wMMxl6DWL&dzp)Xb*y8|AUjRfDK*u%&BhBQqExulP6?Ug zyu9eyDg%W$u5`p33Rj)i07$!3)jP)w&}q?d)l_U3bu#yZ(_$0ZwO{3Sr%1<*c&i3y zA*+ZASgEi3h{_CF(#aCUQhEUrRJzpnuKAC$_~#eDs2%Uudt4-UdJoqnmn~lSYlsLM)cl^DuVxTzMs`OhGhG&DD?5A%+jr?(IQovWtPq~rgK|> zdvch6ON0%uq3f^EK??ye6S@NTFRlfUD&0cO7fEGC@-2astqC9>1Q?vktnFz;e`@3p zfY{d{Cw}c)-cQ?QbAtJ%tAOSGB#i(1E5tvA^c_#f?Xrg?NZW0Hy z6!0{_l?NIRwvD76t|96(&1rz@A|>KoV>4+i5Yyw&%$Ow<;_3R@{@C0oEl%#9rGYoE zJr;gPHrqlciVEt!J^OS1G?H~JBJVc2?{G={r_Ilu+B?N(#?rfi?PBhDHH^|UCsJcs z)R6DneG1)Q^adH^NH%jeRzrb0zCn{d+V-@(YCr#_9u@N~ztVGdb6{=eT)~m^#RpH1 zIvLnU5ftzG*%9rXruzT!@;`+q3?xQ3#eZ;@pj&l8lYn|pfP_M?NQf%{xYHj;s!`oXxbDpQfWM}Z z_-iBr%QBv3WTX{vb$R0>|Kv!csxJBQSoI-XZQHOfdu%J%`zKl<;oWeW#_4Yhx@8%2 z6E)f9svo`lX|gWm%BtDv$TnPbfHj+Ai~ zTDuIM?A#6`zs(NKnS15d;pC@xcFnzWe_|QL;G~79i?m`{F7Zl31;~;c98W_|Qellv~T;10wOJ;ThT?&7s2k*D} z&ChnpzzYs|-66ErUw$5Mjzo_~MQHJh_JJ*h^%#L?vo$4>KirGR_SmG>(v|L3doJGB zb0N&d+gCN~niVy~UvRBQZE~>kT-d3SXP-I2oyRW6xnkxfn@`?*PYfolewI@?Bq5RX zscr&w;ZmA#ymg7>c9!3Z(vkz;?Db&j1$sT(g(NHJF@TYh!z&@psQ}3#mg;-*Bm#_I zUERX%gaWj+q7P8E8Xd;FlCzfvw8WoMSzi1eusGl$bra;rpOh@e76TrX1P8*KWnBuS zp@a_rOJ_qZ6dZ=u*R^<7<|99V(h+j8_3cQ=%AV=Dmb&)3mN?}+^H%uXcTMk-^ow6! zxZ%0Yb+##!5vRK}`WV>5AM%53vRocLth6k>yn3tHAUN6PIqgE(nH$(s85UaT@DC?_ z>Bx;|Z#hYJ)wC5B;^-j$DnZY_#3j{@At2OPHI$pFWK(&F2E6b&{oB3VFvzVTt~Yf10Q|ftC75bY;)C(YKu*D<9l8={i|KR3D8niXSbIUowyxm^45ysH?@-^S?ku zlNmi+u?==Gb0Cdt&cH%|daGSvhLh1{AdpHlp$*8mFYoX05F5vil(5<}q7n3)+ETo$ zBRbe9nb&Hehkc08)}6gt3t(e3uF{ux5`T1h)t&Cy{uZy0Eh~CW!Xr+{cDG5gp`tDm zd-l4YWf1TC$j|cp68Vvwt#8h0C`~%%l-FgVj0>qjuQ^eXrr}i6Dwy1-IJC<*JSt?R zhBtFEwJ9?TE3p{*UUqRfOIyNHhx?G19qj`J+y{T~;!t*A1Z#k9Ux4qNKx+eH#R8(X z0GTAZ$d-YyNZbp2xzTaDZVyT9H=I9TWB5mbmFrth1g%YIHqTwGb4GkLu)QZ_cNX8P zhxlUvIUW-Pb^Q{2xMyDjs`Xr_i3Z;6^f#ZeAaMt%AsNkXQaV}XfPLCIh+dOC?U(*N zqXrF}uSCZV^ciHvGyWGE@l9~QcjqKYoIaO9Qy%Hvq*l%@g0XQLh-Hr3L6;v7M}yrw z6A|Fu}mV*alYL^yS&QHNM~os zMYxPxKYM&thbP+wwon-dM1{z>h(N0+pSP+|K`OoFR#|uItDG=T`|Cf;NEE&hO1)@4 zF&JCik9IUjPc1NoS@DIGE4WrgY~X%+7S0i%VY~3BQGaC69lO+%3nf@031C?*n{PUa zL9-U}%Jcm0k?VY!5rV(_f$FR0P?3jP^sa&pPRDV~}N45M&aJTc$Z?liM z1L9fW&ddE8qboF*dA9mNQ>z`@Ho?(UeY;)aif#2-Be-$>^L!N+^G&wJF)@~_X8)$j zp{TPZa(~yoa#J%<({M_d4=s>eTY5yV_*&p=y*mfi_7m%(6@yi(I<)mm<{^e0N9bz6 zUKqb4m5HIpclXKBNSt?CWkY2I*z*U{8cN^09qUTPmmFbE5@cHZ;)ZMPs%u9_e2PoO%ry5>)^JbDBz z%Y@eMR@u$rB-4W*#Vfh}m2&d@!kN7@_d{i%%wcj_;k|E$CK4S^50bTLs~%P_y(f*_ z+U^Dmja+il10NJpLOKtXS60|9gjMR>WtnzoR_;2kA!<4CbSPkfsEPhGqs@8Bh>n9b zkY2Q(@0;)bIs9 z_pUdTnO>bp)}N&%;^M2A{9cN&0x-$VmJk^Djl@w#)lK&^cSH*6Q7M0BohB_&|}yeguw6mjb-L5TZgPDY4dP) zbAsJwmn!?WiPySOR(Tvy+!xlwT!xqCF$FTS|CWwx%!j!NHKo7HvU}SeSfGx9jvh9y zl@ODB=abl>0+H?(D=`QRezU|ML$1t@cUmQSC~&+PP$}eH)nGD70Bjmg--z4ITXyMB z2Ii}}yTJhODJ2YmM!dZ%a~@pqh4kTE{d8`ISxMKsnVhZO2CCe<+&aX`E0eHzSS~w#)NF){p^jq8$gWM~xQR+;xhxicKmH`t( zT_3NZj}Qv15nL~ZaAP}5rrvv8TiTL7O^|vu$nS)!NP53{)8*;ye^_)d+gl%PW!842 z`N-RmIz6H>q*2_ApwB{9Dvnn_9#zuY`lS9yO=~u*_%QBZfzMBpsAC5`INz&#{G;~- zxcaD#-NPSI*{~<&OP(6scYbzWa%M;IaJ}Bfol2WWBR_V3Se^Z!&N==+VANpzZD5GL zx3SB8|7+jiz?GQk-TH#xh4%d#`>zh;xoP?!&bnHG)u3Yjs#A=Rh#2xyzk1^hr3X%WXml-(blEY|_nAyEf0rS}QN8VMg^M5NpzgUI9f7{S#@j|K~6#o`vBHNlS3W zL9^?B6&-9Bze4}Gr-?Fo&s^wmiiV4vRPVGp!SMw9gdUhN94Fl1JZ{=Wq&(=A%c{)< zYge>Vlo-y5C$Fnd&#n0XgaP@7FT#}y$CR^BBGU^)<5b!pH)pSvIZlQhFXwocaxe^h zJXnso&~tmjUot*bOGJoM%jlXp!CXBh8CN z+^;Z1=TorO;|GCwM8t(Xg^>0zcagp|5Sz!VM{6QAyP%DZtMB*D0^&;bRRV3zq)VA5 zZPgtuvCfrX#W2$1P+}ESc*{m|yEI21e6C_*(Lp!d#i2TY##1J5eZu*r-7A;UegEFV zNI6SYeMfx-|05;K^i%LviD#2DUrc>haXSjX_U+p{KfwM35YkDWMJLfyz!d$#cNXmV zkAWxD6X?snXqnNnD9PmoTMmMTKjCN4^Ni4%P~6V%AJN)4fdrOqd0n{Asgi($(`Ef% z3Mr`-&Do&=0gK5CmU)%Z?_JFUvZ=9YacTgpUjl22Bkbw>lA1uB8xt_&HeON4MtrUW z8FAW`)5Y{RR^31!uGyV#mLsDp@4OP8`gD`xcDtKr zp=SUJnAnevxG{tELwrmabras+^sFNmfG>I5@7jTlb)InjD!jHS0j_VMVBQV<3dN%?8jS!cn#5F`qsu z3NHjUzP)>Y1!C!Y?S_BTZfj(v>RM=R{4!`QX3y1h@A4urUj}Q^)c3ieJbADAM#whQ zZ%ima{;KJsRiNzgQ&$iXbPI$l>&9Ba95x;-HQTQqC;|k+K@Jb_QWvHbt*-3_poE#a9TrxM(d;%L|3Q}y zaCH(M$CE+vKrs;>_qvHR%9ljONjr8@)aqzyVqInKH^Q-gx~`3>VKj`@@cv$x>tPNp zOG~`yq5whL^z;;ZNk7`5V07Ffs}T@!wefI3e}Sn=MoKs__E?uNJ1kDd#}`3#5P)Os&&ghsZyUp4f98il|v z<@TE6uj}`BbzgED!dRr6R}X(r8{mO@pfX_KXgCh#>G-L5 zhWcu}LX664BQ-Yq5K(|-L+ug7S!k~}1Tj>vDl3M-8-X`Gn5px-)n!BS$hyoU9Rl&s z@27SU3y2RV|Kt7A)Hr*4zFf<nB#aj1 zxH{}9GFy?&E-^Pp391OP$3^psTCEM?#fRl3GC4-IxV${Ckn8|C|K>n)FCs5pbUv(g ztXCN@<=-GR_>f@~SoawJ@(>9Q_=#WV$kEk>sBoQKndaGzM2ZO+zaM4#b|fIs=lv*H zkL3)9$T9bPhd*RLevw0ulArPM&x5Z929{{zT86RPybv`tOYY!Y(^$CGX7e|+9`_mt zAekOKmdqDQV}{?fdPWs`&AP+OX_x)R38tw)8{?BCXxK!QMxkcQGlcXCMZ%GxsyjT2GqKa zKySY0$k2@itIt{`N*rH4fh_5mIm)^*p2F2GA-dqWE)O0f67gCHk#Eb-7}wJ*+gc;E zA}<9*1%>*Y&Q-qmF4ss$*RiQmVbTz<`k*BO^eS426j(HMja|VkFJ^VJEqR%c6UZWV zw3QeK+sQwgM=$DWB^^Lnb1?oi3(J60TTa7`?wTK3HsXll(qAflA_M%r=oWtK53XmJ zDt%Z|woP(@!K_wxxtHw~wEGV$NN3I6Uz@v+nL)qdh;%*Xw*qE`Xf00cY%4w%a()D? z>5oS?e4sSFFX1GueAr3#VYitZlg57t$`2AuhTbk|v-9UEw_~&H=1v6+O5(Cc8%N>T z>EfTMz&;+*P((NR00p5b9vV}XTt{9#{}T5G=PBLd@%*&y?K-B~}Wsh=V%A1lKrcwv<~|I{R# z0_?2)>?oige$6Mt&Y%>v3{>OSyvk7~z$G?x>iWIQpU!3u#N$xbOoVgmMBkAa`5~go zWnZShgs5o+HeOZsYrul5VBy6j|5Lc88JPMC)A;g^->|=BWQRwXW7?P9$G&Jh2S+q( zKgE(oUec-r-)TAYcIIT7yJqSMs}rdPvx}xRQV!-X%XBK)_9I6dROny(zt?|i94QIR zMGV)m;<;iod+cQrN43@zSc&_Fz=|bYk7T+GNhJO}^K;>GxEcgh_9Bgk393zW=@pOKR8XrZ;5_SXmRiL-&8g+vd@tned` zQqD5MPcBVYw5e_y83N$T1?rJ#V8T|!w&6t4RU^ry2F%A+YAmIvGu6;x49_+9VUj#p z;qmBEdRlyoT0`YPWTXrxpi-5W+McTYqY`UQi!8tNYoFgYf5-6rpS|{*->@3E!?xXY zd!%DfQVd?mmS8aS+{W#TPN1ps7QX%s#@HMM@y?qY@iBOHR=KnHS!S7be1S`Nd8lE}n&SeCkEb0GUUf8uPE44@b$XS& z$bTrt?rrmH)c3IrDLZ^MOUXKa+H@?VNU6n4BRDJFyJqE7onC(1>^X2p(OdS(i*$V; z>CwqDxZ0s{>52{3Sm`W(CD2~>@bcgWscwADl~I%eJ;2xE+VI{0yUs?e1ngkD8UX)G z0G?_zi4lUdYiD-56vx!F>>DzMd}7AkJR)3|?Y)Og>R3je(Ay~fI&R%q*ZgABFqH9m zbJ^*EgM`Sl0=KJV8gtZhP4;yE!13?J!pd^UP3_6v{>3owh*UQRG4X`%;j%cSo27gT zFTd=f64F~HVtV-}4D6mw#F%>YJnP&GL61XZIo?(15%hlEUnu<=bl=#i$IVG0@3fbZYFbO0#M>OU#s+gbZA{^43%%U{DWXEZq5|9Et~Z9rv3%Yjq<>EiBd7Fop1jFW@}xzM zrK;bjNpHAM6SQH+{Z7f8aW!vFl2X0P=xr}N{6`^@+Y%8dUw)^4#{R4cA*3{K$Ez<~ zaXKpDqy98Px<#h!R-dqyT11g165%B|2#*|^uYZ1GN#CL>?6I+HV}{T7<~0VZkKM~^ zUKM0TyKp}4DI*;}K##Ov;P`Yn8bmF`@|6Mil08~k!A2@rwt7(vWyWkOp-rC}qfc2o zy>jne(N)+3^)rm-0#)=e+rR!>$TeFx%#f#@EjK;>wQ2HgEjOL6d{E49lSOVr_jx zoLj`W%9|pULd;JhLn7DyQ=Lth_sHT`yk%Z8HemsG1#t5dL0H~?Hhz=jqvorV5y$48 z$fwXDAM-kP5gwI%BD1j42Ph?2+7W)=ZhHi-{#rH(Hd;FGrdgUJTa zCwxgD=^BttB*oKB$VFmWERN5|T+LU3vV^?b{{DH%)jx}KR6z?Pd$>G9a>C^BUDdKm zGtG?H-N>73Z7@N8QcUHR_yv;mco>jxkY!jPc;W^5>FG#*c z0_e}6Q+c%bSfY_cXU442K9+N5VRD@5k!0iMpq#lg$25 zpy`!Q=R1@{i6#zFC8WWICI=lsaqMk{wYCO3Cci`b;%HiZG&wJQuAvQcp$VpDc>(vL z3`0lbErsIiJjRb#_h$LouYOu-<8*hEvp5CjD{PHa@=+t&Z! zL-zB#^h9{)O`djA*MY^fCp8b+4FX}sXA3$1gOuX`$p#`!=H#z^7~n;~4?2}}RB`*K zbnKz0|Lzt6x`-Ykogn$*1+E>6VP0d~jzWE1twfRjF3EOdHSL-x4UT&N4QFW|sjLcF z9_Yb5g!!3=o+SC}=HAo1hLAj+eW3(mQ?_n&lZJxCM`v6DYIC0Mz zCB)HZmay+|hW8Yf(Z4Ylp8P11ZrkZL<_t4qx+J~(*Bcnn6P!Ma;o*-mqT>X-sPQ<6 z`IkI~omCi#^d>}BQuNB~T(aEb6kEo|=pYCi7%^%j4BD0EZ(_=?__EQ4cyA#*a(a7#sf1yG!Yk=8xf z+k*>h+B9fv^wIVMs1RQEHYmoxr$ha@j0Cfwh-}Kggi>Yk(o#b4!me-`khwYHC{osL zgb*c4kUH>wjJUESU*GV5vG?9lO>O(Xs2vdjk*0uTD^(yyr6~g0>IMV^l-{EvU5H4B zNGw3;97RAuKxv@`1QI$#2t`4pClnzhh|)Av{y^%=LP3XW@p%_yH(IDqZ_+;C95ncn{-#Np0wT-ukxTQv0Msn6 zN;y}510VK@1v@ESrzjYnu4r8VdzBv8%(3?> zZwH4f${Lk70wayqmV^1k2?K8l$XEm+a|Jwx9~9$a(cS|XM6DoY)sHd9`oIY7NQT`U z(^X|cX!TDy;f&`FfHy4?A^4dly#>4|UwBB2Mp=YJv{)5# zG(cl}X+67-5s3EIV3^zpVLG(yXZtQUx3)5jbYm!=p|A#eL%UsT^IBV7@$-4*qf+~p zo{3L#P1clk5qs?C7oyd7ej-L@;6m5E1yp3Q8Y$rCHFug>m`|k+Fj?! ztJ3Fa4lKZAjcUvLQb$oF3%_9<9Qj(9>d{zcqxTF0YhAU*g>iJJ*8Q4fAQNHhD?0Y@ zySyQpF1sLZ(W$eKAK8RAaOt=en0`b0e4%S60n2%I&(frF(|I3+Vm-yV!Pd^2 z8D0pSugQeY1&1|Xfjue*Hzj@1Oc!nwW|ivq-hd{205X0bI91fZbZ7#xahj5>JV+Yw zF^-kfsp2TexyWj71kKmD$N=|&-wDhn9)+E18qVX>V?ylf)uM2HOz-~4kkZE+LdZ z`x@~}5f(4q+eG$xXoiocF8xJF&A4DkmUyV%4x1bMb73r1kcac2o6TV4rMQ}^5K%J7U0wKg#mej zQfE-;U4#jQs2S!33i6L=fUJ zxfd_{tBYJUJ(!BU4(qV)>a9>2W{GigR1!q1q-vAgEGDhE65R5(V@qJ$LusXpSvC73 zJ`kB7hN0V$z)~^vdbaHywH3nhv|i!xnX#f8wpYpk+x&{JpCSE=>j}TfaGdS;LZ3hP zM0WnNao)kGqly!grGCXCTw^5dXfff}w$kl{f(ll}+_Z&!4cBzZcASD|>fhi;n5jZP zf!C%Y(Y@+PiZBr=ft~d8qh&>o)^b)8GuY}!Im*^7)bQ=3U*}dg!Eg62Q<#N)P6A<8 zkT?H;o4UOo&4LIZMLM#)Q z$)xo|pzg;O$Jiu=v_a4U2&GOzE5jHLjDDruep|J?{~Wsd`oY{}C^Pfch;BCVc=7%? zATqgjg?;dErg02igV?^(ky1?e?8DbBb(MU=M}!68m7|4iIM>@&uS(ktP7DXOEIJ}g zjWlOxV2r+Kz(Sq=>7j>rd&9~Pg5#x@Dvh4`iRq&hNj1yvk#HB8>-OK|l~m4S9c71_ zUdN5h7dd5}%3KL%U|59=?bUd;J<0=E1R0*Prv^dYHmqpke7lS~vgRwRDu61}VK;`&kN1U3at1ADgAXQGc^+|hHhxBLQ|zyO zOBBGo?`*hPC3$j|`J&V6Bc;#HivMU$)x{Xc@w{@|WXFcAAo6i5EZj}it89Ra=0LND8S>VwfSdLoXx!mJ*zA<01Milp z`Sl^yuFG;a{br9QiT*HvHCAFpqU#ZkJj!9D`*!Cv`ZSo8U{;zLa5{!mHOb~35oQ{7 zyPn|nFqC?PB~eGl^d&(E)m3&BPE)F8AfE*Hi*}}go1wQOfmNLk{<0LBL7uUT3*svJ z64k$cNLiYewLxj8{kSA_cJ6JDWGu^GZB9JR8XUZ%=x*ov*HWY4;D`S{c*DO2pT2%j zxg2wnDQlMf5EAp|93qMJD^qaxQbtN(>~5P%=4hGQ=1na*eh6qatgA0KIfOk+<+p9| zp2{eQ&Whg^Ks<_a1fx&q!Ntb23nl>;0oT#@@=~H?!Hi2x2M9MG=DyQF$GIx=rWmVO zj@)i)GANKO1nyDU$9L@Nm=fh&Y>AH3uO`J8rB~hav~Rr}-g6(qpZ$FzLp233y8J%& zXWye1iBQv1@vQMM_L0|Lq=$+u&(HX)T5Y?^(r;$&r&+`~YbJC@ zsx9k&0T3eTvu(JYW1G#}dNbXrJaX{dW7RD{u@nMFEH*M|%!ncKWi^9;B3 z)j402Ztp(6bfVEJdD6tnI@~QJeX{umClVCj6KC^vdREj+c%)^voR{lSrcgXXw3E7T z8x|_%G)hQWV>nP+3U(L!PJ6g$_3r53%ZWG(O;U zmZ^Zn!OVNeIGl{y1^X5c*;gONO>{?Mf8$C5up*Q*aF8vG5@AeNb(pTlK~CzQK=A`t zX;34YMD`r~z=C8wPic^Ig_bG=q}_Pl-P8?M|A%#r{+K9rZQWsgnGAU^@tUz%Z)fS^ z7*32#8}7fTFZh|k?ERV2U$c^}+A*MtO>7^0%M|mvyI@x&;c1sNDRE#@#uFL_<(i zSWD-7hT<#xOCr>fxSkw!u{Q5!su>Vk43Ii<_cxPIH;?+^f(7C@W^<`*&{`$dbQku#OKAOvuEjy@v}CTZ{04d8J@fKUfBK6 zlB4;??fKM}po{B`l+8p2XD$C+HWU;51msaFiEb1O`@Dd(n*1=8|D ze$FLLvw_@@Xop_{40+y6o&ebS$(#H+Hv?AU2X>jznPj#l7`l>6F~YDixNqGW8Bk&e z;?T0}u~E;_bD7=RkSRASorckODc!@vreV0Oaa?DOYHHs_#P-xVx~uZnrH5K)tixUw z8}}Ip2>o94EX6LmJi6qkLPBO8E0;29aP54+?fIQ-cqknK#5xQdU??5E%{1jZYIN{6 z-Cbur`VxV3F(dr-UFMdXi7*T^)|&8s<^B>FBwJh*)(wT+jUpos=qsacaPHTi*pj&;#z+X@w%A8(z*y{;7& z`1YRlK}qfh*YGq(Xu?Tbx1`-RcwCKh0e{*pa1F1bTsYy}Q53Po#T^m%qWwB+Y?>`@ z8LhzRu*`TCMTYF>DWgoeCB)f0Fk1m7N=sb@%Yfsc=^?xmBDxL!CG1UPBrWhxGd$iD zF6^KucI$9=%Y5Mvi1k_26`pMMm_LpcUVrPVfLcs|zS$cO8KaK?=kMe0`Hyjrg5yp{ zDX3T%tt^ejn6!)}ra}+fyz&c|uOL0Ul&bg{fOW}WFLXafoTsbhDRz7xN0-yfxR2UI z&*Kmx7L$YTEn^`Q!>`=?LABg*qME{4#Z-_K^(+p>2gI|l19P*du%sN=Y-*37_U!z6 zGRlpq%CZKk=8QQ|$z(q;LzqT`@P#cF4ZAhB5s-(?U~!U04Wp~8TSFy2uEEW&->wak zelUNSrVa!&%0Jq5&=0gYn*kGl{qU=2Vi*$FBYu6U!P$K=&>U{#Utbd}=3SO9ntH|7 zl@gpI zWthBG=s%~;dH^(rvQ;^ttr}YkWyOtdljVKZBI5N+E9^ON0K-7^6Z`8IxI}W5-YYfN3dF1=7g$&3e#}(W5Jvvysgo#QMF%}&>DGy9^q)=AI{=WXkkCc zR7m?%dM`9M`%9lpBn`82drp2f$xzX}41uZ;itMriZ$(>Q{wc&e_opcz0v<7vD!YVK2Id>qj@SJRS%^vaVgk5=d$(N90QYdi}3`m zGw0a930>UZyDbdj=51gfyDyI`vvop`T7Gu$w|BySQvPL5DS`VuxREEt8${PrR&a9` zTBPneDxR2v22VJ9djcM9I)&x^1+RsB(xt%;>Z%IqCyACSbCrHdptIE5PrNd%+($wu z=%p+5arx~QEFO{GHm4F{QmC_exr))p$;Es@*C9E_)mbj1Ee322U*ci7dr9z>f#WrvaGZl=J~aHbHu({QtEM6VbFk4JQD`s~JL)KOUL@=i*z{cG($ z7EWzhevP69!hsnOzd%RuB01~x)w_8NNtPow3+eeD|4r zapyELA0O!e8S6RMmb)U>%7wDUW8ZqRZAKqW{thiT?ozAJ;wLj*Yu|Bn07{en$ZQa>8GSWy7Dp6D+Nq6jT|!vkyx^gf-ndJ$xvM@#U`F?8e+@?Ka2}L z`2eZ0O{i~ZN-=HjH@*3x&H<(=aKpW-c42*^Iyx)aOFRF&w|0Ij3vQ(U+fwdH?)$cV zs7DN9J26gHjQMztI17u1AH{7`_X7pjnBsLYb1t6kk|80J!Q_I%nHdM~Npf!Rv?9+` z_4B>lN$F`_%~3{4yW1VqA|9>F(_o5Lj_0vh&PU?#dg2|B@0q3oL<#g#m70% z^jsOEfvu4Jb4sLCiRC8Sr%Ztk*9!m|w_KN%n;1OXZ_c8+G>{2%ey3*Q@A`VH?Y7Po z$maQAEKRdjL&$9i%r?l`b2kr2R`@df-PYIRZ4jY(5sUt~kvD;$^(3`Pfo1eTeT~Vm zpEpKZG|K@Z>pn=Vk+%oztfQx#!vaaJI*j#BZfHkc{DWCzB(f|lYR-bGalSu(&L#Bz zqF6gEnOn4!`Axa}?tD=de{+c0m8e5MJCIYREJsE?M+8e!_d%TGNh6lpB)Ca_JjtcD z{jz6=`I67+%T00A(1%j@pgT_KeUm+{(_KJ6rsh|m#qSr0z1hUkhSGjW;jTo2LAW3! zBKYnsX&e^rZKfJbgyN8hrJlYry@Lc5ObWi-tAzY=nXM%w!i{}**K$=*4zY{L|i>-%l zhk|fil>|x-5S$ZE*x+~p-{G`9z}-1h$RUn9@RO+oDoO=|TJKp1cPVFdLmT_q-2&zOMFP#KhkPZn4CArcjTI|hojk`W?UtU{Ap~fFy4}x_N?aLx^+e=z!(8&^9lNUXwz>8yk+nri46HoW;7bJ&n|~Q>J-YR@@pB7_ zzUzSEKs)+r?!`fUxv&B7?N>#8*(RK;EkG!4QD3=^!PkMr=mf#gkLlA^MlH?NgP@{O z%Gu}GLc{~RnjWq4bA7(Ie@-thhA9*_dH)LH)eTzVu_hP13Fkch{KS7D?yJv*CgLFz z>pTGih7*0Ki|fJ3InD(DYF6!UL+97!u}xf-s}mRazP z>P0eV%lTxUhqB(&!|-g6m*MY|9m!B9-ve36VfFbzzpO%xHP(^Mn-_JBnOGX4iwZzJ zR~kXmQIEbXlM}UeQh(%>C^Ue(>(pL1eP&$VA;M3?79J zSutSHm)j#UlL$H5Bu9%lB2AV#8nTNk&MaM))C#c!Cx6W-mNyXV*&GR~LYwWA+j4^C zjljL5o_KXyWo=b;#I`LPzPz?^k?0OdgbV9ypxZ$;{{!Snuxn|UJ%{A$VxLEyWz1s} zHI#gbg1!+LjIPb0Hx+%fR&P-@yfeZqqg-$%o!gi{5D9)^UUzNKMc^Sqv1|WKph45itb6aE(^@wU--$mh?WO6r>`O;7z|CR8cn#+c+?) zGWugA$Dpef)>}dG6DC{45+QAeQTNFxH*i)(=Sf6CP&dcgWIq=e%sCU~BHQe7RqGqYUNLcL3UBr?;k z2Y9;$`vvQIA7x%KCQuA3>c_m1pFp3690r?pf)Pr}i-!{iR;0n^7k@oBEx3;h>qLuW zl88b)b->LMP?|$a7iR{Swig2BtYGF_%9AjRb4yLCDS^?Nl37e$-26(;&=+Y)zc*sG zT${{U-DO>#EKbYOd7JYfYaYpgt#O6PspF}1YBJoLI!>8Q?Mh9OJ@Nb+6VnC5T-)rH zl8->`y2JpvbGL{7+(THwPsL-iMvR$J>3&GMi;l4VA1>OC^~V}9eWek4x)pwAjn|+! zM_$|J_dGyOZ*|})2ufLq@jlC{8I9S8@y)7K!(s z>U%N<67Z?w&al{RgF^#0iH0p19Y%HW59g@`ToEyi=NNnA9%j=ohsDMBJ3T${$>+1$ zDW0lX91Ysr@Ag^4h3O;)(n@$D-m1ThS1u#H4YqNX7=QR(!*dgJvWma+P8==Ww04NhKqQ`xdLI7#Vz*{;SSYlp~+WV?>4ZTmLsN&Ogx+Ahs}y*5z4 z&4n#rjl2=r3mPzh@_sbz`Zs-1jxF$**+(0Qj)H<;ghEv!D4$(6G4t)8Re4&=ZJyz8X^-c8+wJp`7YB*R$}!GGxmi9@RSz#-Vt!3$wZ_KcR&%2%$zzu{DiA2vv}Ic zhcRV}ed8}zl%F{b?wE^{(@90^Hdt|%7#4Q!1t$Vhp|3nj0Lef4XUH06$I+s`I_5Fu zOOBu+g#T%LBN#Su7yHe{-Ya7#6tcjoU8=ura96PN&pnOLjLF7P2AYc0vD75+B#FQy zSNYlIs1uZyaP|$}*DT5kWzGdghsB|wMSz9lNQ+T{aaEYFS6&->twiE#<8+udw#x7vlE-5_NkAWbcgr5%rex zEb`}UCa7po1LRmS+zR4sK}2d&i!W%{JQxSA;^4Z{>#&rb z4oV%g{6?&ZjOb_Gz^nU>#r(_V>?m^q+YcQ=jHRqU)c*Wf-;WS9X?ZvL(m5p`)s|7s z9G7WI(Y`R?;@D84?Di`BA&`YXEl)#7X?zQBR$ajxt-wF7Pi)SvuTW<&HD^1b5eEyxU06FO#rxWQ^3LX5yis#vL7cN*I%%Bj{5r|cudnwD`s{rkGRNB!W&hc~&0a<7|M;Y@^L_i3oydX!LBZkb4`e3asg20cy6+bOnH+_E-FFhHzYyYrN( z5m{{?H-A$2Fo1AMv>fx3w_n@pLkND&yj{pjyY89-k;IgCrTdh&TjF#YB7#Mo+eVg_ zlH4Wh*Oi3q359RR@SZtw?R0NOjMO>NV6ST_XNpuKza@&U7V#_8V9lL}or)}6ZiDS1 zE65}TGzLfozp_ODlmr~M=pr5jvTXno4SA?<7J1amaXz++-aOr=#;A|iyigJrXqL5X zJ4hilx#mTn%(QBK?;d&@iR7l2_W6}r_jWXuEJgxOAWeeqEORXkH-^zGbO@9@c z&o;UEGtK!eZc{0^80-4@^{nsruvGW>B1`)$>(=B;X66Ol`OCeGbh^aC!Y;XBHxw};8+2RrxyzNS`LluY zL+|FFlzf7J54M$ZEz%A84R4ngy^{IOyHo1^E39XqdF8&q8sP59j`b0@m*Cx~;0=QE z3WWP$*_HWLxAe}yB;G|wpjR1qUBPP(oVBQ17bBS4xBT6m!3YW{*{KN>qe z?&FBB3z^J)ABl7?ZXN4+{bG?cu4bd=5(&l1 zuD|czY5z^(rmSqTnt=*I#qE5soRpOfJXETBXZ~~WVV_s-s%N!c`48BDgDW&D0e+9_ zLExd&DdlA-Ep85ot5)p;DD>}+elcH*b7dK3Ot#=aYL(i9f|qOd93@?2!Rn_niT(aF zTGw8x_YC~)(I{`YUFig+dw$#dZev!ep8Zlu@s{h559fVxkI^x#DH|p=clOrD9~wUN za64@U$+f1hs)*?;j??Ztj|q3#cDyeU1aK%CI0)+rpojAz9@kVggM4gqjRz0TyWk1a z&xEVsYwB{b=jLc-Wuf?!T;sX^6dS>WN|Bd zFK?tND%CBZWClwD2!?g|_#dzBz4YY<3H`1=`;sI!Dl~F*Si7_*ogu8@PvbW7!QYQ3 zsVD7EyX`tjiBRo5o@DpcOkpX2c|buo^L&zM8cT+3TByYTnNuLa6DOcxO&#j6FCfNdv1Cyyp%GU{?5-Dx=o)*(?p*_|he$sf(L;~xHI3oC^ryKfWp7Oi5h{kP*gmH zSLkRK`RytP#m7x}2-*E3bw7qU4fd{C+F#&Xbhx={yB_18_~0Jdv!V+gbYb9&z-pvk zOv-9`t6|b+xJ8_k7o2S_1T|$_632O-dRcqbsy^D$hPsFJX=hA)X8D| zNzHKFALYJU)xmfD#AnK(Wfm75KbKfMVln&VAHFhDxpvw-N7LtFlBBDBQDi8{d{ZYY ztNoi$%73f(>;K_E{y%Xb|2yuKa5CIWc$`FnNJpIkBIhh(c`B$o03WlQlq;I{@iylM zph@>Vb%u>#s4itneRCCNM#WbyO0k~P1%>(?nw!Q}@_nUE8we*Yy^%^Oe%a`E!Aw3BgGk>@dm(L@OW(=#x>GdBa386u)=56H0HaO#`R`-H+EvpEZ~7dg6Rs z1sI;O8p1+eI<8e^4nKz1Et@cw4d)f=Uk>)Wduqu1LLQ(!Y|NFu{AKgO&$vJ}F(0G- zcG{i8IY;;7WK9U?U*FU_BIZ3-3JI~1FEja8R~zlP@)dQn$F1h3r{MP%I0<$7<&VJk zx@3&-o$}!>k8%OHcWlvXj}u>PVd9Q4Qn?)E4(q%9{a=ct(&b>y<*OF`|8O1n7jNu8 z^q3g@SNj1#6=;9|H#cC84hKDHr9nfabz1<+zReNEQ{(_Erq%TX@?%xo5kho|FEuvr zga$uU0V#`8AS3S>R|P@v4oeZxt}b2?t<|vC#mE6qb_^N8x?Lt^_3Jx;xLd(mssbD@ z$q~zIHw}0PfHqp2G+5GZZVs!@7afN_0PecNv2CCvJn=q(>_K>LgWQX{pJu_dc!JY3 z6Tds=r%^yh$A#LC)Q`iqPsrf^)@<~PxHr(oX~g2|MdQZ<$j(jlG2T~d9d`9w^1G-B zsm$2Fj4@=ehb2iY&kBnSwBit<#(7i-_#1>FER5zqQ=4&w(7Eopyf*IUCdHVp_Z z*?E!DEuqIH% z@TGwS79m)4)J2d}r_=>IY7~^o@N(5>R3_3}wJ5ieWtF!DRQ-IuZd^HaO}X&prK;5f zk^x3?g@G!~`;`2m>4g=;zO{c)kG6?$Q~@ZB05X4tF|vFBf@aW^0RW*N^(BT-3I(6h zIz}?P(JZM`>FKTA?;pPSqh4~PFf%Z2?)VqB2im!=F|>R(6@-wKwwzbBq) z)B~?YfBbWgB*(x3x8~FhsuI_ z97yXV3ZhK&y>!f4>I0n|Nax;{&P+~pDU5Zs;*l!&5rgBkCH1Z)idFmy%}FoWso5aV z4H-wwX2gJPAKOu$cGMRlpC>mTJc=Fz3}^!)VQHOFdqC+Q$2&i)wteR4ARY^*lHYPz z%A2&~ooXJ5smm-iD5X~B`n|v>Hq0HKuP?71d~KDG1Us>*-1VTc;w810`u*`LeVs4N zh|U+gjXVTwcC^Vb>!UTWSuBJ=IYpg zEJOMGM59=|MvYIuOUQz+ca}$X{vudb6)dtG&0iEwIC^Ko)TesNT)ibE>g^bgwT<}trYw7?_J_KZ z-#Tw8cV7VRW#(58ff{f)qhKyH)~P-31gQ9wqhn$Ozv(;!B71UA3~{UqNhMB&FQ%5X z>LU7!zS(9aw*=n&8)C9T`(a^Ch1Ho)v)K={#T7i#T(T~IE~Kz3~`bcZIG zzQ!*GPwTKuot%1}?SJek3N6}6J3dXi*!_-w>P|pXeUeLa;nxCE-jOKDFt|f%XOsxw zHwzI6i-jHWcHN)o%J})bMK2!|9Y|lzGR+Zgf3cM1k>eYYD>hWAkTGY%So*4wtm7@8 zG5l3Bymv zz`!XikQm#76z0GgxiK_BStrULDNc)9+#*!QNqdvA&#sT-{EE0-I{ zH_N}|fLNwjn;=RapwYU(>^FDYU+S#Y@A~*(2PJ%l$OVe8e<_G7XyjC; z)lp0>t{+D~A?{xzz~gns2HL?j%T9{eZKimNk3NHiKSil)f*GLG$0t8;Eoh|5P8%2F zXVgaWKfG8W_c=!{qiZ2beH$Nd@u>yx*f!}&w6%WCG-0@=&*tsDK5G%JmHjMZIteiAKi&s~Zi2xcT9r<>Cao-FdSQCe(DICdbHf|+KAXL|NfQ}lnUPoOvh@$_t`aOf8M zilB}}BtifX?XXSjFAS4z&+?W+W42I#6#KrZRC-a5UIqcxr!|Vl=G*Gi$d+q=?)jt6 zG#?E5u>TJwBgz;&*Z0a^;=a=j1r1#-K>6?l??4!vg&NgAv!pLg!H}S$bW~^!$8azR zEx5GLOs-Rhms;2X4Z`WO4zg{EOB8f6v!xs@Jdai_xlhEXolNZUB6h^8@ zSbLtWia7R);P+t8H@NZpkITW%?hnKxP7q7U?Itay151o5H1hCB)XL8j)3n5YrW%jdbCo|GB4Yh)L{z;UksYHIQobL>JB&bg_5-0ae z_LPU^f*}>PbxoA*OSI5<*tUcJ+Donb4%c3)ULGsA)Sy}7Ko`RBvxb4M3e4esW?G|i z^J1AVDwKz?Dlf4nIhSoR^&GB=M3RD+&9}u2)bi*l(z>ZGpa9t>UW>@ zxyS*GzGwqezNz<9O)){g{M;*woz&=~{Ld0q>Yq#hSi+s^t$B7u;%;g(q`c>3yfw6M zCEX|C2)wtT-yO1s(@oLNyrbZ>e7yaxOXOyx-L>q}e$KaV^*?w!T|XjQ21x-&>vlwp zbVa)v{RckPkTfoyH9nJ}bWlF!4~0{wOln?M9KKYkS(G(|%Niz6_PD3n`YbL`Ohc+? zr64QmY-pGVOx$S!Qk(j5T9MkL^=Pr}LR}4DHyh`NGArs2^ou7R`(6ErEX({^3$I!VqAkE5> z`o`ENXLshOb?L~fQ^y0LOl*(66-LPBg_x%XCz z?8~GgzJ5N1&mJ`B9cssRa;o2`23ydvW5;Cd!Gmo*m?gdeG)A7jHYwdFz?N>vnpx^) zeVv!DZ^Ab|osmuqp9}MdpS&#cB7q_g!rO@fuN(tjxx96pC?=Q%`MTk{j4ypYYiQin zRXAeiP@J2rS>R+3c5T5Uz|WNlMnUIApq`fb(c(F8FZ1S17}$hP?SKolD7{;L*b|iN z(%+g}iuJbL$&kq8-x%<8*KDmQxI%kCv3U@6MdYA)8%)$OtG>~aV0_)IN>Wv;Nh{k( z;V5x$Y<4N8o#r))_D?_ZFr&Fhxl5xZJ@dudqb@O~@qwWp4Ru4N>CuuJ12xODMkzPO z#loif?F>fAN!$4ddp^U@tiU}Yb?Hlh zjz)UIF7?_k@OJqfl^a<{eOtGy2fp(I%KXuOs$e^YN;3mu6HQ;Zu|zM-NzL^4(-?SAC>T{uVXh zn3DZCT%TA50m~c!gmC#4lE_RWPb?SHMPVKD`g70S9Qg*eO|~&~Ap85LvKOV;Xk2vu z52ih=Qt@SURJE1xC-U0X$d9I)+R65$f<)X2HAU?ubLeK@(kN4Rske7bL0lRc+}0z` zmf?MA%3G;o%ys1+q3A0RyOJZjiQ+9trl%|OIiNrAk?KR{1Wo#NmmdMp7Gy%7YLFyZ z-9^>Wd1~ru==ZB`eqx8Eo%>{Jk8CYX08fzj!q~hA_;iGq&IT+A=r%Pc_U!q>el=H094d{zP`b z)gpbO+=q9A{|MPQ+Uj|I2xWw|C;%`whPS8B%&!(U4sYk^k64dX%7b)<-Tt4|tqGCd zuEVU!$&HCz#q%ys?Exaj_mW4a{0=I2n`Yd$Ovy4<#E*Gx4Hdb)9_A@?)G4}dm8dI2 zQD?#=?Lg!<_JC(+?xA6h(>nyvL!yIHwR|0FtY0vHFizRnHxLy$?<%C}N{?0deDb@PjxBt8Y{}R+Jgs=krLGwC@+dYUs_Y6Df@T0||&@V=B z-2%%TnYI_8t&(ISdbuv~&ppK@3koR9Ur|Q4uU-Xh86NQ@*;zZ>WGO1|74$$)74YV- z7acN+gMZ%-DyYWgEWzttE)kvBg@4L60zZQ}s2IJo4C5*$JaK{<{F2f*s=PmwsZC{2 zz>9?P(q;y4whaLP`PL^Laje95<4djzVlXnNagq` zSx5O$)+5-CwYyKmfu1x0J9qicYDTu6?Ft9k*3*u7W3YkS3BJ*pC^GTGz{k8vQF;$c zn4=~f7t#jL?u0XvykB}v%7Ua3jx}@OIiC7qv1SJG`2oC|qlf)PtDN8TZ}}D5{#&xN zZO9SP;IoF02-B<~Z$+YfAW=et3Y_ifL?pUu4YdgZSk^;s7Vj`%ycLN)0Q7Y0i<6^t zPzFGAxMH4cQQ1b9hl3}7u zqb_AzqcLsg6P&^|A^gBjhgR12dY!MS*swIS*afZB(ixZO>zdD98>^+BElfK3kn702 zW}#Q#8VlrKE%s&DPOy9lY%~dyuaSK1@2(&Fp1>7B6TiKHswrq$Fq@kTV_>2|JrgyN zr_8O`Dk0=Sydv~cGU?NiA06S(w%?%K-uX6-MQiQG))yld6S0%Vhf4J(ulh<)b;v!V z(=U5JpqM@gxF;v>B%s`NwrOd@q`%8xQ<1!g(}X+tm=FHb?%e;pc`d}(N!<{!*xd#x z0fwemU+uVJu3X*wyQIcCcp9z#i`kFl%DfWvZ@s+-cSeZcnx6Zao5!IDvX{wu%VN1 z1YAS*XAZ-^-(w=VAw%e`u~P@C5)iOYe-8r`LVzW7pes0r0??~qIOg5!Z4fa3kC%O7 z@^PL76WIrR5W7a2`y$~+zeK_6W`iH(hpn7)2a_v@ZV9+A5akS?#(?X-BAX}m*JaGX z%S2A{XM&u~<9~nqeYn-+46J)-@se#wQ*2I&<2QTixa(9Gs04Hm7QGtm8S1NJe6Sz) zMTqgusb9KF!+hvdQj)=5{~WFAUoLD2VAR0_F`;MCV8hl>7s?nQO~Rjod@-aUH=VrM zAuBPminlnDDg_jL1V<1@5cD)3+*(-O%F$=h$v1s)cYXOL{fjr(o`1V?8R@>sCYHao zK2wm;Wyo)M_V$h?KDYTW2`LXs`Cn@e39F96=Xh)$@f><9aPZDfR0a0;XHVdN z4*zeqpuc9;bK-MB@lv%LI2A{1#*}Ke(0|Jv7~&bt6FJB7c(={iN+4$q)3we;P{n=b z|B8CO8^b#YXM?1B(-+%2t1)aRkg|3iaFCh|3ANFfVj}h>6W#(gMmAr$z(S=kRf-V0M zZp0DAvK*L{l|``cn0pbRl`J+5tZIThJ~Jj?&%orN9fOdxt3xORz1wc24HD+p!j4PD zaP}7diqI@?*X(M^dcIU+KW$N@l`~&IUo#|XC?w*Kkoo@e%7g5MmW-YS1G!uOW#tn7 zJOHSi%PSAdv*M=c?q@6yfF|Hol2L;Rc?Wq=!C-t2oMu>65az#ri$a*TyQ!l{^rbJW zt|}{36E<$q-5EJ0=|GL`V0PE_+F5>o-0XWaCgO0bIMG@sn-n|1Sz-6=mw?C5Cos9f* zkBP)HHwx$GUu*P!xlYK&UNX4mij<-kWk&f|xRCE=AUW@ok}0?`1ZVQn41R}Z=5vyz z4uQJ>ki8E0f)}~+=N{vAFGYkW=f>YxdT=)u8EHpLwJD(6Z~nQ*S9$<+$#<_`nUf^- zOR|DN7h*kx%Wx2A_9p?C(KJJTWG+V?^pm6gAYdIP0du4fpijBYnD2>)>fZJX`Xblx zp(c%uu>YIggq_RkF!kp`IESE+2*yaSG>R)Y;IXUH$#Y)Kk2ZRyTPc}VEPCPAe_O2n zv%B;^e*XN!Ci=+#W{c|_dNLD~^dXobe&?oG5!?@W^h749ht$-aNbf%bQkDD}m>z*D zk(s3jZqMy%$6Czh5J$D1kR@OWW#e6*Xk>sK^h?E&@SEOaQL%wZ^9<|nwzWHARXYT? zpLyf^S;E{xFltX&7!aW87qNZ4At2q-6M<wxln^5GtY% zB!uXMywGnBs?Uu2jVY8&OBQt^XWnYA9rdq-R-Pj-43q0Yd#>3d)*eeb2{=67s<^1P z8EQxM-O{IV-{_0-MyW@gx|7+aQRH3ps-fn48f~_71npUM2*qb{0PUIc0Ehw0uxP7J zo>JQX#om{Pv$?PBTC1a~s+uWQtJJKmd8n*X6w5p($Wm2;P;(Hm+M35zV{5Du5fN&h zLP`t^RjsjRiJGZ|ij+uC_C9By@9gXP);{09zO&cv-lzWQ^Iat<``a6njN`{SlA8Pa-{|zA#th{15#nvk?yOUo>+1&0daDKeid;rmkwDR zbe563+9fy7>znE9(nO#9;msCf$$iHrD${7Ef$95cV3y>YtC=HmY-1->E+# zVi)v!GdBbjCW;wNdG(j1^L54LpCkYO=W_X&P*>PiHq&ghl9p>}ycW29j@hQ!8p-?2 zC8T`a(gDJ&xXx#YS_|ehi$H^wct18|@tT{2gsP{^O-V^SIseF~uf6|3W@}QRPc#Qy z{R_pe%Xey;I(SsNr7Z-%L-QlYlBmgKE`l?AItdlE4QC~RFK&R(;uI=YbMW!9I4R6$ z;B3J|_Y<>i1^JO>Q$M!kg-DMdx-(@NHNN-ih7T`34ezfH>%Wk!UT&nd*4@{kG?h3e zUehvqq+b&Jb>U>8&P8Ia!Ub4d-Cq>pJ3Im zD{%gtoJ8!(n0WI35yJ5c%j(MWj*mwUrVmfBM1C3j7CnD~xc<(4|Nkb}{<}vH_jfyX z(ExAX*sw1wy&LnBRb9?!Y0czXk~LGO3jQv#^DS8s7S2Sj`0McB&CHaxkvO77u2zrk zB`bEd=s?DMyUxpvtZ7ugElD|uke~VdYtI&viC6uM=@_NTD@GlCbcRhSewgi8&uM5A zZV?3ztNv5I#{b)9*lE*c0JiZPJ1bvU3~rv}2wCqBJS}cHK z^_79SOzXOkLlf}(0jBPesbzWO4LN9AYR`5rhJ{e;#_OI{Nf>(srJnaHJXgoT4)UPZ z-080c_p;^2LC=3qd-jC$UPv+<$araoQQ#EEo;N@B_Z#edi?sjSOYQGkp@08G_nG4`g0Ar{ z(xZxbNV|NLjgU0HMw6kinb9^Dlf6uap`Qi-=V7tkg=gXFFPOUXTsP8W;9=o;*!?$i z<00vmzHIYrs#BTKgJZ~UrhD=2g5j)qyxx&mEEkV$yGRn#P0X`2MR|#;|KU{a02i;SxaL- zrPB9PzUXZ-Hk*EVd@A^5i$tnl`3z`7CZKfAFcKoG+TgP$(K=05kH~kJKv}|{M2kW; zM?o3LH_g6s7ZR4n`w!Nt%-#tae3ggDQ<>|c%uX!kpgM3i;6Q!#S~%X;>iMl7MZf%; zHKlwjV*l|)Y*9I|FTB)K#e&>mbm_E5B=WZ@8693 z|EtgZPfxf1g%tiTSduaaDs3>%oT3yn&OphgCI(DRY<1(Sp-E9vYKPfzX4;{LQbg^T z*$PYoJj5}rKSj@~#s@_N7?FD(GutK3YyfRhB~?+M21S-Tm-j7enw!Rbwktl|fj*B3 zVPO(`w5tkR1|+7{F!kb54#0Ds7Y5cN+r=@|>53!p01VBJ&}cW&A`u%J9vb0I)qswd z01v|Nf%M$MU$_mNhkgHx_V`!KMg3kA&c7K?{4Egw@d-@w*b07Xo?&7}Wh$C$!)fon zu#_)$Wqe1rqo3Dgm=l@Zrp)%c+OW5PPa73)Pi+i-#VzRHsI@=o`u__FjK`@dJdjep~?zj4_Ai6Y_*uVA3ygVys( z6$%O;>sjH$vECCtB6_KJB`#ZP>p@?inhSnz2-VW~{_t`c&m6L^&&(%SxL zx+lj9IJ?GBAdgx)Txk^KEfzGm{0x_y2)V~41`NdS(fB7~m4vL&CLKnGBiZr;TXH41 zf+&2oXxFwN-Tf$y!9us7CCjR6t5TSwYPjqu!k>6w+V`U8YnXDVDypV+!tl7s-P4!G zBpwa(%U#ad8Xi9_*Y)5ADdIbJ72x@vsF}j_D-d3m9N~;kS|T#u7@KT zag8QM-X`J`5#Pd<-v;j{u&!!5$&2b(8YgnB4s_pSXQ?W(|Lqeye14?&jNE zNAh-lMZV_&Te8SeU2Eb~@#r9^2A8EVexPyHe__R9BuZGuD(XTsXw5=Ka*AC_f5Rzo zWKgt1`KrgiYG{5Vs{ZI;{Ojj^wV}y!gbqqQ0g0^b?P&#zz={bBuD3z+OqD8Uoxq+b z=lZyY-ZLk=j)S(x-4`2cb!uM^1T<)RX!R}KwLZq>Yu-CmN(P z^{r~YLF~Fz&ZEq$qg!sZ&4~-WQL4xF;7_tX8kzpxC*3`!68@0?_)xhMCs zn|wUF(;3-n&eRb59j4XL&xtY4JfRGcCN`H2g=o8^-VQMLY5@nOJ+=xa(kbU|JN#+O zbN!|&n4(=+G_OnCl5rTRcjDaz`8MiG%-VK_gCazPoj+b{%%Vnd+Cd^gTuEpRd#0zL zMVjAO$tQo~+aq>+AjbndHDa7OktTKl+_4qDcp|@{kYWa;K^Cwe5_>Y1sT_ikwsZ+o z5p%7_?4NVm&lp6?4urV+Xb-ptOElC=%t^-UfBKxSroN_qXIBm@BeOPQHL?0tni2nR zl<)VBlHVw~zmC{H`s%BFL&(u`$p%aYttX273Bac<2$Lb%G)5~+DW{&Bgv}GCeB+gl z6s&T@AAtrU05*@7`%2Te?WYGDpBS+t{q(0jZm*4?ePH_V%8h3d>7U$@(;(0!XnJyT zngD@7&f1PQG`ur7(N>S+tS|>ncU-72C!D=g-OcS;-78prIhw`XVG%40aNlMcJ=8fr zCW^AbEviSAnMzIoNg)~`F||6L^O)(jf3W?yV8=v)&}ClYdxRyfU1>`*(KYzBmuExI zcUg^-MXxB|$h`bTX=Sn6pnP^p-@da!gSp37e)j!c?ZP+O?vD=7zkc4=8my<~eW07z z6&$WW$k_OfTXRcGbC#Oi7Iq;SnG?F4nI-8Ga|I%vrEkBO>@fT2k;kzPZC1pXC=1?W z%eW`Zy+brE7<_*I)rGZ}utM{9fxgU<*Q-~?N=At<1Ty=Fj`A$}|% zPyd+pu5CH}IS>L&Uer%0cOO+|lgT|qQ(D%SmqFR?p$>`6_CtNXqp4W4*;~PrS0d8y z{KX&bpN?<-?*90_MzC*u;_oimAM#~>wE;FXM3eO0oGypMXflg8EeVSg-BnQyj8inf z#WpK*a^qv1?omE@k;H>6$OytD%aCH?-Gx)?DXF1KTJ?hyoPgn*^up&9T<{T|m&PQ3N z-c;}KSYp-Fo=Cj&xr%zGnKnR7eJpaG#zo0p5NReyf@o~yUE(%j+Luc;0VhV9KM6N6 zIc1Pb*dlST&cgz%TG|^z7v63uCxcDLD`f9iH%%1PB^aX~Ep*McL=psCn#a^e&?X~+ zMW>x9e)*YIBDRMTBMmDvqba|9#XSF?ciitwf4&i(-$L>~3&}GLjSUko0-#r)%K4yb z3O_tiahz7^dvQdP*h=pCG%FN&jPplC4sY521_A%M%lNmR{(JD`H*WE7t=d2S-q%_v z{tfR>$zz>x=;2TF(=se_;f~2aDc3qpV$c^+;u5 z@MNVP3j)p|@)=pA~@G{Dz#BGQ?Oh|3OYB?qFYp-t?wsyDYM(d^4VsfvamkC5?+9YnD_}d9>^9wT2bMqniJ7bT{@ttcQK3BqG$MQTu({xN9JjN*oz0=#wLpFyrukKsW_sCE{{>nYQ0EIf!g zhA1_b>5IHO?Gb!{n^4v0X_PA$n`P%COzBk?SFQJXT#0frMy+LYf(-q7RewXVhYTs>_FDrLS)A)%E_LMSfQ)!VzJ>xVylBRih2c`iQ zrE^lovzarSR1Ui5V?WkM$g>;0^WGa^3)gHNl%@{YRgcsQ$!vr>>31$0dtub>op+iZ zXuMZu+N>R#K{?5}=nsc#1@kJq>DWMeO4Ma^u4SN2d0b2%w*P83;p-MqJzyB~C=`fzMCDtjxyu%Jx|0d~muErR!5|rI~_j4R#|(FQBSA zW0h~~WX`Abm=B+PkNvPBuxv%3dBR>V3K@SFjdoV^48lk?_2bsYFoMRDoxaaTifxUJ zfgDb$k+EtZ0BHv5*cf}G<#U5Z3@>b|$y>1mbyiNJPSUiNS})a`rR=Bl!?2HCSzQhE z7Fm;;K$AK&qy^Yed|%DS0ad$v&v}GRGq1-2@9gnoH|v`=z3Wv+kWNNDovt_Dd#c!} z-^sa|efrqPv*k73hgV5wc>L5=G*Yyq1=~BZM$#{mq|06_e^FUEAQ(i4h+TK*t10TiCd6mRqMP)FCYe>$XoJE5dEUR)+phob`|J zhx%R0CKfXx#TTl3xEFgB>7gsh-NJC6h;fBUv01%LzR|l2ZzJ%XIQ;HYlF(vDE zz)o1fVi$n(#W+;SM8AK0TDNt$p8nHnLk^VGdc#G-)Q0<04N4M( zouy-;W_)~EW}MF~d!($ai+<@Mit{eLS#mJcD|xZ_TgL3R3^nm)B!l(vP>ohdy>pbR zeH!tGp){tYj)hebE2AszH>OZgKFTuqbIzU`^GR?6(lg|+Pf)Uq?&xyk7nb-1o&6k> zjCTLNL+nGR@+4smzsL295e;LFlOdadOKR#%pM&{MS#(+z3rHE|&j@824$b-}IkkPP zc8={UtiQUIerU}YWZIv%3z$)asOB`83it)e#Fo_p_#uG3U2K}}fg7aEtVt1wr2+emFoujZ};+@ z?s7F`B0UAuUV#Q2l9Tf$E?*|vKmWD+bgX!Kuw%rr2{RN*^v@1r# z^?6M*E^k}ju>62I`%312l&*d!qar^ciMnk z#5P4!N<;jjlPic8a%i^(=7Gw&fVn+?-N<=UgrwCvQFu}lUNnzJ%?UJ*;}oHadR|Al zP}f$2RB6A?H_|Fb!DA|;qb=+7Ll6A1{(+Y`#T0@iK|i0LG%6d~_B;wh$**(HUH)j{He59cyx{Mbw^6ct?0&{Xs@vkzNazjrkG^I{$NnuOaZnqVV-O_lmuwpkArh8!d@`PK@O2l z5f1UwqNMhG$}tj0N~DJ`woD9RT3RStcnJoWN_0EMA`c7 zgh*bTm)1Cgo9vulHV6&zD((%Xf(B*{99kO+gaIbi%^q?=?0TC@tsiqTdDP}6pk+NW zp@y5;dk12x0TePtX+(gBXMObM0Jom7^jphzq&*)jSV_lWx~Wi$~H#Nd;}to4rx+?W7(5kFyj=6ddusXR6N_QYq8&<(|27cU}u z`Kh#$BxzkgTACL2u?}LF=94c-d5~xt3^C<<WYjL(WazClL-q|og8O>%9<0WVJQaPiu_6(tZR)m)6Sq(YE=yg3v$BM7tEW~M8!da z*iBbVhPU@H7M96d!Ba_h>slkUQs}+cVw`l8FNy=Pz+a1E2n554s+*TgFT3EGv+{y>Z;Cd4!Q=VZr{SQK#A#=^5fc^8F8w{ZZHk z!TIvrPhgtir5unhav*#GYQ#{h@_}lV$zS+U&{cZEC~(nz{01$;?(;<&-1NbQWr~7a z(HUhQq-Bhpb(ZKXG~C{la|P%>mmUlS9*VG23hppj#z*fFy*2%7+!lylu*j7x2LVg9 zMH8R3{Mq->xAjgudm3$XJdLF+`*0MnF^X65Ck2um8yVd+{9xfN`gcbSK|@oui`yx1 zRWci~Ej14B28i|zAy)A)Mq7IDA+E)=6;e=PPGiA2niO#(LIei)Enck=(i_M5%GbNR z_~Gz&P8j%>AMx|vdbFJ-R7VvheDOeaN~Wr6&9#d4nXzah=Bzl6)(N)GQVmN_WiRX+ z@#kXCCoy?rp&5XzwT>YJYW-0f-Re*W9(EL?Ewd_!kFMJiqk?Gfs^I#Rh=R6&@{aQL z19{YQ2jDai29yKnk7DKP)%NmbObR^ey#@u}K{-F9P?m2$oHgt&zI>=UE&D{o1!wa~(@!lrChFe8N~q){1PWO2X!$JawtA4@C1{$B z>GcYC6+xpMJf+;wAmxJM``P2~9I=%}_dm2@w_5ryw=~=Zvc4m^W|sKW8*Y^j>9;$v z3!bzbtwg>YsoH*C(>z*QThr1KYg)6@J{c*8pLCr0_bzCH{T5q`}H0`om zlyy4FG$2XbqVqx;iY;KUN3Kkt>Nwme>oeS{pWz~y39-t&W07q1YgG9tz7{E9s5e?D zozeV5p;GhRdFf!2)ksY|dAR-NMC3xb75&aQ(~G@uO4NyRDk{=d#)+#Ff4UNj;Gco* zc5H-F+~ljYuR0J^Q%}WUl@j;bTFDdC{)bmJfh|A|iyXiSNu3WHitZ+TXE{1HWt}oPO%1v6N$!>NzYUz+ZLZ9^euVpi7eH} zLBdT*jOmyvU<3H#J^zEJ-ZtKVaX>BQ22#Jyt0g2wl+!Z19(g9YY$X5odRb(se($b? zB5Mrc{>T6-*P>_PK@*-itHEob$hn;tcE@(9K;e{r3&9Spr}w5_+A^8ddg`rz3w@G? zI=si21=JQsyVIsA8`K|ZU?^Ekw|PXI@(IAMt*M%*Edkel8{`BWFc7RCEGQnY`!evY|tLfYJBKzoW|M8|(*}oYvi$XRt<<7yQXDGOb+F227Kj=v^p( zE?p-2{s)$mEXQ76JVT!+WMnCHac8D2&M>hO{L;HaKvLmH5zfd-Br)=6QoH@=Wh7*q zgYg^qd%7N_(22Z^T9m3#mODj22$EycL%d37VcFdUQlrG-Ksk96;NHF3cNOei*dX+J zEy3TrZUcmdR@Ad~KwSd%9PPRS)$GKpa%~Bt-A&d-u>>N-NNFjqi{vS74QZ*}m(tnJ zLFyy>Om8ejtqicjMZbICBa=c)XC=_Qoi4U3OOpIxuOq?&FlR+hozS%lA+f7SdtsEK0U5 zqJS1vnYAGwkgiR;N=`K#b$KU`^CdNpU2V&@ps>%@kEO+8Qvxq5=W%2*4b>`D&gOE{CVhinKw=*(5Wj8E{-k;d$JtN*Li* zt;yYOVsG4*GRN7~Fnko<;3#&*X{{ym^+b+poDX!VcKE&F#W}O|N2H_;)?Bwq0MEVm zjt!xm*o#%y2C9d9f5zM`yJeGgj8lNPI!d^EGkM9h*dOU^oK}FIo_pOS8bkSf(yz<$ zRM*qZ_3U$6O1rO%)%#sC@58)LO89b|oo3are{Cu%6m>Af1e|_GldiqYb9ZoH+U~sI z*^gbi^+z@J{eE-aw~qC{g}40U@BJ$xI)7q70c?PU>PSJvIZu)EM`>_n6y1U59zg<} zjO@4*c|UiXABGs}MesI{)1};qm~9~-En&AS$65n3?_t|=qL24rtOtFfLc{ul9-M5r zGa(^iQGW#~R8DSb8J?MFS@V7M8F9IbIIGourj1X-;SKBPBaBIZ&g1gZ6&{(6TWeRZ zWQ4sxf=9+_e@}Ztp6;1iA>f5*y1gypm8m2Xi4}V?I9|z@do6gXM3A*L*QC(=?Y1xW z5k2tv`)O9K-8QEdsB{o2`s4aAR;QwD3}q|Lm6$2j<7a7( zmm^J?NaQ!x8Y~;oImySENJB7<`}A?qSiH!s|OA)#cO~gX@f+< z{EjIxa^nrNams8$-HayQ*c%x=Ukj#l)>6G`ZItXTf0!9@JJuWS<%Qj#thRh?S6Zw@ zyln@(^RB!)f>USW-$k`49}oE2S`zy2czcg~4P>R9cIqrr8zJaezLWRKKJ;Hr+R?H( z%XjYQYW`=38rN*NQ3F!`yROpRkP}kCEhprQ(II9A{uLI>V7)~dq5e!OqImVrp9kEp z;-{_mGPx38Z7#Y#EnpFRY+Y1viL#fKEXz1Kj1$7Z0M@?zUaE^-u6L4g>S6mDaxHx6 zT`E~&-hA1%>y2YeCVfrLLz&%`K3)(ngqhhbcg5fQ>;?DM$2+Vsf>yAwQO{vmq4$fU z3`l=oTS*~6q3LLhnr2vkz`+vo|3SCNcx*>1Qre0m4Fzk~1Z#b)4i2OgO5 z4erIpqPEnxhZ_JED_I(5TeUc<_Sa7 zzSOjKN@O%c3^q-0W*t|G5Hp`pir-ZJT!Ax2Luwmit8|9gE1Tj1`#wVDw-%cr&=Q+o z4#^&6F)4jH>--Uj17yBv@dJN_ieQY30jG2FnYsWiSM-^&OGXxn8Bk4=-kESIXyAk{ zb5i00mgIYS=4?4Q@qXl_{X|G?$FjBOT|v8K z4Xgc#IxH2^Dzl%X#zB*g?FPqy>lz<352cfZ3!+`%({yWEGbNT$J!cPBplCl{ zlrtuXd{5SUgCqg?;5PVd9en#^eez1oC#1u)E&g5%4B3)3=5y)g=#{#houpBz4z!U~ zD#86;ODoh>mfCg}s&$f$4VVwt7ZZ)i<2mzd8PO;`0PVD+QheHA>!t>#tThNvwvDf3 z2*3@QdlH5iJ2)!E1~DmDpQBQVX4*uk3(9GIT!fuG-{quwhy3vwMaZ#s zi<0@Q?(y=*gF$3m3J9z7hSgbYHqf1V2@u{-HKex)y6+c(uJ-mBufLb|IvB97GmSI%qaSw*1oWC)QO&@n~)>p z_RM%@+1Lhe%cr})@SNBg;F`8~EU`1Ko*E4Q0IB}zAbA#9a#)@*o0bO(zcPaF6X^;# zdmLqycm1iuo7Q@Moi_D;pTWcO8xfc3RURLQ0apME&qcql06+?9QjM>+f0@co#91w9 z0^*s|+G4lZh|jbf7G`xKG@af}tvF}dBdv~)&rfMs@4U)FTzY%8Kn8FDhFG+Et8g!6 z!Xis=8G9~_5AcNJw6I!;4c0V`pxCT^6aE|7SgJpVjr>ufABDOOZktlX<;^3)b z?O&K{?F)yGYV$iXhs+%xJ$iw=N(4vY>moNl6XT#---$-oZA6?RPHgd!Bh7Yu(kWmf z-0v2|%df)m)`{+w)Ve!&O>_@kl#~6opxZxC?k5s8i?qQrhLUeI9UM$T!03teyR)Z` z5))BpwG~g9NIO0;FHRyT#I&(F1Zb+-3hf3M2U#jH9bY#}4$eR4$i{o(r?wZeH-i@N z9I%x|1Pb$hwf!o^DLd+uy^`FS#V*0*9<+Gd8R2_yZEq9H_Hf8s2s_gvGsfl4b zgng{|=z6YvM(&_ADfE!1uD4(_fBD%$58&Gjsc9p~DZ03vjpreJq_!mBPgb*Ml~8itV|q?fO<*(e3!p4`{u zt}%FH-Lq2l#6vXj(F5v}sPrT!h%Ur{gVhN4;%Gw9#CW!u+%Ehf)ct}V{_F>bZg*YT z*SkP|Z^vS*_x&ZJO2skJ;LjmiZg&W*tOj$ISP^6647$`2S{8A3{R<1(q|J;u_l!A) zJvCWWu>A(zlIB3f`t)|zGTs3RG*Fke+PLdGoGz*G+%#f{aT-@mo{fnmN=DXCTfg1& zW$zP>l2g*p?y|F;5QNuq^r)o?n1DG}a_%+_sSNJI2jmFjF@g?zV2oXljWve!fbttT zAo{cgLBVTFa*R+Poh&-vFV9{$oX2MsCkbmd5PL;~5@s|BpXEam3D!LZQREGwsDTGN zT`mvo(G-1G(^C1;s~3+R6~z@Lnu%)Z*xxbb5#u^If0P$=Qx$krz&PodqqkRzDxITW zqWLK!_mU`%Q;xUcmrCSm?$J4_-(@~&XzXAA?bVH60YSe>TVbEv8-tiCOAX1qQZr>Y zx&gL9)&fIAy(4A)pn^>ZDUuP-nrX6U=tro)Fq)6Gqaq?goHrflP`N(nfpBL^Z~+Ku zxFXGk0%DvoTbPdroQLy}zp!*4qmpUOi<$4Vyhsszof9K4-R{H^d@N26dag0tm6|VO zZR`${-=hEasIB?e9(gQo{tZp^#z4)?NY_Pqmz0hLKhcd+_atk-r#Wg6ocz_v79JAD z^x|l__{V-#F#Fb^5Q9Lxi^kL9qLZ=B4 zJ^BHw*C(Z88)lqEPhUFRpfs+mEbD_)0W0OMrAH5qkqOG zm#q#LT(-mL>DM_ro%uB|-+sahwdtsSR3aC!d+r3P=gE-RQ?l^c{)W&rBIdqb|7wL^ zn7t9a?)o`lL0BN z&*o@hO#pL^-{eW(Vyr#t0C4V{Q|k5`ilu4uy!JnL@pVAn)r(7?Z53jQ;s#&BD+|E6 zF6DYZ*IqQ$@JEb|Ji-bFqRv>O$I<#F5s8d5)kLpZ%|-W3KFWX-Es?@S#{-`1xd9i zua6c>>gO(5qSQML9xi05%MSW_IX!i&?!W$44XZHK{7%sN zy1hpI#&EGMe}%kA%;kKC@mR%VPwSNv&819SJCE*4K~aOuIGK@P+%88Cr1VB>i>*cS zBA77Lc>4`FJH=Z2@&ujBB?LR973Ln*E;_ZoyT+$2oNCiJTGD{80kuhlH(`Co1B6OP zceG;paz6mR^9*l#M`@QZtP<>;6Q%gT4E5UaiW5&*}(X=@nDCW%HsAFxtW*xZE zlbf$?j5;W!xRQLM8Eo_$l=<#L!M0BbE?N-L$-R5(^YG>%qvXIR-c4?+OC#b}SQd#& zyt^ZJIn4`pcE^C4n9J1VFCMuC0}4@UBT*=Y7}iFgff}t9D)6Y3aS<^AJ{4$|9LeTF z;VFy>$~^)bMksdY1eIo!gsg#!0?>A*aBSW> zvY%waZ(44f z<6B0dE-&vW`1n>`Z8j8dewJsE;D{C%>ATXt^c?-J*eI>YC{sGn($5+)5+x-r(=2W( zbxTTR+P1c}eI*_iNxgKGtaX*NiVG)3P8v`H$oolKmDs8Zx^Xd_pB7rWeh^&beyyo- zw63+)jN|r!GgA1K!<%B%QO@4doeyatu(uV`*6A&%<6l@h@$5?KMOkij>*4l4UwcrN zGzh0j}GV2Bh9(7upkwCKXB(W=>gu%VxtIvPNrj6e4>v2rAzBH+)^Kz6Ow zp}hA;z?SbmwSu~aU;mc&h2_594G78F@WjhNO9`bl0x`;UHBJ2`?JVyF%K{Jgr5>$ zuwYhh1UEHg+|ImJ*Uu~9>`N0aC4c?j?qF&>2c3df1N*P%IbP-Ozu;Jtl;)QfrbPM# z!OD)Mve6t4#SjCc$LO~LNJEbcYYRIRVnn1`jpOc96doc3V44ICT79bxC|4-L)o@rY zh|NUf!E@u%sTtj$-}g24DRZJs1$#IXcMLDq-JqZ2HHCSL2u96L+?3`f%G?~zxSNx@ zZ&Umste%PF#U7+4*ZIbW#Xf`!M^HowEjRaL;Q-3_y97b;q2xLRj`b9`(NA(h-2wLP zt)(6ZNhN&|r4HZ@x8M(LT^Fto+DW%tG{}$p;f*K>tXhwu z($Xb{UUVl=G6p0t#g~TJ`VGS>cw;yNz z{L+|z_e4}@1^nd(tE@j^*uKxjdQ2|{R$%5$UVmZ3!w0xun$aAZ`DWtTvgJTgh896^ z=jq)!Z2?fXU1;F-H`y;??|*JXjTI*bf~#TChPHwDkfFY!k)h+N*9M>gXYF|RISr3f zcYD$ZN;is9?A_uCSDxHS>bv5D6lS$Oe$mc2fw?m+lhP9t4NIA2)J;Jz{f6pZ0iz2^ z&u83tkpg;6{WlVEj=)+Ir5rD7s+MR+WDRPwkGyCzzBkXp7>YcB6RM!44Ok5C%~}zd z6OV<9=RLzrtN5N^JoZ&pG_-CsB$w-Dj0Q%#jri)SPC@Uf+UK&PEY@-CQB3)e`2W_(@3*%49|fE-z^s+%KDqxL>~aJa4^9 zT(wG;RzmlBSfP#=ovwV6U>K}*(MMI_DG9S!d)8J=D7o7@$WIODVd4OBtB!+}fl!J#*G#B_fn3S4`Vr|0IX`I=jXe@$_|! zXYq+xQ^OO^MFVpI>r^wYsLn-6Gqxmx3&q|uUcXe7OFuu1%h(!aRN-c7s8o>$wAK2F z7a*KPLNC^A`Y3#t{9>kzM7B?O?`R{XG?J;M$2x*BshjdqG$|eL&4w!;Jq5UPJQnPp zh-<$9KSk3ePj~TEJA!65=2&T=L@@h?KhWt0j(W^?xUSWU_Gwa>GbNX&)BaIn!)$O; zXmiN9djfh6cKth!RSH!~i_-74&IxfibOM{gfq{$4CXdUDk+- za}q~DkmT75_HR|eX-u4__MJ)8Ujq><5eB6`9*6Wyi7cvta_k5>*K%Ugim)@L8`8?eECFvC6r*hWYox z1%jZ8CXJ&)W;di;m`E(-klXut@Ao7et~J*GVnIpyl7osv_E?TzrlZIy_E?N$o1-vu zakR}o2KdXzQFjZjk=idK%{U7EBtr9C)|91T@Lt89yJT{nP3E1qSfF(#2(lG=vl!I( ztgt>cTKh6=p9*0LZxy1(flS1&3m{BarWicZQa*_;yM?qDA4;s7glmR`s1*4Nvbmxl zEty+%xyvshTQ8Di6n}}xY}qpy7*9g#m$>*qZgqq8${Rn}9i_FiKtyZyH`mC;3&BsQ zq2N~x-ulLgJvO&4;82pXYPLNkr7k+t?bnpGd?jp2CiQ2UBuHSfS{@=>KLkFkk1+-V8cHu`HjQ~QWFeVff$ zIUL`Pr5y>ytP477i%<&V=ptCZvdL*6 z$T89*vQsNa4c7{zKUKKhzm5fE`)YFc{xAy zTz)v_JBy_QvI{r8{ML&6lKr^m3|t_0#Cbouuog=e#(K zf*iS){LSqknwlQ1q9Sl6;`}IemDyaPg%|>SzopFyOD8nq>-aYPh*i^~KT(8N;yz7J zi?Y+eUHb>6`4A%LP*Q2ty?vBaXqt*Z`YQ2OG(Leg3L(6S;G74s;>~O2+3kIw>Qgn@ z^9;BWI*7I+4`8?!fu#G(IZ+Z*)>BJ%S-DtcpeVAwdFy}5J^R3QSGOEca28tCp#oe6 zN7lxWato(?Ng_z{p~-lKGRQ=GqLWX<|wn*o`#1uZXYMBHbW0>A@lVU z58Ho$O`9_mvb?pM4MrjyS{AP)2zSzjlvL*3v3gAMAgSB5X3K%v*jXyEPc`uCQT# zbN5hwJ?vDBwm1!C)kb?rYGR*=(dMJE5rFfl2r;i>$puSy9ZQ6-1EQz0d<3!j;wv;2e>1wpp1pp6Ri_)H0 z0{$s$Jg4G7HNI{@yk%sm#m~bha2oTT*d%pvSwUlFz=4nV!;CJ7GwRh4kAZL$O0X#p zf34&01O9%c(ot87;V!F$4E44*p8h$O@1`g?ie2oCK?luSL{ka*OP5<{w8Ptu`;+?a z4+s4>^};Mx@=uel1(o~TBrCruvgMvB3K7~F$X@S1a3$&d_8Ie0H-M+3m@h^c~d z2gJ?S$)ky&At8JE&D73qg&0}oJ4zs|1D6) zj-2VNL3)jf_HczPjVanCS@hTx%ifl(5OGR;Egp6)U&^e2-@sJLR3&4?r@!}|M#NkE z%bIr9CAI-$uOb0x&vm~uMqI&s!Gnh(P{&0zVVOCUeAt70?9l1{+2$Ad?FRiesLk?G zWcZ;*Iw~AUPxEVQah?v;`ogkk&=rR`$Ao?{6#o^2W(s>%=X|WTGA%Kr$icDKJ+uM{ zlOcp<$II6Z7^Cmz$b{!kN2nOX#M1;U#GkO~zq;EL0Pk>9w{^=g%E0u>y}C=;DPom0 zs<`$vbRtu&ue4Z7Ki9BsID*40wkF>FGu8Ns4(?j*n*i@t=@^NUi)+M{r*~J0mw*ov zlaOcp%aM|$xki1(r1{5qvV|}gX}=phnMw>obw-|FwL&oaerl;jlrJpC6Y_Lj6tf+` z%5s?y* zCLjS~q9DCVS6V~}NC}Y=Iz+mFfOP335s)T{LWmIJx%cxvbKco=p8d{w-u=#+v*+x8 zm`P^t355IiyMNbpeZQaY(G+oWR5|ynIJUh7X;`&4Hu#@+(0}{E{l9g=KRSi|8zNwXYxOJ`M=~TY;7gpwN9gZB>^Q0S3EYLrSA3llCVs4Vaj0_t9FmslA*)ko%mZiL z`->+S-Rn-O_X-}P>M<1c0-<%sH^+ll50bP2R%I0xK{njMk~Ih$JAlT9_`O#(J`k8Pw}<(qidW@s$4d;O=HTPoI0o#Az|}Sb)_GXd_#)@bKMsTxOsMk zvG~>8&(NrD%Xeno&l7Uk*%1t^u|d)P=dwnhvWNNX8FCp#1+%j~YJ&vxp zx~ur-RA?mF&)~3^A>E#{-p|bD<1$m}Hyvb=1q`3sn!@~Y62vy@#&&fl*ftHm`C|sEH_p1lN}BCvlFm2N0~D|x&nM!Z`7PJYcQz{=SxH- zy0Udj!_8=FL=?Z{W}~AaU3`+ROZla?ZuV=#lDd$e-u%&H^{t7S{dow)Ff_>X5OZN9 zSm9C6s8#u%&X95zWFE+oeG;K{R*@rlc&gUY3Tx2uKy^#%&9Rxgth8p|Rg|pJoGdQV z2QGH(;DgXRDbiJ=-WJnbZ?~RQU6itGAl)^7k*2Z>PN@&4-hYX>~0JRfE!V{W~ zhhN#Yx+5w+V|1nGQCN`t2|c&z;|N>9A>XemF$Sxp4BTE7PW0jEf?@XKf!wsvw;|ip zP9}`Gn`$zKtae*UF^1<``s1cElC#Q(iutPA#(g5wc5fYf!UOQY_W@-LBXNq|tiE?> zP>LN%BMEu`$HA$P-Wj-xUob_{Zu}L+D^8(Wv3+3}%jCS`wD{>m-5$PoYbJ*H!DoX+9dcItD z)QH3TE$l5|iO3z5pyS7MN7)Xu`{-aN#f_68vYmyagaBvmcKnrvy2Z)mcF{CQY} zC=*SrTYJ6fdKn&``NffnE#J%&j!h``i3nX|;IJ#DmB)tQ1)Yb|Ee^p7Ica}lX|iJc zJu2a7IQH1FsU9W+o3o>;^1$#=8HGZj8&+s0;|au0X$cSipoX*_ieN_P4kKzj1+6A) zpWDS!v;oN@NN~SUu~+XG9JsGx9HSdd;T$IUw~&EQgt7{@eBorhTj-jXL?q9xyLll^ zjWdFu>LaDg61^9F)naVKtFuX4KU(Yvo+kom79vhTDAvPqx>hN9Q+8ekRt5yUoKOOK^t0|F{*<+9wbyd`> z+|H!{s;-xC#WKJU%v3=`3|O|ek`Lqex0B{V({}7lD~e0)9@-Bmhf4R%M|x<qfGLQVrBJpd*?_;d&KQyV^gLkrn0@^>d@NbP}0gd zm?X961VwjVz3%wkT9l0eqF$N_kwMl@eE?N z%*lE4D5XH7;mp?GS6`IIAZ!#Jv_iTk8iJI6J%K3Amr8RbfVBt5K9l&!l<-UCl z6B)@^UgE@~aSS^j&Fz?(E=U7Y>{iG6*;%&qw3;bq@9=XPJ*e8IXg}OzyBjUzH3(iB z#A5Q`x{BSbA4XTjEi#N0tzK}YW%@xVtBQUGb6a0pPr8xZ!#<^w^FzvZ?b4OLz7MfE zKTl1k`UtoPvAeRyM^}x-yt}1PhL+N7<(?19%82r>$s5!hu=@&d4GY_E770?AVFuUL zU3qHasx)G+%-k6+86@(&E%;KqRW_Hg3dK|~dvsn?{vdy+)9T#3uhn>1Jr3)qh&zI( zWq{nkdkcDiN13f&a(AE<=5?D^A)0#dKIDA6j$}+8IPEmLDElNosIoi?8_Lcq-Zedn z6OMLtl3#4qjfmW`-3;rD%-Nj`*gm2+TkVV!?gX>AS(htqlez(vTY#^K7Z*m6|C;|elsy3+ z8F}U_7V0MPvebKAzr<0kf%nL{f$X$=!;c?acoR63h8yTVzuO$ip4h$W;bKjBnW~~% zb&xPwkRv9fIa+;pbD}hx|69K*ktA&(Gf}Yonph2;|7wHRaPOvIPW8!0c?wI4)b(#TKaJWVhSM>bsbD}O~Cu2 z;!$TBb{!9NPj2;~E-<(@83JkDA{>(*&B`Wdhk>)T+!2L^wNck^?5A8=-@O_Mwm8=V z3qHT@5GP2HkdP^Jizg-{EKEytRmng69n9Ddoa8lRTP<++D{tyn`e#cU>DezFhzdyR z=1P%=qpvB4JcNt>>Y;nfHU{)CM^SrBh9m+KwY}EhYckAsl44Y$ZQKF7f!6wtXk+#b zZO+)e8{?0T6@vQzd0XLXQ&afoC?*N!b=_-5!NFIRRJaqqO5V4DIyG&y|VVyVfC;54yjzMgya{^#PbA+$J;wA2n-{Jg|On?+)TK7>+F;F;Y8 zERts~w9&dKB|V}z!!(d5GP;wWRzm!FDhB_nE)N;ov&=LtG2_>M`l_~nF-4ZhTThgi zINIyApyk_z3odlqe&3{OJ7cnPKDyvv1l0UIB{8(ts~aXatI-prpb_`5THQTy_@R>s zdzw5M zh2<-a);gr{6V~z!Y$`kiY(<$|vUSC}2vgy;6DfeD)xy|%x}!iZ;Uod%4KNK*{D=#5 z|G!PpHyg@nyT?j!Q(7Tel*kvqFY5~tR_S-#=sDIzPcW|7dw;wkT$IipkNIjnT;9d` zsStc;N}(F_Amq5pPknNEmHzXT(#S(NG1dnd3i$d28RD->PrsU6(d&E97;S zv}~zU9!s5w@pJ@DaOGSDm?Iq64x+u{M$#I0Vr=23(oxjk+R{d@gS7{0hecME55obf9 zEgFetHu17<#b}kC@^xfSJ z$%EU(oGY0XFRTmI1aX(vz@#-(*`>6JAO$F4VtFFjv8 z7*qQIy(xPw=kyjV#!#}v7_TRiEInD1Tesn3=kE-n^OTrTYyo@0Z?9q$=bPLPK+%2Ti`whH|4JpKX`ZCQ5H4%qsSdsVjF++`I8!R;j`#!eOUN0(gAPIuW- z+TvtAnjK$U>a03!^9!^f;3GP=Za{SLU?Xtq!W{x;jrl+7>rVO5dV@m*w( z4`Uc#Z+_AsN^P7Db>)MrchI0!u&Pyql-0EJ(3MmEbR{C-$pd%uiJTdiuW9hb3%e>5 zEMJM@qol>RgF~@ff%;)@9P|lQ6@Ky$=&8~_PeEt_ak;?h9>e29toz|H9i$~MC&F7~ zB&ROR6Vt6L%s-S>n@L41%Wm6jw@!0r- z)1IiUHEc&S9Q--kz3HYm#)1H%;q8%++0 zA|MiwyZ*w%*uEX5+)W~HRc5^z=Ex;NiPAFZ&niZ(3yqbmEDE(WoeeA=`EGy!l1%M6 zKoSwNtWIMl?Xhj?X*AD*yj-7JA;yZ%n%LQV{3;hf7tmQ~&qF1=ZXi!5A1+HR{r1ci znyan%l93w*0HNGFL9$)LG##1YpqCOF>{k5S_q9~slYP*}3S8ab?A8}CEV`E{+8{(h zh1DVY7=t-@iI1P72ImH;J0ziVZ?X2l!6MQh3NP@-TccmxFp<&J&~?5&*)_EQ!S6Phz#-;m*81#QLm;cEo%|ChhzhaN)KU~H#$kpd7Y>eOGswb#U z6>mI8J1a@_l&@gIo`b%Yb5+O|~#)IX^_$*)6JWor_QLv5^{F=Wls4^{k?a$>ian z^wq`todWWrw}t@MW)c2e=XF{z_54Wfl!E(fRykV>7{QKY z0b4iyn}8U}isQvGyDyWaj}4c#kHUSFqFTZI?1omot0zVBe)|ERWF1eE=xV?N zX@<7JzFR^RjRkRZa??mI6xVl2?94RvZ6bTpj_$3JWx%)Lx~oR~V%L)!!4XBH#Tm8< zE*Dp>43^K)Al;8LHaAOs#H1W7sXos-Fa^#8kH;+qjdiY{(^Sr8J*@C}K3EG@F1+w5 zqOOSNCJI*}&`0!f_lZp9g;U@oZBkZF?bQcqJai3O4@s0JHnw9$ULROZ>z6f4aAjr4 zGd>^$DQP|VV{tALfKZq8r|UBmcWw_up2E5p>lbod=(y7TQ6WLEg$;kbIwBYr;p^Y(oybO9$w!3x(q)SrV zY-!yR*CH>U)&{@6$}VyXI7uhb;wahyztLJ1W1H|~GwgYo!Z4A$NNC2LthSOY->Kug zb*RUMqqsY;{)*&W*pzE6J>s_8t<*19Uhb$|;1CbF%BYp}8s5q1Xuzw_&NB?FE~wdY z*kE@mBl)tdN~<1%=d_b}Ms}vb4};%q4v9S07PxY}KFl0Nvh+_G-iJ@mHRT32MTIhUBmKD(@pz#+B)Y z4nFIt5Ip<*7!PK&?aiG1Sg=P4WO3{`Df~d^#p}AnaC|6BW_1QU(VJ^rJ$t7CjA@0B z0rN7qfV7{dghAdb&+=AMIzjZ)Ga#=qJ}3ZDf~%F$-0k1a?!Q#Svu{%KY({E2&Sn#< zz`~EF3?n0v#ZF+gmfFtt@$&Y`wLfzpLT4u+I!F9&mDT{L03&H^Y$DY#J<-_s$hT?O zba+?B@Q?q9y+x?l0}A*#;BE;7a9zcr!-`KqJP2LJAhH453qhsK@BzJDx^9s=Wv^>2 zartU0Gg1_~e1*)pJm<0kGjquiGPybIJb6EL;r3+1un@b#x1Esy_Rnt_Q>!d{*D)-) z%A?J$@k-xD2)a3OGn5un4`&0-`B1WPU;%kLFPY$&Z&7YqaCy&|;`&hy^p*}G6!G*} z6P+?+VWeluF9O$$olFwLA32~tzc7?u3k`f(USDCFqr)m-nteyjyTz``5e=RMNCS^C zz`%6cMdGBG?osmzDAVc=ch8VZ2&rj=DSQJBMH%i<7iGOq5ls-Ex*W@Tx@Y-UAcG0T z?IY-PWHnYPnRrt?%hFK~74GGIs0}|vxuypxh+XfSiP5_>ru?Bb`;4Zi)~JX;BsMm zT41ik51W>;7qY!)EMAlCLIv}xOoPp<1d+cY0PO;Yt~0QcF4WW7j@9VKCxt){J0QN3 zBbqpys&^SN285n7kxL-7mjtXJO=uw3!q--WwIkCw3)!tkN@L%W5A#BnZ;kjtCG+k_ zJ*sWOP2rI7?}KPq_Ts!ihWqo4X1ZMP9Zwyx{?9Kx9`vv#b&>8@_AqGxE4!W~Wxf7v zb80QMbNh3$kIl)g#BT-Xk}}^nw@DIfc!q)|-q$TwB`SAHj*{o}R1`iuYzAf#-FaA1 z>W3ySeL!uDVGFNuanQHU`ttE8fO?8{jw0H%!mOtUze(#W9#};sf^ZxCs07zbq1dx3 zkIR6zS${O?#XTGu6{Yqv+OK)KK~}t_vm?b=Eq@C?7bY#dn=*q)diw274^z&@3;IlA z*SeEc{<=V)lh|STlj3A!O($Wm`YMAuW z>K`X1IQ+cgI}o|P{hVjdyZSGv-$Ip$EBv%!*YS2QB&EqVPn2o1^L*@rt4-UqJP=+P z%KFEgHZ9C(=4wmSKW9+9BedPQ4Eyl~> z0SR!kXWg`g7Zgu$a<^x*6aG43XZBp;FeOCE{*Eiv|D1G%ltrK0n(Z^<7GdM2KWAQY z7C{`=Ty*1D6*2wu6gU1pHrj>rB%7fF5Vmm0M1~BUb0V#0jAeV}w@xk}5GUgj+#ZnW zmSzle9qm1%d!1P>^zh)$yZXr7$M$H*Q6ck8owEx#AXt1Rtt{N>dhd^1<~2=!!O><& zLakPg8F)+6XHL(~>e@R`m=9|Y6NEV_x%j-KzEz68UACo>v8nPywAnI|aeffC5wEo9 z+oK!S#V?l|UsXLT5JQyvmTH!NANIj93%Q*Qhov~~gST1n$8WysE zUoDG}>>W!1W^i|qNseK$3=Y~cgEt_hU5D&zEqbmYMV7$@?41!AbSE0LW;^24B%N*k z$XBCCq#idVIpsB;_x1cv!*SIQ-4~ZpgH+(;^kPFq*fWIu!$s%VP~ety#Ywht?yOS7 zmfWNQ#xbtG>lo=Pb1`{wN#TAmlgYQz-S3_3_mmNrC`nhUlExm6?L27XLya?*v5;d8 zIgH^kvqq0wt;?*ky+V!@_CR?vllLgTlkEoiCluD}DJ0>(T5x(FOG^IZi2`xyHf zTK#~Y`m`!Gnq#wwjf{*_OXGr7S!9A~edHdiDbiaqHOVWo%DJ)z;%b~S2I-vN7dR=v2U_?-%OqRp4@PZG< zr=h~~VV+fmWx?feQ)x!}=6MQK+v%a0;nj%H3|+vOAuRve*3kA;mGl{h+rM!{ot53c zAYG}NY3ozKWoD3F5+BdzO^aO=jW3ug6wtxJXxaShV5fe#$v3 za2v!q%w`757%zAFn{9bEeT(yx%c4VVBN$3-$2}dqx|8}qIGiZ01t56y6W2QOj6(bl z8&BBBj||QKss#IA)*|BQ$Q9)5+884>f<X%YCz<|$Njz;9F`vjF&xi3JXQDREAx8<j8z{zQ*O;b-~OHW(vw?6o{XMB zz44h@mLMPWXP5R)Znb6!j^-<%%Kk`iz^WIA3lBpa{!AAens71_l=B|FZF5z&X6t>7 zWqwjd!6kQ!k+Fi(0d&sWhTN1&XD6j_x^mKF`(3yxadE%5bk^m&0-WxUw2R))m!bad zQyB5-ko@7c^IttEsvX)W>$ zPsBzIQS7T#EHH+jnp^aZ03rEJm+i^btPb`oCoe(JfO)Qg6|%W#8t4?_cV9=fjqbfT zRJ|miZKVj^ob=OGDTB6ViD=T|2*`6zwA8O8`^JO-1wRF~bmE|V!w>s~`Ky$k3(p$j zj(<8O^#&t=>hG(8(xQqF5w$;)to%d@d;Z%t1+yew= z_Qu}-@Y}4}?V^AdzDDgy;T2lpE4naEg`}9Kr%F@wMf-^IA879G(Z$K-1mU9UdGIE+ zQ-QKvTsFvCLiBT)g-m=^HDiJKESMKj=P5O4eB<$@nXw<`ytE{ir=F_H)g^p|_rAqX z7WrBjz?|x3Q_MVeNQwQX`8G;C?v4d-2xLlrfyajp5j!p_o*gb+(U&IKyRmp9mptm) z%Y`xg{q-7HxNrj}B{Nh_7Vwa%nCSXgB+{V7|G{a~pkVWxjMYYR?q*nY=nq}1)s+jd zGO!IUzt@HTBkqS>apnjlTYNk( z>kJ4Az}3}jy@=R&Q8tj<3X20=jf`1|$JfI}DZZrNia2Py6m}!>{;c{g@-+>jPsYdV z>JW4=COhSsxBrGEx7IGKa&(3sYShi1#{6;}Z!=mu z^+wCEC{-|3q=QASQd7gY&=L2zG~B~vNF^FsJ{Xv)P;NnNrQ!WcgDUYEx)6*{7 ze+7I8#1bYM`(%GHp_o3Bo4$2aF90V0QmL{LbNgmUIsb_rS(b{T`BFBhe&n&;Td&N* zis?GDx?&hwla=7SAs_{2(I;r(Ad39-VT5>Q=>E!!<{6VB*ncTrY=m!cvF7Xt@f+ zbx(GW#)w3OtZBo-r>bmUuTkM!77tHkT!diAoDFN5iXLh4kx{h5|!36I^W8z*&id2+qUNhRIx_!7*@^dxs}Vjs`H zou{5pc|@{1DF$wApc_1IkGSHa$Lq>84|7Pt#_eI?W^ZVEtQH6I3PU;ojMi#mV&=Pf zJ#DDntFQS%BZ})D%!=78PFUN%atgYhQB_3vHeVy}zU9WKx}?!|GpN^$S)euR6ZSbSu%PeI74%JRzwia(WtyefO@}4{@$NEKcmUDZH>>N?e2hn#@;= zkfg?xlGm8g|2q@(FFUXPn>6?DV)^H(Be2&EMPl06H|@j=K;!9j?gZ%bJ<5L-z5Tz; zA5NR<6rr7Sq+Cx+!KIz1fov&7FJEmH@lL{>D_~ywofN=ukP?)BfMv7aKD4#mYRqG+ zp_FXp{mB=!c@%v`ZK)k?!1td(sE)P>fmT(tnyq!kQ0d*x%2bYE^W45O>MdE~GtzSh z`YY#YI^7_4x<)BY=N*EVyb%Q#d$o{n!rtA<@o|5Ql@_4i04;6yb(Xv}j(N~9qP{YOx=sh->~>{W6)$Xx=uU_Fne~9!+BET1u7?pwXWg`0v1^)ypch)kR8`r?4}+R0&yPw&D+Ku!B&;*xKVk}KqsZ>M6wg_W(^WeC(@;tt7J0p}QLnN|-^ z`g295af!EPX(#-JQ%%f+ZOyKSQXVgmJ4bb0lO5WjvS4ODFe+zcA}Q3zn9tbedVYqF zI_NIwp5mwAE>!Kt&LK&0?yGbIh!^JCkLN(hzW^bZyPk!AOjn75it0VUp`-WBe z97d#3C8IE^0p~~FEV;I~#uVi;b3gs{&qD4BnZUsDvd`2n`%O#5`&yoMW(r+XUB|e~ zmbi$F1}&=?JCCykr7QB{f?)wRT;C_bC;5oej1gC|!`@tU59${LFU*i&8wXTMd?Zs` z4HR*45?_x|yY49e$d`ZbD``dYWnfNVpFcJ|KHct;t?|WJi3=PSE~92Nczcp~ z*l*V#eCM+|o$aoq>Rj1$!`mVY=tD=&@*)EXbU+&v1wwQ`r*o1O5=hAC zBd=c3_^=4kxONNTUTW^L7{waI2LRgHzAjHfW^{wk^%hFH;wXBBp^u3IlGAd#`xr-n zvLF$=bT{uJF(=a%Sz>);*{7TCVDetjb95 z5fcr0%j6c@ncDZjUGLec=qt+B$;22#oo$H3#~*pcAfcdnop+#f2w5k%%s39oLBBoK zc|KnrY(aYpARcd^4MS_3Xv6)sk6IrkltJvnTVrcIBx=i)oo<9bD(xN4xfaz?uEsZ9 z^%;WR0FJL-y|6e#*61GnnG{`58U7@AqXHd{6^fYtXRWU(vqH|?4jjN|fV#4~dj#|7se;ic+9o{@I0R}S}5 zayv?=^GqK3Y=708N6Um3%h*7>Fmade^yFPnOH}J%zrm>xQ{uz;9ao=ZJJo>U@yLQ|hpsKoL<_aVlx5PT@J*-;Ue7AEN49-#Hsn?*np05jw{-fH*+$VB0yo zDj_4JfQyih?B&;L*Mlu*+#7Ij^DSq*-cE$T4t|>mNfN+4*53`;mWAc4{#n~~{@|NL zjH0_S_m6@f0efoxnBB1ZjmBRGMGZaz=)fO?z-9?e1<3kQj}TMU@$nNhaLn>78vEu9+{t~(p?}wPu=AQ zofwuO!cfTf-vLi-ZKM0oQx(~1g?K;EdO2e1qVOfD4IkD|RPSKi>zk+KCGb%;WKBFk&3;S1)^oR_ z-Rq*~sJ&d0Jle~SBdH+#aeGO_wHIpQu3V1rhLZDdj01yB9^1vW3pSUiRwRAcs&0GM zj8OfqAT#Rgq6rsqHg;OEewKq%VHxZqT+{S14lTFzFO@b`MROI>n2!18;1VZK9ss>a zp_3qq))_rE;N<^qS(zfA@t%z0hC9?zga?vwteQ`~f`iJT^Rr26LXSDn$7%~-sM--G zpFi*`2uPmqkz0iYCT~m1w3zCgN$NHD3Uc^Bh|iG;VK8ZjY~S+|)L6?zpO^FurGVmX zRK~bvV9{U}5{n)(d))!SR$>f3lRnjbOR>a`_B_V18O|zw&pLdw@<68fyTR-aE<$;~ z+592Z?Iha|4{+(Z5CekK8_Au&&=qFj3M+!x_JCC&a|fIjw|sgWC*-U{jIG5OVii*r z#*aoGWw<^lHe(^XOBu}33+79c~l9`@|1q>8TUDU%#12JC6%{cjA((LmaC zPea|#sFOR(q)M+vp;JD49L#m+(^QT^HJJtw{!Z8v|IpKZLM})**D<#AirZwvkc~g5 zf`8-V`0;2Y?)+!|g1xRCJtIp*ccc5$4=%hm;aSk{>n{pyFIY8o?08N~FG(K1Jg&`X zFvVY_)t~7Rz1{B0HI6>0RyWDJKP+s<{(i&m(`WljXT2^sjm@2SW;sV#SO&V<>6q0=3xEK|M^Uha5$|Cyaq|v#kIonNN}i9X_<7=IpO-Z^vJk7(^O54Iy2tLb!xT zJ2{K@N=OBEe1#^to`R(zslT6OHKcJF2D8=slEnx;W`3{~;iYWMZ0wHzej9VVvn4pZ zTD4-Qy0kHy7vlM(ON!HA`jF0Q(80z=$g_`;nob2jY4<8E7BGKS(QQ1~*PZ`N%dy>W z=)mxEr}VvR%~%fFawluIeK63H($mhgbLs)s zab`9)u5k@j{~0=k>I)s(pEa4y1&eZJR4;2fS-sO`HMSZc@kz)o+zj!NMvn~redR2|x{2oYd6a*YRZxBHSnd~`S32x-6wQ?2Vpi6gSi9J)wO zKk!?Y+GrdnfQ1zeYZU`nr>Bc@^0G%T9c!Pdl>LeF9fIec#A4}@7O3t0(VePO-*zNx zv(0>6(8e#4Ogn!pwvWn^g0COW(aoy5%7ra1 zC+(^?#=IZp-ZrQ%JIO8|{*alID6_oRhOby(B|D6;4Dh8?){WkQzfIy03=J~1-Xv5U zD=t>J5ewG%B2A5gp&@CX(zrx96=UgtEVHKlncuhl+NZqxEiKRYIDmDSc*9NWBZ+dR zKl{u~`Puj*)SR77zA3H+pZIQ+8fX$&+rPv{eT3UZQ}N)1;(e=)w}YC#4&aPG(ZE>xM(ByF0K_4wh^lz?tO#ctqz4q)O! zGr$Rp^&KVWrL31DzQHg1nfs{M-F9!}Jxqr@I6V@xkhc~>VJr1PtW%OwusXnj>leLy zFgZqe3`^@iG7;5jrvR}O!$&K}AhlVrPPl0K3YXq*i;O8y9gyXI8ZoKP5UHO* zNYQnh$cMd?LqM zDP>K5i&~q_rh_=I;W~ufiP^(O9#SAzH_4j2YTO*NbE!bg%5cPJMA}is*nB-rKLjp7 zULZ8lc_DOe_CVJM$oE1h z(iJIt(Vgma4q9RPX1A}|S-3APoZ8Z^h;{xFX6Ym92OMQww|KQvGj(UjSkYTc{j<6A zp*1Hmlhkx$YL;V`$2@qr>EPpjurB`i7V8C{^4ebWDl@K_nw+d!)qp`s;Q&_0pqarH zJMM6=?q)#KS?xHMqRZq#sX=}UdxvME>tGzlD55SjPdtBn5Xmh5NI$Q+Wl~qN7?z{R z`~`8|#E)MN!1q;dHMPob=>y^OTee0Dxxq?DeWa0{5*}b0955JSz|H$uCM!pLE#yr% zc)>JoMrInr(+=(TDUc3+@OdF9;!Q(~>n4wXD}u0iLY9XVx6l$?qA+*kqR4(MxH z6+j0K{N)YI?gL?l5S;+8+V_k>1QTtOyhlaQA_33{n0OXN0g)uqyebWeWBi+SPD_v# zOn*zo(wD}xie>1L$#Q*gskh2zD8Z}VSLmw4u5kR@ho9LjlE z+7a>v>){dU>;7flp!g5boS&zfa=X|U7N{@CVg2k+@GKz0^L^A)*NZ?aZZpC)9v)6~ zO`Z|u^}AcACpfECj;|vhMuqO3>yd?_?o44q8k=$s*rKQ^OZ|CIi}-(@(jYnIr@-Qv z@;<)|JHmj)2dsJ~(XK-ABgHTKZfzY@1$W1?b#j2JtttfJHQ-O0TH-qBW5ZY{Lqgg) z(l-%_QRHkZ9h`03H-m{8z6J+bi4|1Jxd^dUSoe8qI>9r#X3*M07G;dON(0sji_9Z0 zs?|7<#Drvp-9s`nrfgU03m!29fZwq}^wbjl^mM0$kCkgpdilyG<4QB-8Sr<>3&_n) zEcATyuKj|637}_qX}wqKR37uOOc0axgbB^5TEC`>#InU+a1eLuEi zLdlJBYp15la^IW4bbOsuC^PmummP);(cFnsS|`C>g4K0JZ79b?RHS>E$V- zF`i4edSxD2^c(~9HN}m9p0qh&0-XsEFz_5mZ{d5cpUx4}`q@QqA32w&Fn*_%QxjU+ zfWQLU{gpDh3N5J2n{jGV74TWzoE~0W*7pcdsKvSti|@tb3SG9j?7BSYT110$>H{0u zuBX=>YSfN3-IYES99h0wwIhGq=`56E)wXw%b6yia--;_+teUQpH=F+MuS|xh5a{JG zZw&ibaxV`NtE`9Xs`;3@i=cUGJ}v!zj-61)PLQaYw^g>0L9AewyBSklF?+~~JMH%s zk(GCEn|3d=cMBmCysW2mX^8Vqw9)VHDqhFNL-kC?(&Xhrf2bMUQ1KDkz1LviUDCMB zQHq?bL+;`$6n77@4X;r%TL;&Ya+oY8=N#=nb+=Xcem}01)fbxIBQwODuGLF48#wIO zA>F|_PKGR6ba?jSbMxtzeoAmsq*LGkz;4b@`f5-P`sV8Nlh664nv6;`Y< zuP1Gj%PI|2;=a686bN+v#k}N2V64@P4LDRzSaSeG^mdb83ulwTNj>%qR{+O`E=zLg zw~Uu04-l=QO#@3ejYBFK&%N__vk9*3P!R!g=S%leZ^WhXYE?yc@0kRuvj%vgAxWy? zMDh+URUBFWY0eR{FyEbC5^io#S-J2B_M_BCbZjx0H5N$73fwO?h>@xRs0I^JF)~45 z!ZX0sCEj51LqUuSB9w?t?w_e}SUN)|ZTs&9sZlJV0<#3OD;TA(uX?BVC#JuyymBSxPyJtPIIK@q zzB*O;w@8LQL`H_u)#{uCc~0>CbXuEVTL)yism+U|v139^n`a*Y4wQJB6l;GIC9J{$&@e+Bz`44Dkr?_lm0)NKNSKC%^`gqVo-0iG1@BV!1-dL$CP zb@Tz`+xf)Mbg_2t=n{XJt$nr0ma+A#AC|}qnNT#(WV$3D;4Upb*02nVImLbIuM)QZ z?SuZIrgr+@RoMSPd;Vnu+rR&yf7L2X*K8HEb3m@5`jX4qR`JgqS!d(+**R(3eMrvG zw#X4*`&rKpN?b~SSSN+If?DWFrTX4)FOq8S&>P3>AOD#wkEwQeJbvCF&qrHg;YWQw zb98Z3xr{wb^Jb`zZN|eatYu02(&r`YoCAgHf2ZgJ-6W<> z7oMd4PUYFo%e1CrWi4K_i?o&Az2EWxf)381ECX6|;B0}xFeY^~E>$aCk+~uh&ES90 zeGM;X9bUR28=AR=Qad3(m$vV-~e96&?ft zfyfWOijCz4`G#_u1*nFf+R5QFbb9jW?R#OVU#I`#C+UCMVE*9)_22lFzj|5z{pbBF zF4EJKOlmz%iIU%sCtI?|FqFtO2^5J9LKLGL)nFKXP#AEdfg%eNoE&IPMUnhudjwt3 z$h)XdwhXzcbICc*Z1d}XPS>1yJ$MgGy=#?IdVgCYtL1U>^vvwE_}ujnKtl~*2C*ho z6nv~ORqKeOx+oW*c|ab580!?(`9mJVT|OBEHBX)$um!AUGMH%T4c+Rj_Th; z3I&XTd5?|$ZFX(|0>(Jgc7jsfcD5smH>ENJ=r_oPv!6m0xyM#9f&u5}d>EISIw^k} za3<^mK!lJp(lB<_+R0ov_i^hLR@#p!?|0|UploYv(fE})!s+`C2rYC)`{Z>zm0!|FUUJWWQW0@ zY`Z#P`Y3b`l_s{cMTN`tJfYj0$?GSmE9W6d;I$PG(s-`-SqAR!@RA zf1XNQX}|*0=V;U~YG(6ZeJ;m~s z#o?9ShoTFPk3Z+mTpT;o`SNOB!LD#h`}cv;a{it|e3*%4CrYffQ-eLW8!V*t-L2%j zH8tz?mP^5+wHFU_i{Y~Aw!UcO{jhm_FaGowR~8&7*)cc%K{3s*gvR@wXmgnOyuCF9 zasKVcs}%jQ_>281R~vm_^&Tbu2x>?>FLbe%+3f#f@4bVX+}Hh4mlaS%sRBxDbODj3 zlw>Ij5Lke8q>6|T5JE2!U@5(CsTxW|N(>Nc0#dW+3lI@Pkx&x^X@Nu`ypj-q?>^@@ zbLP&y``mrz-o4NHowNRNhDj!j;eEc}=lMLJ@=E4gWRbJ?cTl|i0$*tn$Nlj9R9%|% z{c#p_K(}zjv>IfCX+jcFmaw@=6-d7^9!_cR!0 z2$g1=(ob|oCvfBe48yqB-u8JE=pbZ>c3>DJ?Y@%G;#D&Jtu!L}_W3E>P+JZD+wK@R zh>6?hR=%AjueG?B%^ge-@U4SJvV*1rz9Wy@pW1m@);Rl@>1T&yZutljg=gx`4V%?V z1ZVDk7g&sD3u2fy!0yrlFI$;D*}nAS&27!FlaL?uZO881Vep=Z65URgW-#^5Xc_FHN~K?~i(BH}Ymx+7g*>`qzR z-HWXtVXZap+)UN+;%R$WJtt}v>!zjf1g%CeuP3c$@Nqu=ICN6mgz<%XVsom@TVt3J z2-4`-%1a}Ht0J0Gm2eM{IHaSEj<^*mxH83RjNmyRB0S~4wr6SV7RbuaPV18!r>;<# zZ?e4RM5j+VaZ@WFlt}L;3$9HRoPU%jX%^RKvz+JQQQn8>RU&6C8g%hJcUC)iqixOL z(`^Uz=zE)3Dq1*9lcMeK;~E%V1s6Nk9_t5K6Yf_Nj!y*7$xT=JjBY(-Juu_yDDv zacF^U$&e!WR3oi3??Oe{+VrNFHp?YM5=XPSv94(xu}I(U{&9#0ZeNq6sGs8<>Io(S zSK)RJpOoK1OO`%-2s_=}|6{=E{OK&*46p?a}? zfjcZ%?fqtUkjY%B+h2WLnlye_0#69kUN`Zu6Y^&|I7yvcJquL203Hkn3TVwN95!V} zAJ3z&U2zmcq~b5!0I@V%t9LPGs3pS=qC*7sVY0tS{@Gxj+I)Xo3lQpebZR7G?)Zfl z35ee^FJ14#U!qCgY3ISqRfL*Y2f)%_r7#I^vh~)vX5_K zb;($%wWzH#+2Om)fO~CXd-fBMQ1+99;tn3p2dKmt(w0G_O2p7Nex3^6a5=Rm7XNPQ zNz?wsXG=4oQsMnb9Buk8jfQD%YrC$HUg#s>=rTL=v&PgN+fj)LBmCOcb;H{l?omGu zDFKh39uS5JG(!7w0e#NisZ(eeH-X2hwGZPNRkdbEM|0Ed9w+7AElYcKLG(Vi1@H0L zokRCdd}{@Le31WKzL?t4QL$5hxWu$zoFE^= zj{EpRKS+PQ_$^jTdqGO!`&ZH-$mrn;5TC2KEMo-%bk_Pp*7}Dle)}sz_dE5s3;#?5 z#eW;?PvopaK!;{9rO+i0wts8&dIZtN^7ZYXA%A*5{F%`AA12ZN3rFE(HRu-zqnfcr zNEVZAu9)gN@JP;MiqNBb&|GVIu8+qS89guor8ddZuw)R^W=`31B*xhHYfOqwu9+z2 zRm{$;H(J~d_c$8!qSsiYX1cVr-Kwf%1Ff(rJ4x-AOUYmV?xeXhHEnH;@DL?5_@x;J z{5W(CCs|>z7QEe=ahiPsK(MUB(2LM#{us6{&>RS^4Sg#-CU$)cSfNW2m5X6JEO`Jr z=O22I<>T*9IXKOQpOd?JO#y7@=0_hFS+Kso)h~HI={N=+{Z$bN-cyq2k@UY1ytX=| zY_rkom&WR!HVx*-Mt+)BOk{&3uIG-9Q49RwIRN9F1RKl4&@)lp5{kfWYMOW-$lOQU zkJ-^Dccz@W-BvhXy;sl4$;bz}#DwU2ztJvAealODS2>}QDrA&yEmgtt?29cK9v&91 zQQ)_&H&|WRbYYzXrYQYv0TSn24fADQC+ZL4$BrAoN%M@~?fdGe3a6(idp#o{XU&3y zpSj@BgAz&Dl|=+y(CW3Az7Ot%MLy}p{nnV%@gb8JYvGkqk450|6X5?fXJ<1))Yrix z-TWXwjTzA9FNi9WHI++)kNX>0re2_kPDfNs+I(W?Gy?4mzW!*s2_ymhC%@gT>)yTd0AC zN{|p=6HO;&d$4e3XPNYoE_@m1n4A9V@{=cZ3!icn+TiAB)%CJTRG0o4L`9bO(0(XA zBQ6MX7_jV?;G#F8PiKLf)vyRXdQF0ArGKL8@QH4+PveVHIQ{g;X*e^4IhsBoHucm< z7PS78T*VvASb`fR&{y6(?xudhpp#k$0kf>?`Ie@0Ca8CLMEZJV&=8a&_n+6@V{bOa)*|UFeH6>mds_&^H`Kwk2|eE9uY0{nVUp zc+=F^VR(nC(O)aJ4nME(t5FkNG7K2JVPd#8^i^1eyKpI2LQQ5lh*OhXoE&%ep)!Ag zq<-k0Rqa~DXq)rf&oBfcv72dd&=$N+hTZ~2$_C&=4@lO~)E3*%#ecQ50P^VaJ@$y6 z8s57#eKZp)$PFp!`hGCiHi|3}$J#`Fs6>Cehx*=cy^l=&W>1{{UR9U3%$ye1%+}s; zeN@@ancrIyT90}NL{M@@I!At+2VF~_yDcQWfL`ZJqUlB~>=VW5p>=6yJm9{F7G^uO zq;nhkm#;wK2)5SMXFt+mNIaZJKa6E=IGB$a`5u<1Vk~xSuXt)9ZZ6+u zy1(!s@5iAh3u&k+nnq1jZ*-$UC-DfF8C?>T5esMJbxEiJ24JF~Ao41Jqi=Bdf1!7j zMNw<&Gc6FpYTdQ?r^z?Xg>i6)h^t$X2QpFS| zFSqX5d;c4KLkjQx#^1VKN!TCOd>Q_YvN8I_>N918HRxl!X+(QF(BWW^zr$(LseKLR z#d$%Vp&JbPqmOz(v*Y?!t)n_Kv8>@;rhK4)>5QliM!(deDl0kDYdg;=7h7W-ycsFv=H^juH@(&p zTqSHDh4x0cxw?Dv-}Z)kz&7+TX(0gNlwMBUK z&}+WmA%GN-U7o=?eIBgXB@TDxk3&@@RQp2*od2ww|8MCTNB>+@{@+pe|6d5Yf6r#^ z(Chyban*lm#S|Sl+;EC3>lber{s04}xdy-&1PL3#qiW)yAF%Ii2?XdR@3-|*om*WxFw{lJ_xO^Ry{mb_ip16gyz=&F+ z>jOynFUs6K-9x<%9j|9XqfYMPaX$CH%;((4c91AVyF|AApEoB`?6N~ zwhZY+gwn2$>Dqu>M?{9yJWTOJ-$@hb{Nxxf7(Mm2aym3LI(*|}$tfMNpo=RMBe}D| z(sEh#GpGPxlYLr!y&*&zyr1c&Aoi>&O(Wo<=0idyG!ZE+AF?7qT?JPg`9tEu$)Lhe zOL}_RqK-qqy+-^JecXN`FD*ElYqid^rMw(zu9mhV(h^Hr^9fb8J#(kzm@Ro@n9Nxx z<*qqIz}wr>xt7n}T?rVrCG7XSnUYqGjD57$mtE1v!(&v6?awqT8rIlaK;WQ~VRDGX z`6CR2XE?U^QbvMGSiVudaYjFcSIzsv$^Ify`2BNUQNojII?_(Hq+Pp4pLpuVU1E~; zta!*DR}AILtCyncMr(9C2rwU`pd2H7ICY8UIiOz!Yd1B$VPst5AC<7ei(&H%bTMH9 zY9LQ8x(UG+w3(q+H&cvZN4zDV2}`zJcm}j&@c{Z=O-t#t)4JOttWZ72`>lSSA6fZR zR>eC}p@fN?@9j9>$G9l>h!DVx*Kb$N-Yy5_!PADVu&CTco!>%*-b1Vtd7hSn!z#Em z@B^G!x7nvBh#uRi`|e+QAV)T$ASAq#{x`=~UFs{Pox}%X9;rUNL&gy{wT!Zy1HAok zN0Y0McZ1bwFn}q`1XT&{qCh)s6!xhCoDdG+PDrJ00Z zrfy^!JLi7ZOS!IT#jretp+uQPmt`Y7d{2tQjfp z)RnUGvMBg=o+Kc~Z&9Y-D8FaePhlo!%MR8k>D>yLnag(cP5;K60^6J@q~JlD5A>Wp z(sc@Y)$=61@;>7@_RSD|$$`F=1g&$Ywkl|tF_hwwcjqtC(aE`c-B0JLvs^D6Pux)1Cb@C_ zVE-a6+qH5It!tW4tVY}~ z{)j)&|7v)};Xr@+TF^wjw4n)B)|B7g`9@N+pwI2^pmxmzl2{}I%!Dp2q%J_Bpg?~&1JJbvrdhYcHaG$q z;`ae%MOv^DaHmb>LVDioRS7Zr+i}_@q6y4wH16XI8vcx!8j z6F;Z%V}Y=xE|>(9XDg7>JD$*xD=lJ69=F;;H^h~kyCY&qR{q+Khpynv?#Uea44IK< z$^*76zpx|Sp!1=;w}i$=Jdr1CaHtREzV|FRQtQ`oG3EjoS(%bAUpg5S8Dabm-$n{H ze%F(RiEJ5M)Kx2-H5VUpm@I6(UXu`iSxz9p=!S(OPBFI;i$f!H*XOPn<3ED&dcTk+ zt!qbjHWUH?Vg7GBU8+_ya>S||)lvlr8f1ODUzl!pBpV_LVBIuiwXF9Ff5 zXq6CWLGalvnD7CA0Fc5s(!DozIM%5X_MH1 zz%(?XzL~Oqv5kJvk}DXIqD1IAs^Q}PvJK*y$W=bQqJOwn@TY+PoSx!uHF^z?7n9|U;aiXFx?Y_MVW?K0QMsHa7c2AF`omA|=YLbb;G^l} zFf-eC&cOeaFB+a?yJNr z`p-a`@=x>(nifl+{g|H67ybON5Z2}wa8%iE>P4sQ^QEypl#)BHuR|{rfbhj_F5v97 zjybi-Jj$7(D~#hf>`2JR`}ggfKb1Ay7I$oQm>uwcIMK3T{3Ot((n1BJpY1xLCL3r) zyy_+%l#c62QuA%mflhynZ)}lD?U2ke&g=0mgD>^)ulhT6zA?n5+|{p?$~eZJ68X4> zi2Txs7W({cuHVzuIH~ldR(6p5wDVMBBbno@k2~^joVS1CjQsB(*V;ArejLhRZSS+2 ze;gVexg9gNUtf5b=g^Nom9YQ*7x$0;TmJX2VW1n*KLSoG1PoiShG{kldyIRENPMcX z`5j!Mt3_!8^+R_jb~5-@HAB^DC zd5##e<~sV ztiu1GVcLK2CjIWpAl)7n=kOG>jyZdZ>4RuN@(3lGW{3-0vL#jFXljtNz+9K zOb*Zh2zDp^_x~*H{@;6m{?^F%r>NoI`_}&Pul@JG{Jv(;gjkY*1M@cqU-v?yItL1( zbrIArT`#J;7h%aT9zrXxQjb{FE2^gtZTH}aP3v?>GE+uU$89u~>2h{IF0`9H#+}F(!@*K?H>-CW8Vy2Ml_ z-|hvI-&T|I{bNycdib`nk8F(tG;y&qS{$kj>MuH#w}WA^(WmjP(KE!pX#7+{n;kiL zI|(ER$10fs$7;IE?485BX&N6CeS=f1#--cEFlfO5GIh@U2+!yE%K=P@&FH6}3u`d) zjVO-CdsmfB(@T%i?Vid$CMefp2fwi1Qm(!!P}~i$MdUZ;!os|3_y6)Q9WEVBHfE*) zE-V@LWd>j0k3*^U@z^rpWVZ(DI2t?WN!FQfeS6T*L*7DD+9kvz)dzkZJ1DUp-=u_d z-}PAvLBaWDrejV0F%s}6xccws-@SJ~bzCB>KsOtHyVI~w(eztptdG#aO5TgD2@iAn zNDR>{S{TUV@bEGcm_NUxe@XCZ6QNHrk#vpTIam+9@GekdKFPMFa;fGQs(*{5j9D7t zn_d(hd*10w_Nm&_`YH8ug@(P=ChnZ9OEpuw#cn+d%CT_OC0ge+94DXMpb@<=P#Xqett4+oQ}4`{*u6f@T4%PNbLkn+qRXLTOvu>>MLE zgArpl8FXM^$xv=0nl-qrpADy6@hM57$-G1`fsezLN*M6Z^M${dQmk4!?b?omy zL6$4QdMHZ;1FoyY&G-8JXdneuqJ{I4J!-{8Wu7Drf`_7m$a zXWT^udYSzMXoe$L+MIFFU=ezPtqq7!G6a?4J5FaD4fE)J8kwF}4UBZ5A~T6;yOCb7 zvu0I#{?#snsHhr@!#uhC3L$>1FwspHosTBjuFD_V z(3U1zvqTb!jX?SL@88jkTR5iABR$p=rQb(@do44ZQJ3@V`z$C@A;xahR}FnWOrDxs zL(g&{=5jyIgq-N4^6~wFTEQWxcDdBC?XDK>P_f)5-}GF+@Q+vPBdFbs7_*!vrOoCJ>C*c__Hl3YGtlG><{SN~ z+vp$>dXqEWaTS2Geh%C2h4DtIvlW2_ZR+gBW2=ojJA`S}xnwCbLX4{RXn$Vr4lJwPH-CmFKhD9VA= zp9qNi1k2M|@LR2AQ+mytD>-tyH~w(r{-BIa?vZ- z0?{`bxccJ|Xy73fmZkd<>Bfjy8qQ0>n?M}LcZRR@+SrG7JMnCo;Td4aeDJZ{W^cE^ zt9im9`vn^2_8+!YxiXa>+W1&?my%6=*MdiVuZ@-6ecXKX(ycxrdFsSneN$yr8dm_e zSG6?H7~`Ap9!+Dyny`IO9>Np_0lsVn#DjQigftaeMXX}M&g z>!A^;vvweHTIc*I;03e*$8??W@h?6p(9~gDJhD_3vvO}SL0!L zM2sYWV_c!+J+}l+BVljDwn!BHR;A}{E=$8VAVNQ*qT~2_E?mbXu`f~f#wD~4g4vgX z%e-60h5xdOx!*8WP0)&%50yavI;Hxiy#O&(;w9_iSR3uZ@q?yf3!>~mF zLq@~zQ6j*rrRX!r+wDMP%|@Q=8z8}y&LL7$XvTJ8&UI?DO-*NpLwY$Qn5!#P>gcwj zT;^w-MW#=G?u}$$=IWlt(3NWvfiK-Z;_SxsMzw^X7`BgF)c#i z3&5Mcg#ct1XqQ-zf&3*~kQ|@VV*C5ZbjDIVfu+C}0}SbT)aX>GFz^J(pnT?5%799R zwM28RYx;l%qHP;lbQK<@wAlPc_@U>zKknyl%wF4o}W@^Al0mfcPm5HZMo1*A&D+$+vFMf z%ufe#(5q}+hElI5@e$v7q(%#1%Q(_c&gpArh}#0jjE1f}FoS3$f$c`U#T=kI8FZ>M z?AN;O-^Gh36^}o}|6-y!Vn%4F;Kf>($=-@kZ+2M7!3peW26z#$)IjYD0(^=yQmIE- zpUBFAyE0Vg?Cz8<^sUJ&`i?ceFgIR`P6pjAp=xBX%eD{xacJ6jQKR21m2(*IVHt7; zEZA^hj_O^L?5xBvNbERg=LLfxA99o@p+{%J@~y`4(FyYx8C;`ao=$qN{zYbfnc z%0yZ?11d0Z>%#w2~&mPLVKtN69ck9Cwrih zVcFgCr3=GA^dR`zw;7V?=c-3v-5NCwP1hjnz}uYmwnnO z>B&+fIZfJde1ag=?7RJD`^^;Rrww<}M_1Bi1f#)-VK2fN!N?{S=+@1`LN3b%`#L%(>;zl#C2~q#aztRz@2))1k%J zP>7_>m5-+rplKM`bep_Xf(JJIhGGpOs>#+{r$u$)hCe_Kn5cY5YalJVRhQd7t2}Sz zlukL#%$Q+!Hx%4^70wh z*3ru`5jeZGgdVZd{il-4+li{JS4VfbPwbzsW|*Dl-T7*u$onlKd}ywq68iKhhgO=I zj&+)Gz(JRGqh65znMlpwhA;nQoBjPQ^grUA|C8JDe~~7D84rsXmj-k{BqbD5Z`SAX z49YXwp&S;&v^aQ;k4_mai`M~QdEz)t$5zpko3Xz zVWOkC+S=+GM+weP>DlcCubbNozBfnUptc|B4Q&!~L}t{LlSVg_9w__w7<0?^p=vG& zEN36|-gKBJ}nw+BkYL{Rp zaDMLohG*qfPAUj?ykPSIEb6v!R6h(Ky}7n{5|+YIJII2nc{!_3Mx8aLripZ-^3t`> zQfa3bbQ#)E35H1G=LB8+)HQ|8OTsT)?rKPGHrae!aGcgFcb*FyZn1p6!VG9lpE4aX zEj<1H3vWu{udSjnrFBBr&*fRzMTL=q;Z_M($E9JxhLUBhIcZ;8N|6Q-&I*khcL9@2 zH$}l=VTS233O#{55Av-g*|*y#v>{leEnO*LLU z+heB`#kuVpg65uD%a_@twc|`}UY7)O>F2=U=1>nUc}ZplTd;}g$_S;!utbm#fwT0z zdnDBbNLV}{k2mL3p8d-ixJcARx<;BdY)Q)ra<7^DB0j+>g(86ZX` zKk}(01FC?Cn$PIpmeYyOuKtbf(1PUXEBNP-@@Sc zsc)?l@HTjOSAJl&drkYB^c2fvAew%XI++BbVy3{4Lo5TYC;^sIXNGvxP&6;}JmA*n zGSeZJ&ob+ChA?zGN-9?u=otWdni;T#Y0dzt9*^8F+146p66J87B)ANMNm7!GPDJFX8^CTBdB?ymU_CX81C<+E>4OqbYPl`U<~_(q5WUSnaFK%8=zQHo38W-2g1aq= zPFJ0?@9!6Bi9{!9%Trk|H-jCV5XN~QM)@I^Ig|I@a;Y3JrD5|}r)eg|LjQyz%!Norgb(v}#f?BBYtW)~I zE`X7Ki#Fo(+R&qxTl4|?Gw-F~gPJ{w+;8mD5macMuib$|9+iY*(jpe}2WQ(6#e42o zUW4c+-(U?O4bF-h8hz1#OcA=$o2-z~<72>F05YCvi-uySZ&SmOB9yr!-Q>{NHeKPg zs{_&M8C4G5m4>bnf_z6S-GaZZNOwmVkaj&JgsPD?mH8VgHe+n8q=+wB>nWrH|IcNV z{7s(ZpIqmEL>Kn=f9C)6e(nE-hk9gS7xD~pY}X};tkH+lrFcA31R<4h$&9-|E>fk; zU@78m`B=58bS#i5@44&n(pJBvnRF?BYb6Y~`6ZW&Uo}AH>#9Km=0in*L7@-SdYI6( z;G@H5_qz6<$>;i;)%Pb$`R}ikf5bcgCs*H*0)b)BUE)dZd=T-m#QAuC#EQmWq%;c{ zuVU|iWs}ZvJ(_8KaI)Z#j5G~gLSsii-uo}cJ^q_^v466T{}HwF_kZU9=&H(d`F;W1 z`_wt}9ca$pGXr7frfAEzuU~`r4NM)xCaODN0GeLI;ij;DLH+`$E%BWJPEuj9IOusV zD1>1a=UX)5Kzf)(-TUpD+A^U?(!;u)KDSci>Ua1rK3k7YBzK>g^&IYfM;LmHXBh^4 z)%Lwu=^SsCii^i;T4O5|10C?rDb$C*(H^2O+j!w02$5=gh$*GxJoY+Ut;z4ij9Kghq9>8M`W?( z%d{^dQdDf$04>76dQT<)CtIOw8>0GUUiHOhKRqvy9bmn{S`)j`871t^! z2Y8-+d(VsM?r>F`ZJAJWhvqKLTasnFB)zGR%!-G#!Y9h9U?!yin_P_B#c=$++ zl-%gJ$(bhBqc=$vcAl^c92oLC;7Yw<(WhY3-R&&J&`Xt&Y98|_qK+-tn(@xGe|XpO z%brbWZmn0wgBIkJaHyZ2-x&GB3#>JUSMp{r=(hWtsl4*<4^ZjyB6niR7WWFq(29eO z$zPXS;6{_9m8(xNT_Y(AC!=nLL5HX(Iu{b5XMk6WmESQ00z>0Dfu_}?sq1Y2L?ncN zZjJOImz?%0Q#l;t_+6th?xW-Fv+l=BWQLs;)IKA0&*}=9Sa(}v?6XEqv$L0iTiQar ztDI2l8DjW@=4iLdZT_$$os%wjVrL3b5NT2Lb%w%8@L3u@?xWi)A}n!n0x7AgiBz7e z3DSK!UG;?rZz4l=(9eC7Hw72P6VBgnim*wx3$aMEt%O8T^RledytzN0t zcFw*kL1d8Jr0sqzBG6P(xz$F?C5DLK+hnlrcu8Cz>o|e*0D>8|_vpu#2^pyhNM35B zN)KQ0@Kay@LE|h}Rjg#%=iJa2_FgtPXknmQ+4vbJ?MBk&n^v*g1CsIxU-Z z!?)D$9ZGFZDo4-AAFaTgDIsJzZ>72DqJbgSBhDbYp+8C0`c2}2y>+Llz~JJ2h#H0XgB$waD( zG>z*paFphGk-9dh5}TPVeY{LmZ*xgzPIYqFGa3YU2pKePmTQ<&7Z|rq^XPIB=g6$7 zfCMKN>+%}p7_lKZB{Bc^q6>^Iq8yN?PcOgRTNvNuy~KNX;a;-N#?=rTue)cH7qOa2 z4}ESa-Y1!VHQiSnLc9ZzQA)}fvm{9~0cV(X?=qu1V4%jGrvblYR-cJII`(xl+5&|X zu>WL7o;BUGoUwPftutPV&r{LmF}V6wdAZ2L@=DggW2yFI_0VPct3{25E*&KKNe{$!Q zJ+IkahI-B-FX+;Fd%Q~045ihoU@<>QJ#PNus&_ISK$Tz4;Qg{&8|@VK%JEadNS|Mhgs@KDcZcwhNyWYu_|0$8`n8KIdZDU*Fa>7BSYpiFq zQUbqjo=uUQMrXn5YkF(QN#;ec2EJv!^R_$L)SlTVtUA;>gI_hMskfO6`5h~ z+KOU^9Y*}Q0{pYK_5|1~bPc#N@4KJ^MxgOB0+&p2pLLqLT@C>mz3R*+-g+G~+gegN z=l4AY*Nw%x=@S_$jn9B;EL11i7H;|c=ULdahqGO;#-3$-O1_Dv0? zjg#JP^mP6|-nF0nm+^{;Bpy~+G^)Fu7&$bS<%M}&uJg``K>Iai~6y7IMq?F)iJTA zg=%6##k)`6*_p}(JTKHMSx%T+5QeHCWdH$+0fX45l;|u7ASilm38oqL4Bt97NmnTB?Iiz7g+Fdo`6AMp0TuL5=e0LJ2tHU6 zwW<80*>g0t3=AN1l*O8!U0KPtWG}doF~&dx2;+(z>`e@7s=9>yVX)#R`NXj=ng=_U4!3BLz&F|!YcmmW?@mcIglW^KV+t|v?W%O z<#D#}(Wka7^`gtUeEb!zau5BsOivSTcGyjoHb23f8&7o%GA!A}bXwQLxB=4H9^@@c z1*-N50s8JWNo4=wRkzi}IzPf)N~P8F>{`OC)10hP>gO_#ppoXN8=T37293?#x1Uyt zVjVY;w}8OvbsKXp8*uHwm$+HX5bDcQ{YLJrkWQeHm+p&MO{wSEd|Wqs*mz^s-bwd7 zO%gwd_Q>})IQ`lBl7YsD>*shTE>_%$d&;n$Q=fIS{A7TtX$VMtQxPDeA$oON1o7c! z^s}(;WUN(>-!|{cbfZ|BfquC>cP#eWRe62og13=gM(3h^&YAM(2w9T#RbmS)3LJK7 z;)#MBapWVAPLm!b7`D+xJga>vLUnSIbD191PupPeJ#!mrM?oAEpA@m+gvPfr0H~}fB388 zLIR^i#h5f+Jxx!PIQYbsk(yU#*|XcGS}sAXG-&9lzQkZkr~4`GtzFf+1Bk>>!uFLJkTkG8Wp^3Q+rB?#D7P<{f_O= zdD}O*VY%}`nW9~Jd2xhSWtML;s=YTnBs6(AlHhKUK^S6udIE*4k5AleQDz3ae<;Ab z-`v8vZHuwozNswNh;wF$^^k5C2_gtvOK?VsTx{8;KNMZ-iC`|+l7iIahCv(JBgdoW z11TSJdhW)6VEl|@3u)!z5mmHY9n%B3FqoZ>m6^l(uboQV0T1e%{~+ zcv@%N@Hcy<8i7fRx(Glh#2A80qO&%`CV>Jw;u+F7MJ6Wiw%<9aaKf~{t+}y*(Aqlw z$km4zzo(H~+ph)7wh!a@;80BemzxqUvDoxJswbt^%1v~lX95)`=9gW?-(7&7p~u$A8wG zPxF7HN4=|N%#DOW^CX&16E2J^lns;^dnzqW@B^^v;h5>OAx(G8uFkxWi7c2LB#7ue z6uPTX*+Y#O8?A_3Aft8=s~~-hX%n_Gq;w zWX0NAZ(zXJ7ZEb`v5OArQ98oDM~}~10tswUav$05i)l~gn|E9UfhZ2If$qe`+Kv_y zLaKiJ;^U@w$z)F7*4X_k4^!0eSoB{eZ(fT!d85ms|ADfqf0*W=X}VPG`0BXT7r8(` z)Si7RMWzvNst}~vpj~-mz<>8^+tjhdp>OBqWBt!vvzE2!G0!pbt29-UHJ*vTL*EK^nP`D&CTCM==PmlEa%Ned4-2_3Avx#ht{!Me!|mKj#g3+imxW-f=O zoiH!WhhJG$;p2O^Bs+AaV8u}y{h+?-n2jCz`(r6VPYYxlLD{8srR$F4sCllOs+-jK z!as4_W6un=h22tHs?p%7HcA=hb>Dg?O%~L9cW!Df@LrNSilPgasha{BoRw#j1VZ zcojme#kJU2kb+VSq%j1j(VMS9!c!9G7DK7WMPTj6A(0M+um@o!y-nTbQ;K*rFHr8I zVido%_V5{GlUXPC?7Xr*x6g|=6oX;FBcp#sTZPte{_zz^A_n#NC8COo8L_vj1@cTY zvonq7l2oWX#+H`) zWHR;c=VVbQ>I+-64E0(H)LOy}wb;PthVVY6<~dk)bteUDZ1k7Zq8Hh(-;nE{UU1ay zoVD!AERneKN1!%(L&Pq8$&ZA&)0)vMb~Cn+C+m4b_9gQ{S&U5S=o(a=G4-4y2DsQT zntGIkfY43}zK;(a3O#x_a+B9oFP!`}ZaIBks%?B%mWI2iGHc9>!y{xeSJpj!UK>j1 z-kcfjbMt!@C04C+A*nc~>t2SMqrOy?%xHP_o8}5D|Kv7Qs`a+4+PQMF!HYci=6FPE zah|)~c^kKko}nzhm`>MqFcz}(&F2YCRX5q8+_Tv$<33#amRaU0-hV{#{WUVWL5cPg zcHT4kc+@SVI*?Ffrz<%zmB7}aI&kmqG{mu+5m~yg7AHJNROB^OtZ=}6DWJ*pXr1rZ z`f3@tUUp=8LYDOxrZ+#N-^V32!e86t-k9a>}CC~MK}tRIMo`OF}=v!ZcVtJI1?N(9xM78Pg1C^zT9N{E>kV;!c>jghx&r_SpQoc zuCYUJjhsIeFsw_A$);1E%S5&(Q16kf0S@#0NO{Sj=?f8^ z&X-8qdgYyObx#S5l+T-$JI*SkV|{ps+w$z)zr2X{YUuJ+So$WQ={{ZVkWZOZlJ9p_ zIi->(-Pk#WaYmsGTLOZX6^&k4q~zTC`a#2S)K*`#Pp^Q^R9^nRWt}moT)~5x2s|(O zMDo6cuX&o6AC4=+NG1Dfu{~N%_G^cs7Nlqak4f!N`4rvx3rMbuPUzred`VGNN|3k- z$g&I;fRe7K);qPHnp25LrA3!Be5co+#?@mD5qO-N{u-oAdfkgjs z{LOE1^mD)Z%Eh~+4t)Dg^~0Ah-N7N%PoCXGSUUmgg0r6L^QBC^UEf%fpHYL`D1{eM6F z{Ev9&pOE(dGo%f!Z;#M7n8|$V|_+-Tya#Ngcc(%K87l8J&xC4 z2*)r~YfiPxxQN#&(k&cm%b zcwaI^CAHY#Y|p!MHW;zmcn6y|u@jULo{^k)#1Kc^oUBxK_M;psYJRd!38c&%1zFv} z9YRiFx&|ce8%VI-Im%+Z0a`BbbWIt>fTmXq!qTi`^H|>Od;Q_zr)Pe5 z{CcvwI@B0aP0^Jz>$aM+&H^8`m7~i$Ph+A36eYgS^!UMZj@av;66};4l_=GqZSvEC*xO!?PeKu8p^}I#rV}(35Z-opAB20VA2S@Pxrd*hil@H zeC`4B*PfFMCU+6_fSG}@cazgK1AmEELbHs7mP%(uImnS^P*C8cZoeNMbhBPaGdwra zC`gtP?)5+}(mr*?_F+{zw^q1bkNj{uiPp6#}xkAyvR zLiD-N?`a)p*x-XA)F#z7IV9*6`p-@V)^@p^ATw?y=27$f-(J9b7nAN8UV0+vwi}sC z$b1^KQbQHoz1n$|^?`!+8RHkWZ`G@lMmaUjja?qZfC{abg`1-b@XxV1m(9Njsl zB+RTk6hi+MeRzK8HGnX#8x0B!E{Xcsq$#8k42Y6=-Lx`UKnX(=Nd@L5;`8gYX^>T@LzsP`yXKDKrI)*<~9K zRJg5El|RMVv{uIKxg9S)rKAv!?Gt>MXUZB0@w!i1bc`P?jLQhngTFC6Z9WloWn*?Y-`~#zNicrXl~k`=UwiR-Io*QR zh9)VYDT^Xvu$*pKoa>fWy)yOBiF)Dsja&zzo1Z7FP3*E9k3$6cMv@C{?A-XT5gt6!6xZ41`3c3JoynPp4btpSU!SkFu4A~izq|xH_CTduCGETpdQGjERF~2222A~EP<9Y! z*HvV+5};^^2VExb7bn#m^s6w2hAhc{kh*5n;;i)1zt*jyonGx9H7}LCEZ$+8F@jP` z!QgQ>pLdtpy`<0qG*rvLdGuTae9*>+G_@m3EltixyMV7gi7gGdF|^H}I@3j4*2Y)b zAQD^%VA^(;REY9rQ87)7^Vt0}sN4YWd>pJ{ScCI}7`H`pNs{vblg z1-z*y!$GmTLc*^ktgF_d8TkaWYOhiqOq_eTNbW`KdM}d;^YdWik1^K9bhpk&F9w1bz#cJiqSt(vgugQjbikTOM z#b#dMus2x2;?}(suuN=5Nj4VAK)KEP}8EQiJ zK?|a(QqHE&>FqKnd)BAqAS_GKn3C{r`ip~NZ@a1``7EUog0bMVnXI<8%iI2xV};s5 z3S(B>kkb^saf2h>KzfYM{LvQnrK~SveXCOYc?DkF9cPb;JWc^y5us89{xX1j<4))3<5hK+ir6x_KRazLmIdeyGuubpe&jJp%By zC83HxGz*Tg-RRpLqU7mCko<}iKs3?9 z+;XiEvy_N{=78P(Gej4}cc?m`EXYX#=gPp*AM5S7m31!vF33pPMVXqFpAi_l%Ei}7e}q zWOkwPeWXUmkdIqcwwlYvmVVf0|((`T|mk-0kBCGR(<#5X_zwsh#SrH_&e%UU|oIA7 zz+yJAE$3G^33}JR$up+6qm7T3UaCE^Clpazi-uc~535-M%MY^{zZ)rx9 zUegK*BT%JfsM5+e%jwT@sjx#Rhjs~k&t#AA4H%WCKkGrR`c(1cOlNGVdrsiY24R4) zrAY6LOnop_IE;r0M0J%%Ij5xR{n|R*=0YEjeV**8cssYxld%zl>x5YeG z^6W%M$U)8J`ExI~kGxYmb-u*pjb56NctT5mxUfUYeN7SlYhs3aSNDl^=qcpvW&MQK z1M7yeOz_}|5TK`X`JAY0;q`0bs%T9t9oCs))Q+1d>b3>k=OG7{;dk+`Q8lKcn@A}K zRG2EaXZRl^1SEW;2)J1 z#v3(F0u`u*qxiUlKJ@kUa2Rqwo`N5hAh`FA-(PFcZ zb*cK8=Ax9Qvq@6Ib(V?Jv4t#GoteQ{&%6y~?tzhA9=VXW;68>0z)ZHVXBrbsfwG@h zL05ybvCH@R#+!eItUH4p`*K7icFX>kZ320o8AVqoAwHvXDkHJd1*xQO~9N*;Ogo=>>Rnc~2_z=9&A&OIaI1Ud%ZQ zf2u%>9$B1Sk)X&({6-)5(&Yv$BxDsxg`zt7(kOIsbS~n2Npzby;2W^*TU0IR4RMzsut$;NAgpL`c{Pf*lY?N6yd05$w_DfF#%XHNcLn74ymwh#WP>j7ZX<8NPY7q3xNsL*|=aK?0^#^&C(;3O0_#61iCfUD43&BOpfhL}Bi^jOjNu=S?V-S844`yqr0+L<)i*0Uzr>v>t;{)OX5e$rbDMD~h54v` ztEA1pB}hYlf;w*5gIWvI!JbX5?2QTD2Y)|n6R%IlR0tYv<=dE2tw5=^OKKm8x zRGpDa%%bmt+lOCfHDr*@l8N#_>KI&5m z5NImCB{XVH8d-c$?g?D_wc=?*&M|RwTbPKcBuw?gP{)k|Jq^Dbtv4c1r7Fc31}u%l z3(xZzDyb>reN6Kp}j8}vmJ19eUGr4<`tJcYplR(VcaYZHk9^AlOh# z8L??vVZ!J}o!L<40zhCmuQ1ISysI^Ibt>^giP9`+9o@*7Z7uP?KFYm>GVRb>!2`|G zdntXfnhL7OK-?a$^qo-J*TIv)gn;hiZq|fap!y8U@!Zqi+>YQJcQr8rDOk(>`QS69 zaK=j?FKhpIYDxxu!f)r!3EfO}6fqu3Nj(!hlu{tCxU!*-d_nI)2$cWw3@7D+8j3k@ zeukjGUn$2vn^H`vb(K!~{!S1Jy^$u)wF>2ZExEBqrA zi2g1s|4#|V|Be#se|F6SzG|wgw8e&o97zWUyF0aYb+t(+YHDhp97=}i4~je!b4h?3 zpH51Zy{6KpAoo}wM#a%o>4I~F$Bo7ebtIQ-7&Lz~4d4kiq*XmT_qT{-9>xoa(bm*-5`)}?)a zXe&wy#t=WB!fmZUxbbOE6~8qdei-({V>QoN@YHn$-ILR1cXSmbrXS^vC}{sNEMsts zQ;z*SjYjVBxL_k^cPbl2Y++RA=b$K^{l{m!Jb{HPuw5SW4?CDwE5BDp(!rhUvpb!@ z@f+La*-YyVL$pJ1p96)3LCFAK^?dAa?bO*F+Us4Or6N5(gm5z=Y52zPWPd4Q1oul5 z_%#e`c6sppm(Q(m<$nLvo+PT^cb*k2^T051^O@I=Oibds+yHnFA^a}SxL)@zkMZkQ z$GZnGh6$it*#g^ao2~i#RkA@FgzZWpkT`kzkDIFz*Y&_@z1xkDoxs{xxT;+qUv9z8 z%a{Ku*vi|9ISulZDJM9!Tq)4JhmH$P=8Ej{d_V}JkANv3`1=nKaGVm5LZ}{7zz}7F zyleUkY^#yrxIz13Xd+9Ld(?Zj(uZZltQ240@0-2cf#-_Vu1_++AH^?&rb|s^OLdYb z$0=Sep@|hh-C|!KO?RZEMqL)v^&8i}%97jVL1Lz61&Ka_0Ic~Vct82oT^=gz36@?$ zq=;;Q)JrVoB*UpQ27LYsU?HoMdrSvIVnU&-&~Y3+&N-N6FvKD3$Mo`=Z@F54!Xu8s zKEMq4-6QmQwLFc^Gpm_)#*}}5^9n500Rlx|<%Bg~_&QsKXd{v*#E4J~Gs(`EDiWct2Nk{OkD%0Be?P8Y_4d;jmOaI-nQeq+7R9 z=db=~$?4-gc4}o+gO}&yu7W4+)N=^O!e~^N)#w@PaI1po{Mj>hCdaLoI*z64+_+IG z+m%9&HA-~=6CPDeAL}UUDib_SBbFMtM`7e2X6FmoDoDV_0W(VTEk@O28IA(^_mK3}reu&VEZ z-U(C~-*q0Net0KZ_L)4wsi|aUfwh7)`HGD%U(uaZ^>NAh8WJ*Ymq)l+j!T-YN~l?# zq!6ER<nc9wQ&Bhog(ibBd zPik(BmOa|;d-JtfjGmfWo&5^%HVc+f6}q0W2CpCTaac7iHg(yTfX{g!7w@B}+e|wH zs3tADD2(J@vn0gisNokBZL&_9e=}#7MQEhBNasp^Z1?QB^PHJck*~0qqKkDUihg7T zO=8CLm=TP6l!@Tpn()34H@*GA$4>e*BauuZt{>&j9+$nM{ajEiTLEw*U@7Ve>K*S+ zO!_|Cfp-rtG6h#;X35>@>FE;=)8xrn-|B_gl1hWs{D8kW81Z)PWx8nNs$DT-&L

$?2 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≥(>&uawp}U8iDLdI!8k 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

Fp8?H+j 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∾Sg3!nqPHLNPxDw?g+4&=8?E2|$2u*5 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%0DO#$BCfV`$L10fXlk+DY;W1%VsMPe_@-_P_C=Nf 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 ZNURx!Fs>-_#1#v{< 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 diff --git a/docs/source/routing/configuration/yaml.mdx b/docs/source/routing/configuration/yaml.mdx index 479ed57e08..c38a649f39 100644 --- a/docs/source/routing/configuration/yaml.mdx +++ b/docs/source/routing/configuration/yaml.mdx @@ -15,9 +15,10 @@ import Coproc from '../../../shared/config/coprocessor.mdx'; import Cors from '../../../shared/config/cors.mdx'; import Csrf from '../../../shared/config/csrf.mdx'; import DemandCtrl from '../../../shared/config/demand_control.mdx'; -import Experimental from '../../../shared/config/experimental.mdx'; +import ExperimentalChaos from '../../../shared/config/experimental_chaos.mdx'; +import ExperimentalType from '../../../shared/config/experimental_type_conditioned_fetching.mdx'; import FleetDetector from '../../../shared/config/fleet_detector.mdx'; -import ForbidtMut from '../../../shared/config/forbid_mutations.mdx'; +import ForbidMut from '../../../shared/config/forbid_mutations.mdx'; import Headers from '../../../shared/config/headers.mdx'; import HealthChk from '../../../shared/config/health_check.mdx'; import Homepage from '../../../shared/config/homepage.mdx'; @@ -27,7 +28,8 @@ import Limits from '../../../shared/config/limits.mdx'; import OverrideSubUrl from '../../../shared/config/override_subgraph_url.mdx'; import PersistedQueries from '../../../shared/config/persisted_queries.mdx'; import Plugins from '../../../shared/config/plugins.mdx'; -import Preview from '../../../shared/config/preview.mdx'; +import PreviewEntityCache from '../../../shared/config/preview_entity_cache.mdx'; +import PreviewFileUploads from '../../../shared/config/preview_file_uploads.mdx'; import ProgOverride from '../../../shared/config/progressive_override.mdx'; import Rhai from '../../../shared/config/rhai.mdx'; import Sandbox from '../../../shared/config/sandbox.mdx'; @@ -71,6 +73,8 @@ Expand the code block to view an example YAML config file containing all propert +Learn more in [Caching Automatic Persisted Queries](/graphos/routing/performance/caching/in-memory#caching-automatic-persisted-queries-apq). + --- @@ -97,6 +101,8 @@ Learn more in [query batching](/router/executing-operations/query-batching). +Learn more in [Working with router for Apollo Connectors](/graphos/connectors/router). + --- @@ -107,7 +113,9 @@ Learn more in [External coprocessing in the GraphOS Router](/router/customizatio -y default, the router only allows GraphOS Studio to initiate browser connections to it. If your supergraph serves data to other browser-based applications, you need to update its Cross-Origin Resource Sharing (CORS) configuration. Learn more in [CORS](/graphos/routing/security/cors). +By default, the router only allows GraphOS Studio to initiate browser connections to it. If your supergraph serves data to other browser-based applications, you need to update its Cross-Origin Resource Sharing (CORS) configuration. + +Learn more in [CORS](/graphos/routing/security/cors). --- @@ -125,7 +133,11 @@ Learn more in [Demand Control](/router/executing-operations/demand-control) --- - + + +--- + + --- @@ -133,7 +145,7 @@ Learn more in [Demand Control](/router/executing-operations/demand-control) --- - + --- @@ -145,10 +157,29 @@ Learn more in [Sending HTTP headers to subgraphs](/graphos/routing/header-propag +Learn more in [Health Checks](/graphos/routing/self-hosted/health-checks). + --- +The router can serve a landing page to browsers that visit its endpoint path (`supergraph.path`): + +- A basic landing page that displays an example query `curl` command (default) + + ```yaml title="router.yaml" + # This is the default behavior. You don't need to include this config. + homepage: + enabled: true + ``` + +- _No_ landing page + + ```yaml title="router.yaml" + homepage: + enabled: false + ``` + --- @@ -187,7 +218,7 @@ If you need to override the subgraph URL at runtime on a per-request basis, you You can enhance your graph's security with GraphOS Router by maintaining a persisted query list (PQL), an operation safelist made by your first-party apps. As opposed to automatic persisted queries (APQ) where operations are automatically cached, operations must be preregistered to the PQL. Once configured, the router checks incoming requests against the PQL. -See [Safelisting with persisted queries](/router/configuration/persisted-queries) for more information. +Learn more in [Safelisting with persisted queries](/router/configuration/persisted-queries). --- @@ -202,26 +233,67 @@ plugins: var2: 1 ``` +Learn more in [Native Plugins for router](/graphos/routing/customization/native-plugins). + --- - + + +Learn more in [Entity Caching](/graphos/routing/performance/caching/entity). --- - + + +Learn more in [File Uploads](/graphos/routing/operation/file-upload). + +--- + + + +Learn more in [Progressive Override](/graphos/schema-design/federated-schemas/reference/directives#progressive-override). --- +Learn more in [Rhai customization for router](/graphos/routing/customization/rhai). + --- +[Apollo Sandbox](/graphos/explorer/sandbox) is a GraphQL development environment. It runs a graph via introspection queries on the router's supergrpah schema, and it provides an IDE for making queries to the graph. + +Running Sandbox in router requires configuring `sandbox.enabled`, `supergraph.instrospection`, and `homepage.enabled`: + +```yaml title="router.yaml" +sandbox: + enabled: true + +# Sandbox uses introspection to obtain your router's schema. +supergraph: + introspection: true + +# Sandbox requires the default landing page to be disabled. +homepage: + enabled: false +``` + + + +**Do not enable Sandbox in production.** Sandbox requires enabling introspection, which is strongly discouraged in production environments. + + + +Learn more in [Apollo Sandbox](/graphos/platform/sandbox). + --- +Learn more in [Subscriptions](/graphos/routing/operations/subscriptions). + --- @@ -692,12 +764,18 @@ You won't see an immediate change in checks behavior when you first turn on exte --- - + + +Learn more in [TLS for the router](/graphos/routing/security/tls). --- +Learn more in [Traffic Shaping](/graphos/routing/performance/traffic-shaping). + +--- + ## YAML configuration utilities ### Variable expansion From 1bdacadf7686ddf8290805a0f1e0b69ee00e3885 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 5 May 2025 20:13:04 -0700 Subject: [PATCH 31/47] remove About Router, divide up its content --- docs/source/routing/about-router.mdx | 177 ----------- docs/source/routing/get-started.mdx | 27 +- docs/source/routing/graphos-features.mdx | 184 +----------- docs/source/routing/license.mdx | 153 ++++++++++ docs/source/routing/operations/defer.mdx | 2 +- .../query-planning/native-query-planner.mdx | 2 +- docs/source/routing/request-lifecycle.mdx | 15 +- docs/source/routing/self-hosted/index.mdx | 41 ++- docs/source/routing/self-hosted/install.mdx | 278 ------------------ 9 files changed, 201 insertions(+), 678 deletions(-) delete mode 100644 docs/source/routing/about-router.mdx create mode 100644 docs/source/routing/license.mdx delete mode 100644 docs/source/routing/self-hosted/install.mdx diff --git a/docs/source/routing/about-router.mdx b/docs/source/routing/about-router.mdx deleted file mode 100644 index 90ddad9b43..0000000000 --- a/docs/source/routing/about-router.mdx +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: What's a Router? -subtitle: Runtime for graph-based API orchestration -description: Apollo provides cloud and self-hosted GraphOS Router options. The router acts as an entry point to your GraphQL APIs and provides a unified interface for clients to interact with. -redirectFrom: - - /graphos/routing ---- - -## What is GraphOS Router? - -GraphOS Router is a graph runtime. It's a gateway from GraphQL clients to a federated graph ("supergraph") that's managed by the GraphOS platform. A router receives client requests, orchestrates calls to the various APIs that make up a graph (the "subgraphs") to efficiently fetch the requested data, and bundles the fetched data into a client response. - - - - -Because Apollo uses GraphQL and Apollo Federation to define a graph, each router is an endpoint of a GraphQL API. Like API gateways in general, a router offers a central place to implement cross-cutting concerns, such as authentication, authorization, caching, logging, monitoring, rate limiting, and demand control. These and other features of the router are configurable declaratively via YAML. - -### Runtime of GraphOS platform - -As the runtime of the [GraphOS platform](/graphos/get-started/concepts/graphos), a GraphOS Router gets the supergraph schema—the blueprint of the federated graphs—from the GraphOS control plane. It then executes incoming clients operations based on that schema. - -Unlike API gateways that offer capabilities to manage API endpoints, the router isn't based on URLs or REST endpoints. Rather, the router is a GraphQL-native solution for handling client APIs. - -### Subgraph query planner - -Whenever your router receives an incoming GraphQL operation, it needs to figure out how to use your subgraphs to populate data for each of that operation's fields. To do this, the router generates a _query plan_: - - - - -A query plan is a blueprint for dividing a single incoming operation into one or more operations that are each resolvable by a single subgraph. Some of these operations depend on the results of other operations, so the query plan also defines any required ordering for their execution. The router's _query planner_ determines the optimal set of subgraph queries for each client operation, then merges the subgraph responses into a single response for the client. - -You can use the following tools for inspecting query plans: - -- Use the [Explorer IDE](/graphos/platform/explorer/) to view dynamically calculated example query plans for your operations in its right-hand panel. -- Use the [Apollo Solutions command line utility](https://github.com/apollosolutions/generate-query-plan) for generating a query plan locally. - - - -### Entry point to federated GraphQL API - -The GraphOS Router is the gateway and entry point to a federated supergraph. Clients send GraphQL operations to your router's public endpoint instead of directly to your APIs. - -## GraphOS Router deployment types - -As the entry point to your supergraph, a GraphOS Router must be able to process the expected load of client operations. The scalability and performance of a router, or a fleet or router instances, can be influenced by their deployment infrastructure. - -### Self-hosted routers - -You can choose to manage the runtime infrastructure for your routers by yourself. Using container images of router, you can host and deploy your router instances from your own infrastructure. These _self-hosted router_ instances allow you full control over their deployment. - - - - - - -Self-hosted routers running on the [Free plan](https://www.apollographql.com/pricing) are rate limited to 60 requests per minute. - -For requests in excess of this limit, the router returns an HTTP 503 (Service Unavailable) response. - - - -### Cloud-hosted routers - -You can choose for Apollo to provision and manage the runtime infrastructure for your routers. Apollo hosts and deploys each instance of router in the cloud. Each _cloud-hosted router_ instance is fully integrated and configurable within GraphOS. - - - - - - -While cloud routers are hosted in the cloud, GraphQL subgraph servers are still hosted in your infrastructure. - - - -## Common router core - -Both cloud-hosted and self-hosted routers are powered by the [Apollo Router Core](https://github.com/apollographql/router)—a high-performance router packaged as a standalone binary. - - - -A GraphOS Router is an Apollo Router Core binary with a [licensed GraphOS plan](https://www.apollographql.com/pricing). - - - -### Router type comparison - -Apollo offers the following router options, in increasing order of configurability: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Router typeDescriptionConfigurabilityPlan availability
Shared cloud routerApollo provisions and manages routers on shared infrastructure. - Basic configurability, including HTTP header rules, CORS settings, and - subgraph error inclusion - - Serverless** -
Dedicated cloud router - Apollo provisions and manages routers on dedicated infrastructure that - you control and scale. - - Highly configurable, including all options for shared cloud routers and - additional configurations - - Dedicated** -
Self-hosted routerYou host and manage the router on your own infrastructure. - Highly configurable and customizable, including all options for Cloud - Dedicated routers and additional [customization - options](/graphos/routing/customization/overview). - - The Apollo Router Core is available as a free and source-available - router. Connecting your self-hosted router to GraphOS requires a{" "} - GraphOS plan. -
- - - -**We've paused new sign-ups for Serverless and Dedicated plans while -we improve our offerings based on user feedback. This means cloud routing is -temporarily unavailable to new users. In the meantime, you can explore other -GraphOS features with our [Free -plan](https://studio.apollographql.com/signup?referrer=docs-content). - - - -## GraphOS Router features - -Although powered by the source-available Apollo Router Core binary, GraphOS Routers offer an expanded feature set that isn't available when running the Apollo Router Core without connecting it to GraphOS. - -Cloud-hosted routers automatically have access to additional GraphOS Router features, while self-hosted routers must be authenticated with a GraphOS Enterprise license to gain access to these features. Refer to the [pricing page](https://www.apollographql.com/pricing#graphos-router) to compare GraphOS Router features across plan types. - -## Next steps - -- Learn more about deploying router instances in your own infrastructure in [self-hosted router](/graphos/routing/self-hosted/) - -- Learn the basics about configuring a router in [Configuring a Router](/graphos/routing/configure-your-router) - -- For all available configuration options, go to [Router configuration](/graphos/reference/router/configuration) reference docs - -- To learn more about the intricacies of query plans, see the [example graph](/graphos/reference/federation/query-plans#example-graph) and [query plan](/graphos/reference/federation/query-plans#example-graph) in reference docs - -- Learn more about Apollo-managed routers in [cloud-hosted router](/graphos/routing/cloud/) diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx index bc24821a2e..6343c13483 100644 --- a/docs/source/routing/get-started.mdx +++ b/docs/source/routing/get-started.mdx @@ -6,7 +6,9 @@ description: This quickstart tutorial walks you through installing an Apollo Rou import ElasticNotice from "../../shared/elastic-notice.mdx"; -Hello! Let's run Apollo Router for the very first time. You will: +Hello! Let's run Apollo Router for the first time, using the simple scenario of developing and deploying locally. + +In this guide, you will: - Download and install a router binary. - Download a supergraph schema. @@ -16,7 +18,7 @@ Hello! Let's run Apollo Router for the very first time. You will: ## 1. Install router binary -Let's start by downloading and installing a router binary. +Let's start by downloading and installing a router binary locally. 1. Download and install the latest version of the router binary with a single command line: @@ -194,10 +196,10 @@ type User The router's many features are configurable via a YAML configuration file. You set your options declaratively in YAML, then point your router to it at startup. -Let's customize a common setting: the router's _supergraph listen address_. It's the network address and port on which the router receives client requests. By default the address is `127.0.0.1:4000`. For this guide, let's change the port to `5555`. +Let's customize a common setting: the router's _supergraph listen address_. It's the network address and port on which the router receives client requests. By default the address is `127.0.0.1:4000`. As an exercise, let's change the port to `5555`. 1. Create a file named `router.yaml`. Open it for editing. -1. Add the following configuration for `supergraph.listen` that sets it to `127.0.0.1:5555`: +1. Add the following configuration that sets `supergraph.listen` to `127.0.0.1:5555`: ```yaml title="router.yaml" supergraph: @@ -206,16 +208,16 @@ Let's customize a common setting: the router's _supergraph listen address_. It's ## 4. Run the router -When you're developing with the router locally, it's useful to run the router in _development mode_, or dev mode. Dev mode is a collection of router configuration settings that enable development and debugging features. +When you're developing with the router locally, it's useful to run the router in _dev mode_. Dev mode is a collection of settings that make router development and debugging easier. -Let's run the router in dev mode. We'll also run the router using both the supergraph schema and YAML configuration files you saved: +Let's run the router in dev mode. We'll also use both the supergraph schema and YAML configuration files you saved: -1. Run the router with command-line options: +1. Run the router with these command-line options: - `--dev` enables dev mode - `--config` provides the path to your YAML configuration file - `--supergraph` provides the path to your supergraph schema - ```sh + ```sh showLineNumbers=false ./router --dev --supergraph supergraph-schema.graphql --config router.yaml ``` @@ -223,7 +225,7 @@ Let's run the router in dev mode. We'll also run the router using both the super - ```sh + ```sh showLineNumbers=false disableCopy=true 2025-04-25T21:54:05.910202Z INFO Running with *development* mode settings which facilitate development experience (e.g., introspection enabled) 2025-04-25T21:54:05.981114Z INFO Apollo Router v2.1.3 // (c) Apollo Graph, Inc. // Licensed as ELv2 (https://go.apollo.dev/elv2) 2025-04-25T21:54:05.981141Z INFO Anonymous usage data is gathered to inform Apollo product development. See https://go.apollo.dev/o/privacy for details. @@ -285,8 +287,7 @@ That's it! You've successfully sent a query to a router running a development gr ## Next steps -Now that you know how to run the router locally in dev mode with a supergraph schema, you can: +Now that you've run the router locally, explore more about deployment and configuration: -- Understand concepts [about the router](/graphos/routing/about-router). -- Learn how to [configure the router](/router/configuration/overview). -- Deploy the router [in your own infrastructure](/graphos/routing/self-hosted/containerization/overview). +- Deploy the router [in your own infrastructure](/graphos/routing/self-hosted) with containers and/or Helm. +- [Configure runtime features](/router/configuration/overview) of the router. diff --git a/docs/source/routing/graphos-features.mdx b/docs/source/routing/graphos-features.mdx index 87e54b27bc..b4efec8e83 100644 --- a/docs/source/routing/graphos-features.mdx +++ b/docs/source/routing/graphos-features.mdx @@ -1,43 +1,16 @@ --- title: GraphOS Router Features -subtitle: Use router features enabled by GraphOS plans +subtitle: Features that requiring a licensed GraphOS plan description: Unlock Enterprise features for the GraphOS Router by connecting it to Apollo GraphOS. redirectFrom: - /router/enterprise-features --- -## GraphOS Router features - -A GraphOS Router gains additional features when it's passed a license from a GraphOS plan. +This page lists the additional features of GraphOS Router that are enabled via integration with a licensed GraphOS plan. > Refer to the [pricing page](https://www.apollographql.com/pricing) to compare GraphOS Router features across plan types. -### Subscriptions - -Subscriptions enable clients to manage real-time data updates effectively, without the need for constant polling. This is particularly crucial in applications that need live updates, such as notifications, stock tickers, or chat applications. Using subscriptions improves performance and user experience by ensuring that clients receive the latest information as soon as changes occur on the backend. - -The router supports both the callback and multipart protocols for handling subscriptions. [Learn more](/graphos/routing/operations/subscriptions). - - -### `@defer` - -The router's support of the `@defer` directive helps client developers tackle the common challenge of how to create a responsive user experience when certain fields of a query take longer to resolve than others. This is important for real-time applications like dashboards or reports. - -`@defer` improves application performance by delivering response data incrementally. The router supports deferring root fields of the `Query` type and fields of any entity type, and it can retrieve deferred data via follow-up queries to your subgraphs. [Learn more](/graphos/routing/operations/defer). - -### Entity caching - -Entity caching speeds up graph data retrieval by storing only the necessary data for entities, rather than entire client responses. It's helpful in scenarios where the same data is requested frequently, such as product information systems and user profile services. - -Using Redis, the router stores subgraph responses and ensures that requests for the same entity from different clients are served from the cache, rather than fetching the data repeatedly from subgraphs. It can cache data at a fine-grained level and provides separate configurations for caching duration (TTL) and other caching behaviors per subgraph. [Learn more](/graphos/routing/performance/caching/entity). - -### Query batching - -Query batching helps maintain data consistency when working with rapidly changing data and making multiple requests within a short duration. This is particularly beneficial in micro-frontend architectures where multiple frontend components request data independently to render a single page. - -Query batching allows developers to bundle multiple requests into a single batch, ensuring consistent data across these requests. The router can accept batched requests from clients and process each request separately, preserving data consistency. [Learn more](/graphos/routing/performance/query-batching) - -### Other GraphOS Router features +## GraphOS Router licensed plan features - Authentication of inbound requests via [JSON Web Token (JWT)](/graphos/routing/security/jwt) - [Authorization of specific fields and types](/graphos/routing/security/authorization) through the [`@requiresScopes`](/graphos/routing/security/authorization#requiresscopes), [`@authenticated`](/graphos/routing/security/authorization#authenticated), and [`@policy`](/graphos/routing/security/authorization#policy) directives @@ -49,7 +22,7 @@ Query batching allows developers to bundle multiple requests into a single batch - An [offline license](/graphos/reference/router/graphos-features#the-enterprise-license) that enables running the router with GraphOS features when disconnected from the internet. - [Using contexts to share data](/graphos/schema-design/federated-schemas/entities/use-contexts) with the `@context` and `@fromContext` directives -### Enabling licensed plan features +## Enabling licensed plan features To enable licensed plan features in a router: @@ -59,151 +32,4 @@ To enable licensed plan features in a router: - You connect your router to GraphOS by setting [these environment variables](/graphos/reference/router/configuration#environment-variables) when starting the router. - If your router _already_ connects to your GraphOS organization, no further action is required. -### The GraphOS license - -Whenever your router instance starts up and connects to GraphOS, it fetches a **license**, which is the credential that authorizes its use of GraphOS features: - -```mermaid -flowchart LR; - subgraph "Your Infrastructure"; - router(["GraphOS Router"]); - end; - subgraph "GraphOS"; - uplink(Apollo Uplink) - end; - router--"Fetches supergraph schema
and license"-->uplink; -``` - -A router instance retains its license for the duration of its execution. If you stop a router instance and then later start a new instance on the same machine, it must fetch a new license. - -Licenses are served via [Apollo Uplink](/graphos/routing/uplink), the same multi-cloud endpoint that your router uses to fetch its supergraph schema from GraphOS. Because of this, licenses introduce no additional network dependencies, meaning your router's uptime remains unaffected. To learn more about multi-cloud Uplink, read the [Apollo blog post](https://www.apollographql.com/blog/announcement/backend/introducing-multi-cloud-support-for-apollo-uplink). - -A router instance's license is valid for the duration of your organization's current subscription billing period (plus a [grace period](#grace-period-for-expired-plans)), even if the router temporarily becomes disconnected from GraphOS. - - - -### Offline license - - - - - -Offline license support is available on an as-needed basis to Enterprise organizations. Send a request to your Apollo contact to enable it for your GraphOS Studio organization. - - - -Running your GraphOS Router fleet while fully connected to GraphOS is the best choice for most Apollo users. However, some scenarios can prevent your routers from connecting to GraphOS for an extended period, ranging from disasters that break connectivity to isolated sites operating with air-gapped networks. If you need to restart or rapidly scale your entire router fleet, but you're unable to communicate with Apollo Uplink, new router instances won't be able to serve traffic. - -To support long-term disconnection scenarios, GraphOS supports **offline licenses** for the GraphOS Router. An offline license enables routers to start and serve traffic without a persistent connection to GraphOS. Instead of fetching its supergraph schema from Apollo Uplink, an offline router gets its supergraph schema from a local supergraph schema file. - - - -You can use the GraphOS [schema delivery pipeline](/graphos/platform/schema-management#schema-delivery) for supergraph CI (schema checks, linting, contracts, etc.) in an online environment to manage the local supergraph schema file provided to your offline router. - - - -An offline license can be retrieved from GraphOS with the [`rover license fetch`](/rover/commands/license) command. - -With an offline license, a router can either be fully disconnected from GraphOS or configured to connect to GraphOS on a best-effort basis so that it can send graph usage metrics. Apollo recommends configuring your router to report graph usage metrics to GraphOS whenever possible. Since your router sends metrics in a best-effort fashion, it incurs no performance or uptime penalties while enabling several powerful GraphOS features, such as operation checks, field insights, operation traces, and contracts. - - - -A router using an offline license requires [the use of local manifests](/graphos/routing/security/persisted-queries#local_manifests) when using [safelisting with persisted queries](/graphos/routing/security/persisted-queries), otherwise it will not work as designed when the router is disconnected from Uplink. - - - -An offline license is valid for the lesser of the duration of your contract with Apollo, or one year, with an added grace period of 28 days. You are responsible for keeping your offline license files up to date within your infrastructure by rerunning `rover license fetch` to fetch updated license files. - -#### Set up offline license for the GraphOS Router - -Follow these steps to configure an GraphOS Router to use an offline license: - -1. Fetch an offline license by running [`rover license fetch`](/rover/commands/license/#license-fetch) with the ID of the graph from which you want to fetch a license: - - ```bash - rover license fetch --graph-id - ``` - -1. Provide the offline license to your router on startup. The router accepts an offline license in a few ways: - - 1. [`--license `](/graphos/reference/router/configuration#--license) CLI option, with an argument containing an absolute or relative path to an offline license file - 1. [`APOLLO_ROUTER_LICENSE_PATH`](/graphos/reference/router/configuration#--license) environment variable, containing an absolute or relative path to an offline license file - 1. [`APOLLO_ROUTER_LICENSE`](/graphos/reference/router/configuration#--license) environment variable, containing the stringified contents of an offline license file - - - - - The router checks the CLI option and environment variables in the listed order, then it uses the value of the first option or variable that is set. - - The `--license ` option is only available when running the router binary. When running a router with `rover dev`, you must use environment variables to provide your offline license. - - - -1. Configure the router to use a local supergraph schema by setting one of the following: - - * [`--s/-supergraph`](/graphos/reference/router/configuration#-s----supergraph) CLI option, with an argument containing an absolute or relative path to supergraph schema file - * [`APOLLO_SUPERGRAPH_PATH`](/graphos/reference/router/configuration#-s----supergraph) environment variable, containing an absolute or relative path to supergraph schema file - * [`APOLLO_SUPERGRAPH_URLS`](/graphos/reference/router/configuration#-s----supergraph) environment variable, containing URLs to supergraph schemas - -1. (**Recommended**) Configure the router to report usage metrics to GraphOS in a best-effort basis by setting both the [`APOLLO_KEY`](/graphos/reference/router/configuration#apollo_key) and [`APOLLO_GRAPH_REF`](/graphos/reference/router/configuration#apollo_graph_ref) environment variables. - - These metrics are necessary for several important GraphOS features (operations checks, field insights, operation traces, contracts). Sending them best-effort incurs no performance or uptime penalties. - -### Licenses with local development - -You might also need to run an GraphOS Router instance on your local machine, such as with the [`rover dev`](/graphos/graphs/local-development) command. It's likely that your local router instance doesn't connect to GraphOS to get its supergraph schema from Uplink. For example, you can run `rover dev` to perform composition locally. - -**You _can_ use GraphOS Router features with a locally composed supergraph schema!** To do so, your router must still connect to GraphOS to obtain its [license](#the-graphos-license). - -#### Set up local development - -These steps work both for running the router executable directly (`./router`) and for running it via `rover dev`: - -1. [Create a new variant](/graphos/graphs/federated-graphs/#adding-a-variant-via-the-rover-cli) for your supergraph that you'll use _only_ to fetch GraphOS licenses. - - Give the variant a name that clearly distinguishes it from variants that track schemas and metrics. - - Every team member that runs a router locally can use this same variant. - - When you create this variant, publish a dummy subgraph schema like the following (your router won't use it): - - ```graphql - type Query { - hello: String - } - ``` - -2. Create a [graph API key](/graphos/platform/access-management/api-keys#graph-api-keys) for your supergraph and assign it the **Contributor** role. - - We recommend creating a separate graph API key for _each team member_ that will run the router locally. - -3. When you start up your local router with your usual command, set the `APOLLO_GRAPH_REF` and `APOLLO_KEY` environment variables for that command: - - ```bash - APOLLO_GRAPH_REF="..." APOLLO_KEY="..." ./router --supergraph schema.graphql - ``` - - - The value of `APOLLO_GRAPH_REF` is the graph ref for the new, license-specific variant you created (for example, `docs-example-graph@local-licenses`). - - The value of `APOLLO_KEY` is the graph API key you created. - -4. Your router will fetch an GraphOS license while using its locally composed supergraph schema. - -### Common errors - -**If your router doesn't successfully connect to GraphOS,** it logs an error that begins with one of the following strings if any GraphOS features are enabled: - -| Error Message | Description | -|-----------------------------|-------------| -| `Not connected to GraphOS.` | At least one of the `APOLLO_KEY` and `APOLLO_GRAPH_REF` environment variables wasn't set on router startup. | -| `License not found.` | The router connected to GraphOS with credentials that are not associated with a GraphOS plan. | -| `License has expired.` | Your organization's GraphOS subscription has ended. **Your router will stop processing incoming requests at the end of the standard [grace period](#grace-period-for-expired-plans).** | - -## Turning off GraphOS features - -To turn off an GraphOS feature, remove all of its associated configuration keys from your router's [YAML config file](/graphos/reference/router/configuration#yaml-config-file). - -## Grace period for expired plans - -If your organization terminates its GraphOS subscription, your router's license is considered expired at the end of your final paid subscription period. GraphOS provides a grace period for expired licenses so that you can turn off GraphOS features before they produce breaking errors in your router. - -If your router has an expired GraphOS license, its behavior degrades according to the following schedule, _if_ any GraphOS features are still enabled: - -- **For the first 14 days after your license expires,** your router continues to behave as though it has a valid license. -- **After 14 days,** your router begins a **soft outage**: it continues processing client requests, but it emits logs and metrics that indicate it's experiencing an outage. -- **After 28 days,** your router begins a **hard outage**. It no longer processes incoming client requests and continues emitting logs and metrics from the soft outage. - -Your router resumes normal functioning whenever you renew your GraphOS subscription or turn off all [GraphOS features](#list-of-features). +> Learn more about the [GraphOS plan license](/graphos/routing/license). diff --git a/docs/source/routing/license.mdx b/docs/source/routing/license.mdx new file mode 100644 index 0000000000..ca939d52f2 --- /dev/null +++ b/docs/source/routing/license.mdx @@ -0,0 +1,153 @@ +--- +title: GraphOS Router License +description: Learn how to manage the license for a Apollo GraphOS Router, including offline license configuration. +--- + +## The GraphOS license + +Whenever your instance of GraphOS Router starts up and connects to GraphOS, it fetches a **license**, which is the credential that authorizes its use of GraphOS features: + +```mermaid +flowchart LR; + subgraph "Your Infrastructure"; + router(["GraphOS Router"]); + end; + subgraph "GraphOS"; + uplink(Apollo Uplink) + end; + router--"Fetches supergraph schema
and license"-->uplink; +``` + +A router instance retains its license for the duration of its execution. If you stop a router instance and then later start a new instance on the same machine, it must fetch a new license. + +Licenses are served via [Apollo Uplink](/graphos/routing/uplink), the same multi-cloud endpoint that your router uses to fetch its supergraph schema from GraphOS. Because of this, licenses introduce no additional network dependencies, meaning your router's uptime remains unaffected. To learn more about multi-cloud Uplink, read the [Apollo blog post](https://www.apollographql.com/blog/announcement/backend/introducing-multi-cloud-support-for-apollo-uplink). + +A router instance's license is valid for the duration of your organization's current subscription billing period (plus a [grace period](#grace-period-for-expired-plans)), even if the router temporarily becomes disconnected from GraphOS. + + + +## Offline license + + + + + +Offline license support is available on an as-needed basis to Enterprise organizations. Send a request to your Apollo contact to enable it for your GraphOS Studio organization. + + + +Running your GraphOS Router fleet while fully connected to GraphOS is the best choice for most Apollo users. However, some scenarios can prevent your routers from connecting to GraphOS for an extended period, ranging from disasters that break connectivity to isolated sites operating with air-gapped networks. If you need to restart or rapidly scale your entire router fleet, but you're unable to communicate with Apollo Uplink, new router instances won't be able to serve traffic. + +To support long-term disconnection scenarios, GraphOS supports **offline licenses** for the GraphOS Router. An offline license enables routers to start and serve traffic without a persistent connection to GraphOS. Instead of fetching its supergraph schema from Apollo Uplink, an offline router gets its supergraph schema from a local supergraph schema file. + + + +You can use the GraphOS [schema delivery pipeline](/graphos/platform/schema-management#schema-delivery) for supergraph CI (schema checks, linting, contracts, etc.) in an online environment to manage the local supergraph schema file provided to your offline router. + + + +An offline license can be retrieved from GraphOS with the [`rover license fetch`](/rover/commands/license) command. + +With an offline license, a router can either be fully disconnected from GraphOS or configured to connect to GraphOS on a best-effort basis so that it can send graph usage metrics. Apollo recommends configuring your router to report graph usage metrics to GraphOS whenever possible. Since your router sends metrics in a best-effort fashion, it incurs no performance or uptime penalties while enabling several powerful GraphOS features, such as operation checks, field insights, operation traces, and contracts. + + + +A router using an offline license requires [the use of local manifests](/graphos/routing/security/persisted-queries#local_manifests) when using [safelisting with persisted queries](/graphos/routing/security/persisted-queries), otherwise it will not work as designed when the router is disconnected from Uplink. + + + +An offline license is valid for the lesser of the duration of your contract with Apollo, or one year, with an added grace period of 28 days. You are responsible for keeping your offline license files up to date within your infrastructure by rerunning `rover license fetch` to fetch updated license files. + +### Set up offline license for the GraphOS Router + +Follow these steps to configure an GraphOS Router to use an offline license: + +1. Fetch an offline license by running [`rover license fetch`](/rover/commands/license/#license-fetch) with the ID of the graph from which you want to fetch a license: + + ```bash + rover license fetch --graph-id + ``` + +1. Provide the offline license to your router on startup. The router accepts an offline license in a few ways: + + 1. [`--license `](/graphos/reference/router/configuration#--license) CLI option, with an argument containing an absolute or relative path to an offline license file + 1. [`APOLLO_ROUTER_LICENSE_PATH`](/graphos/reference/router/configuration#--license) environment variable, containing an absolute or relative path to an offline license file + 1. [`APOLLO_ROUTER_LICENSE`](/graphos/reference/router/configuration#--license) environment variable, containing the stringified contents of an offline license file + + + + - The router checks the CLI option and environment variables in the listed order, then it uses the value of the first option or variable that is set. + - The `--license ` option is only available when running the router binary. When running a router with `rover dev`, you must use environment variables to provide your offline license. + + + +1. Configure the router to use a local supergraph schema by setting one of the following: + + * [`--s/-supergraph`](/graphos/reference/router/configuration#-s----supergraph) CLI option, with an argument containing an absolute or relative path to supergraph schema file + * [`APOLLO_SUPERGRAPH_PATH`](/graphos/reference/router/configuration#-s----supergraph) environment variable, containing an absolute or relative path to supergraph schema file + * [`APOLLO_SUPERGRAPH_URLS`](/graphos/reference/router/configuration#-s----supergraph) environment variable, containing URLs to supergraph schemas + +1. (**Recommended**) Configure the router to report usage metrics to GraphOS in a best-effort basis by setting both the [`APOLLO_KEY`](/graphos/reference/router/configuration#apollo_key) and [`APOLLO_GRAPH_REF`](/graphos/reference/router/configuration#apollo_graph_ref) environment variables. + + These metrics are necessary for several important GraphOS features (operations checks, field insights, operation traces, contracts). Sending them best-effort incurs no performance or uptime penalties. + +## Licenses with local development + +You might also need to run an GraphOS Router instance on your local machine, such as with the [`rover dev`](/graphos/graphs/local-development) command. It's likely that your local router instance doesn't connect to GraphOS to get its supergraph schema from Uplink. For example, you can run `rover dev` to perform composition locally. + +**You _can_ use GraphOS Router features with a locally composed supergraph schema!** To do so, your router must still connect to GraphOS to obtain its [license](#the-graphos-license). + +### Set up local development + +These steps work both for running the router executable directly (`./router`) and for running it via `rover dev`: + +1. [Create a new variant](/graphos/graphs/federated-graphs/#adding-a-variant-via-the-rover-cli) for your supergraph that you'll use _only_ to fetch GraphOS licenses. + - Give the variant a name that clearly distinguishes it from variants that track schemas and metrics. + - Every team member that runs a router locally can use this same variant. + - When you create this variant, publish a dummy subgraph schema like the following (your router won't use it): + + ```graphql + type Query { + hello: String + } + ``` + +2. Create a [graph API key](/graphos/platform/access-management/api-keys#graph-api-keys) for your supergraph and assign it the **Contributor** role. + - We recommend creating a separate graph API key for _each team member_ that will run the router locally. + +3. When you start up your local router with your usual command, set the `APOLLO_GRAPH_REF` and `APOLLO_KEY` environment variables for that command: + + ```bash + APOLLO_GRAPH_REF="..." APOLLO_KEY="..." ./router --supergraph schema.graphql + ``` + + - The value of `APOLLO_GRAPH_REF` is the graph ref for the new, license-specific variant you created (for example, `docs-example-graph@local-licenses`). + - The value of `APOLLO_KEY` is the graph API key you created. + +4. Your router will fetch an GraphOS license while using its locally composed supergraph schema. + +## Troubleshooting + +**If your router doesn't successfully connect to GraphOS,** it logs an error that begins with one of the following strings if any GraphOS features are enabled: + +| Error Message | Description | +|-----------------------------|-------------| +| `Not connected to GraphOS.` | At least one of the `APOLLO_KEY` and `APOLLO_GRAPH_REF` environment variables wasn't set on router startup. | +| `License not found.` | The router connected to GraphOS with credentials that are not associated with a GraphOS plan. | +| `License has expired.` | Your organization's GraphOS subscription has ended. **Your router will stop processing incoming requests at the end of the standard [grace period](#grace-period-for-expired-plans).** | + +## Turning off GraphOS features + +To turn off an GraphOS feature, remove all of its associated configuration keys from your router's [YAML config file](/graphos/reference/router/configuration#yaml-config-file). + +## Grace period for expired plans + +If your organization terminates its GraphOS subscription, your router's license is considered expired at the end of your final paid subscription period. GraphOS provides a grace period for expired licenses so that you can turn off GraphOS features before they produce breaking errors in your router. + +If your router has an expired GraphOS license, its behavior degrades according to the following schedule, _if_ any GraphOS features are still enabled: + +- **For the first 14 days after your license expires,** your router continues to behave as though it has a valid license. +- **After 14 days,** your router begins a **soft outage**: it continues processing client requests, but it emits logs and metrics that indicate it's experiencing an outage. +- **After 28 days,** your router begins a **hard outage**. It no longer processes incoming client requests and continues emitting logs and metrics from the soft outage. + +Your router resumes normal functioning whenever you renew your GraphOS subscription or turn off all [GraphOS features](#list-of-features). diff --git a/docs/source/routing/operations/defer.mdx b/docs/source/routing/operations/defer.mdx index 014f1d8ea9..10b505115a 100644 --- a/docs/source/routing/operations/defer.mdx +++ b/docs/source/routing/operations/defer.mdx @@ -20,7 +20,7 @@ To use `@defer` successfully, your supergraph and its clients must meet the requ - This functionality is currently supported in Apollo Client for [Web](/react/data/defer) and [Kotlin (experimental)](/kotlin/fetching/defer). - Your supergraph must be one of: - A [cloud supergraph](/graphos/routing/cloud#cloud-supergraphs) - - A [self-hosted supergraph](/graphos/routing/self-hosted#self-hosted-supergraphs) running the [GraphOS Router](/graphos/routing/about-router) + - A [self-hosted supergraph](/graphos/routing/self-hosted#self-hosted-supergraphs) running the GraphOS Router ### Entity-specific requirements diff --git a/docs/source/routing/query-planning/native-query-planner.mdx b/docs/source/routing/query-planning/native-query-planner.mdx index fb74e744d5..2756b0ca01 100644 --- a/docs/source/routing/query-planning/native-query-planner.mdx +++ b/docs/source/routing/query-planning/native-query-planner.mdx @@ -11,7 +11,7 @@ Learn about the Rust-native query planner in GraphOS Router v2.x ## Background about query planner implementations -In v1.49.0, the router introduced a [query planner](/graphos/routing/about-router#query-planning) implemented natively in Rust. This native query planner improves the overall performance and resource utilization of query planning. It existed alongside the legacy JavaScript implementation that uses the V8 JavaScript engine. +In v1.49.0, the router introduced a query planner implemented natively in Rust. This native query planner improves the overall performance and resource utilization of query planning. It existed alongside the legacy JavaScript implementation that uses the V8 JavaScript engine. As of v1.59.0, the native query planner is the default planner in the router. As a result, the legacy query planner, which was built using Deno and relied on the v8 engine, has been deprecated. diff --git a/docs/source/routing/request-lifecycle.mdx b/docs/source/routing/request-lifecycle.mdx index 867e610233..38dfc1546c 100644 --- a/docs/source/routing/request-lifecycle.mdx +++ b/docs/source/routing/request-lifecycle.mdx @@ -1,22 +1,21 @@ --- title: Router Request Lifecycle -subtitle: Understand how the router processes client requests -description: Understand how GraphQL client requests get processed by the request lifecycle pipeline of Apollo GraphOS Router. +subtitle: Learn how the router processes client requests +description: Understand how GraphQL client requests get processed through the request lifecycle pipeline of an Apollo Router. --- import RequestLifecycleOverviewDiagram from '../../shared/diagrams/router-request-lifecycle-overview.mdx'; -Every client request made to a GraphOS Router goes through the **router request lifecycle**: a multi-stage pipeline of services that processes requests and returns responses. +Every client request made to an Apollo Router goes through the **router request lifecycle**: a multi-stage pipeline of services that processes requests and returns responses. - +The router processes a client request by first passing it between services along the lifecycle's **request path**. In the request path, it needs to figure out how to use your subgraphs to fetch or update the fields of the request. To do this, the router generates a _query plan_: -Understanding the router request lifecycle makes it easier for you to write router customization plugins or configure router telemetry. + + - - -The router processes a client request by first passing it between services along the lifecycle's **request path**. The request path breaks up a request and sends constituent sub-requests to subgraphs. Then along the lifecycle's **response path**, the router gathers all the responses from the subgraph requests into a client response. +A query plan is a blueprint for dividing a single incoming operation into one or more operations that are each resolvable by a single subgraph. Some of these operations depend on the results of other operations, so the query plan also defines any required ordering for their execution. The router's _query planner_ determines the optimal set of subgraph queries for each client operation, then merges the subgraph responses into a single response for the client. ## Request path diff --git a/docs/source/routing/self-hosted/index.mdx b/docs/source/routing/self-hosted/index.mdx index 545944468c..7e4fe0f7b9 100644 --- a/docs/source/routing/self-hosted/index.mdx +++ b/docs/source/routing/self-hosted/index.mdx @@ -1,10 +1,9 @@ --- -title: Self-Hosted Router -subtitle: Host and deploy routers in your own infrastructure -description: Distribute operations efficiently across microservices in your federated GraphQL API with the Apollo GraphOS Router or Apollo Router Core. Configure caching, security features, and more. +title: Deploying Self-Hosted Apollo Router +subtitle: How to deploy router for your own infrastructure --- -A self-hosted GraphOS Router or Apollo Router Core enables you to fully manage the runtime infrastructure and deployments of your supergraph. +Apollo Router is a graph runtime that you can deploy in your own infrastructure. ```mermaid flowchart LR; @@ -19,31 +18,31 @@ flowchart LR; class clients secondary; ``` - +Each release of Apollo Router includes: -Self-hosting the GraphOS Router requires a current GraphOS [Enterprise or Free plan](https://www.apollographql.com/pricing). +- A binary +- A container image +- A Helm chart - +## Local binary -## Downloading and installing a self-hosted router +Running Apollo Router directly from its binary speeds up local development, and it enables embedded use cases where containers are unavailable. -Apollo provides the router as both a binary and as images to run in your containerized deployments. +Follow the [quickstart](/graphos/routing/get-started) to run a router binary. -### Router binary +## Kubernetes via Helm -Apollo provides a binary of the router for multiple platforms. You can download the router bundle, extract the router binary, and run it. +Helm is a package manager for Kubernetes. Apollo provides an application Helm chart with each release of Apollo Router in GitHub Container Registry. Since router v0.14.0, Apollo has released each router Helm chart as an Open Container Initiative (OCI) image in `oci://ghcr.io/apollographql/helm-charts/router`. -To learn more, follow the steps in the [self-hosted router installation](/graphos/reference/router/self-hosted-install) reference to run a router binary with a sample supergraph schema. +Follow the [Kubernetes deployment guide] to deploy the router with a Helm chart. -### Router container image +## Container -Apollo provides container images of the router to deploy in self-hosted environments. The router images are hosted on GitHub in its container repository. Each router release includes both production and debug images. +For containerization without k8s or Helm, Apollo provides container images with each release of Apollo Router. The images are available in GitHub, downloadable from `ghcr.io/apollographql/router` and the [router repo](https://github.com/apollographql/router/pkgs/container/router). Both debug and production images are provided. -To learn more, go to the [containerization overview](/graphos/routing/self-hosted/containerization). +Follow the router deployment guide for your container environment: -- If running with Docker, go to the [Docker](/graphos/routing/self-hosted/containerization/docker) docs to learn how to run router images. -- If running with Kubernetes, go to the [Kubernetes](/graphos/routing/self-hosted/containerization/kubernetes) docs to learn to deploy with router Helm charts. - -## Next steps - -- To prepare your routers for production deployment, follow the guides in [Production Readiness](/graphos/platform/production-readiness/checklist) docs. +- [AWS](/graphos/routing/self-hosted/containerization/aws) +- [Azure](/graphos/routing/self-hosted/containerization/azure) +- [GCP](/graphos/routing/self-hosted/containerization/gcp) +- [Docker](/graphos/routing/self-hosted/containerization/docker) diff --git a/docs/source/routing/self-hosted/install.mdx b/docs/source/routing/self-hosted/install.mdx deleted file mode 100644 index b5ade4692c..0000000000 --- a/docs/source/routing/self-hosted/install.mdx +++ /dev/null @@ -1,278 +0,0 @@ ---- -title: Router Quickstart -subtitle: Run the router with GraphOS and Apollo-hosted subgraphs -description: This quickstart tutorial walks you through installing the Apollo GraphOS Router or Apollo Router Core and running it with GraphOS and some example Apollo-hosted subgraphs. ---- - -import ElasticNotice from "../../../shared/elastic-notice.mdx"; - -Hello! This tutorial walks you through installing the router (GraphOS Router or Apollo Router Core) and running it in with GraphOS and some example Apollo-hosted subgraphs. - -> **This quickstart helps you run a _self-hosted_ instance of the router.** If you [create a cloud supergraph](/graphos/quickstart/cloud/) with Apollo GraphOS, Apollo provisions and hosts your supergraph's GraphOS -> Router for you. -> -> Cloud supergraphs are recommended for organizations that don't need to host their router in their own infrastructure. - -## 1. Download and extract the router binary - - - -### Download options - -You can either automatically download the router binary directly to your current directory, or manually download the router bundle for your platform. - -#### Automatic download (Linux, OSX, WSL) - -If you have a bash-compatible terminal, you can download the latest version of the Apollo Router Core directly to your current directory with the following command: - -```bash -curl -sSL https://router.apollo.dev/download/nix/latest | sh -``` - -With the router binary now in your current directory, go to the step [Running the binary](#running-the-binary). - -#### Manual download - -Go to the Apollo Router Core's [GitHub Releases page](https://github.com/apollographql/router/releases) and download the latest `.tar.gz` file that matches your system. Currently, tarballs are available for the following: - -- Linux (x86_64) -- Linux (aarch64) -- macOS (Apple Silicon) -- Windows (x86_64) - -If a tarball for your system or architecture isn't available, you can [build and run the router from source](https://github.com/apollographql/router/blob/HEAD/DEVELOPMENT.md#development-1). You can also [open an issue on GitHub](https://github.com/apollographql/router/issues/new/choose) to request the addition of new architectures. - -After downloading, extract the file by running the following from a new project directory, substituting the path to the tarball: - -```bash -tar -xf path/to/file.tar.gz --strip-components=1 -``` - -If you omit the `--strip-components=1` option, the `router` executable is installed in a `dist` subdirectory. - -### Running the binary - -You can now run the router from your project's root directory with the following command: - -```bash -./router -``` - -If you do, you'll get output similar to the following: - -``` -Apollo Router // (c) Apollo Graph, Inc. // Licensed as ELv2 (https://go.apollo.dev/elv2) - -⚠️ The Apollo Router requires a composed supergraph schema at startup. ⚠️ - -👉 DO ONE: - - * Pass a local schema file with the '--supergraph' option: - - $ ./router --supergraph - - * Fetch a registered schema from GraphOS by setting - these environment variables: - - $ APOLLO_KEY="..." APOLLO_GRAPH_REF="..." ./router - - For details, see the Apollo docs: - https://www.apollographql.com/docs/federation/managed-federation/setup - -🔬 TESTING THINGS OUT? - - 1. Download an example supergraph schema with Apollo-hosted subgraphs: - - $ curl -L https://supergraph.demo.starstuff.dev/ > starstuff.graphql - - 2. Run the router in development mode with the supergraph schema: - - $ ./router --dev --supergraph starstuff.graphql -``` - -This is because router requires a supergraph schema and we aren't providing it one! Let's fix that. - -## 2. Download the example supergraph schema - -For this quickstart, we're using example Apollo-hosted subgraphs, along with an example supergraph schema that's composed from those subgraph schemas. - -From your project's root directory, run the following: - -```bash -curl -sSL https://supergraph.demo.starstuff.dev/ > supergraph-schema.graphql -``` - -This saves a `supergraph-schema.graphql` file with the following contents: - - - -```graphql title="supergraph-schema.graphql" -schema - @link(url: "https://specs.apollo.dev/link/v1.0") - @link(url: "https://specs.apollo.dev/join/v0.3", for: EXECUTION) { - query: Query - mutation: Mutation -} - -directive @join__enumValue(graph: join__Graph!) repeatable on ENUM_VALUE - -directive @join__field( - graph: join__Graph - requires: join__FieldSet - provides: join__FieldSet - type: String - external: Boolean - override: String - usedOverridden: Boolean -) repeatable on FIELD_DEFINITION | INPUT_FIELD_DEFINITION - -directive @join__graph(name: String!, url: String!) on ENUM_VALUE - -directive @join__implements( - graph: join__Graph! - interface: String! -) repeatable on OBJECT | INTERFACE - -directive @join__type( - graph: join__Graph! - key: join__FieldSet - extension: Boolean! = false - resolvable: Boolean! = true - isInterfaceObject: Boolean! = false -) repeatable on OBJECT | INTERFACE | UNION | ENUM | INPUT_OBJECT | SCALAR - -directive @join__unionMember( - graph: join__Graph! - member: String! -) repeatable on UNION - -directive @link( - url: String - as: String - for: link__Purpose - import: [link__Import] -) repeatable on SCHEMA - -scalar join__FieldSet - -enum join__Graph { - ACCOUNTS - @join__graph(name: "accounts", url: "https://accounts.demo.starstuff.dev/") - INVENTORY - @join__graph( - name: "inventory" - url: "https://inventory.demo.starstuff.dev/" - ) - PRODUCTS - @join__graph(name: "products", url: "https://products.demo.starstuff.dev/") - REVIEWS - @join__graph(name: "reviews", url: "https://reviews.demo.starstuff.dev/") -} - -scalar link__Import - -enum link__Purpose { - """ - `SECURITY` features provide metadata necessary to securely resolve fields. - """ - SECURITY - - """ - `EXECUTION` features provide metadata necessary for operation execution. - """ - EXECUTION -} - -type Mutation @join__type(graph: PRODUCTS) @join__type(graph: REVIEWS) { - createProduct(upc: ID!, name: String): Product @join__field(graph: PRODUCTS) - createReview(upc: ID!, id: ID!, body: String): Review - @join__field(graph: REVIEWS) -} - -type Product - @join__type(graph: ACCOUNTS, key: "upc", extension: true) - @join__type(graph: INVENTORY, key: "upc") - @join__type(graph: PRODUCTS, key: "upc") - @join__type(graph: REVIEWS, key: "upc") { - upc: String! - weight: Int - @join__field(graph: INVENTORY, external: true) - @join__field(graph: PRODUCTS) - price: Int - @join__field(graph: INVENTORY, external: true) - @join__field(graph: PRODUCTS) - inStock: Boolean @join__field(graph: INVENTORY) - shippingEstimate: Int @join__field(graph: INVENTORY, requires: "price weight") - name: String @join__field(graph: PRODUCTS) - reviews: [Review] @join__field(graph: REVIEWS) - reviewsForAuthor(authorID: ID!): [Review] @join__field(graph: REVIEWS) -} - -type Query - @join__type(graph: ACCOUNTS) - @join__type(graph: INVENTORY) - @join__type(graph: PRODUCTS) - @join__type(graph: REVIEWS) { - me: User @join__field(graph: ACCOUNTS) - recommendedProducts: [Product] @join__field(graph: ACCOUNTS) - topProducts(first: Int = 5): [Product] @join__field(graph: PRODUCTS) -} - -type Review @join__type(graph: REVIEWS, key: "id") { - id: ID! - body: String - author: User @join__field(graph: REVIEWS, provides: "username") - product: Product -} - -type User - @join__type(graph: ACCOUNTS, key: "id") - @join__type(graph: REVIEWS, key: "id") { - id: ID! - name: String @join__field(graph: ACCOUNTS) - username: String - @join__field(graph: ACCOUNTS) - @join__field(graph: REVIEWS, external: true) - reviews: [Review] @join__field(graph: REVIEWS) -} -``` - - - -This file is all that the router needs to communicate with our subgraphs! - -## 3. Run the router in development mode with the default configuration - -Now from your project root, run the following: - -```sh -./router --dev --supergraph supergraph-schema.graphql -``` - -The console output should look like the following: - -```sh -2022-06-29T22:23:24.266542Z INFO apollo_router::executable: Apollo Router v0.9.5 // (c) Apollo Graph, Inc. // Licensed as ELv2 (https://go.apollo.dev/elv2) -2022-06-29T22:23:24.488286Z INFO apollo_router::router: starting Apollo Router -2022-06-29T22:23:25.774334Z INFO apollo_router::axum_http_server_factory: GraphQL endpoint exposed at http://127.0.0.1:4000/ 🚀 -``` - -That's it! Running the router with the `--dev` flag enables a development mode that exposes [Apollo Sandbox](/graphos/explorer/sandbox/) so you can run queries against the router. - - - -**Do not use the `--dev` flag in a non-development environment.** It relaxes certain default configuration options to provide an improved local development experience (e.g., it exposes subgraph error messages to clients). - -[Learn more about dev mode defaults.](/router/configuration/overview#dev-mode-defaults) - - - -Visit `http://127.0.0.1:4000` to open Apollo Sandbox, inspect your entire supergraph, and run your first queries! - -## Next steps - -Now that you know how to run the router with a supergraph schema, you can: - -- Set up [managed federation](/federation/managed-federation/overview) -- Learn about [additional configuration options](/router/configuration/overview) -- [Estimate the system resources needed to deploy the router](/technotes/TN0045-router_resource_estimator/). From 0629fc3210cc2547b0b89296a7e876c7f429dbcf Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Thu, 8 May 2025 10:02:26 -0700 Subject: [PATCH 32/47] Apply suggestions from code review Co-authored-by: Maria Elisabeth Schreiber --- docs/source/routing/configuration/cli.mdx | 10 +++++----- docs/source/routing/configuration/envvars.mdx | 2 +- docs/source/routing/configuration/overview.mdx | 10 +++++----- docs/source/routing/get-started.mdx | 12 ++++++------ docs/source/routing/graphos-features.mdx | 2 +- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/source/routing/configuration/cli.mdx b/docs/source/routing/configuration/cli.mdx index 46e2375347..e97f674211 100644 --- a/docs/source/routing/configuration/cli.mdx +++ b/docs/source/routing/configuration/cli.mdx @@ -10,7 +10,7 @@ This reference covers the command-line options for configuring an Apollo Router. ## Command-line options -This reference lists and describes the options supported by the `router` binary. Where indicated, some of these options can also be provided via an environment variable. +This reference lists and describes the options supported by the `router` binary via command-line options. Where indicated, some of these options can also be provided via an environment variable. @@ -76,10 +76,10 @@ The absolute or relative path to the router's optional [YAML configuration file] -⚠️ **This is not available on Windows.** - The absolute or relative path to a file containing the Apollo graph API key for use with managed federation. +⚠️ **This is not available on Windows.** + @@ -92,7 +92,7 @@ The absolute or relative path to a file containing the Apollo graph API key for ⚠️ **Do not set this option in production!** - +
If set, a router runs in dev mode to help with local development. [Learn more about dev mode.](/graphos/routing/configuration/yaml#dev-mode-defaults) @@ -264,7 +264,7 @@ plugins: ## Configuration schema for IDE validation -The router can generate a JSON schema for config validation in your text editor. This schema helps you format the YAML file correctly and also provides content assist. +The router can generate a JSON schema for config validation in your text editor. This schema helps you format the YAML file correctly and also provides content assistance. Generate the schema with the following command: diff --git a/docs/source/routing/configuration/envvars.mdx b/docs/source/routing/configuration/envvars.mdx index f0b6102e17..fab56321dd 100644 --- a/docs/source/routing/configuration/envvars.mdx +++ b/docs/source/routing/configuration/envvars.mdx @@ -12,7 +12,7 @@ This section lists and describes the environment variables you can set when runn -The supported environment variables apply only if you're using GraphOS Router with [managed federation](/federation/managed-federation/overview/) and GraphOS Studio. +These environment variables apply only if your supergraph schema is managed by GraphOS. diff --git a/docs/source/routing/configuration/overview.mdx b/docs/source/routing/configuration/overview.mdx index 59ee0d7cba..77a8e88fec 100644 --- a/docs/source/routing/configuration/overview.mdx +++ b/docs/source/routing/configuration/overview.mdx @@ -4,20 +4,20 @@ subtitle: Overview and reference for router configuration description: Learn how to configure the Apollo GraphOS Router or Apollo Router Core with environment variables, command-line options and commands, and YAML configuration files. --- -Running an Apollo Router involves some key configuration steps: +Running an Apollo Router instance involves some key steps: - Getting the schema of the federated supergraph that your router is running - Configuring runtime features declaratively in YAML -- Running for development or production +- Deploying to different environments (dev, prod, etc.) - Providing configuration command-line options, YAML, and environment variables at startup -## Setting supergraph schema +## Getting supergraph schema As the runtime for a federated graph, a router needs to know the schema of the graph it's running. We call the schema for a federated graph a _supergraph schema_. You need to configure the router at startup to know where to get its supergraph schema. That configuration depends on whether or not its supergraph schema is managed by GraphOS: -- If your supergraph schema is managed by GraphOS, you can configure your router with the GraphOS graph reference and API key as environment variables (`APOLLO_GRAPH_REF` and `APOLLO_KEY`). Based on these, the router can automatically fetch the supergraph schema from GraphOS. -- Otherwise, you can provide a supergraph schema file. You can save a supergraph schema file and provide its path to the router. +- If your supergraph schema is managed by GraphOS, you can configure your router with the GraphOS graph ref and API key as environment variables (`APOLLO_GRAPH_REF` and `APOLLO_KEY`). Based on these, the router can automatically fetch the supergraph schema from GraphOS. +- Otherwise, you can provide the router a supergraph schema file [via command line or environment variable](/graphos/routing/configuration/cli#-s----supergraph). ## Configuring features in YAML diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx index 6343c13483..5b9a52fcae 100644 --- a/docs/source/routing/get-started.mdx +++ b/docs/source/routing/get-started.mdx @@ -49,15 +49,15 @@ Let's start by downloading and installing a router binary locally. ## 2. Download supergraph schema -A router needs a schema for the federated graph, or "supergraph", that it's orchestrating. For this guide, we're downloading an example supergraph schema, which we'll provide to the router when running it. +A router needs a schema for the federated graph, or _supergraph_, that it's orchestrating. This guide uses an example supergraph schema, which you download and provide to the router. -1. From your project's root directory, run the following to download and save a supergraph schema to a file: +1. From your project's root directory, run the following to download and save an example supergraph schema: ```bash showLineNumbers=false curl -sSL https://supergraph.demo.starstuff.dev/ > supergraph-schema.graphql ``` - + ```graphql title="supergraph-schema.graphql" schema @@ -198,7 +198,7 @@ The router's many features are configurable via a YAML configuration file. You s Let's customize a common setting: the router's _supergraph listen address_. It's the network address and port on which the router receives client requests. By default the address is `127.0.0.1:4000`. As an exercise, let's change the port to `5555`. -1. Create a file named `router.yaml`. Open it for editing. +1. In your same working directory, create a file named `router.yaml`. Open it for editing. 1. Add the following configuration that sets `supergraph.listen` to `127.0.0.1:5555`: ```yaml title="router.yaml" @@ -210,7 +210,7 @@ Let's customize a common setting: the router's _supergraph listen address_. It's When you're developing with the router locally, it's useful to run the router in _dev mode_. Dev mode is a collection of settings that make router development and debugging easier. -Let's run the router in dev mode. We'll also use both the supergraph schema and YAML configuration files you saved: +Let's run the router in dev mode, using both the supergraph schema and YAML configuration files you created: 1. Run the router with these command-line options: - `--dev` enables dev mode @@ -218,7 +218,7 @@ Let's run the router in dev mode. We'll also use both the supergraph schema and - `--supergraph` provides the path to your supergraph schema ```sh showLineNumbers=false - ./router --dev --supergraph supergraph-schema.graphql --config router.yaml + ./router --dev --config router.yaml --supergraph supergraph-schema.graphql ``` 1. Check that your router is running, with output similar to the example: diff --git a/docs/source/routing/graphos-features.mdx b/docs/source/routing/graphos-features.mdx index b4efec8e83..644bc49016 100644 --- a/docs/source/routing/graphos-features.mdx +++ b/docs/source/routing/graphos-features.mdx @@ -1,5 +1,5 @@ --- -title: GraphOS Router Features +title: Licensed GraphOS Router Features subtitle: Features that requiring a licensed GraphOS plan description: Unlock Enterprise features for the GraphOS Router by connecting it to Apollo GraphOS. redirectFrom: From b14ba861179cb5e3e0ad15563773366c175ded3b Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Thu, 8 May 2025 10:38:12 -0700 Subject: [PATCH 33/47] Fix link --- docs/source/routing/self-hosted/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/routing/self-hosted/index.mdx b/docs/source/routing/self-hosted/index.mdx index 7e4fe0f7b9..3cdf684cf2 100644 --- a/docs/source/routing/self-hosted/index.mdx +++ b/docs/source/routing/self-hosted/index.mdx @@ -34,7 +34,7 @@ Follow the [quickstart](/graphos/routing/get-started) to run a router binary. Helm is a package manager for Kubernetes. Apollo provides an application Helm chart with each release of Apollo Router in GitHub Container Registry. Since router v0.14.0, Apollo has released each router Helm chart as an Open Container Initiative (OCI) image in `oci://ghcr.io/apollographql/helm-charts/router`. -Follow the [Kubernetes deployment guide] to deploy the router with a Helm chart. +Follow the [Kubernetes deployment guide](/graphos/routing/self-hosted/containerization/kubernetes) to deploy the router with a Helm chart. ## Container From 988b1a1c7dc783f38ce57ef7139b319838f79106 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Thu, 8 May 2025 23:12:10 -0700 Subject: [PATCH 34/47] address review comments --- docs/source/routing/graphos-features.mdx | 4 +- docs/source/routing/license.mdx | 77 ++++++++++++----------- docs/source/routing/request-lifecycle.mdx | 4 +- 3 files changed, 44 insertions(+), 41 deletions(-) diff --git a/docs/source/routing/graphos-features.mdx b/docs/source/routing/graphos-features.mdx index 644bc49016..c546c36bf5 100644 --- a/docs/source/routing/graphos-features.mdx +++ b/docs/source/routing/graphos-features.mdx @@ -12,10 +12,13 @@ This page lists the additional features of GraphOS Router that are enabled via i ## GraphOS Router licensed plan features +- Real-time updates via [GraphQL subscriptions](/graphos/routing/operations/subscriptions) +- Improved performance with [query batching](/graphos/routing/performance/query-batching) - Authentication of inbound requests via [JSON Web Token (JWT)](/graphos/routing/security/jwt) - [Authorization of specific fields and types](/graphos/routing/security/authorization) through the [`@requiresScopes`](/graphos/routing/security/authorization#requiresscopes), [`@authenticated`](/graphos/routing/security/authorization#authenticated), and [`@policy`](/graphos/routing/security/authorization#policy) directives - Incremental migration between subgraphs through [the progressive `@override` directive](/graphos/schema-design/federated-schemas/entities/migrate-fields#incremental-migration-with-progressive-override). - Redis-backed [distributed caching of query plans and persisted queries](/graphos/routing/performance/caching/distributed) +- Redis-backed [entity caching of subgraph responses](/graphos/routing/performance/caching/entity) - Custom request handling in any language via [external coprocessing](/graphos/routing/customization/coprocessor) - Mitigation of potentially malicious requests via [request limits](/graphos/routing/security/request-limits),[demand control](/graphos/routing/security/request-limits), and [safelisting](/graphos/routing/security/persisted-queries) - Custom instrumentation and telemetry, including [custom attributes for spans](/graphos/reference/router/telemetry/instrumentation/spans#attributes). @@ -30,6 +33,5 @@ To enable licensed plan features in a router: - Certain features might require a later router version. See a particular feature's documentation for details. - Your router instances must connect to GraphOS with a **graph API key** and **graph ref** associated with your organization. - You connect your router to GraphOS by setting [these environment variables](/graphos/reference/router/configuration#environment-variables) when starting the router. - - If your router _already_ connects to your GraphOS organization, no further action is required. > Learn more about the [GraphOS plan license](/graphos/routing/license). diff --git a/docs/source/routing/license.mdx b/docs/source/routing/license.mdx index ca939d52f2..597e338dc4 100644 --- a/docs/source/routing/license.mdx +++ b/docs/source/routing/license.mdx @@ -7,6 +7,11 @@ description: Learn how to manage the license for a Apollo GraphOS Router, includ Whenever your instance of GraphOS Router starts up and connects to GraphOS, it fetches a **license**, which is the credential that authorizes its use of GraphOS features: +A router instance retains its license for the duration of its execution. If you stop a router instance and then later start a new instance on the same machine, it must fetch a new license. + +Licenses are served via [Apollo Uplink](/graphos/routing/uplink), the same multi-cloud endpoint that your router uses to fetch its supergraph schema from GraphOS. Because of this, licenses introduce no additional network dependencies, meaning your router's uptime remains unaffected. To learn more about multi-cloud Uplink, read the [Apollo blog post](https://www.apollographql.com/blog/announcement/backend/introducing-multi-cloud-support-for-apollo-uplink). + + ```mermaid flowchart LR; subgraph "Your Infrastructure"; @@ -18,11 +23,42 @@ flowchart LR; router--"Fetches supergraph schema
and license"-->uplink; ``` -A router instance retains its license for the duration of its execution. If you stop a router instance and then later start a new instance on the same machine, it must fetch a new license. +A router instance's license is valid for the duration of your organization's current subscription billing period (plus a [grace period](#grace-period-for-expired-plans)), even if the router temporarily becomes disconnected from GraphOS. -Licenses are served via [Apollo Uplink](/graphos/routing/uplink), the same multi-cloud endpoint that your router uses to fetch its supergraph schema from GraphOS. Because of this, licenses introduce no additional network dependencies, meaning your router's uptime remains unaffected. To learn more about multi-cloud Uplink, read the [Apollo blog post](https://www.apollographql.com/blog/announcement/backend/introducing-multi-cloud-support-for-apollo-uplink). +## Licenses with local development -A router instance's license is valid for the duration of your organization's current subscription billing period (plus a [grace period](#grace-period-for-expired-plans)), even if the router temporarily becomes disconnected from GraphOS. +You might also need to run an GraphOS Router instance on your local machine, such as with the [`rover dev`](/graphos/graphs/local-development) command. It's likely that your local router instance doesn't connect to GraphOS to get its supergraph schema from Uplink. For example, you can run `rover dev` to perform composition locally. + +**You _can_ use GraphOS Router features with a locally composed supergraph schema!** To do so, your router must still connect to GraphOS to obtain its [license](#the-graphos-license). + +### Set up local development + +These steps work both for running the router executable directly (`./router`) and for running it via `rover dev`: + +1. [Create a new variant](/graphos/graphs/federated-graphs/#adding-a-variant-via-the-rover-cli) for your supergraph that you'll use _only_ to fetch GraphOS licenses. + - Give the variant a name that clearly distinguishes it from variants that track schemas and metrics. + - Every team member that runs a router locally can use this same variant. + - When you create this variant, publish a dummy subgraph schema like the following (your router won't use it): + + ```graphql + type Query { + hello: String + } + ``` + +2. Create a [graph API key](/graphos/platform/access-management/api-keys#graph-api-keys) for your supergraph and assign it the **Contributor** role. + - We recommend creating a separate graph API key for _each team member_ that will run the router locally. + +3. When you start up your local router with your usual command, set the `APOLLO_GRAPH_REF` and `APOLLO_KEY` environment variables for that command: + + ```bash + APOLLO_GRAPH_REF="..." APOLLO_KEY="..." ./router --supergraph schema.graphql + ``` + + - The value of `APOLLO_GRAPH_REF` is the graph ref for the new, license-specific variant you created (for example, `docs-example-graph@local-licenses`). + - The value of `APOLLO_KEY` is the graph API key you created. + +4. Your router will fetch an GraphOS license while using its locally composed supergraph schema. @@ -91,41 +127,6 @@ Follow these steps to configure an GraphOS Router to use an offline license: These metrics are necessary for several important GraphOS features (operations checks, field insights, operation traces, contracts). Sending them best-effort incurs no performance or uptime penalties. -## Licenses with local development - -You might also need to run an GraphOS Router instance on your local machine, such as with the [`rover dev`](/graphos/graphs/local-development) command. It's likely that your local router instance doesn't connect to GraphOS to get its supergraph schema from Uplink. For example, you can run `rover dev` to perform composition locally. - -**You _can_ use GraphOS Router features with a locally composed supergraph schema!** To do so, your router must still connect to GraphOS to obtain its [license](#the-graphos-license). - -### Set up local development - -These steps work both for running the router executable directly (`./router`) and for running it via `rover dev`: - -1. [Create a new variant](/graphos/graphs/federated-graphs/#adding-a-variant-via-the-rover-cli) for your supergraph that you'll use _only_ to fetch GraphOS licenses. - - Give the variant a name that clearly distinguishes it from variants that track schemas and metrics. - - Every team member that runs a router locally can use this same variant. - - When you create this variant, publish a dummy subgraph schema like the following (your router won't use it): - - ```graphql - type Query { - hello: String - } - ``` - -2. Create a [graph API key](/graphos/platform/access-management/api-keys#graph-api-keys) for your supergraph and assign it the **Contributor** role. - - We recommend creating a separate graph API key for _each team member_ that will run the router locally. - -3. When you start up your local router with your usual command, set the `APOLLO_GRAPH_REF` and `APOLLO_KEY` environment variables for that command: - - ```bash - APOLLO_GRAPH_REF="..." APOLLO_KEY="..." ./router --supergraph schema.graphql - ``` - - - The value of `APOLLO_GRAPH_REF` is the graph ref for the new, license-specific variant you created (for example, `docs-example-graph@local-licenses`). - - The value of `APOLLO_KEY` is the graph API key you created. - -4. Your router will fetch an GraphOS license while using its locally composed supergraph schema. - ## Troubleshooting **If your router doesn't successfully connect to GraphOS,** it logs an error that begins with one of the following strings if any GraphOS features are enabled: diff --git a/docs/source/routing/request-lifecycle.mdx b/docs/source/routing/request-lifecycle.mdx index 38dfc1546c..ba03f7bc71 100644 --- a/docs/source/routing/request-lifecycle.mdx +++ b/docs/source/routing/request-lifecycle.mdx @@ -12,8 +12,8 @@ Every client request made to an Apollo Router goes through the **router request The router processes a client request by first passing it between services along the lifecycle's **request path**. In the request path, it needs to figure out how to use your subgraphs to fetch or update the fields of the request. To do this, the router generates a _query plan_: - - +Diagram of a query plan + A query plan is a blueprint for dividing a single incoming operation into one or more operations that are each resolvable by a single subgraph. Some of these operations depend on the results of other operations, so the query plan also defines any required ordering for their execution. The router's _query planner_ determines the optimal set of subgraph queries for each client operation, then merges the subgraph responses into a single response for the client. From 318f1e4f354a65052a143a85f33bb4ba299ef88c Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Thu, 8 May 2025 23:48:15 -0700 Subject: [PATCH 35/47] move coproc and rhai --- .../customization/coprocessor/index.mdx | 472 ++++++++++ .../customization/coprocessor/reference.mdx | 844 ++++++++++++++++++ .../{rhai.mdx => rhai/index.mdx} | 0 .../reference.mdx} | 3 + 4 files changed, 1319 insertions(+) create mode 100644 docs/source/routing/customization/coprocessor/index.mdx create mode 100644 docs/source/routing/customization/coprocessor/reference.mdx rename docs/source/routing/customization/{rhai.mdx => rhai/index.mdx} (100%) rename docs/source/routing/customization/{rhai-reference.mdx => rhai/reference.mdx} (99%) diff --git a/docs/source/routing/customization/coprocessor/index.mdx b/docs/source/routing/customization/coprocessor/index.mdx new file mode 100644 index 0000000000..72907186b7 --- /dev/null +++ b/docs/source/routing/customization/coprocessor/index.mdx @@ -0,0 +1,472 @@ +--- +title: External Coprocessing +subtitle: Customize your router's behavior in any language +description: Customize the Apollo GraphOS Router with external coprocessing. Write standalone code in any language, hook into request lifecycle, and modify request/response details. +--- + +import CoprocTypicalConfig from "../../../../shared/coproc-typical-config.mdx"; + + + +With **external coprocessing**, you can hook into the GraphOS Router's request-handling lifecycle by writing standalone code in any language and framework. This code (i.e., your **coprocessor**) can run anywhere on your network that's accessible to the router over HTTP. + +You can configure your router to "call out" to your coprocessor at different **stages** throughout the request-handling lifecycle, enabling you to perform custom logic based on a client request's headers, query string, and other details. This logic can access disk and perform network requests, all while safely isolated from the critical router process. + +When your coprocessor responds to these requests, its response body can modify [various details](#responding-to-coprocessor-requests) of the client's request or response. You can even [terminate a client request](#terminating-a-client-request). + +**Recommended locations for hosting your coprocessor include:** + +- On the same host as your router (minimal request latency) +- In the same Pod as your router, as a "sidecar" container (minimal request latency) +- In the same availability zone as your router (low request latency with increased deployment isolation) + +## How it works + +Whenever your router receives a client request, at various **stages** in the [request-handling lifecycle](/graphos/routing/customization/rhai/#router-request-lifecycle) it can send HTTP POST requests to your coprocessor: + +```mermaid +flowchart TB; + client(Client); + coprocessing(Coprocessor); + subgraph " " + routerService("RouterService"); + supergraphService("SupergraphService"); + executionService("ExecutionService"); + subgraphService[["SubgraphService(s)"]]; + end; + subgraphs[[Subgraphs]]; + client --"1. Sends request"--> routerService; + routerService <-."2. Can send request
details to coprocessor
and receive modifications".-> coprocessing; + routerService --"3"--> supergraphService; + supergraphService <-."4. Can send request
details to coprocessor
and receive modifications".-> coprocessing; + supergraphService --"5"--> executionService; + executionService <-."6. Can send request
details to coprocessor
and receive modifications".-> coprocessing; + executionService --"7"--> subgraphService; + subgraphService <-."8. Can send request
details to coprocessor
and receive modifications".-> coprocessing; + subgraphService -- "9"--> subgraphs; + + class client,subgraphs,coprocessing secondary; +``` + +This diagram shows request execution proceeding "down" from a client, through the router, to individual subgraphs. Execution then proceeds back "up" to the client in the reverse order. + +As shown in the diagram above, the `RouterService`, `SupergraphService`, `ExecutionService`, and `SubgraphService` steps of the [request-handling lifecycle](/graphos/routing/customization/rhai/#router-request-lifecycle) can send these POST requests (also called **coprocessor requests**). + +Each supported service can send its coprocessor requests at two different **stages**: + +- As execution proceeds "down" from the client to individual subgraphs + - Here, the coprocessor can inspect and modify details of requests before GraphQL operations are processed. + - The coprocessor can also instruct the router to [_terminate_ a client request](#terminating-a-client-request) immediately. +- As execution proceeds back "up" from subgraphs to the client + - Here, the coprocessor can inspect and modify details of the router's response to the client. + +At _every_ stage, the router waits for your coprocessor's response before it continues processing the corresponding request. Because of this, you should maximize responsiveness by configuring _only_ whichever coprocessor requests your customization requires. + +### Multiple requests with `SubgraphService` + +If your coprocessor hooks into your router's `SubgraphService`, the router sends a separate coprocessor request _for each subgraph request in its query plan._ In other words, if your router needs to query three separate subgraphs to fully resolve a client operation, it sends three separate coprocessor requests. Each coprocessor request includes the [name](#servicename) and [URL](#uri) of the subgraph being queried. + +## Setup + +First, make sure your router is [connected to a GraphOS Enterprise organization](/router/enterprise-features/#enabling-enterprise-features). + +You configure external coprocessing in your router's [YAML config file](/router/configuration/overview/#yaml-config-file), under the `coprocessor` key. + +### Typical configuration + +This example configuration sends commonly used request and response details to your coprocessor (see the comments below for explanations of each field): + + + +### Minimal configuration + +You can confirm that your router can reach your coprocessor by setting this minimal configuration before expanding it as needed: + +```yaml title="router.yaml" +coprocessor: + url: http://127.0.0.1:8081 # Replace with the URL of your coprocessor's HTTP endpoint. + router: + request: + headers: false +``` + +In this case, the `RouterService` only sends a coprocessor request whenever it receives a client request. The coprocessor request body includes _no_ data related to the client request (only "control" data, which is [covered below](#coprocessor-request-format)). + +### Conditions + +You can define [conditions](/router/configuration/telemetry/instrumentation/conditions) for a stage of the request lifecycle that you want to run the coprocessor. You can set coprocessor conditions with [selectors](/router/configuration/telemetry/instrumentation/selectors) based on headers or context entries. + + + +The `Execution` stage doesn't support coprocessor conditions. + + + +Example configurations: + +- Run during the `SupergraphResponse` stage only for the first event of a supergraph response. Useful for handling only the first subscription event when a subscription is opened: + +```yaml title="router.yaml" +coprocessor: + url: http://127.0.0.1:3000 + supergraph: + response: + condition: + eq: + - true + - is_primary_response: true # Will be true only for the first event received on a supergraph response (like classical queries and mutations for example) + body: true + headers: true +``` + +- Run during the `Request` stage only if the request contains a request header: + +```yaml title="router.yaml" +coprocessor: + url: http://127.0.0.1:3000 + router: + request: + condition: + eq: + - request_header: should-execute-copro # Header name + - "enabled" # Header value + body: true + headers: true +``` + +### Context configuration + +The router request context is used to share data across stages of the request pipeline. The coprocessor can also use this context. +By default, the context is not sent to the coprocessor (`context: false`). +You can send _all_ context keys to your coprocessor using `context: all`. +You can also specify exactly which context keys you wish to send to a coprocessor by listing them under the `selective` key. This will reduce the size of the request/response and may improve performance. + +If you're upgrading from router 1.x, the [context key names changed](/docs/graphos/routing/upgrade/from-router-v1#renamed-context-keys) in router v2.0. You can specify `context: deprecated` to send all context with the old names, compatible with v1.x. Context keys are translated to their v1.x names before being sent to the coprocessor, and translated back to the v2.x names after being received from the coprocessor. + + + +`context: true` from router 1.x is still supported by the configuration, and is an alias for `context: deprecated`. +We strongly recommend using `context: deprecated` or `context: all` instead. + + + +Example: + +```yaml title="router.yaml" +coprocessor: + url: http://127.0.0.1:3000 # mandatory URL which is the address of the coprocessor + router: + request: + context: false # Do not send any context entries + supergraph: + request: + headers: true + context: # It will only send these 2 context keys to your coprocessor + selective: + - apollo::supergraph::operation_name + - apollo::demand_control::actual_cost + body: true + response: + headers: true + context: all # It will send all context keys with new names (2.x version) + body: true + subgraph: + all: + request: + context: deprecated # It will send all the context keys with deprecated names (1.x version) +``` + + + +If you use the `selective` configuration, you must use the new context key names from v2.x. It does not support the `deprecated` keys from v1.x. So for example, if you try to specify `operation_name` instead of `apollo::supergraph::operation_name`, it won't map to the new context key. + + + +### Client configuration + + + +For example, to enable h2c (http2 cleartext) communication with a coprocessor you can use this configuration: + +```yaml title="router.yaml" +coprocessor: + url: http://127.0.0.1:8081 + # Using an HTTP (not HTTPS) URL and experimental_http2: http2only results in connections that use h2c + client: + experimental_http2: http2only +``` + +## Coprocessor request format + +The router communicates with your coprocessor via HTTP POST requests (called **coprocessor requests**). The body of each coprocessor request is a JSON object with properties that describe either the current client request or the current router response. + + + +**Body properties vary by the router's current execution stage.** [See example request bodies for each stage.](#example-requests-by-stage) + + + +Properties of the JSON body are divided into two high-level categories: + +- "Control" properties + - These provide information about the context of the specific router request or response. They provide a mechanism to influence the router's execution flow. + - The router always includes these properties in coprocessor requests. +- Data properties + - These provide information about the substance of a request or response, such as the GraphQL query string and any HTTP headers. Aside from `sdl`, your coprocessor can modify all of these properties. + - You [configure which of these fields](#setup) the router includes in its coprocessor requests. By default, the router includes _none_ of them. + +To learn more about coprocessor requests, go to: +- [Reference of request properties](/graphos/routing/customization/coprocessor/reference#properties) +- [Example requests by stage](/graphos/routing/customization/coprocessor/reference#example-requests-by-stage) + +## Responding to coprocessor requests + +The router expects your coprocessor to respond with a `200` status code and a JSON body that matches the structure of the [request body](#example-requests-by-stage). + +In the response body, your coprocessor can return _modified values_ for certain properties. By doing so, you can modify the remainder of the router's execution for the client request. + +The router supports modifying the following properties from your coprocessor: + +- [`control`](#control) + - Modify this property to immediately [terminate a client request](#terminating-a-client-request). +- [`body`](#body) +- [`headers`](#headers) +- [`context`](#context) + + + +**Do not** modify other [control properties](#property-reference). Doing so can cause the client request to fail. + + + +If you omit a property from your response body entirely, the router uses its existing value for that property. + +### Terminating a client request + +Every coprocessor request body includes a `control` property with the string value `continue`. If your coprocessor's response body _also_ sets `control` to `continue`, the router continues processing the client request as usual. + +Alternatively, your coprocessor's response body can set `control` to an _object_ with a `break` property, like so: + +```json +{ + "control": { "break": 401 }, //highlight-line + "body": { + "errors": [ + { + "message": "Not authenticated.", + "extensions": { + "code": "ERR_UNAUTHENTICATED" + } + } + ] + } +} +``` + +If the router receives an object with this format for `control`, it immediately terminates the request-handling lifecycle for the client request. It sends an HTTP response to the client with the following details: + +- The HTTP status code is set to the value of the `break` property (`401` in the example above). +- The response body is the coprocessor's returned value for `body`. + - The value of `body` should adhere to the standard GraphQL JSON response format (see the example above). + - Alternatively, you can specify a string value for `body`. If you do, the router returns an error response with that string as the error's `message`. + +The example response above sets the HTTP status code to `400`, which indicates a failed request. + +You can _also_ use this mechanism to immediately return a _successful_ response: + +```json +{ + "control": { "break": 200 }, + "body": { + "data": { + "currentUser": { + "name": "Ada Lovelace" + } + } + } +} +``` + + + +If you return a successful response, make sure the structure of the `data` property matches the structure expected by the client query. + + + + + +The `body` in the `RouterRequest` and `RouterResponse` stages is always a string, but you can still `break` with a GraphQL response if it's encoded as JSON. + + + + + +```json +{ + "control": { "break": 500 }, + "body": "{ \"errors\": [ { \"message\": \"Something went wrong\", \"extensions\": { \"code\": \"INTERNAL_SERVER_ERRROR\" } } ] }" +} +``` + +```json +{ + "control": { "break": 200 }, + "body": "{ \"data\": { \"currentUser\": { \"name\": \"Ada Lovelace\" } }" +} +``` + + + + + +If you return a successful response, make sure the structure of the `data` property matches the structure expected by the client query. + + + +### Failed responses + +If a request to a coprocessor results in a **failed response**, which is seperate from a **control break**, the router will return an error to the client making the supergraph request. The router considers all of the following scenarios to be a **failed response** from your coprocessor: + +- Your coprocessor doesn't respond within the amount of time specified by the `timeout` key in your [configuration](#typical-configuration) (default one second). +- Your coprocessor responds with a non-`2xx` HTTP code. +- Your coprocessor's response body doesn't match the JSON structure of the corresponding [request body](#example-requests-by-stage). +- Your coprocessor's response body sets different values for [control properties](#property-reference) that must not change, such as `stage` and `version`. + +## Handling deferred query responses + +GraphOS Router and Apollo Router Core support the incremental delivery of query response data via [the `@defer` directive](/router/executing-operations/defer-support/): + +```mermaid +sequenceDiagram + Client->>Router: Sends a query that
defers some fields + Note over Router: Resolves non-deferred
fields + Router->>Client: Returns data for
non-deferred fields + Note over Router: Resolves deferred
fields + Router->>Client: Returns data for
deferred fields +``` + +For a single query with deferred fields, your router sends multiple "chunks" of response data to the client. If you enable coprocessor requests for the `RouterResponse` stage, your router sends a separate coprocessor request for _each chunk_ it returns as part of a deferred query. + +**Note the following about handling deferred response chunks:** + +- The [`status_code`](#status_code) and [`headers`](#headers) fields are included only in the coprocessor request for any response's _first_ chunk. These values can't change after the first chunk is returned to the client, so they're subsequently omitted. + +- If your coprocessor modifes the response [`body`](#body) for a response chunk, it must provide the new value as a _string_, _not_ as an object. This is because response chunk bodies include multipart boundary information in addition to the actual serialized JSON response data. [See examples.](#examples-of-deferred-response-chunks) + + - Many responses will not contain deferred streams and for these the body string can usually be fairly reliably transformed into a JSON object for easy manipulation within the coprocessor. Coprocessors should be carefully coded to allow for the presence of a body that is not a valid JSON object. + +- Because the data is a JSON string at both `RouterRequest` and `RouterResponse`, it's entirely possible for a coprocessor to rewrite the body from invalid JSON content into valid JSON content. This is one of the primary use cases for `RouterRequest` body processing. + +### Examples of deferred response chunks + +The examples below illustrate the differences between the _first_ chunk of a deferred response and all subsequent chunks: + +#### First response chunk + +The first response chunk includes `headers` and `statusCode` fields: + +```json +{ + "version": 1, + "stage": "RouterResponse", + "id": "8dee7fe947273640a5c2c7e1da90208c", + "sdl": "...", // String omitted due to length + // highlight-start + "headers": { + "content-type": ["multipart/mixed;boundary=\"graphql\";deferSpec=20220824"], + "vary": ["origin"] + }, + // highlight-end + "body": "\r\n--graphql\r\ncontent-type: application/json\r\n\r\n{\"data\":{\"me\":{\"id\":\"1\"}},\"hasNext\":true}\r\n--graphql\r\n", + "context": { + "entries": { + "apollo::supergraph::operation_kind": "query", + "apollo::telemetry::client_version": "", + "apollo::telemetry::client_name": "manual" + } + }, + "statusCode": 200 //highlight-line +} +``` + +#### Subsequent response chunk + +Subsequent response chunks omit the `headers` and `statusCode` fields: + +```json +{ + "version": 1, + "stage": "RouterResponse", + "id": "8dee7fe947273640a5c2c7e1da90208c", + "sdl": "...", // String omitted due to length + "body": "content-type: application/json\r\n\r\n{\"hasNext\":false,\"incremental\":[{\"data\":{\"name\":\"Ada Lovelace\"},\"path\":[\"me\"]}]}\r\n--graphql--\r\n", + "context": { + "entries": { + "apollo::supergraph::operation_kind": "query", + "apollo::telemetry::client_version": "", + "apollo::telemetry::client_name": "manual" + } + } +} +``` + +## Adding authorization claims via coprocessor + +To use the [authorization directives](/router/configuration/authorization#authorization-directives), a request needs to include **claims**—the details of its authentication and scope. The most straightforward way to add claims is with [JWT authentication](/router/configuration/./authn-jwt). You can also add claims with a [`RouterService` or `SupergraphService` coprocessor](#how-it-works) since they hook into the request lifecycle before the router applies authorization logic. + +An example configuration of the router calling a coprocessor for authorization claims: + +```yaml title="router.yaml" +coprocessor: + url: http://127.0.0.1:8081 # Required. Replace with the URL of your coprocessor's HTTP endpoint. + router: # By including this key, a coprocessor can hook into the `RouterService`. You can also use `SupergraphService` for authorization. + request: # By including this key, the `RouterService` sends a coprocessor request whenever it first receives a client request. + headers: false # These boolean properties indicate which request data to include in the coprocessor request. All are optional and false by default. + context: all # The authorization directives works with claims stored in the request's context +``` + +This configuration prompts the router to send an HTTP POST request to your coprocessor whenever it receives a client request. For example, your coprocessor may receive a request with this format: + +```json +{ + "version": 1, + "stage": "RouterRequest", + "control": "continue", + "id": "d0a8245df0efe8aa38a80dba1147fb2e", + "context": { + "entries": { + "accepts-json": true + } + } +} +``` + +When your coprocessor receives this request from the router, it should add claims to the request's [`context`](#context) and return them in the response to the router. Specifically, the coprocessor should add an entry with a claims object. The key must be `apollo::authentication::jwt_claims`, and the value should be the claims required by the authorization directives you intend to use. For example, if you want to use [`@requireScopes`](/router/configuration/authorization#requiresscopes), the response may look something like this: + +```json +{ + "version": 1, + "stage": "RouterRequest", + "control": "continue", + "id": "d0a8245df0efe8aa38a80dba1147fb2e", + "context": { + "entries": { + "accepts-json": true, + "apollo::authentication::jwt_claims": { + "scope": "profile:read profile:write" + } + } + } +} +``` + +## Additional resources + +- See the Apollo Solutions ["Hello World" coprocessor](https://github.com/apollosolutions/example-coprocessor-helloworld) for an example of a coprocessor that simply logs the router's payload. +- See the following Apollo Solutions authorization and authentication examples: + - [External authentication coprocessor example](https://github.com/apollosolutions/example-coprocessor-external-auth) + - [Custom auth coprocessor example](https://github.com/apollosolutions/example-coprocessor-custom-auth-directive) + - [`@policy` coprocessor example](https://github.com/apollosolutions/example-coprocessor-auth-policy) +- Use the Apollo Solutions [router extensibility load testing repository](https://github.com/apollosolutions/router-extensibility-load-testing) to load test coprocessors. + + diff --git a/docs/source/routing/customization/coprocessor/reference.mdx b/docs/source/routing/customization/coprocessor/reference.mdx new file mode 100644 index 0000000000..d5cda41277 --- /dev/null +++ b/docs/source/routing/customization/coprocessor/reference.mdx @@ -0,0 +1,844 @@ +--- +title: Coprocessor Reference +--- + +## Property reference + +Table of coprocessor request properties. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Property / TypeDescription
+ +**Control properties** + +
+ +##### `control` + +`string | object` + + + +Indicates whether the router should continue processing the current client request. In coprocessor request bodies from the router, this value is always the string value `continue`. + +In your coprocessor's response, you can instead return an _object_ with the following format: + +```json +{ "break": 400 } +``` + +If you do this, the router terminates the request-handling lifecycle and immediately responds to the client with the provided HTTP code and response [`body`](#body) you specify. + +For details, see [Terminating a client request](#terminating-a-client-request). + +
+ +##### `id` + +`string` + + + +A unique ID corresponding to the client request associated with this coprocessor request. + +**Do not return a _different_ value for this property.** If you do, the router treats the coprocessor request as if it failed. + +
+ +##### `subgraphRequestId` + +`string` + + + +A unique ID corresponding to the subgraph request associated with this coprocessor request (only available at the `SubgraphRequest` and `SubgraphResponse` stages). + +**Do not return a _different_ value for this property.** If you do, the router treats the coprocessor request as if it failed. + +
+ +##### `stage` + +`string` + + + +Indicates which stage of the router's [request-handling lifecycle](/graphos/routing/customization/rhai/#router-request-lifecycle) this coprocessor request corresponds to. + +This value is one of the following: + +- `RouterRequest`: The `RouterService` has just received a client request. +- `RouterResponse`: The `RouterService` is about to send response data to a client. +- `SupergraphRequest`: The `SupergraphService` is about to send a GraphQL request. +- `SupergraphResponse`: The `SupergraphService` has just received a GraphQL response. +- `SubgraphRequest`: The `SubgraphService` is about to send a request to a subgraph. +- `SubgraphResponse`: The `SubgraphService` has just received a subgraph response. + +**Do not return a _different_ value for this property.** If you do, the router treats the coprocessor request as if it failed. + +
+ +##### `version` + +`number` + + + +Indicates which version of the coprocessor request protocol the router is using. + +Currently, this value is always `1`. + +**Do not return a _different_ value for this property.** If you do, the router treats the coprocessor request as if it failed. + +
+ +**Data properties** + +
+ +##### `body` + +`string | object` + + + +The body of the corresponding request or response. + +This field is populated when the underlying HTTP method is `POST`. If you are looking for operation data on `GET` requests, that info will be populated in the `path` parameter per the [GraphQL over HTTP spec](https://github.com/graphql/graphql-over-http/blob/main/spec/GraphQLOverHTTP.md#get). + +If your coprocessor [returns a _different_ value](#responding-to-coprocessor-requests) for `body`, the router replaces the existing body with that value. This is common when [terminating a client request](#terminating-a-client-request). + +This field's type depends on the coprocessor request's [`stage`](#stage): + +- For `SubgraphService` stages, `body` is a JSON _object_. +- For `SupergraphService` stages, `body` is a JSON _object_. +- For `RouterService` stages, `body` is a JSON _string_. + - This is necessary to support handling [deferred queries](#handling-deferred-query-responses). + - If you modify `body` during the `RouterRequest` stage, the new value must be a valid string serialization of a JSON object. If it isn't, the router detects that the body is malformed and returns an error to the client. + +This field's structure depends on whether the coprocessor request corresponds to a request, a standard response, or a response "chunk" for a deferred query: + +- **If a request,** `body` usually contains a `query` property containing the GraphQL query string. +- **If a standard response,** `body` usually contains `data` and/or `errors` properties for the GraphQL operation result. +- **If a response "chunk",** `body` contains `data` for _some_ of the operation fields. + +By default, the `RouterResponse` stage returns _redacted_ errors within the `errors` field. To process subgraph errors manually in your coprocessor, enable [subgraph error inclusion](/router/configuration/subgraph-error-inclusion). + +
+ +##### `context` + +`object` + + + +An object representing the router's shared context for the corresponding client request. + +If your coprocessor [returns a _different_ value](#responding-to-coprocessor-requests) for `context`, the router replaces the existing context with that value. + +
+ +##### `hasNext` + +`bool` + + + +When `stage` is `SupergraphResponse`, if present and `true` then there will be subsequent `SupergraphResponse` calls to the co-processor for each multi-part (`@defer`/subscriptions) response. + +
+ +##### `headers` + +`object` + + + +An object mapping of all HTTP header names and values for the corresponding request or response. + +Ensure headers are handled like HTTP headers in general. For example, normalize header case before your coprocessor operates on them. + +If your coprocessor [returns a _different_ value](#responding-to-coprocessor-requests) for `headers`, the router replaces the existing headers with that value. + +> The router discards any `content-length` headers sent by coprocessors because incorrect `content-length` values can lead to HTTP request failures. + +
+ +##### `method` + +`string` + + + +The HTTP method that is used by the request. + +
+ +##### `path` + +`string` + + + +The `RouterService` or `SupergraphService` path that this coprocessor request pertains to. + +
+ +##### `sdl` + +`string` + + + +A string representation of the router's current supergraph schema. + +This value can be very large, so you should avoid including it in coprocessor requests if possible. + +The router ignores modifications to this value. + +
+ +##### `serviceName` + +`string` + + + +The name of the subgraph that this coprocessor request pertains to. + +This value is present only for coprocessor requests from the router's `SubgraphService`. + +**Do not return a _different_ value for this property.** If you do, the router treats the coprocessor request as if it failed. + +
+ +##### `statusCode` + +`number` + + + +The HTTP status code returned with a response. + +
+ +##### `uri` + +`string` + + + +When `stage` is `SubgraphRequest`, this is the full URI of the subgraph the router will query. + +
+ +##### `query_plan` + +`string` + + + +When `stage` is `ExecutionRequest`, this contains the query plan for the client query. It cannot be modified by the coprocessor. + +
+ +## Example requests by stage + +### `RouterRequest` + + + +```json title="Example coprocessor request body" +{ + // Control properties + "version": 1, + "stage": "RouterRequest", + "control": "continue", + "id": "1b19c05fdafc521016df33148ad63c1b", + + // Data properties + "headers": { + "cookie": [ + "tasty_cookie=strawberry" + ], + "content-type": [ + "application/json" + ], + "host": [ + "127.0.0.1:4000" + ], + "apollo-federation-include-trace": [ + "ftv1" + ], + "apollographql-client-name": [ + "manual" + ], + "accept": [ + "*/*" + ], + "user-agent": [ + "curl/7.79.1" + ], + "content-length": [ + "46" + ] + }, + "body": "{ + \"query\": \"query GetActiveUser {\n me {\n name\n}\n}\" + }", + "context": { + "entries": { + "accepts-json": false, + "accepts-wildcard": true, + "accepts-multipart": false + } + }, + "sdl": "...", // String omitted due to length + "path": "/", + "method": "POST" +} +``` + + + +### `RouterResponse` + + + +```json +{ + // Control properties + "version": 1, + "stage": "RouterResponse", + "control": "continue", + "id": "1b19c05fdafc521016df33148ad63c1b", + + // Data properties + "headers": { + "vary": [ + "origin" + ], + "content-type": [ + "application/json" + ] + }, + "body": "{ + \"data\": { + \"me\": { + \"name\": \"Ada Lovelace\" + } + } + }", + "context": { + "entries": { + "apollo_telemetry::subgraph_metrics_attributes": {}, + "accepts-json": false, + "accepts-multipart": false, + "apollo::telemetry::client_name": "manual", + "apollo_telemetry::usage_reporting": { + "statsReportKey": "# Long\nquery Long{me{name}}", + "referencedFieldsByType": { + "User": { + "fieldNames": [ + "name" + ], + "isInterface": false + }, + "Query": { + "fieldNames": [ + "me" + ], + "isInterface": false + } + } + }, + "apollo::telemetry::client_version": "", + "accepts-wildcard": true + } + }, + "statusCode": 200, + "sdl": "..." // Omitted due to length +} +``` + + + +### `SupergraphRequest` + + + +```json +{ + // Control properties + "version": 1, + "stage": "SupergraphRequest", + "control": "continue", + + // Data properties + "headers": { + "cookie": ["tasty_cookie=strawberry"], + "content-type": ["application/json"], + "host": ["127.0.0.1:4000"], + "apollo-federation-include-trace": ["ftv1"], + "apollographql-client-name": ["manual"], + "accept": ["*/*"], + "user-agent": ["curl/7.79.1"], + "content-length": ["46"] + }, + "body": { + "query": "query Long {\n me {\n name\n}\n}", + "operationName": "MyQuery", + "variables": {} + }, + "context": { + "entries": { + "accepts-json": false, + "accepts-wildcard": true, + "accepts-multipart": false, + "this-is-a-test-context": 42 + } + }, + "serviceName": "service name shouldn't change", + "uri": "http://thisurihaschanged" +} +``` + + + +### `SupergraphResponse` + + + +```json +{ + // Control properties + "version": 1, + "stage": "SupergraphResponse", + "control": { + "break": 200 + }, + + // Data properties + "body": { + "errors": [{ "message": "my error message" }] + }, + "context": { + "entries": { + "testKey": true + } + }, + "headers": { + "aheader": ["a value"] + } +} +``` + + + +#### `ExecutionRequest` + + + +```json +{ + // Control properties + "version": 1, + "stage": "ExecutionRequest", + "control": "continue", + + // Data properties + "headers": { + "cookie": ["tasty_cookie=strawberry"], + "content-type": ["application/json"], + "host": ["127.0.0.1:4000"], + "apollo-federation-include-trace": ["ftv1"], + "apollographql-client-name": ["manual"], + "accept": ["*/*"], + "user-agent": ["curl/7.79.1"], + "content-length": ["46"] + }, + "body": { + "query": "query Long {\n me {\n name\n}\n}", + "operationName": "MyQuery" + }, + "context": { + "entries": { + "accepts-json": false, + "accepts-wildcard": true, + "accepts-multipart": false, + "this-is-a-test-context": 42 + } + }, + "serviceName": "service name shouldn't change", + "uri": "http://thisurihaschanged", + "queryPlan": { + "usage_reporting": { + "statsReportKey": "# Me\nquery Me{me{name username}}", + "referencedFieldsByType": { + "User": { "fieldNames": ["name", "username"], "isInterface": false }, + "Query": { "fieldNames": ["me"], "isInterface": false } + } + }, + "root": { + "kind": "Fetch", + "serviceName": "accounts", + "variableUsages": [], + "operation": "query Me__accounts__0{me{name username}}", + "operationName": "Me__accounts__0", + "operationKind": "query", + "id": null, + "inputRewrites": null, + "outputRewrites": null, + "authorization": { + "is_authenticated": false, + "scopes": [], + "policies": [] + } + }, + "formatted_query_plan": "QueryPlan {\n Fetch(service: \"accounts\") {\n {\n me {\n name\n username\n }\n }\n },\n}", + "query": { + "string": "query Me {\n me {\n name\n username\n }\n}\n", + "fragments": { "map": {} }, + "operations": [ + { + "name": "Me", + "kind": "query", + "type_name": "Query", + "selection_set": [ + { + "Field": { + "name": "me", + "alias": null, + "selection_set": [ + { + "Field": { + "name": "name", + "alias": null, + "selection_set": null, + "field_type": { "Named": "String" }, + "include_skip": { "include": "Yes", "skip": "No" } + } + }, + { + "Field": { + "name": "username", + "alias": null, + "selection_set": null, + "field_type": { "Named": "String" }, + "include_skip": { "include": "Yes", "skip": "No" } + } + } + ], + "field_type": { "Named": "User" }, + "include_skip": { "include": "Yes", "skip": "No" } + } + } + ], + "variables": {} + } + ], + "subselections": {}, + "unauthorized": { + "paths": [], + "errors": { "log": true, "response": "errors" } + }, + "filtered_query": null, + "defer_stats": { + "has_defer": false, + "has_unconditional_defer": false, + "conditional_defer_variable_names": [] + }, + "is_original": true + } + } +} +``` + + + +### `ExecutionResponse` + + + +```json +{ + // Control properties + "version": 1, + "stage": "ExecutionResponse", + "control": { + "break": 200 + }, + + // Data properties + "body": { + "errors": [{ "message": "my error message" }] + }, + "context": { + "entries": { + "testKey": true + } + }, + "headers": { + "aheader": ["a value"] + } +} +``` + + + +#### `SubgraphRequest` + + + +```json +{ + // Control properties + "version": 1, + "stage": "SubgraphRequest", + "control": "continue", + "id": "666d677225c1bc6d7c54a52b409dbd4e", + "subgraphRequestId": "b5964998b2394b64a864ef802fb5a4b3", + + // Data properties + "headers": {}, + "body": { + "query": "query TopProducts__reviews__1($representations:[_Any!]!){_entities(representations:$representations){...on Product{reviews{body id}}}}", + "operationName": "TopProducts__reviews__1", + "variables": { + "representations": [ + { + "__typename": "Product", + "upc": "1" + }, + { + "__typename": "Product", + "upc": "2" + }, + { + "__typename": "Product", + "upc": "3" + } + ] + } + }, + "context": { + "entries": { + "apollo_telemetry::usage_reporting": { + "statsReportKey": "# TopProducts\nquery TopProducts{topProducts{name price reviews{body id}}}", + "referencedFieldsByType": { + "Query": { + "fieldNames": ["topProducts"], + "isInterface": false + }, + "Review": { + "fieldNames": ["body", "id"], + "isInterface": false + }, + "Product": { + "fieldNames": ["price", "name", "reviews"], + "isInterface": false + } + } + }, + "apollo::telemetry::client_version": "", + "apollo_telemetry::subgraph_metrics_attributes": {}, + "apollo::telemetry::client_name": "" + } + }, + "uri": "https://reviews.demo.starstuff.dev/", + "method": "POST", + "serviceName": "reviews" +} +``` + + + +### `SubgraphResponse` + + + +```json +{ + // Control properties + "version": 1, + "stage": "SubgraphResponse", + "id": "b7810c6f7f95640fd6c6c8781e3953c0", + "subgraphRequestId": "b5964998b2394b64a864ef802fb5a4b3", + "control": "continue", + + // Data properties + "headers": { + "etag": ["W/\"d3-7aayASjs0+e2c/TpiAYgEu/yyo0\""], + "via": ["2 fly.io"], + "server": ["Fly/90d459b3 (2023-03-07)"], + "date": ["Thu, 09 Mar 2023 14:28:46 GMT"], + "x-powered-by": ["Express"], + "x-ratelimit-limit": ["10000000"], + "access-control-allow-origin": ["*"], + "x-ratelimit-remaining": ["9999478"], + "content-type": ["application/json; charset=utf-8"], + "fly-request-id": ["01GV3CCG5EM3ZNVZD2GH0B00E2-lhr"], + "x-ratelimit-reset": ["1678374007"] + }, + "body": { + "data": { + "_entities": [ + { + "reviews": [ + { + "body": "Love it!", + "id": "1" + }, + { + "body": "Prefer something else.", + "id": "4" + } + ] + }, + { + "reviews": [ + { + "body": "Too expensive.", + "id": "2" + } + ] + }, + { + "reviews": [ + { + "body": "Could be better.", + "id": "3" + } + ] + } + ] + } + }, + "context": { + "entries": { + "apollo_telemetry::usage_reporting": { + "statsReportKey": "# TopProducts\nquery TopProducts{topProducts{name price reviews{body id}}}", + "referencedFieldsByType": { + "Product": { + "fieldNames": ["price", "name", "reviews"], + "isInterface": false + }, + "Query": { + "fieldNames": ["topProducts"], + "isInterface": false + }, + "Review": { + "fieldNames": ["body", "id"], + "isInterface": false + } + } + }, + "apollo::telemetry::client_version": "", + "apollo_telemetry::subgraph_metrics_attributes": {}, + "apollo::telemetry::client_name": "" + } + }, + "serviceName": "reviews", + "statusCode": 200 +} +``` + + diff --git a/docs/source/routing/customization/rhai.mdx b/docs/source/routing/customization/rhai/index.mdx similarity index 100% rename from docs/source/routing/customization/rhai.mdx rename to docs/source/routing/customization/rhai/index.mdx diff --git a/docs/source/routing/customization/rhai-reference.mdx b/docs/source/routing/customization/rhai/reference.mdx similarity index 99% rename from docs/source/routing/customization/rhai-reference.mdx rename to docs/source/routing/customization/rhai/reference.mdx index 028551c14f..7fda1085f1 100644 --- a/docs/source/routing/customization/rhai-reference.mdx +++ b/docs/source/routing/customization/rhai/reference.mdx @@ -2,6 +2,9 @@ title: Rhai Script API Reference subtitle: APIs for router customizations description: This reference documents the symbols and behaviors that are specific to Rhai customizations for the Apollo GraphOS Router and Apollo Router Core. Includes entry point hooks, logging, and more. +redirectFrom: + - /graphos/routing/customization/rhai-reference + --- This reference documents the symbols and behaviors that are specific to [Rhai customizations](/graphos/routing/customization/rhai/) for the GraphOS Router and Apollo Router Core. From 994108a329e1317d3042e87a41cfd61e678eef81 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Thu, 8 May 2025 23:59:23 -0700 Subject: [PATCH 36/47] update (outdated) config.json --- docs/source/config.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/source/config.json b/docs/source/config.json index 8e481a369b..4fd0c6569c 100644 --- a/docs/source/config.json +++ b/docs/source/config.json @@ -2,9 +2,6 @@ "title": "Self-Hosted Router", "algoliaFilters": ["docset:router"], "sidebar": { - "Routing": { - "About Router": "/routing/about-router" - }, "Reference": { "Migration": { "From Gateway": "/reference/migration/from-gateway" From cd53d0ad317e6bdef39b5e9e25c766adfb946882 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 12 May 2025 10:00:09 -0700 Subject: [PATCH 37/47] Apply suggestions from code review Co-authored-by: Danielle Man --- docs/source/routing/get-started.mdx | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx index 5b9a52fcae..0a05f1d816 100644 --- a/docs/source/routing/get-started.mdx +++ b/docs/source/routing/get-started.mdx @@ -1,26 +1,26 @@ --- title: Apollo Router Quickstart -subtitle: Run a router binary +subtitle: Run the router locally description: This quickstart tutorial walks you through installing an Apollo Router binary, running it with an example supergraph schema and a YAML configuration file, and making test queries with Apollo Sandbox. --- import ElasticNotice from "../../shared/elastic-notice.mdx"; -Hello! Let's run Apollo Router for the first time, using the simple scenario of developing and deploying locally. +Hello! Let's run Apollo Router for the first time, using the simple scenario of developing locally. In this guide, you will: -- Download and install a router binary. -- Download a supergraph schema. +- Download and run the router as a binary. +- Create a supergraph schema. - Create a router YAML configuration file. - Run the router in development mode. - Make a query to the running router. -## 1. Install router binary +## 1. Download the router -Let's start by downloading and installing a router binary locally. +Let's start by downloading and running the router locally. -1. Download and install the latest version of the router binary with a single command line: +1. Download the latest version of the router binary with a single command line: ```bash showLineNumbers=false curl -sSL https://router.apollo.dev/download/nix/latest | sh @@ -40,14 +40,14 @@ Let's start by downloading and installing a router binary locally. Optionally, go to [router releases](https://github.com/apollographql/router/releases) in GitHub to download and extract a bundle. -1. Check that your router installed successfully by running the `router` binary from your project's root directory: +1. Check that your router downloaded successfully by running the `router` binary from your project's root directory: ```bash showLineNumbers=false ./router --version ``` -## 2. Download supergraph schema +## 2. Create a supergraph schema A router needs a schema for the federated graph, or _supergraph_, that it's orchestrating. This guide uses an example supergraph schema, which you download and provide to the router. @@ -192,7 +192,7 @@ type User
-## 3. Create and edit YAML configuration file +## 3. Create a router config The router's many features are configurable via a YAML configuration file. You set your options declaratively in YAML, then point your router to it at startup. @@ -208,7 +208,6 @@ Let's customize a common setting: the router's _supergraph listen address_. It's ## 4. Run the router -When you're developing with the router locally, it's useful to run the router in _dev mode_. Dev mode is a collection of settings that make router development and debugging easier. Let's run the router in dev mode, using both the supergraph schema and YAML configuration files you created: @@ -250,11 +249,10 @@ Let's run the router in dev mode, using both the supergraph schema and YAML conf ## 5. Make a query -A router in dev mode runs its own [Apollo Sandbox](/graphos/explorer/sandbox/), a local GraphQL server running a development instance of your graph. Sandbox has a browser-based IDE, Explorer, that you can use to write and send real GraphQL queries to your development graph. +When the router runs in dev mode, it hosts an [Apollo Sandbox](/graphos/explorer/sandbox/) automatically. Sandbox has a browser-based IDE, Explorer, that you can use to write and send real GraphQL queries to your graph. -Let's use Sandbox and its Explorer IDE to write a query and send it to your graph: -1. Go to the URL of the router's Sandbox, [`http://127.0.0.1:5555`](http://127.0.0.1:5555). The Explorer IDE should be running. +1. Go to the URL your router is running at, [`http://127.0.0.1:5555`](http://127.0.0.1:5555). Sandbox should be running there. 1. Copy and paste the example query into the **Operation** pane of Explorer: From 16bfecbab310fa311fb1d17615ee4afdd05cf733 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 12 May 2025 11:51:17 -0700 Subject: [PATCH 38/47] Update docs/source/routing/graphos-features.mdx Co-authored-by: Maria Elisabeth Schreiber --- docs/source/routing/graphos-features.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/routing/graphos-features.mdx b/docs/source/routing/graphos-features.mdx index c546c36bf5..035876d2e1 100644 --- a/docs/source/routing/graphos-features.mdx +++ b/docs/source/routing/graphos-features.mdx @@ -10,7 +10,7 @@ This page lists the additional features of GraphOS Router that are enabled via i > Refer to the [pricing page](https://www.apollographql.com/pricing) to compare GraphOS Router features across plan types. -## GraphOS Router licensed plan features +## GraphOS Router licensed features - Real-time updates via [GraphQL subscriptions](/graphos/routing/operations/subscriptions) - Improved performance with [query batching](/graphos/routing/performance/query-batching) From a2e3cc5daed8f9f73c3eb7504e452c313057c758 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 12 May 2025 12:16:49 -0700 Subject: [PATCH 39/47] address review comments --- docs/source/routing/configuration/cli.mdx | 18 ++++++------- docs/source/routing/get-started.mdx | 32 ++++++++++++++++++++--- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/docs/source/routing/configuration/cli.mdx b/docs/source/routing/configuration/cli.mdx index e97f674211..f0dcc9d821 100644 --- a/docs/source/routing/configuration/cli.mdx +++ b/docs/source/routing/configuration/cli.mdx @@ -38,13 +38,13 @@ For options available as both a command-line option and an environment variable, -The [supergraph schema](/federation/federated-types/overview#supergraph-schema) of a router. Specified by absolute or relative path (`-s` / `--supergraph `, or `APOLLO_ROUTER_SUPERGRAPH_PATH`), or a comma-separated list of URLs (`--supergraph-urls `, or `APOLLO_ROUTER_SUPERGRAPH_URLS`). +The [supergraph schema](/federation/federated-types/overview#supergraph-schema) of a router. Specified by absolute or relative path (`-s` / `--supergraph `, or `APOLLO_ROUTER_SUPERGRAPH_PATH`), or a comma-separated list of URLs (`--supergraph-urls `, or `APOLLO_ROUTER_SUPERGRAPH_URLS`).

-> 💡 Avoid embedding tokens in `APOLLO_ROUTER_SUPERGRAPH_URLS` because the URLs may appear in log messages. +> 💡 Avoid embedding tokens in `APOLLO_ROUTER_SUPERGRAPH_URLS` because the URLs may appear in log messages.

-Setting this option disables polling from Apollo Uplink to fetch the latest supergraph schema. +Setting this option disables polling from Apollo Uplink to fetch the latest supergraph schema.
-To learn how to compose your supergraph schema with the Rover CLI, see the [Federation quickstart](/federation/quickstart). +To learn how to compose your supergraph schema with the Rover CLI, see the [Federation quickstart](/federation/quickstart).

**Required** if you are _not_ using managed federation. If you _are_ using managed federation, you may need to set this option when following [advanced deployment workflows](/federation/managed-federation/deployment/#advanced-deployment-workflows). @@ -142,11 +142,11 @@ The default value is `info`. -An offline GraphOS Enterprise license. Enables Enterprise router features when disconnected from GraphOS. +An offline GraphOS Enterprise license. Enables Enterprise router features when disconnected from GraphOS.
-An offline license is specified either as an absolute or relative path to a license file (`--license ` or `APOLLO_ROUTER_LICENSE_PATH`), or as the stringified contents of a license (`APOLLO_ROUTER_LICENSE`). +An offline license is specified either as an absolute or relative path to a license file (`--license ` or `APOLLO_ROUTER_LICENSE_PATH`), or as the stringified contents of a license (`APOLLO_ROUTER_LICENSE`).
-When not set, the router retrieves an Enterprise license [from GraphOS via Apollo Uplink](/router/enterprise-features/#the-enterprise-license). +When not set, the router retrieves an Enterprise license [from GraphOS via Apollo Uplink](/router/enterprise-features/#the-enterprise-license).
For information about fetching an offline license and configuring the router, see [Offline Enterprise license](/router/enterprise-features/#offline-enterprise-license). @@ -163,9 +163,9 @@ For information about fetching an offline license and configuring the router, se -If using [managed federation](/federation/managed-federation/overview/), the Apollo Uplink URL(s) that the router should poll to fetch its latest configuration. Almost all managed router instances should _omit_ this option to use the default set of Uplink URLs. +If using [managed federation](/federation/managed-federation/overview/), the Apollo Uplink URL(s) that the router should poll to fetch its latest configuration. Almost all managed router instances should _omit_ this option to use the default set of Uplink URLs.
-If you specify multiple URLs, separate them with commas (no whitespace). +If you specify multiple URLs, separate them with commas (no whitespace).
For default behavior and possible values, see [Apollo Uplink](/federation/managed-federation/uplink/). diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx index 0a05f1d816..f9aa8fd309 100644 --- a/docs/source/routing/get-started.mdx +++ b/docs/source/routing/get-started.mdx @@ -49,17 +49,19 @@ Let's start by downloading and running the router locally. ## 2. Create a supergraph schema -A router needs a schema for the federated graph, or _supergraph_, that it's orchestrating. This guide uses an example supergraph schema, which you download and provide to the router. +A router needs a schema for the federated graph, or _supergraph_, that it's orchestrating. This guide uses an example supergraph schema, which you download and provide to the router. + +The example supergraph schema is composed of four subgraphs: `accounts`, `inventory`, `products`, and `reviews`. It outlines the types (`Query`, `Mutation`, `Product`, `Review`, `User`) and their fields, and it specifies which subgraph is responsible for resolving each piece of data using Apollo Federation directives (`@join__*`, `@link`). 1. From your project's root directory, run the following to download and save an example supergraph schema: ```bash showLineNumbers=false - curl -sSL https://supergraph.demo.starstuff.dev/ > supergraph-schema.graphql + curl -sSL https://supergraph.demo.starstuff.dev/ > supergraph.graphql ``` -```graphql title="supergraph-schema.graphql" +```graphql title="supergraph.graphql" schema @link(url: "https://specs.apollo.dev/link/v1.0") @link(url: "https://specs.apollo.dev/join/v0.3", for: EXECUTION) { @@ -217,9 +219,31 @@ Let's run the router in dev mode, using both the supergraph schema and YAML conf - `--supergraph` provides the path to your supergraph schema ```sh showLineNumbers=false - ./router --dev --config router.yaml --supergraph supergraph-schema.graphql + ./router --dev --config router.yaml --supergraph supergraph.graphql + ``` + + + + Running router with `--dev` is the same as using the following configuration: + + ```yaml title="Same configuration as --dev" + sandbox: + enabled: true + homepage: + enabled: false + supergraph: + introspection: true + include_subgraph_errors: + all: true + plugins: + # Enable with the header, Apollo-Expose-Query-Plan: true + experimental.expose_query_plan: true ``` + [Learn more](/graphos/routing/configuration/cli#development-mode) about router dev mode. + + + 1. Check that your router is running, with output similar to the example: From b56e5212b85b282a40fe4d7d4981b5b47cfd7a77 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 12 May 2025 12:47:11 -0700 Subject: [PATCH 40/47] clean up --- .../routing/operations/defer-overview.mdx | 137 ------------------ docs/source/routing/operations/defer.mdx | 130 ++++++++++++++++- docs/source/routing/operations/index.mdx | 11 -- 3 files changed, 126 insertions(+), 152 deletions(-) delete mode 100644 docs/source/routing/operations/defer-overview.mdx delete mode 100644 docs/source/routing/operations/index.mdx diff --git a/docs/source/routing/operations/defer-overview.mdx b/docs/source/routing/operations/defer-overview.mdx deleted file mode 100644 index ed7f01c580..0000000000 --- a/docs/source/routing/operations/defer-overview.mdx +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: Overview of @defer directive support -subtitle: Improve performance by delivering fields incrementally -description: Improve your GraphQL query performance with GraphOS Router and Apollo Router Core's support for the @defer directive. Incrementally deliver response data by deferring certain fields. -minVersion: 1.8.0 ---- - -Apollo Router's support of the `@defer` directive helps client developers tackle the common challenge of how to create a responsive user experience when certain fields of a query take longer to resolve than others. `@defer` improves application performance by delivering response data incrementally. This is important for real-time applications like dashboards or reports. By deferring data for some fields, the router can resolve and return data for the query's _other_ fields more quickly, improving responsiveness. - -## What is `@defer`? - -The `@defer` directive enables a client query to specify sets of fields that it doesn't need to receive data for _immediately_. This is helpful whenever some fields in a query take much longer to resolve than others. - -The `@defer` directive is applied to a GraphQL query. Specifically, deferred fields are always contained within a GraphQL fragment, and the `@defer` directive is applied to that fragment. - -Here's an example query that uses `@defer`: - -```graphql -query GetTopProducts { - topProducts { - id - name - # highlight-start - ... @defer { - price - } - # highlight-end - } -} -``` - -To respond incrementally, the router uses a multipart-encoded HTTP response. To use `@defer` successfully with the router, a client's GraphQL library must _also_ support the directive by handling multipart HTTP responses correctly. - -The router's `@defer` support is compatible with all [federation-compatible subgraph libraries](/federation/building-supergraphs/supported-subgraphs/). That's because the router takes advantage of your supergraph's existing [entities](/federation/entities/) to fetch any deferred field data via followup queries to your subgraphs. - - -## Which fields can my router defer? - -Your router can defer the following fields in your schema: - -- Root fields of the `Query` type (along with their subfields) -- Fields of any entity type (along with their subfields) - - Deferring entity fields is extremely powerful but requires some setup if you aren't using entities already. This is covered in more detail [below](#entity-fields). - -See below for more information on each of these. - -### `Query` fields - -Your router can defer any field of your schema's `Query` type, along with any subfields of those fields: - -```graphql -query GetUsersAndDeferProducts { - users { - id - } - # highlight-start - ... @defer { - products { - id - } - } - # highlight-end -} -``` - -With the query above, the router first returns a list of `User` IDs, then later completes the response with a list of `Product` IDs. - -### Entity fields - -Your router supports deferring fields of the special object types in your supergraph called entities. - -Entities are object types that often define their fields across multiple subgraphs (but they don't have to). You can identify an entity by its use of the `@key` directive. In the example subgraph schemas below, the `Product` type is an entity: - - - -```graphql title="Products subgraph" -type Product @key(fields: "id") { - id: ID! - name: String! - price: Int! -} - -type Query { - topProducts: [Product!]! -} -``` - -```graphql title="Reviews subgraph" -type Product @key(fields: "id") { - id: ID! - reviews: [Review!]! -} - -type Review { - score: Int! -} -``` - - - -Entities are query entry points into your subgraphs, and this is what enables your router to defer their fields: the router can send a followup query to a subgraph to fetch any entity fields that it doesn't fetch initially. - -Here's an example query that defers entity fields using the subgraphs above: - -```graphql -query GetProductsAndDeferReviews { - topProducts { - id - name - # highlight-start - ... @defer { - reviews { - score - } - } - # highlight-end - } -} -``` - -To handle this query, the router first resolves and returns a list of `Product` objects with their IDs and names. Later, the router completes the response by returning review scores for each of those products. - - - -It doesn't matter which subgraph defines a particular entity field! Queries can defer entity fields that are defined across any number of different subgraphs. - - - -### Defining entities in your subgraphs - -If your subgraphs don't yet include any entities, you need to define some before clients can start deferring their fields in queries. - -To learn about creating entities, see [this guide](/graphos/schema-design/federated-schemas/entities). - -## Next steps - -- [Configure your router](/graphos/routing/operations/defer) and clients to enable and handle `@defer` diff --git a/docs/source/routing/operations/defer.mdx b/docs/source/routing/operations/defer.mdx index 10b505115a..405de6c7a5 100644 --- a/docs/source/routing/operations/defer.mdx +++ b/docs/source/routing/operations/defer.mdx @@ -1,14 +1,136 @@ --- -title: Configuring and applying @defer +title: "@defer Directive Support" subtitle: Improve performance by delivering fields incrementally description: Improve your GraphQL query performance with GraphOS Router and Apollo Router Core's support for the @defer directive. Incrementally deliver response data by deferring certain fields. minVersion: 1.8.0 --- -Learn about: +Apollo Router's support of the `@defer` directive helps client developers tackle the common challenge of how to create a responsive user experience when certain fields of a query take longer to resolve than others. `@defer` improves application performance by delivering response data incrementally. This is important for real-time applications like dashboards or reports. By deferring data for some fields, the router can resolve and return data for the query's other fields more quickly, improving responsiveness. -- Configuring Apollo Router and clients to support the `@defer` directive. -- Writing subgraph schemas and queries that use `@defer`. +## What is the `@defer` directive? + +The `@defer` directive enables a client query to specify sets of fields that it doesn't need to receive data for _immediately_. This is helpful whenever some fields in a query take much longer to resolve than others. + +The `@defer` directive is applied to a GraphQL query. Specifically, deferred fields are always contained within a GraphQL fragment, and the `@defer` directive is applied to that fragment. + +Here's an example query that uses `@defer`: + +```graphql +query GetTopProducts { + topProducts { + id + name + # highlight-start + ... @defer { + price + } + # highlight-end + } +} +``` + +To respond incrementally, the router uses a multipart-encoded HTTP response. To use `@defer` successfully with the router, a client's GraphQL library must _also_ support the directive by handling multipart HTTP responses correctly. + +The router's `@defer` support is compatible with all [federation-compatible subgraph libraries](/federation/building-supergraphs/supported-subgraphs/). That's because the router takes advantage of your supergraph's existing [entities](/federation/entities/) to fetch any deferred field data via followup queries to your subgraphs. + + +## Which fields can my router defer? + +Your router can defer the following fields in your schema: + +- Root fields of the `Query` type (along with their subfields) +- Fields of any entity type (along with their subfields) + - Deferring entity fields is extremely powerful but requires some setup if you aren't using entities already. This is covered in more detail [below](#entity-fields). + +See below for more information on each of these. + +### `Query` fields + +Your router can defer any field of your schema's `Query` type, along with any subfields of those fields: + +```graphql +query GetUsersAndDeferProducts { + users { + id + } + # highlight-start + ... @defer { + products { + id + } + } + # highlight-end +} +``` + +With the query above, the router first returns a list of `User` IDs, then later completes the response with a list of `Product` IDs. + +### Entity fields + +Your router supports deferring fields of the special object types in your supergraph called entities. + +Entities are object types that often define their fields across multiple subgraphs (but they don't have to). You can identify an entity by its use of the `@key` directive. In the example subgraph schemas below, the `Product` type is an entity: + + + +```graphql title="Products subgraph" +type Product @key(fields: "id") { + id: ID! + name: String! + price: Int! +} + +type Query { + topProducts: [Product!]! +} +``` + +```graphql title="Reviews subgraph" +type Product @key(fields: "id") { + id: ID! + reviews: [Review!]! +} + +type Review { + score: Int! +} +``` + + + +Entities are query entry points into your subgraphs, and this is what enables your router to defer their fields: the router can send a followup query to a subgraph to fetch any entity fields that it doesn't fetch initially. + +Here's an example query that defers entity fields using the subgraphs above: + +```graphql +query GetProductsAndDeferReviews { + topProducts { + id + name + # highlight-start + ... @defer { + reviews { + score + } + } + # highlight-end + } +} +``` + +To handle this query, the router first resolves and returns a list of `Product` objects with their IDs and names. Later, the router completes the response by returning review scores for each of those products. + + + +It doesn't matter which subgraph defines a particular entity field! Queries can defer entity fields that are defined across any number of different subgraphs. + + + +### Defining entities in your subgraphs + +If your subgraphs don't yet include any entities, you need to define some before clients can start deferring their fields in queries. + +To learn about creating entities, see [this guide](/graphos/schema-design/federated-schemas/entities). ## Requirements for `@defer` diff --git a/docs/source/routing/operations/index.mdx b/docs/source/routing/operations/index.mdx deleted file mode 100644 index 96f2310f06..0000000000 --- a/docs/source/routing/operations/index.mdx +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Real-Time Operations -subtitle: Configure the router for real-time operations -description: Configure the Apollo GraphOS Router to support real-time operations, including subscriptions, defer directive, and file uploads. ---- - -Responsive applications rely on the router to handle operations in real time. You can configure to support various real-time operations: - -- [**Subscriptions**](/graphos/routing/operations/subscriptions) - support GraphQL subscription operations -- [**Defer**](/graphos/routing/operations/defer) - use the `@defer` directive to enable incremental delivery of response data -- [**File Uploads**](/graphos/routing/operations/file-upload) - upload files to the router using multipart HTTP requests From 88b590a21b154feeb52b18773faaf9aff5fd445d Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 12 May 2025 14:42:20 -0700 Subject: [PATCH 41/47] redirect --- docs/source/routing/configuration/overview.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/routing/configuration/overview.mdx b/docs/source/routing/configuration/overview.mdx index 77a8e88fec..c26c5fb777 100644 --- a/docs/source/routing/configuration/overview.mdx +++ b/docs/source/routing/configuration/overview.mdx @@ -2,6 +2,8 @@ title: Router Configuration Overview subtitle: Overview and reference for router configuration description: Learn how to configure the Apollo GraphOS Router or Apollo Router Core with environment variables, command-line options and commands, and YAML configuration files. +redirectFrom: + - /router/configuration/overview --- Running an Apollo Router instance involves some key steps: From 6d5c97733caf0b8bd0a617260134779e96c98feb Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 12 May 2025 15:05:46 -0700 Subject: [PATCH 42/47] fix links --- docs/source/routing/configuration/yaml.mdx | 2 +- docs/source/routing/customization/coprocessor.mdx | 2 +- .../observability/telemetry/trace-exporters/datadog.mdx | 2 +- .../observability/telemetry/trace-exporters/dynatrace.mdx | 2 +- .../observability/telemetry/trace-exporters/jaeger.mdx | 2 +- .../observability/telemetry/trace-exporters/new-relic.mdx | 2 +- .../routing/operations/subscriptions/configuration.mdx | 2 +- .../source/routing/self-hosted/containerization/index.mdx | 8 ++++---- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/source/routing/configuration/yaml.mdx b/docs/source/routing/configuration/yaml.mdx index c38a649f39..ed21f96c6e 100644 --- a/docs/source/routing/configuration/yaml.mdx +++ b/docs/source/routing/configuration/yaml.mdx @@ -245,7 +245,7 @@ Learn more in [Entity Caching](/graphos/routing/performance/caching/entity). -Learn more in [File Uploads](/graphos/routing/operation/file-upload). +Learn more in [File Uploads](/graphos/routing/operations/file-upload). --- diff --git a/docs/source/routing/customization/coprocessor.mdx b/docs/source/routing/customization/coprocessor.mdx index e860f7753e..b9f8f5ede4 100644 --- a/docs/source/routing/customization/coprocessor.mdx +++ b/docs/source/routing/customization/coprocessor.mdx @@ -141,7 +141,7 @@ By default, the context is not sent to the coprocessor (`context: false`). You can send _all_ context keys to your coprocessor using `context: all`. You can also specify exactly which context keys you wish to send to a coprocessor by listing them under the `selective` key. This will reduce the size of the request/response and may improve performance. -If you're upgrading from router 1.x, the [context key names changed](/docs/graphos/routing/upgrade/from-router-v1#renamed-context-keys) in router v2.0. You can specify `context: deprecated` to send all context with the old names, compatible with v1.x. Context keys are translated to their v1.x names before being sent to the coprocessor, and translated back to the v2.x names after being received from the coprocessor. +If you're upgrading from router 1.x, the [context key names changed](/graphos/routing/upgrade/from-router-v1#renamed-context-keys) in router v2.0. You can specify `context: deprecated` to send all context with the old names, compatible with v1.x. Context keys are translated to their v1.x names before being sent to the coprocessor, and translated back to the v2.x names after being received from the coprocessor. diff --git a/docs/source/routing/observability/telemetry/trace-exporters/datadog.mdx b/docs/source/routing/observability/telemetry/trace-exporters/datadog.mdx index ac235e190f..032a1e5ff1 100644 --- a/docs/source/routing/observability/telemetry/trace-exporters/datadog.mdx +++ b/docs/source/routing/observability/telemetry/trace-exporters/datadog.mdx @@ -9,7 +9,7 @@ context: import BatchProcessorPreamble from '../../../../../shared/batch-processor-preamble.mdx'; import BatchProcessorRef from '../../../../../shared/batch-processor-ref.mdx'; -This tracing exporter is a configuration of the [OTLP exporter](/graphos/routing/observability/trace-exporters/otlp) to use with [Datadog](https://www.datadoghq.com/). +This tracing exporter is a configuration of the [OTLP exporter](/graphos/routing/observability/telemetry/trace-exporters/otlp) to use with [Datadog](https://www.datadoghq.com/). For general tracing configuration, refer to [Router Tracing Configuration](/router/configuration/telemetry/exporters/tracing/overview). diff --git a/docs/source/routing/observability/telemetry/trace-exporters/dynatrace.mdx b/docs/source/routing/observability/telemetry/trace-exporters/dynatrace.mdx index 9c0fbf98e1..0cc9cedfea 100644 --- a/docs/source/routing/observability/telemetry/trace-exporters/dynatrace.mdx +++ b/docs/source/routing/observability/telemetry/trace-exporters/dynatrace.mdx @@ -6,7 +6,7 @@ context: - telemetry --- -This tracing exporter is a configuration of the [OTLP exporter](/graphos/routing/observability/trace-exporters/otlp) to use with [Dynatrace](https://dynatrace.com/). +This tracing exporter is a configuration of the [OTLP exporter](/graphos/routing/observability/telemetry/trace-exporters/otlp) to use with [Dynatrace](https://dynatrace.com/). For general tracing configuration, refer to [Router Tracing Configuration](/router/configuration/telemetry/exporters/tracing/overview). diff --git a/docs/source/routing/observability/telemetry/trace-exporters/jaeger.mdx b/docs/source/routing/observability/telemetry/trace-exporters/jaeger.mdx index 9d1be7bd04..014b2a8f62 100644 --- a/docs/source/routing/observability/telemetry/trace-exporters/jaeger.mdx +++ b/docs/source/routing/observability/telemetry/trace-exporters/jaeger.mdx @@ -6,7 +6,7 @@ context: - telemetry --- -This tracing exporter is a configuration of the [OTLP exporter](/graphos/routing/observability/trace-exporters/otlp) to use with [Jaeger](https://www.jaegertracing.io/). +This tracing exporter is a configuration of the [OTLP exporter](/graphos/routing/observability/telemetry/trace-exporters/otlp) to use with [Jaeger](https://www.jaegertracing.io/). For general tracing configuration, refer to [Router Tracing Configuration](/router/configuration/telemetry/exporters/tracing/overview). diff --git a/docs/source/routing/observability/telemetry/trace-exporters/new-relic.mdx b/docs/source/routing/observability/telemetry/trace-exporters/new-relic.mdx index 5297edacf2..346e363ab1 100644 --- a/docs/source/routing/observability/telemetry/trace-exporters/new-relic.mdx +++ b/docs/source/routing/observability/telemetry/trace-exporters/new-relic.mdx @@ -6,7 +6,7 @@ context: - telemetry --- -This tracing exporter is a configuration of the [OTLP exporter](/graphos/routing/observability/trace-exporters/otlp) to use with [New Relic](https://newrelic.com/). +This tracing exporter is a configuration of the [OTLP exporter](/graphos/routing/observability/telemetry/trace-exporters/otlp) to use with [New Relic](https://newrelic.com/). For general tracing configuration, refer to [Router Tracing Configuration](/router/configuration/telemetry/exporters/tracing/overview). diff --git a/docs/source/routing/operations/subscriptions/configuration.mdx b/docs/source/routing/operations/subscriptions/configuration.mdx index f2abe55f1a..3462fe0cb1 100644 --- a/docs/source/routing/operations/subscriptions/configuration.mdx +++ b/docs/source/routing/operations/subscriptions/configuration.mdx @@ -13,7 +13,7 @@ Learn how to configure the router to enable GraphQL subscriptions. Before you add `Subscription` fields to your subgraphs, do all of the following in the order shown to prevent schema composition errors: -1. Update your router instances to version `1.22.0` or later. [Download the latest version.](/router/quickstart/) +1. Update your router instances to version `1.22.0` or later. [Download the latest version.](/graphos/routing/get-started) - Previous versions of the router don't support subscription operations. 1. Make sure your router is [connected to a GraphOS Enterprise organization](/router/enterprise-features/#enabling-enterprise-features). - Subscription support is an Enterprise feature of self-hosted routers. diff --git a/docs/source/routing/self-hosted/containerization/index.mdx b/docs/source/routing/self-hosted/containerization/index.mdx index dc737eb5cc..d14b59a332 100644 --- a/docs/source/routing/self-hosted/containerization/index.mdx +++ b/docs/source/routing/self-hosted/containerization/index.mdx @@ -29,10 +29,10 @@ While the default behavior of a router image is largely suitable for a basic dep To learn from examples of customizing and deploying router images in specific environments, see the deployment guides for: * [Docker](/router/containerization/docker/) -* [AWS](/graphos/routing/containerization/aws) -* [Azure](/graphos/routing/containerization/azure) -* [GCP](/graphos/routing/containerization/gcp) -* [Kubernetes](/router/containerization/kubernetes/). +* [AWS](/graphos/routing/self-hosted/containerization/aws) +* [Azure](/graphos/routing/self-hosted/containerization/azure) +* [GCP](/graphos/routing/self-hosted/containerization/gcp) +* [Kubernetes](/router/containerization/kubernetes/) See the Apollo Solutions [example Cloud Foundry deployment](https://github.com/apollosolutions/example-pcf-deployment) for a minimal router configuration and Cloud Foundry manifest file. From a1a80d3a50b39644b0e4b57784c9b07a7a000fcf Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 12 May 2025 15:12:42 -0700 Subject: [PATCH 43/47] redirect --- docs/source/routing/get-started.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/source/routing/get-started.mdx b/docs/source/routing/get-started.mdx index f9aa8fd309..db08692800 100644 --- a/docs/source/routing/get-started.mdx +++ b/docs/source/routing/get-started.mdx @@ -2,6 +2,8 @@ title: Apollo Router Quickstart subtitle: Run the router locally description: This quickstart tutorial walks you through installing an Apollo Router binary, running it with an example supergraph schema and a YAML configuration file, and making test queries with Apollo Sandbox. +redirectFrom: + - /graphos/routing/self-hosted/install --- import ElasticNotice from "../../shared/elastic-notice.mdx"; @@ -221,7 +223,7 @@ Let's run the router in dev mode, using both the supergraph schema and YAML conf ```sh showLineNumbers=false ./router --dev --config router.yaml --supergraph supergraph.graphql ``` - + Running router with `--dev` is the same as using the following configuration: From 3e2d9accf974c3474700408f71efad398fc14754 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 12 May 2025 15:41:56 -0700 Subject: [PATCH 44/47] fix links --- docs/source/routing/about-v2.mdx | 2 +- docs/source/routing/federation-version-support.mdx | 2 +- docs/source/routing/operations/file-upload.mdx | 2 +- docs/source/routing/upgrade/from-router-v1.mdx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/routing/about-v2.mdx b/docs/source/routing/about-v2.mdx index fb7a57d36c..f16009b596 100644 --- a/docs/source/routing/about-v2.mdx +++ b/docs/source/routing/about-v2.mdx @@ -37,7 +37,7 @@ The router v2.x introduces Apollo Connectors for REST, a declarative way to inte The router is powered by a new **Native Query Planner** that achieves performance at scale with demonstrable improvement in CPU and memory utilization. It's written in Rust and replaces the legacy query planner written in JavaScript, thereby utilizing a simplified architecture and ensuring more efficient and performant query execution. -> Learn more about the [native query planner](graphos/routing/query-planning/native-query-planner). +> Learn more about the [native query planner](/graphos/routing/query-planning/native-query-planner). ### Predictable resource utilization and availability with back-pressure management diff --git a/docs/source/routing/federation-version-support.mdx b/docs/source/routing/federation-version-support.mdx index 6c4bc9d9df..a9960e5bc1 100644 --- a/docs/source/routing/federation-version-support.mdx +++ b/docs/source/routing/federation-version-support.mdx @@ -428,4 +428,4 @@ Only Apollo Router Core and GraphOS Router v1.59 and earlier support Federation - Router v1.60 and later - Router v2.0 and later -[Learn how to upgrade from Federation version 1 to 2.](/graphos/reference/migration/to-federation-version-2) +[Learn how to upgrade from Federation version 1 to 2.](/graphos/schema-design/federated-schemas/reference/moving-to-federation-2) diff --git a/docs/source/routing/operations/file-upload.mdx b/docs/source/routing/operations/file-upload.mdx index 9170a22a1e..bb45f8ee8e 100644 --- a/docs/source/routing/operations/file-upload.mdx +++ b/docs/source/routing/operations/file-upload.mdx @@ -277,7 +277,7 @@ Each part of the request payload is separated by a boundary string (`gc0p4Jq0M2Y Refer to the docs for your client library for further instructions. - [Apollo Client (web)](/react/data/file-uploads/) -- [Apollo iOS](/ios/file-uploads/) +- [Apollo iOS](/ios/advanced/file-uploads/) - [Apollo Kotlin](/kotlin/advanced/upload/) Custom clients can be implemented following the [spec documentation](https://github.com/jaydenseric/graphql-multipart-request-spec). diff --git a/docs/source/routing/upgrade/from-router-v1.mdx b/docs/source/routing/upgrade/from-router-v1.mdx index b5c8f4b47d..fd12bc513e 100644 --- a/docs/source/routing/upgrade/from-router-v1.mdx +++ b/docs/source/routing/upgrade/from-router-v1.mdx @@ -39,7 +39,7 @@ The following headings describe features that have been removed or deprecated in Multiple metrics have been removed in router v2.x as part of evolving towards OpenTelemetry metrics and conventions. Each of the removed metrics listed below has a replacement metric or a method for deriving its value: -- Removed `apollo_router_http_request_retry_total`. This is replaced by `http.client.request.duration` metric's `http.request.resend_count` attribute. Set [`default_requirement_level`](/docs/graphos/reference/router/telemetry/instrumentation/instruments#default_requirement_level) +- Removed `apollo_router_http_request_retry_total`. This is replaced by `http.client.request.duration` metric's `http.request.resend_count` attribute. Set [`default_requirement_level`](/graphos/reference/router/telemetry/instrumentation/instruments#default_requirement_level) to `recommended` to make the router emit this attribute. - Removed `apollo_router_timeout`. This metric conflated timed-out requests from client From 36cebe78356fc1acad56f1c2884d2afd2891043c Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Mon, 12 May 2025 16:08:14 -0700 Subject: [PATCH 45/47] review comments --- docs/source/routing/license.mdx | 8 ++++---- docs/source/routing/performance/caching/index.mdx | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/source/routing/license.mdx b/docs/source/routing/license.mdx index 597e338dc4..4126cb82ce 100644 --- a/docs/source/routing/license.mdx +++ b/docs/source/routing/license.mdx @@ -1,11 +1,11 @@ --- title: GraphOS Router License -description: Learn how to manage the license for a Apollo GraphOS Router, including offline license configuration. +description: Learn how to manage the license for an Apollo GraphOS Router, including offline license configuration. --- ## The GraphOS license -Whenever your instance of GraphOS Router starts up and connects to GraphOS, it fetches a **license**, which is the credential that authorizes its use of GraphOS features: +Whenever your instance of GraphOS Router starts up and connects to GraphOS, it fetches a __license__, which is the credential that authorizes its use of GraphOS features: A router instance retains its license for the duration of its execution. If you stop a router instance and then later start a new instance on the same machine, it must fetch a new license. @@ -46,7 +46,7 @@ These steps work both for running the router executable directly (`./router`) an } ``` -2. Create a [graph API key](/graphos/platform/access-management/api-keys#graph-api-keys) for your supergraph and assign it the **Contributor** role. +2. Create a [graph API key](/graphos/platform/access-management/api-keys#graph-api-keys) for your supergraph and assign it the __Contributor__ role. - We recommend creating a separate graph API key for _each team member_ that will run the router locally. 3. When you start up your local router with your usual command, set the `APOLLO_GRAPH_REF` and `APOLLO_KEY` environment variables for that command: @@ -74,7 +74,7 @@ Offline license support is available on an as-needed basis to Enterprise organiz Running your GraphOS Router fleet while fully connected to GraphOS is the best choice for most Apollo users. However, some scenarios can prevent your routers from connecting to GraphOS for an extended period, ranging from disasters that break connectivity to isolated sites operating with air-gapped networks. If you need to restart or rapidly scale your entire router fleet, but you're unable to communicate with Apollo Uplink, new router instances won't be able to serve traffic. -To support long-term disconnection scenarios, GraphOS supports **offline licenses** for the GraphOS Router. An offline license enables routers to start and serve traffic without a persistent connection to GraphOS. Instead of fetching its supergraph schema from Apollo Uplink, an offline router gets its supergraph schema from a local supergraph schema file. +To support long-term disconnection scenarios, GraphOS supports __offline licenses__ for the GraphOS Router. An offline license enables routers to start and serve traffic without a persistent connection to GraphOS. Instead of fetching its supergraph schema from Apollo Uplink, an offline router gets its supergraph schema from a local supergraph schema file. diff --git a/docs/source/routing/performance/caching/index.mdx b/docs/source/routing/performance/caching/index.mdx index 092cc3b09e..db875be1da 100644 --- a/docs/source/routing/performance/caching/index.mdx +++ b/docs/source/routing/performance/caching/index.mdx @@ -1,6 +1,7 @@ --- -title: Caching in GraphOS Router +title: Caching in Apollo Router subtitle: Accelerate query retrieval with in-memory and distributed caching +description: Accelerate query retrieval for your federated graph with in-memory and distributed caching in Apollo Router. --- Apollo Router supports multiple caching strategies, including in-memory caching, distributed caching with Redis, and entity caching, that allow you to reduce redundant subgraph requests and improve query latency. From d250fc6f0fdc4992fb7ee5d4729480ce0a82f952 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Tue, 13 May 2025 09:26:21 -0700 Subject: [PATCH 46/47] rerun CI From 9fa70a07498ba4e7fa7bc03c26860f5b43787576 Mon Sep 17 00:00:00 2001 From: Edward Huang Date: Tue, 13 May 2025 09:44:03 -0700 Subject: [PATCH 47/47] rerun CI