// Copyright 2025 Envoy Project Authors
//
// 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 envoy.extensions.access_loggers.fluentd.v3;

import "envoy/config/core/v3/backoff.proto";
import "envoy/config/core/v3/extension.proto";

import "google/protobuf/duration.proto";
import "google/protobuf/struct.proto";
import "google/protobuf/wrappers.proto";

import "udpa/annotations/status.proto";
import "validate/validate.proto";

option java_package = "io.envoyproxy.envoy.extensions.access_loggers.fluentd.v3";
option java_outer_classname = "FluentdProto";
option java_multiple_files = true;
option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/access_loggers/fluentd/v3;fluentdv3";
option (udpa.annotations.file_status).package_version_status = ACTIVE;

// [#protodoc-title: Fluentd access log]

// Configuration for the *envoy.access_loggers.fluentd* :ref:`AccessLog <envoy_v3_api_msg_config.accesslog.v3.AccessLog>`.
// This access log extension will send the emitted access logs over a TCP connection to an upstream that is accepting
// the Fluentd Forward Protocol as described in: `Fluentd Forward Protocol Specification
// <https://github.com/fluent/fluentd/wiki/Forward-Protocol-Specification-v1>`_.
// [#extension: envoy.access_loggers.fluentd]
// [#next-free-field: 9]
message FluentdAccessLogConfig {
  message RetryOptions {
    // The number of times the logger will attempt to connect to the upstream during reconnects.
    // By default, there is no limit. The logger will attempt to reconnect to the upstream each time
    // connecting to the upstream failed or the upstream connection had been closed for any reason.
    google.protobuf.UInt32Value max_connect_attempts = 1;

    // Sets the backoff strategy. If this value is not set, the default base backoff interval is 500
    // milliseconds and the default max backoff interval is 5 seconds (10 times the base interval).
    config.core.v3.BackoffStrategy backoff_options = 2;
  }

  // The upstream cluster to connect to for streaming the Fluentd messages.
  string cluster = 1 [(validate.rules).string = {min_len: 1}];

  // A tag is a string separated with '.' (e.g. log.type) to categorize events.
  // See: https://github.com/fluent/fluentd/wiki/Forward-Protocol-Specification-v1#message-modes
  string tag = 2 [(validate.rules).string = {min_len: 1}];

  // The prefix to use when emitting :ref:`statistics <config_access_log_stats>`.
  string stat_prefix = 3 [(validate.rules).string = {min_len: 1}];

  // Interval for flushing access logs to the TCP stream. Logger will flush requests every time
  // this interval is elapsed, or when batch size limit is hit, whichever comes first. Defaults to
  // 1 second.
  google.protobuf.Duration buffer_flush_interval = 4 [(validate.rules).duration = {gt {}}];

  // Soft size limit in bytes for access log entries buffer. The logger will buffer requests until
  // this limit it hit, or every time flush interval is elapsed, whichever comes first. When the buffer
  // limit is hit, the logger will immediately flush the buffer contents. Setting it to zero effectively
  // disables the batching. Defaults to 16384.
  google.protobuf.UInt32Value buffer_size_bytes = 5;

  // A struct that represents the record that is sent for each log entry.
  // https://github.com/fluent/fluentd/wiki/Forward-Protocol-Specification-v1#entry
  // Values are rendered as strings, numbers, or boolean values as appropriate.
  // Nested JSON objects may be produced by some command operators (e.g. FILTER_STATE or DYNAMIC_METADATA).
  // See :ref:`format string<config_access_log_format_strings>` documentation for a specific command operator details.
  //
  // .. validated-code-block:: yaml
  //   :type-name: envoy.extensions.access_loggers.fluentd.v3.FluentdAccessLogConfig
  //
  //   record:
  //     status: "%RESPONSE_CODE%"
  //     message: "%LOCAL_REPLY_BODY%"
  //
  // The following msgpack record would be created:
  //
  // .. code-block:: json
  //
  //  {
  //    "status": 500,
  //    "message": "My error message"
  //  }
  google.protobuf.Struct record = 6 [(validate.rules).message = {required: true}];

  // Optional retry, in case upstream connection has failed. If this field is not set, the default values will be applied,
  // as specified in the :ref:`RetryOptions <envoy_v3_api_msg_extensions.access_loggers.fluentd.v3.FluentdAccessLogConfig.RetryOptions>`
  // configuration.
  RetryOptions retry_options = 7;

  // Specifies a collection of Formatter plugins that can be called from the access log configuration.
  // See the formatters extensions documentation for details.
  // [#extension-category: envoy.formatter]
  repeated config.core.v3.TypedExtensionConfig formatters = 8;
}
