Skip to content

feat(router): optimize playground delivery, add concurrency_limit to config#1519

Merged
df-wg merged 6 commits intomainfrom
dave/eng-6278-dont-render-playground-every-request
Jan 22, 2025
Merged

feat(router): optimize playground delivery, add concurrency_limit to config#1519
df-wg merged 6 commits intomainfrom
dave/eng-6278-dont-render-playground-every-request

Conversation

@df-wg
Copy link
Copy Markdown
Contributor

@df-wg df-wg commented Jan 20, 2025

Motivation and Context

Previously, we were recomputing this template every time and loading it into memory every time you accessed the endpoint. This should fix that, and ensure we only compute it once.

Checklist

Comment thread router/internal/graphiql/playgroundhandler.go Outdated
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jan 20, 2025

Router image scan passed

✅ No security vulnerabilities found in image:

ghcr.io/wundergraph/cosmo/router:sha-7c7f9c73d5aed98edd0df422d873b602dc7f378b

Comment thread router/internal/graphiql/playgroundhandler.go Outdated
Comment thread router/internal/graphiql/playgroundhandler.go Outdated
@df-wg df-wg requested a review from jensneuse January 21, 2025 11:07
Copy link
Copy Markdown
Member

@jensneuse jensneuse left a comment

Choose a reason for hiding this comment

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

One minor.
Last thing, can you add a simple e2e test to the router-tests to ensure that the playground is returning HTML when configured with defaults?
I think we're currently not testing this.

Comment thread router/pkg/config/config.schema.json Outdated
@df-wg
Copy link
Copy Markdown
Contributor Author

df-wg commented Jan 21, 2025

One minor. Last thing, can you add a simple e2e test to the router-tests to ensure that the playground is returning HTML when configured with defaults? I think we're currently not testing this.

@jensneuse isn't that present here?

func TestHealthCheckHandler(t *testing.T) {
handler := NewPlayground(&PlaygroundOptions{
Html: "test {{graphqlURL}}",
GraphqlURL: "/",
})
rec := httptest.NewRecorder()
th := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("test"))
})
req := test.NewRequest(http.MethodGet, "/html")
req.Header.Set("Accept", "text/html")
handler(th).ServeHTTP(rec, req)
assert.Equal(t, http.StatusOK, rec.Code)
assert.Equal(t, "text/html; charset=utf-8", rec.Header().Get("Content-Type"))
assert.Equal(t, "test /", rec.Body.String())
}

@df-wg df-wg changed the title fix(router): optimize playground delivery feat(router): optimize playground delivery, add concurrency_limit to config Jan 21, 2025
@Noroth
Copy link
Copy Markdown
Contributor

Noroth commented Jan 21, 2025

@jensneuse I recently added a test for the playground

t.Run("Should serve both graphql and playground on the same path", func(t *testing.T) {
t.Parallel()
testenv.Run(t, &testenv.Config{
OverrideGraphQLPath: "/", // Default playground handler path
}, func(t *testing.T, xEnv *testenv.Environment) {
// We could see that successful graphql queries have been made in the previous tests
res, err := xEnv.MakeGraphQLRequestOverGET(testenv.GraphQLRequest{
OperationName: []byte(`Employees`),
Query: `query Employees { employees { id } }`,
})
require.NoError(t, err)
require.Equal(t, http.StatusOK, res.Response.StatusCode)
require.Equal(t, `{"data":{"employees":[{"id":1},{"id":2},{"id":3},{"id":4},{"id":5},{"id":7},{"id":8},{"id":10},{"id":11},{"id":12}]}}`, res.Body)
// If the graphql path and the playground path is the same, the playground will be mounted as a middleware and served based on the Accept header
// The accept header must be text/html to get the playground
header := http.Header{
"Accept": {"text/html; charset=utf-8"}, // simulate simplified browser request
}
httpRes, err := xEnv.MakeRequest(http.MethodGet, "/", header, nil)
require.NoError(t, err)
require.Equal(t, http.StatusOK, httpRes.StatusCode)
defer func() { _ = httpRes.Body.Close() }()
_, err = html.Parse(httpRes.Body)
require.NoError(t, err)
})
})
}

@df-wg df-wg merged commit 1d7047b into main Jan 22, 2025
@df-wg df-wg deleted the dave/eng-6278-dont-render-playground-every-request branch January 22, 2025 12:47
james-braund-cabiri added a commit to cabiri-io/cosmo that referenced this pull request Jan 31, 2025
* feat: expose type data and record subgraphs for enums (wundergraph#1495)

* chore(release): Publish [skip ci]

 - cdn@0.12.0
 - wgc@0.71.5
 - @wundergraph/composition@0.34.0
 - controlplane@0.119.0
 - @wundergraph/cosmo-shared@0.33.3
 - studio@0.97.0

* feat: improve rate limit responses (add code, hide stats) (wundergraph#1497)

* chore(release): Publish [skip ci]

 - router@0.161.0

* fix: provider should be specified in the config.yaml (wundergraph#1397)

* fix: update the timeouts for clickhouse and platform service (wundergraph#1500)

* chore(release): Publish [skip ci]

 - wgc@0.71.6
 - controlplane@0.119.1
 - router@0.161.1

* fix: add edfs to the demo environment (wundergraph#1505)

* docs(CONTRIBUTING): fixup minor mistake in CONTRIBUTING.md under Go workspace (wundergraph#1502)

Co-authored-by: Dustin Deus <deusdustin@gmail.com>

* fix: full demo broken in main branch (wundergraph#1508)

* feat(router): optionally add jitter to config polling interval (wundergraph#1506)

Co-authored-by: Dustin Deus <deusdustin@gmail.com>

* chore(release): Publish [skip ci]

 - router@0.162.0

* fix(router): remove wildcard from router graphql path (wundergraph#1509)

* fix: use gauge for server.uptime metric (wundergraph#1510)

Co-authored-by: Ludwig <ludwig.bedacht@gmail.com>

* feat: cache warmer (wundergraph#1501)

Co-authored-by: Ludwig <ludwig.bedacht@gmail.com>
Co-authored-by: starptech <deusdustin@gmail.com>

* chore(release): Publish [skip ci]

 - cdn@0.13.0
 - @wundergraph/cosmo-cdn@0.8.0
 - wgc@0.72.0
 - @wundergraph/cosmo-connect@0.91.0
 - controlplane@0.120.0
 - graphqlmetrics@0.32.0
 - router@0.163.0
 - @wundergraph/cosmo-shared@0.33.4
 - studio@0.98.0

* fix(cache warmup): consider only po of the last 7 days (wundergraph#1513)

* chore(release): Publish [skip ci]

 - controlplane@0.120.1

* fix(cache operation): swallow cache errors and other improvements (wundergraph#1515)

* chore(release): Publish [skip ci]

 - controlplane@0.120.2
 - graphqlmetrics@0.32.1
 - router@0.163.1
 - studio@0.98.1

* feat: add variables remapping support (wundergraph#1516)

Co-authored-by: starptech <deusdustin@gmail.com>

* chore(release): Publish [skip ci]

 - router@0.164.0

* fix(router): write proper line endings and header for multipart (wundergraph#1517)

* chore(release): Publish [skip ci]

 - router@0.164.1

* feat(router): optimize playground delivery, add concurrency_limit to config (wundergraph#1519)

* fix(router): enable health checks during startup (wundergraph#1529)

* feat: improve cache warmer (wundergraph#1530)

Co-authored-by: Ludwig <ludwig.bedacht@gmail.com>

* chore(release): Publish [skip ci]

 - controlplane@0.121.0
 - router@0.165.0
 - studio@0.99.0

* fix: remove semaphore from ResolveGraphQLSubscription (wundergraph#1532)

* chore(release): Publish [skip ci]

 - router@0.165.1

* feat: add compatibility handshake between router and execution config (wundergraph#1534)

* chore(release): Publish [skip ci]

 - wgc@0.72.1
 - @wundergraph/composition@0.35.0
 - @wundergraph/cosmo-connect@0.92.0
 - controlplane@0.121.1
 - router@0.166.0
 - @wundergraph/cosmo-shared@0.34.0
 - studio@0.99.1

* feat: also add handshake for static execution configs (wundergraph#1535)

* chore(router): bump demo library to pickup subscription fix (wundergraph#1518)

* feat(router): add interface for trace propagation (wundergraph#1526)

* chore(release): Publish [skip ci]

 - router@0.167.0

* fix: adding/removing directive is not picked up by wgc subgraph check (wundergraph#1494)

* chore(deps): upgrade ristretto to v2 (wundergraph#1538)

* feat: add normalizedQuery to query plan and request info to trace (wundergraph#1536)

Co-authored-by: df-wg <dave@wundergraph.com>

* fix: add copy button to subgraph routing url (wundergraph#1543)

Co-authored-by: Dustin Deus <deusdustin@gmail.com>

* fix: webhooks shot when schema is unchanged (wundergraph#1542)

* fix: trim the inputs of group mappers (wundergraph#1541)

* fix: subgraphs search functionality (wundergraph#1540)

* chore(release): Publish [skip ci]

 - controlplane@0.121.2
 - graphqlmetrics@0.32.2
 - router@0.168.0
 - studio@0.99.2

* fix: increase max concurrent resolvers (wundergraph#1544)

* refactor(router): redesign JWK authentication logic (wundergraph#1498)

* chore(release): Publish [skip ci]

 - router@0.168.1

* fix: increase the test timeout value to prevent failures on slower machines (wundergraph#1547)

* fix: reduce the breaking change retention duration (wundergraph#1550)

* fix: change the defaults of breaking-change-retention (wundergraph#1551)

* feat(router): enable starting the router without subgraphs (wundergraph#1533)

* fix(router): parse accept header per rfc 9110 (wundergraph#1549)

* chore(release): Publish [skip ci]

 - controlplane@0.121.3
 - router@0.169.0
 - studio@0.99.3

* feat(router): enable using redis clusters for rate limiting and apq (wundergraph#1499)

* fix: json schema for traffic shaping subgraphs (wundergraph#1552)

* chore: Update aws-lambda-router customisation after upstream sync

---------

Co-authored-by: Nithin Kumar B <nithinkumar5353@gmail.com>
Co-authored-by: hardworker-bot <bot@wundergraph.com>
Co-authored-by: Jens Neuse <jens.neuse@gmx.de>
Co-authored-by: Alessandro Pagnin <ale@wundergraph.com>
Co-authored-by: Suvij Surya <suvijsurya76@gmail.com>
Co-authored-by: endigma <endigma@mailcat.ca>
Co-authored-by: Dustin Deus <deusdustin@gmail.com>
Co-authored-by: Ludwig <ludwig.bedacht@gmail.com>
Co-authored-by: Sergiy 🇺🇦 <818351+devsergiy@users.noreply.github.com>
Co-authored-by: df-wg <dave@wundergraph.com>
Co-authored-by: Aenimus <47415099+Aenimus@users.noreply.github.com>
james-braund-cabiri added a commit to cabiri-io/cosmo that referenced this pull request Feb 4, 2025
* feat: expose type data and record subgraphs for enums (wundergraph#1495)

* chore(release): Publish [skip ci]

 - cdn@0.12.0
 - wgc@0.71.5
 - @wundergraph/composition@0.34.0
 - controlplane@0.119.0
 - @wundergraph/cosmo-shared@0.33.3
 - studio@0.97.0

* feat: improve rate limit responses (add code, hide stats) (wundergraph#1497)

* chore(release): Publish [skip ci]

 - router@0.161.0

* fix: provider should be specified in the config.yaml (wundergraph#1397)

* fix: update the timeouts for clickhouse and platform service (wundergraph#1500)

* chore(release): Publish [skip ci]

 - wgc@0.71.6
 - controlplane@0.119.1
 - router@0.161.1

* fix: add edfs to the demo environment (wundergraph#1505)

* docs(CONTRIBUTING): fixup minor mistake in CONTRIBUTING.md under Go workspace (wundergraph#1502)

Co-authored-by: Dustin Deus <deusdustin@gmail.com>

* fix: full demo broken in main branch (wundergraph#1508)

* feat(router): optionally add jitter to config polling interval (wundergraph#1506)

Co-authored-by: Dustin Deus <deusdustin@gmail.com>

* chore(release): Publish [skip ci]

 - router@0.162.0

* fix(router): remove wildcard from router graphql path (wundergraph#1509)

* fix: use gauge for server.uptime metric (wundergraph#1510)

Co-authored-by: Ludwig <ludwig.bedacht@gmail.com>

* feat: cache warmer (wundergraph#1501)

Co-authored-by: Ludwig <ludwig.bedacht@gmail.com>
Co-authored-by: starptech <deusdustin@gmail.com>

* chore(release): Publish [skip ci]

 - cdn@0.13.0
 - @wundergraph/cosmo-cdn@0.8.0
 - wgc@0.72.0
 - @wundergraph/cosmo-connect@0.91.0
 - controlplane@0.120.0
 - graphqlmetrics@0.32.0
 - router@0.163.0
 - @wundergraph/cosmo-shared@0.33.4
 - studio@0.98.0

* fix(cache warmup): consider only po of the last 7 days (wundergraph#1513)

* chore(release): Publish [skip ci]

 - controlplane@0.120.1

* fix(cache operation): swallow cache errors and other improvements (wundergraph#1515)

* chore(release): Publish [skip ci]

 - controlplane@0.120.2
 - graphqlmetrics@0.32.1
 - router@0.163.1
 - studio@0.98.1

* feat: add variables remapping support (wundergraph#1516)

Co-authored-by: starptech <deusdustin@gmail.com>

* chore(release): Publish [skip ci]

 - router@0.164.0

* fix(router): write proper line endings and header for multipart (wundergraph#1517)

* chore(release): Publish [skip ci]

 - router@0.164.1

* feat(router): optimize playground delivery, add concurrency_limit to config (wundergraph#1519)

* fix(router): enable health checks during startup (wundergraph#1529)

* feat: improve cache warmer (wundergraph#1530)

Co-authored-by: Ludwig <ludwig.bedacht@gmail.com>

* chore(release): Publish [skip ci]

 - controlplane@0.121.0
 - router@0.165.0
 - studio@0.99.0

* fix: remove semaphore from ResolveGraphQLSubscription (wundergraph#1532)

* chore(release): Publish [skip ci]

 - router@0.165.1

* feat: add compatibility handshake between router and execution config (wundergraph#1534)

* chore(release): Publish [skip ci]

 - wgc@0.72.1
 - @wundergraph/composition@0.35.0
 - @wundergraph/cosmo-connect@0.92.0
 - controlplane@0.121.1
 - router@0.166.0
 - @wundergraph/cosmo-shared@0.34.0
 - studio@0.99.1

* feat: also add handshake for static execution configs (wundergraph#1535)

* chore(router): bump demo library to pickup subscription fix (wundergraph#1518)

* feat(router): add interface for trace propagation (wundergraph#1526)

* chore(release): Publish [skip ci]

 - router@0.167.0

* fix: adding/removing directive is not picked up by wgc subgraph check (wundergraph#1494)

* chore(deps): upgrade ristretto to v2 (wundergraph#1538)

* feat: add normalizedQuery to query plan and request info to trace (wundergraph#1536)

Co-authored-by: df-wg <dave@wundergraph.com>

* fix: add copy button to subgraph routing url (wundergraph#1543)

Co-authored-by: Dustin Deus <deusdustin@gmail.com>

* fix: webhooks shot when schema is unchanged (wundergraph#1542)

* fix: trim the inputs of group mappers (wundergraph#1541)

* fix: subgraphs search functionality (wundergraph#1540)

* chore(release): Publish [skip ci]

 - controlplane@0.121.2
 - graphqlmetrics@0.32.2
 - router@0.168.0
 - studio@0.99.2

* fix: increase max concurrent resolvers (wundergraph#1544)

* refactor(router): redesign JWK authentication logic (wundergraph#1498)

* chore(release): Publish [skip ci]

 - router@0.168.1

* fix: increase the test timeout value to prevent failures on slower machines (wundergraph#1547)

* fix: reduce the breaking change retention duration (wundergraph#1550)

* fix: change the defaults of breaking-change-retention (wundergraph#1551)

* feat(router): enable starting the router without subgraphs (wundergraph#1533)

* fix(router): parse accept header per rfc 9110 (wundergraph#1549)

* chore(release): Publish [skip ci]

 - controlplane@0.121.3
 - router@0.169.0
 - studio@0.99.3

* feat(router): enable using redis clusters for rate limiting and apq (wundergraph#1499)

* fix: json schema for traffic shaping subgraphs (wundergraph#1552)

* fix: subgraph timeout can't be bigger than global timeout (wundergraph#1548)

* fix: error when graph token is not set when cache warmup is enabled (wundergraph#1554)

* chore(release): Publish [skip ci]

 - router@0.170.0

* fix: incorrect graphql endpoint in playground (wundergraph#1562)

* chore(release): Publish [skip ci]

 - @wundergraph/playground@0.8.3
 - router@0.170.1

* fix: update vulnerable packages (wundergraph#1560)

* fix: synchronize go mod versions (wundergraph#1564)

* chore: reduce verbose logging for failed tests (wundergraph#1565)

* fix: Add missing config mapping, bump aws-lambda-router version

* fix: Repair PNPM lockfile after merge

---------

Co-authored-by: Nithin Kumar B <nithinkumar5353@gmail.com>
Co-authored-by: hardworker-bot <bot@wundergraph.com>
Co-authored-by: Jens Neuse <jens.neuse@gmx.de>
Co-authored-by: Alessandro Pagnin <ale@wundergraph.com>
Co-authored-by: Suvij Surya <suvijsurya76@gmail.com>
Co-authored-by: endigma <endigma@mailcat.ca>
Co-authored-by: Dustin Deus <deusdustin@gmail.com>
Co-authored-by: Ludwig <ludwig.bedacht@gmail.com>
Co-authored-by: Sergiy 🇺🇦 <818351+devsergiy@users.noreply.github.com>
Co-authored-by: df-wg <dave@wundergraph.com>
Co-authored-by: Aenimus <47415099+Aenimus@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants