Packages
ash_graphql
1.9.1
1.10.0
1.9.4
1.9.3
1.9.2
1.9.1
1.9.0
1.8.5
1.8.4
1.8.3
1.8.2
1.8.1
1.8.0
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.0
1.5.1
1.5.0
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc.5
1.0.0-rc.4
retired
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.28.1
0.28.0
0.27.1
0.27.0
0.26.9
0.26.8
0.26.7
0.26.6
0.26.5
0.26.4
0.26.3
0.26.2
0.26.0
0.25.13
0.25.12
0.25.10
0.25.9
0.25.8
0.25.7
0.25.6
0.25.5
0.25.4
0.25.3
0.25.2
0.25.1
0.25.0
0.24.1
0.24.0
0.23.3
0.23.2
0.23.1
0.23.0
0.22.13
0.22.12
0.22.11
0.22.10
0.22.9
0.22.8
0.22.7
0.22.6
0.22.4
0.22.3
0.22.2
0.22.1
0.22.0
0.21.0
retired
0.20.5
0.20.4
0.20.3
0.20.2
0.20.1
0.20.0-rc.3
0.20.0-rc.2
0.20.0-rc.1
0.20.0-rc.0
0.19.0
0.18.0-rc0
0.17.5
0.17.5-rc0
0.17.4
0.17.2
0.17.1
0.17.0
0.16.28
0.16.27
0.16.26
0.16.25
0.16.24
0.16.23
0.16.22
0.16.21
0.16.20
0.16.18-rc5
0.16.18-rc4
0.16.18-rc3
0.16.18-rc2
0.16.18-rc1
0.16.18-rc0
0.16.17
0.16.16
0.16.15
0.16.14
0.16.13
0.16.12
0.16.11
0.16.10
0.16.9
0.16.8
0.16.7
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.1
0.14.0
0.13.1
0.13.0
0.12.5
0.12.4
0.12.3
0.12.1
0.12.0
0.10.0
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.0
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.4.0
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.3
0.1.2
The extension for building GraphQL APIs with Ash
Current section
Files
Jump to
Current section
Files
documentation/topics/response-metadata.md
<!--
SPDX-FileCopyrightText: 2020 ash_graphql contributors <https://github.com/ash-project/ash_graphql/graphs/contributors>
SPDX-License-Identifier: MIT
-->
# Response Metadata
AshGraphql can inject execution metadata into GraphQL response extensions, providing information about timing and query complexity.
## Setup
Two steps are required. You must specify the key under which metadata will appear in the response:
```elixir
defmodule MyApp.Schema do
use Absinthe.Schema
use AshGraphql,
domains: [MyApp.Domain],
response_metadata: :my_extension_key
def plugins do
[AshGraphql.Plugin.ResponseMetadata | Absinthe.Plugin.defaults()]
end
query do
# ...
end
end
```
This produces responses like:
```json
{
"data": { "users": [...] },
"extensions": {
"my_extension_key": {
"complexity": 10,
"duration_ms": 42,
"operation_name": "GetUsers",
"operation_type": "query"
}
}
}
```
## Configuration
| `response_metadata` value | Behavior |
|---------------------------|----------|
| `:key` (any atom) | Uses default handler, metadata under `extensions.key` |
| `false` or `nil` | Disabled (default) |
| `{:key, {Module, :function, args}}` | Custom handler with configured key |
## Default Metadata Fields
When using the default handler, these fields are included:
- **`complexity`** - Query complexity (requires `analyze_complexity: true`)
- **`duration_ms`** - Execution time in milliseconds
- **`operation_name`** - The GraphQL operation name, if provided
- **`operation_type`** - `:query`, `:mutation`, or `:subscription`
## Custom Handler
Provide a key and MFA tuple to customize the metadata:
```elixir
use AshGraphql,
domains: [MyApp.Domain],
response_metadata: {:metrics, {__MODULE__, :build_metadata, []}}
def build_metadata(info) do
%{
duration_ms: info.duration_ms,
request_id: Logger.metadata()[:request_id]
}
end
```
The handler receives an `info` map with keys `:complexity`, `:duration_ms`, `:operation_name`, and `:operation_type`. It must return:
- A map to include in `extensions.<key>`
- `nil` to omit metadata entirely
If the handler raises an exception or returns an invalid value, a warning is logged and the request completes without metadata.
## Complexity
Complexity requires Absinthe's analysis to be enabled:
```elixir
Absinthe.run(query, MyApp.Schema, analyze_complexity: true)
# Or in your router:
forward "/graphql", Absinthe.Plug,
schema: MyApp.Schema,
analyze_complexity: true
```
Without this option, the `complexity` field will be `nil`.
## Troubleshooting
**Metadata not appearing in responses**
Ensure both pieces are configured:
1. `response_metadata` is set to an atom key in your `use AshGraphql` call
2. `AshGraphql.Plugin.ResponseMetadata` is in your `plugins/0` function
**Warning about missing start_time**
The plugin isn't being invoked. Verify it's first in your plugins list:
```elixir
def plugins do
[AshGraphql.Plugin.ResponseMetadata | Absinthe.Plugin.defaults()]
end
```
**Complexity is always nil**
Enable complexity analysis in Absinthe options (see Complexity section above).