// Copyright 2017 Google Inc.
//
// 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.logging.v2;

import "google/api/annotations.proto";
import "google/api/monitored_resource.proto";
import "google/logging/type/http_request.proto";
import "google/logging/type/log_severity.proto";
import "google/protobuf/any.proto";
import "google/protobuf/struct.proto";
import "google/protobuf/timestamp.proto";

option cc_enable_arenas = true;
option csharp_namespace = "Google.Cloud.Logging.V2";
option go_package = "google.golang.org/genproto/googleapis/logging/v2;logging";
option java_multiple_files = true;
option java_outer_classname = "LogEntryProto";
option java_package = "com.google.logging.v2";


// An individual entry in a log.
message LogEntry {
  // Required. The resource name of the log to which this log entry belongs:
  //
  //     "projects/[PROJECT_ID]/logs/[LOG_ID]"
  //     "organizations/[ORGANIZATION_ID]/logs/[LOG_ID]"
  //     "billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]"
  //     "folders/[FOLDER_ID]/logs/[LOG_ID]"
  //
  // `[LOG_ID]` must be URL-encoded within `log_name`. Example:
  // `"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity"`.
  // `[LOG_ID]` must be less than 512 characters long and can only include the
  // following characters: upper and lower case alphanumeric characters,
  // forward-slash, underscore, hyphen, and period.
  //
  // For backward compatibility, if `log_name` begins with a forward-slash, such
  // as `/projects/...`, then the log entry is ingested as usual but the
  // forward-slash is removed. Listing the log entry will not show the leading
  // slash and filtering for a log name with a leading slash will never return
  // any results.
  string log_name = 12;

  // Required. The monitored resource associated with this log entry.
  // Example: a log entry that reports a database error would be
  // associated with the monitored resource designating the particular
  // database that reported the error.
  google.api.MonitoredResource resource = 8;

  // Optional. The log entry payload, which can be one of multiple types.
  oneof payload {
    // The log entry payload, represented as a protocol buffer.  Some
    // Google Cloud Platform services use this field for their log
    // entry payloads.
    google.protobuf.Any proto_payload = 2;

    // The log entry payload, represented as a Unicode string (UTF-8).
    string text_payload = 3;

    // The log entry payload, represented as a structure that is
    // expressed as a JSON object.
    google.protobuf.Struct json_payload = 6;
  }

  // Optional. The time the event described by the log entry occurred.  If
  // omitted in a new log entry, Stackdriver Logging will insert the time the
  // log entry is received.  Stackdriver Logging might reject log entries whose
  // time stamps are more than a couple of hours in the future. Log entries
  // with time stamps in the past are accepted.
  google.protobuf.Timestamp timestamp = 9;

  // Optional. The severity of the log entry. The default value is
  // `LogSeverity.DEFAULT`.
  google.logging.type.LogSeverity severity = 10;

  // Optional. A unique identifier for the log entry. If you provide a value,
  // then Stackdriver Logging considers other log entries in the same project,
  // with the same `timestamp`, and with the same `insert_id` to be duplicates
  // which can be removed.  If omitted in new log entries, then Stackdriver
  // Logging will insert its own unique identifier. The `insert_id` is used
  // to order log entries that have the same `timestamp` value.
  string insert_id = 4;

  // Optional. Information about the HTTP request associated with this
  // log entry, if applicable.
  google.logging.type.HttpRequest http_request = 7;

  // Optional. A set of user-defined (key, value) data that provides additional
  // information about the log entry.
  map<string, string> labels = 11;

  // Optional. Information about an operation associated with the log entry, if
  // applicable.
  LogEntryOperation operation = 15;

  // Optional. Resource name of the trace associated with the log entry, if any.
  // If it contains a relative resource name, the name is assumed to be relative
  // to `//tracing.googleapis.com`. Example:
  // `projects/my-projectid/traces/06796866738c859f2f19b7cfb3214824`
  string trace = 22;

  // Optional. Source code location information associated with the log entry,
  // if any.
  LogEntrySourceLocation source_location = 23;
}

// Additional information about a potentially long-running operation with which
// a log entry is associated.
message LogEntryOperation {
  // Optional. An arbitrary operation identifier. Log entries with the
  // same identifier are assumed to be part of the same operation.
  string id = 1;

  // Optional. An arbitrary producer identifier. The combination of
  // `id` and `producer` must be globally unique.  Examples for `producer`:
  // `"MyDivision.MyBigCompany.com"`, `"github.com/MyProject/MyApplication"`.
  string producer = 2;

  // Optional. Set this to True if this is the first log entry in the operation.
  bool first = 3;

  // Optional. Set this to True if this is the last log entry in the operation.
  bool last = 4;
}

// Additional information about the source code location that produced the log
// entry.
message LogEntrySourceLocation {
  // Optional. Source file name. Depending on the runtime environment, this
  // might be a simple name or a fully-qualified name.
  string file = 1;

  // Optional. Line within the source file. 1-based; 0 indicates no line number
  // available.
  int64 line = 2;

  // Optional. Human-readable name of the function or method being invoked, with
  // optional context such as the class or package name. This information may be
  // 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 = 3;
}
