Get desktop application:
View/edit binary Protocol Buffers messages
Used in:
Key is type name. This structure provides data for the count and latency of individual field executions and thus only reflects operations for which field-level tracing occurred.
Extended references including input types and enum values.
Per type stats that are obtained directly by the router or gateway rather than FTV1.
Stats that contain limits information for the query.
Total number of operations processed during this period for this context. This includes all operations, even if they are sampled and not included in the query latency stats.
Used in:
Map of enum value name to the number of referencing operations.
Used in:
Map of enum name to stats about that enum.
Used in:
required; eg "String!" for User.email:String!
Number of errors whose path is this field. Note that we assume that error tracking does *not* require field-level instrumentation so this *will* include errors from requests that don't contribute to the `observed_execution_count` field (and does not need to be scaled by field_execution_weight).
Number of times that the resolver for this field is directly observed being executed.
Same as `observed_execution_count` but potentially scaled upwards if the server was only performing field-level instrumentation on a sampling of operations. For example, if the server randomly instruments 1% of requests for this operation, this number will be 100 times greater than `observed_execution_count`. (When aggregating a Trace into FieldStats, this number goes up by the trace's `field_execution_weight` for each observed field execution, while `observed_execution_count` above goes up by 1.)
Number of times the resolver for this field is executed that resulted in at least one error. "Request" is a misnomer here as this corresponds to resolver calls, not overall operations. Like `errors_count` above, this includes all requests rather than just requests with field-level instrumentation.
Duration histogram for the latency of this field. Note that it is scaled in the same way as estimated_execution_count so its "total count" might be greater than `observed_execution_count` and may not exactly equal `estimated_execution_count` due to rounding. See comment on QueryLatencyStats's latency_count for details.
Used in:
The total number of operations that reference the input object field.
The number of operations that reference the input object field as a null value.
The number of operations that don't reference this input object field (the field is missing or undefined).
Used in:
Map of input object type to the stats about the fields within that object.
Stats on the query that can be populated by the gateway or router.
Used in:
The strategy used in cost calculations.
The estimated cost as calculated via the strategy specified in stats context The reason that this is a histogram rather than fixed cost is that it can be affected by paging variables.
The maximum estimated cost of the query
The actual cost using the strategy specified in stats context
The maximum estimated cost of the query
The total depth of the query
The height of the query
The number of aliases in the query
The number of root fields in the query
As FieldStat only gets returned for FTV1 payloads this is a separate message that can be used to collect stats in the router or gateway obtained directly from the request schema and response.
Used in:
required; eg "String!" for User.email:String!
Histogram of returned array sizes
Used in:
Key is (eg) "email" for User.email:String! Unlike FieldStat, this is populated outside of FTV1 requests.
Used in:
Used in:
,The latencies of all non-cached requests, so the sum of all counts should equal request_count minus cache_hits. This is an array of counts within a logarithmic range of 384 latency buckets. To calculate the bucket from a microsecond, use the formula: max(0, min(ceil(ln(x)/ln(1.1)), 383)). So for example, 323424 microseconds (323.424 ms) corresponds to bucket 134. Buckets can be skipped using a negative number, so one request on that bucket could be represented as [-134, 1] (skip buckets numbered 0 to 133 and set a 1 in bucket 134).
The total number of requests, including both cache hits and cache misses
The total number of requests that were cache hits. Each request should be represented in cache_latency_count
This array includes the latency buckets for all operations included in cache_hits See comment on latency_count for details.
Paths and counts for each error. The total number of requests with errors within this object should be the same as requests_with_errors_count below.
Total number of requests that contained at least one error
The number of requests that were executed without field-level instrumentation (and thus do not contribute to `observed_execution_count` fields on this message's cousin-twice-removed FieldStats).
Used in:
The operation name. For operations with a PQ ID as the stats report key, either name or signature must be present in the metadata.
the operation signature. For operations with a PQ ID as the stats report key, either name or signature must be present in the metadata.
(Optional) Persisted query ID that was used to request this operation.
The query id. Must be present for all operations. If missing, operations will appear in the insights page without a signature and possibly without a name.
Used in:
Contains (eg) "email" for User.email:String!
True if this type is an interface.
This is the top-level message used by Apollo Server, Apollo Router, and other libraries to report usage information to Apollo. This message consists of traces and stats for operations. By default, each individual operation execution should be either represented as a trace or within stats, but not both. However if the "traces_pre_aggregated" field is set to true, all operations should be included in stats and anything specified as a trace is not added in to the aggregate stats. For performance reasons, we recommend that traces are sampled so that only somewhere around 1% of operation executions are sent as traces. Additionally, buffering operations up until a large size has been reached (say, 4MB) or 5-10 seconds has passed is appropriate. This message used to be known as FullTracesReport, but got renamed since it isn't just for traces anymore.
If QueryMetadata isn't provided, this key should be a statsReportKey (# operationName\nsignature). If the operation name, signature, and persisted query IDs are provided in the QueryMetadata, and this operation was requested via a persisted query, this key can be "pq# <persisted query id>" instead of the signature and operation.
This is the time that the requests in this trace are considered to have taken place If this field is not present the max of the end_time of each trace will be used instead. If there are no traces and no end_time present the report will not be able to be processed. Note: This will override the end_time from traces.
required if no traces in this message
Total number of operations processed during this period. This includes all operations, even if they are sampled and not included in the query latency stats.
Total number of operations broken up by operation type and operation subtype. Only either this or operation_count should be populated, but if both are present, the total across all types and subtypes should match the overall operation_count.
If this is set to true, the stats in TracesWithStats.stats_with_context represent all of the operations described from this report, and the traces in TracesWithStats.trace are a sampling of some of the same operations. If this is false, each operation is described in precisely one of those two fields.
This indicates whether or not extended references are enabled, which are within the stats with context and contain input type and enum value references. We need this flag so we can tell if the option is enabled even when there are no extended references to report.
Used in:
The `service` value embedded within the header key is not guaranteed to contain an actual service, and, in most cases, the service information is trusted to come from upstream processing. If the service _is_ specified in this header, then it is checked to match the context that is reporting it. Otherwise, the service information is deduced from the token context of the reporter and then sent along via other mechanisms (in Kafka, the `ReportKafkaKey). The other information (hostname, agent_version, etc.) is sent by the Apollo Engine Reporting agent, but we do not currently save that information to any of our persistent storage.
Used in:
eg "mygraph@myvariant"
eg "host-01.example.com"
eg "engineproxy 0.1.0"
required
eg "prod-4279-20160804T065423Z-5-g3cf0aa8" (taken from `git describe --tags`)
eg "node v4.6.0"
eg "Linux box 4.6.5-1-ec2 #1 SMP Mon Aug 1 02:31:38 PDT 2016 x86_64 GNU/Linux"
An id that is used to represent the schema to Apollo Graph Manager Using this in place of what used to be schema_hash, since that is no longer attached to a schema in the backend.
The context around a block of stats and traces indicating from which client the operation was executed and its operation type. Operation type and subtype are only used by Apollo Router.
Used in:
, ,The result of the operation. Either OK or the error code that caused the operation to fail. This will not contain all errors from a query, only the primary reason the operation failed. e.g. a limits failure or an auth failure.
Client awareness contexts
Used in:
,Wallclock time when the trace began.
required
Wallclock time when the trace ended.
required
High precision duration of the trace; may not equal end_time-start_time (eg, if your machine's clock changed during the trace).
required
A tree containing information about all resolvers run directly by this service, including errors.
If this is true, the trace is potentially missing some nodes that were present on the query plan. This can happen if the trace span buffer used in the Router fills up and some spans have to be dropped. In these cases the overall trace timing will still be correct, but the trace data could be missing some referenced or executed fields, and some nodes may be missing. If this is true we should display a warning to the user when they view the trace in Explorer.
In addition to details.raw_query, we include a "signature" of the query, which can be normalized: for example, you may want to discard aliases, drop unused operations and fragments, sort fields, etc. The most important thing here is that the signature match the signature in StatsReports. In StatsReports signatures show up as the key in the per_query map (with the operation name prepended). The signature should be a valid GraphQL query. All traces must have a signature; if this Trace is in a FullTracesReport that signature is in the key of traces_per_query rather than in this field. Engineproxy provides the signature in legacy_signature_needs_resigning instead.
Optional: when GraphQL parsing or validation against the GraphQL schema fails, these fields can include reference to the operation being sent for users to dig into the set of operations that are failing validation.
If this Trace was created by a Router/Gateway, this is the query plan, including sub-Traces for subgraphs. Note that the 'root' tree on the top-level Trace won't contain any resolvers (though it could contain errors that occurred in the Router/Gateway itself).
Was this response served from a full query response cache? (In that case the node tree will have no resolvers.)
Was this query specified successfully as a persisted query hash?
Did this query contain both a full query string and a persisted query hash? (This typically means that a previous request was rejected as an unknown persisted query.)
Was this operation registered and a part of the safelist?
Was this operation forbidden due to lack of safelisting?
Some servers don't do field-level instrumentation for every request and assign each request a "weight" for each request that they do instrument. When this trace is aggregated into field usage stats, it should count as this value towards the estimated_execution_count rather than just 1. This value should typically be at least 1. 0 is treated as 1 for backwards compatibility.
The limits information of the query.
Used in:
,use 0 for absent, -1 for 0
Used in:
Used in:
The variables associated with this query (unless the reporting agent is configured to keep them all private). Values are JSON: ie, strings are enclosed in double quotes, etc. The value of a private variable is the empty string.
This is deprecated and only used for legacy applications don't include this in traces inside a FullTracesReport; the operation name for these traces comes from the key of the traces_per_query map.
Used in:
required
Used in:
Should exclude manual blacklist ("Auth" by default)
Used in:
Used in:
The cost of the operation
Used in:
The result of the operation.
The strategy used in cost calculations.
The estimated cost as calculated via the strategy specified in strategy
The actual cost using the strategy specified in strategy
The depth of the query
The height of the query
The number of aliases in the query
The number of root fields in the query
Used in:
We store information on each resolver execution as a Node on a tree. The structure of the tree corresponds to the structure of the GraphQL response; it does not indicate the order in which resolvers were invoked. Note that nodes representing indexes (and the root node) don't contain all Node fields (eg types and times).
Used in:
The name of the field (for Nodes representing a resolver call) or the index in a list (for intermediate Nodes representing elements of a list). field_name is the name of the field as it appears in the GraphQL response: ie, it may be an alias. (In that case, the original_field_name field holds the actual field name from the schema.) In any context where we're building up a path, we use the response_name rather than the original_field_name.
The field's return type; e.g. "String!" for User.email:String!
The field's parent type; e.g. "User" for User.email:String!
relative to the trace's start_time, in ns
relative to the trace's start_time, in ns
represents a node in the query plan, under which there is a trace tree for that service fetch. In particular, each fetch node represents a call to an implementing service, and calls to implementing services may not be unique. See https://github.com/apollographql/federation/blob/main/query-planner-js/src/QueryPlan.ts for more information and details.
Used in:
, , , , , ,Used in:
A `DeferNode` corresponds to one or more @defer at the same level of "nestedness" in the planned query.
Used in:
Used in:
Used in:
Used in:
This represents a node to send an operation to an implementing service
Used in:
XXX When we want to include more details about the sub-operation that was executed against this service, we should include that here in each fetch node. This might include an operation signature, requires directive, reference resolutions, etc.
This Trace only contains start_time, end_time, duration_ns, and root; all timings were calculated **on the subgraph**, and clock skew will be handled by the ingress server.
relative to the outer trace's start_time, in ns, measured in the Router/Gateway.
Wallclock times measured in the Router/Gateway for when this operation was sent and received.
This node represents a way to reach into the response path and attach related entities. XXX Flatten is really not the right name and this node may be renamed in the query planner.
Used in:
This represents a set of nodes to be executed in parallel by the Router/Gateway executor
Used in:
Used in:
,This represents a set of nodes to be executed sequentially by the Router/Gateway executor
Used in:
A sequence of traces and stats. If Report.traces_pre_aggregated (at the top level of the report) is false, an individual operation should either be described as a trace or as part of stats, but not both. If that flag is true, then all operations are described as stats and some are also described as traces.
Used in:
This describes the fields referenced in the operation. Note that this may include fields that don't show up in FieldStats (due to being interface fields, being nested under null fields or empty lists or non-matching fragments or `@include` or `@skip`, etc). It also may be missing fields that show up in FieldStats (as FieldStats will include the concrete object type for fields referenced via an interface type).
This is an optional field that is used to provide more context to the key of this object within the traces_per_query map. If it's omitted, we assume the key is a standard operation name and signature key.
Used in:
,Key is (eg) "email" for User.email:String!