.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you 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.

.. _admin-plugins-tcpinfo:

TCPInfo Plugin
**************

This global plugin logs TCP metrics at various points in the HTTP
processing pipeline. The TCP information is retrieved by the
:manpage:`getsockopt(2)` function using the ``TCP_INFO`` option.
This is only supported on systems that support the ``TCP_INFO``
option, currently Linux and BSD.

Plugin Options
--------------

The following options may be specified in :file:`plugin.config`:

.. NOTE: if the option name is not long enough, docutils will not
   add the colspan attribute and the options table formatting will
   be all messed up. Just a trap for young players.

--hooks=NAMELIST
  This option specifies when TCP information should be logged. The
  argument is a comma-separated list of the event names listed
  below. TCP information will be sampled and logged each time the
  specified set of events occurs.

  ==============  ===============================================
   Event Name     Triggered when
  ==============  ===============================================
  send_resp_hdr   The server begins sending an HTTP response.
  ssn_start       A new TCP connection is accepted.
  txn_close       A HTTP transaction is completed.
  txn_start       A HTTP transaction is initiated.
  ==============  ===============================================

--log-file=NAME
  This specifies the base name of the file where TCP information
  should be logged. If this option is not specified, the name
  ``tcpinfo`` is used. Traffic Server will automatically append
  the ``.log`` suffix.

--log-level=LEVEL
  The log level can be either ``1`` to log only the round trip
  time estimate, or ``2`` to log the complete set of TCP information.

  The following fields are logged when the log level is ``1``:

  ==========    ==================================================
  Field Name    Description
  ==========    ==================================================
  timestamp     Event timestamp
  event         Event name (one of the names listed above)
  client        Client IP address
  server        Server IP address
  rtt           Estimated round trip time in microseconds
  ==========    ==================================================

  The following fields are logged when the log level is ``2``:

  ==============    ==================================================
  Field Name        Description
  ==============    ==================================================
  timestamp         Event timestamp
  event             Event name (one of the names listed above)
  client            Client IP address
  server            Server IP address
  rtt               Estimated round trip time in microseconds
  rttvar
  last_sent
  last_recv
  snd_cwnd
  snd_ssthresh
  rcv_ssthresh
  unacked
  sacked
  lost
  retrans
  fackets
  all_retrans
  ==============    ==================================================

  In addition, on newer Linux system, the following two fields are appended
  in log level 2:

  ==============    ==================================================
  Field Name        Description
  ==============    ==================================================
  data_segs_in      Number of incoming data segments
  data_segs_out     Number of outgoing data segments
  ==============    ==================================================

  Note: Features such as TSO (TCP Segment Offload) might skew the numbers
  here. That's true as well for e.g. the retransmit metrics, i.e. anything
  that deals with segments.

--sample-rate=COUNT
  This is the number of times per 1000 requests that the data will
  be logged.  A pseudo-random number generator is used to determine if a
  request will be logged.  The default value is 1000 and this option is
  not required to be in the configuration file.  To achieve a log rate
  of 1% you would set this value to 10.

--rolling-enabled=VALUE
  This logfile option allows you to set logfile rolling behaviour of
  the output log file  without making any changes to the global
  logging configurations.  This option overrides the
  :ts:cv:`proxy.config.output.logfile.rolling_enabled` setting in :file:`records.yaml`
  for the ``tcpinfo`` plugin.  The setting may range from ``0`` to ``3``.
  ``0`` disables logfile rolling.  ``1`` is the ``default`` and enables logfile
  rolling at specific intervals set by ``--rolling-interval-sec`` discussed
  below.  ``2`` enables logfile rolling by logfile size, see
  ``--rolling-size-mb`` below.  Finally a value of ``3`` enables logfile rolling
  at specific intervals or size, whichever occurs first using the interval or size
  settings discussed below.

--rolling-offset-hr=VALUE
  Set the hour ``0`` to ``23`` at which the output log file will roll when
  using interval rolling. Default value is ``0``.

--rolling-interval-sec=VALUE
  Set the rolling interval in seconds for the output log file. May be set
  from ``60`` to ``86400`` seconds, Defaults to ``86400``.

--rolling-size=VALUE
  Set the size in MB at which the output log file  will roll when using log size
  rolling.  Minimum value is ``10``, defaults to ``1024``. In your config file,
  you may use the K, M, or G suffix as in::

  --rolling-size=10M

Examples:
---------

This example logs the simple TCP information to ``tcp-metrics.log``
at the start of a TCP connection and once for each HTTP
transaction thereafter::

  tcpinfo.so --log-file=tcp-metrics --log-level=1 --hooks=ssn_start,txn_start

The file ``tcp-metrics.log`` will contain the following log format (with client and server both on 127.0.0.1)::

  timestamp event client server rtt
  20140414.17h40m14s ssn_start 127.0.0.1 127.0.0.1 153859
  20140414.17h40m14s txn_start 127.0.0.1 127.0.0.1 181018
  20140414.17h40m16s ssn_start 127.0.0.1 127.0.0.1 86869
  20140414.17h40m16s txn_start 127.0.0.1 127.0.0.1 19088
  20140414.17h40m16s ssn_start 127.0.0.1 127.0.0.1 85718
  20140414.17h40m16s txn_start 127.0.0.1 127.0.0.1 38059
