// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.appengine.logging.v1;

import "google/logging/type/log_severity.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";

option go_package = "google.golang.org/genproto/googleapis/appengine/logging/v1;logging";
option java_multiple_files = true;
option java_outer_classname = "RequestLogProto";
option java_package = "com.google.appengine.logging.v1";

// Application log line emitted while processing a request.
message LogLine {
  // Approximate time when this log entry was made.
  google.protobuf.Timestamp time = 1;

  // Severity of this log entry.
  google.logging.type.LogSeverity severity = 2;

  // App-provided log message.
  string log_message = 3;

  // Where in the source code this log message was written.
  SourceLocation source_location = 4;
}

// Specifies a location in a source code file.
message SourceLocation {
  // Source file name. Depending on the runtime environment, this might be a
  // simple name or a fully-qualified name.
  string file = 1;

  // Line within the source file.
  int64 line = 2;

  // Human-readable name of the function or method being invoked, with optional
  // context such as the class or package name. This information is used in
  // contexts such as the logs viewer, where a file and line number are less
  // meaningful. The format can vary by language. For example:
  // `qual.if.ied.Class.method` (Java), `dir/package.func` (Go), `function`
  // (Python).
  string function_name = 3;
}

// A reference to a particular snapshot of the source tree used to build and
// deploy an application.
message SourceReference {
  // Optional. A URI string identifying the repository.
  // Example: "https://github.com/GoogleCloudPlatform/kubernetes.git"
  string repository = 1;

  // The canonical and persistent identifier of the deployed revision.
  // Example (git): "0035781c50ec7aa23385dc841529ce8a4b70db1b"
  string revision_id = 2;
}

// Complete log information about a single HTTP request to an App Engine
// application.
message RequestLog {
  // Application that handled this request.
  string app_id = 1;

  // Module of the application that handled this request.
  string module_id = 37;

  // Version of the application that handled this request.
  string version_id = 2;

  // Globally unique identifier for a request, which is based on the request
  // start time.  Request IDs for requests which started later will compare
  // greater as strings than those for requests which started earlier.
  string request_id = 3;

  // Origin IP address.
  string ip = 4;

  // Time when the request started.
  google.protobuf.Timestamp start_time = 6;

  // Time when the request finished.
  google.protobuf.Timestamp end_time = 7;

  // Latency of the request.
  google.protobuf.Duration latency = 8;

  // Number of CPU megacycles used to process request.
  int64 mega_cycles = 9;

  // Request method. Example: `"GET"`, `"HEAD"`, `"PUT"`, `"POST"`, `"DELETE"`.
  string method = 10;

  // Contains the path and query portion of the URL that was requested. For
  // example, if the URL was "http://example.com/app?name=val", the resource
  // would be "/app?name=val".  The fragment identifier, which is identified by
  // the `#` character, is not included.
  string resource = 11;

  // HTTP version of request. Example: `"HTTP/1.1"`.
  string http_version = 12;

  // HTTP response status code. Example: 200, 404.
  int32 status = 13;

  // Size in bytes sent back to client by request.
  int64 response_size = 14;

  // Referrer URL of request.
  string referrer = 15;

  // User agent that made the request.
  string user_agent = 16;

  // The logged-in user who made the request.
  //
  // Most likely, this is the part of the user's email before the `@` sign.  The
  // field value is the same for different requests from the same user, but
  // different users can have similar names.  This information is also
  // available to the application via the App Engine Users API.
  //
  // This field will be populated starting with App Engine 1.9.21.
  string nickname = 40;

  // File or class that handled the request.
  string url_map_entry = 17;

  // Internet host and port number of the resource being requested.
  string host = 20;

  // An indication of the relative cost of serving this request.
  double cost = 21;

  // Queue name of the request, in the case of an offline request.
  string task_queue_name = 22;

  // Task name of the request, in the case of an offline request.
  string task_name = 23;

  // Whether this was a loading request for the instance.
  bool was_loading_request = 24;

  // Time this request spent in the pending request queue.
  google.protobuf.Duration pending_time = 25;

  // If the instance processing this request belongs to a manually scaled
  // module, then this is the 0-based index of the instance. Otherwise, this
  // value is -1.
  int32 instance_index = 26;

  // Whether this request is finished or active.
  bool finished = 27;

  // Whether this is the first `RequestLog` entry for this request.  If an
  // active request has several `RequestLog` entries written to Stackdriver
  // Logging, then this field will be set for one of them.
  bool first = 42;

  // An identifier for the instance that handled the request.
  string instance_id = 28;

  // A list of log lines emitted by the application while serving this request.
  repeated LogLine line = 29;

  // App Engine release version.
  string app_engine_release = 38;

  // Stackdriver Trace identifier for this request.
  string trace_id = 39;

  // If true, the value in the 'trace_id' field was sampled for storage in a
  // trace backend.
  bool trace_sampled = 43;

  // Source code for the application that handled this request. There can be
  // more than one source reference per deployed application if source code is
  // distributed among multiple repositories.
  repeated SourceReference source_reference = 41;
}
