github.com/niko0xdev/gqlgen@v0.17.55-0.20240120102243-2ecff98c3e37/graphql/handler/apollofederatedtracingv1/generated/apollo_trace.proto (about)

     1  syntax = "proto3";
     2  option go_package = "./generated";
     3  
     4  import "google/protobuf/timestamp.proto";
     5  
     6  message Trace {
     7    message CachePolicy {
     8      enum Scope {
     9        UNKNOWN = 0;
    10        PUBLIC = 1;
    11        PRIVATE = 2;
    12      }
    13  
    14      Scope scope = 1;
    15      int64 max_age_ns = 2; // use 0 for absent, -1 for 0
    16    }
    17  
    18    message Details {
    19      // The variables associated with this query (unless the reporting agent is
    20      // configured to keep them all private). Values are JSON: ie, strings are
    21      // enclosed in double quotes, etc.  The value of a private variable is
    22      // the empty string.
    23      map<string, string> variables_json = 4;
    24  
    25  
    26      // This is deprecated and only used for legacy applications
    27      // don't include this in traces inside a FullTracesReport; the operation
    28      // name for these traces comes from the key of the traces_per_query map.
    29      string operation_name = 3;
    30    }
    31  
    32    message Error {
    33      string message = 1; // required
    34      repeated Location location = 2;
    35      uint64 time_ns = 3;
    36      string json = 4;
    37    }
    38  
    39    message HTTP {
    40      message Values {
    41        repeated string value = 1;
    42      }
    43  
    44      enum Method {
    45        UNKNOWN = 0;
    46        OPTIONS = 1;
    47        GET = 2;
    48        HEAD = 3;
    49        POST = 4;
    50        PUT = 5;
    51        DELETE = 6;
    52        TRACE = 7;
    53        CONNECT = 8;
    54        PATCH = 9;
    55      }
    56      Method method = 1;
    57      string host = 2;
    58      string path = 3;
    59  
    60      // Should exclude manual blacklist ("Auth" by default)
    61      map<string, Values> request_headers = 4;
    62      map<string, Values> response_headers = 5;
    63  
    64      uint32 status_code = 6;
    65  
    66      bool secure = 8; // TLS was used
    67      string protocol = 9; // by convention "HTTP/1.0", "HTTP/1.1", "HTTP/2" or "h2"
    68    }
    69  
    70    message Location {
    71      uint32 line = 1;
    72      uint32 column = 2;
    73    }
    74  
    75    // We store information on each resolver execution as a Node on a tree.
    76    // The structure of the tree corresponds to the structure of the GraphQL
    77    // response; it does not indicate the order in which resolvers were
    78    // invoked.  Note that nodes representing indexes (and the root node)
    79    // don't contain all Node fields (eg types and times).
    80    message Node {
    81      // The name of the field (for Nodes representing a resolver call) or the
    82      // index in a list (for intermediate Nodes representing elements of a list).
    83      // field_name is the name of the field as it appears in the GraphQL
    84      // response: ie, it may be an alias.  (In that case, the original_field_name
    85      // field holds the actual field name from the schema.) In any context where
    86      // we're building up a path, we use the response_name rather than the
    87      // original_field_name.
    88      oneof id {
    89        string response_name = 1;
    90        uint32 index = 2;
    91      }
    92  
    93      string original_field_name = 14;
    94  
    95      // The field's return type; e.g. "String!" for User.email:String!
    96      string type = 3;
    97  
    98      // The field's parent type; e.g. "User" for User.email:String!
    99      string parent_type = 13;
   100  
   101      CachePolicy cache_policy = 5;
   102  
   103      // relative to the trace's start_time, in ns
   104      uint64 start_time = 8;
   105      // relative to the trace's start_time, in ns
   106      uint64 end_time = 9;
   107  
   108      repeated Error error = 11;
   109      repeated Node child = 12;
   110  
   111      reserved 4;
   112    }
   113  
   114    // represents a node in the query plan, under which there is a trace tree for that service fetch.
   115    // In particular, each fetch node represents a call to an implementing service, and calls to implementing
   116    // services may not be unique. See https://github.com/apollographql/apollo-server/blob/main/packages/apollo-gateway/src/QueryPlan.ts
   117    // for more information and details.
   118    message QueryPlanNode {
   119      // This represents a set of nodes to be executed sequentially by the Gateway executor
   120      message SequenceNode {
   121        repeated QueryPlanNode nodes = 1;
   122      }
   123      // This represents a set of nodes to be executed in parallel by the Gateway executor
   124      message ParallelNode {
   125        repeated QueryPlanNode nodes = 1;
   126      }
   127      // This represents a node to send an operation to an implementing service
   128      message FetchNode {
   129        // XXX When we want to include more details about the sub-operation that was
   130        // executed against this service, we should include that here in each fetch node.
   131        // This might include an operation signature, requires directive, reference resolutions, etc.
   132        string service_name = 1;
   133  
   134        bool trace_parsing_failed = 2;
   135  
   136        // This Trace only contains start_time, end_time, duration_ns, and root;
   137        // all timings were calculated **on the federated service**, and clock skew
   138        // will be handled by the ingress server.
   139        Trace trace = 3;
   140  
   141        // relative to the outer trace's start_time, in ns, measured in the gateway.
   142        uint64 sent_time_offset = 4;
   143  
   144        // Wallclock times measured in the gateway for when this operation was
   145        // sent and received.
   146        google.protobuf.Timestamp sent_time = 5;
   147        google.protobuf.Timestamp received_time = 6;
   148      }
   149  
   150      // This node represents a way to reach into the response path and attach related entities.
   151      // XXX Flatten is really not the right name and this node may be renamed in the query planner.
   152      message FlattenNode {
   153        repeated ResponsePathElement response_path = 1;
   154        QueryPlanNode node = 2;
   155      }
   156      message ResponsePathElement {
   157        oneof id {
   158          string field_name = 1;
   159          uint32 index = 2;
   160        }
   161      }
   162      oneof node {
   163        SequenceNode sequence = 1;
   164        ParallelNode parallel = 2;
   165        FetchNode fetch = 3;
   166        FlattenNode flatten = 4;
   167      }
   168    }
   169  
   170    // Wallclock time when the trace began.
   171    google.protobuf.Timestamp start_time = 4; // required
   172    // Wallclock time when the trace ended.
   173    google.protobuf.Timestamp end_time = 3; // required
   174    // High precision duration of the trace; may not equal end_time-start_time
   175    // (eg, if your machine's clock changed during the trace).
   176    uint64 duration_ns = 11; // required
   177    // A tree containing information about all resolvers run directly by this
   178    // service, including errors.
   179    Node root = 14;
   180  
   181    // -------------------------------------------------------------------------
   182    // Fields below this line are *not* included in federated traces (the traces
   183    // sent from federated services to the gateway).
   184  
   185    // In addition to details.raw_query, we include a "signature" of the query,
   186    // which can be normalized: for example, you may want to discard aliases, drop
   187    // unused operations and fragments, sort fields, etc. The most important thing
   188    // here is that the signature match the signature in StatsReports. In
   189    // StatsReports signatures show up as the key in the per_query map (with the
   190    // operation name prepended).  The signature should be a valid GraphQL query.
   191    // All traces must have a signature; if this Trace is in a FullTracesReport
   192    // that signature is in the key of traces_per_query rather than in this field.
   193    // Engineproxy provides the signature in legacy_signature_needs_resigning
   194    // instead.
   195    string signature = 19;
   196  
   197    // Optional: when GraphQL parsing or validation against the GraphQL schema fails, these fields
   198    // can include reference to the operation being sent for users to dig into the set of operations
   199    // that are failing validation.
   200    string unexecutedOperationBody = 27;
   201    string unexecutedOperationName = 28;
   202  
   203    Details details = 6;
   204  
   205    string client_name = 7;
   206    string client_version = 8;
   207  
   208    HTTP http = 10;
   209  
   210    CachePolicy cache_policy = 18;
   211  
   212    // If this Trace was created by a gateway, this is the query plan, including
   213    // sub-Traces for federated services. Note that the 'root' tree on the
   214    // top-level Trace won't contain any resolvers (though it could contain errors
   215    // that occurred in the gateway itself).
   216    QueryPlanNode query_plan = 26;
   217  
   218    // Was this response served from a full query response cache?  (In that case
   219    // the node tree will have no resolvers.)
   220    bool full_query_cache_hit = 20;
   221  
   222    // Was this query specified successfully as a persisted query hash?
   223    bool persisted_query_hit = 21;
   224    // Did this query contain both a full query string and a persisted query hash?
   225    // (This typically means that a previous request was rejected as an unknown
   226    // persisted query.)
   227    bool persisted_query_register = 22;
   228  
   229    // Was this operation registered and a part of the safelist?
   230    bool registered_operation = 24;
   231  
   232    // Was this operation forbidden due to lack of safelisting?
   233    bool forbidden_operation = 25;
   234  
   235    // Some servers don't do field-level instrumentation for every request and assign
   236    // each request a "weight" for each request that they do instrument. When this
   237    // trace is aggregated into field usage stats, it should count as this value
   238    // towards the estimated_execution_count rather than just 1. This value should
   239    // typically be at least 1.
   240    //
   241    // 0 is treated as 1 for backwards compatibility.
   242    double field_execution_weight = 31;
   243  
   244  
   245  
   246    // removed: Node parse = 12; Node validate = 13;
   247    //          Id128 server_id = 1; Id128 client_id = 2;
   248  	//          String client_reference_id = 23; String client_address = 9;
   249    reserved 1, 2, 9, 12, 13, 23;
   250  }
   251  
   252  // The `service` value embedded within the header key is not guaranteed to contain an actual service,
   253  // and, in most cases, the service information is trusted to come from upstream processing. If the
   254  // service _is_ specified in this header, then it is checked to match the context that is reporting it.
   255  // Otherwise, the service information is deduced from the token context of the reporter and then sent
   256  // along via other mechanisms (in Kafka, the `ReportKafkaKey). The other information (hostname,
   257  // agent_version, etc.) is sent by the Apollo Engine Reporting agent, but we do not currently save that
   258  // information to any of our persistent storage.
   259  message ReportHeader {
   260    // eg "mygraph@myvariant"
   261    string graph_ref = 12;
   262  
   263    // eg "host-01.example.com"
   264    string hostname = 5;
   265  
   266    // eg "engineproxy 0.1.0"
   267    string agent_version = 6; // required
   268    // eg "prod-4279-20160804T065423Z-5-g3cf0aa8" (taken from `git describe --tags`)
   269    string service_version = 7;
   270    // eg "node v4.6.0"
   271    string runtime_version = 8;
   272    // eg "Linux box 4.6.5-1-ec2 #1 SMP Mon Aug 1 02:31:38 PDT 2016 x86_64 GNU/Linux"
   273    string uname = 9;
   274    // An id that is used to represent the schema to Apollo Graph Manager
   275    // Using this in place of what used to be schema_hash, since that is no longer
   276    // attached to a schema in the backend.
   277    string executable_schema_id = 11;
   278  
   279    reserved 3; // removed string service = 3;
   280  }
   281  
   282  message PathErrorStats {
   283    map<string, PathErrorStats> children = 1;
   284    uint64 errors_count = 4;
   285    uint64 requests_with_errors_count = 5;
   286  }
   287  
   288  message QueryLatencyStats {
   289    repeated sint64 latency_count = 13;
   290    uint64 request_count = 2;
   291    uint64 cache_hits = 3;
   292    uint64 persisted_query_hits = 4;
   293    uint64 persisted_query_misses = 5;
   294    repeated sint64 cache_latency_count = 14;
   295    PathErrorStats root_error_stats = 7;
   296    uint64 requests_with_errors_count = 8;
   297    repeated sint64 public_cache_ttl_count = 15;
   298    repeated sint64 private_cache_ttl_count = 16;
   299    uint64 registered_operation_count = 11;
   300    uint64 forbidden_operation_count = 12;
   301    // The number of requests that were executed without field-level
   302    // instrumentation (and thus do not contribute to `observed_execution_count`
   303    // fields on this message's cousin-twice-removed FieldStats).
   304    uint64 requests_without_field_instrumentation = 17;
   305    // 1, 6, 9, and 10 were old int64 histograms
   306    reserved 1, 6, 9, 10;
   307  }
   308  
   309  message StatsContext {
   310    // string client_reference_id = 1;
   311    reserved 1;
   312    string client_name = 2;
   313    string client_version = 3;
   314  }
   315  
   316  message ContextualizedQueryLatencyStats {
   317    QueryLatencyStats query_latency_stats = 1;
   318    StatsContext context = 2;
   319  }
   320  
   321  message ContextualizedTypeStats {
   322    StatsContext context = 1;
   323    map<string, TypeStat> per_type_stat = 2;
   324  }
   325  
   326  message FieldStat {
   327    string return_type = 3; // required; eg "String!" for User.email:String!
   328    // Number of errors whose path is this field. Note that we assume that error
   329    // tracking does *not* require field-level instrumentation so this *will*
   330    // include errors from requests that don't contribute to the
   331    // `observed_execution_count` field (and does not need to be scaled by
   332    // field_execution_weight).
   333    uint64 errors_count = 4;
   334    // Number of times that the resolver for this field is directly observed being
   335    // executed.
   336    uint64 observed_execution_count = 5;
   337    // Same as `count` but potentially scaled upwards if the server was only
   338    // performing field-level instrumentation on a sampling of operations.  For
   339    // example, if the server randomly instruments 1% of requests for this
   340    // operation, this number will be 100 times greater than
   341    // `observed_execution_count`. (When aggregating a Trace into FieldStats,
   342    // this number goes up by the trace's `field_execution_weight` for each
   343    // observed field execution, while `observed_execution_count` above goes
   344    // up by 1.)
   345    uint64 estimated_execution_count = 10;
   346    // Number of times the resolver for this field is executed that resulted in
   347    // at least one error. "Request" is a misnomer here as this corresponds to
   348    // resolver calls, not overall operations. Like `errors_count` above, this
   349    // includes all requests rather than just requests with field-level
   350    // instrumentation.
   351    uint64 requests_with_errors_count = 6;
   352    // Duration histogram for the latency of this field. Note that it is scaled in
   353    // the same way as estimated_execution_count so its "total count" might be
   354    // greater than `observed_execution_count` and may not exactly equal
   355    // `estimated_execution_count` due to rounding.
   356    repeated sint64 latency_count = 9;
   357    reserved 1, 2, 7, 8;
   358  }
   359  
   360  message TypeStat {
   361    // Key is (eg) "email" for User.email:String!
   362    map<string, FieldStat> per_field_stat = 3;
   363    reserved 1, 2;
   364  }
   365  
   366  message ReferencedFieldsForType {
   367    // Contains (eg) "email" for User.email:String!
   368    repeated string field_names = 1;
   369    // True if this type is an interface.
   370    bool is_interface = 2;
   371  }
   372  
   373  
   374  
   375  // This is the top-level message used by the new traces ingress. This
   376  // is designed for the apollo-engine-reporting TypeScript agent and will
   377  // eventually be documented as a public ingress API. This message consists
   378  // solely of traces; the equivalent of the StatsReport is automatically
   379  // generated server-side from this message. Agent should either send a trace or include it in the stats
   380  // for every request in this report. Generally, buffering up until a large
   381  // size has been reached (say, 4MB) or 5-10 seconds has passed is appropriate.
   382  // This message used to be know as FullTracesReport, but got renamed since it isn't just for traces anymore
   383  message Report {
   384    ReportHeader header = 1;
   385  
   386    // key is statsReportKey (# operationName\nsignature) Note that the nested
   387    // traces will *not* have a signature or details.operationName (because the
   388    // key is adequate).
   389    //
   390    // We also assume that traces don't have
   391    // legacy_per_query_implicit_operation_name, and we don't require them to have
   392    // details.raw_query (which would consume a lot of space and has privacy/data
   393    // access issues, and isn't currently exposed by our app anyway).
   394    map<string, TracesAndStats> traces_per_query = 5;
   395  
   396    // This is the time that the requests in this trace are considered to have taken place
   397    // If this field is not present the max of the end_time of each trace will be used instead.
   398    // If there are no traces and no end_time present the report will not be able to be processed.
   399    // Note: This will override the end_time from traces.
   400    google.protobuf.Timestamp end_time = 2; // required if no traces in this message
   401  
   402    // Total number of operations processed during this period.
   403    uint64 operation_count = 6;
   404  }
   405  
   406  message ContextualizedStats {
   407    StatsContext context = 1;
   408    QueryLatencyStats query_latency_stats = 2;
   409    // Key is type name. This structure provides data for the count and latency of individual
   410    // field executions and thus only reflects operations for which field-level tracing occurred.
   411    map<string, TypeStat> per_type_stat = 3;
   412  
   413  }
   414  
   415  // A sequence of traces and stats. An individual operation should either be described as a trace
   416  // or as part of stats, but not both.
   417  message TracesAndStats {
   418    repeated Trace trace = 1;
   419    repeated ContextualizedStats stats_with_context = 2;
   420    // This describes the fields referenced in the operation. Note that this may
   421    // include fields that don't show up in FieldStats (due to being interface fields,
   422    // being nested under null fields or empty lists or non-matching fragments or
   423    // `@include` or `@skip`, etc). It also may be missing fields that show up in FieldStats
   424    // (as FieldStats will include the concrete object type for fields referenced
   425    // via an interface type).
   426    map<string, ReferencedFieldsForType> referenced_fields_by_type = 4;
   427    // This field is used to validate that the algorithm used to construct `stats_with_context`
   428    // matches similar algorithms in Apollo's servers. It is otherwise ignored and should not
   429    // be included in reports.
   430    repeated Trace internal_traces_contributing_to_stats = 3;
   431  }