This sounds very useful.  (We did something hacky with the address to get 
similar functionality just inside a plugin, this would be much cleaner.)
I wonder if it should take some extra optional arguments to allow doing 
transparent stuff too.  (So it would be a complete super-set.)

-William Bardwell
________________________________________
From: Alan M. Carroll [a...@network-geographics.com]
Sent: Friday, May 23, 2014 4:39 PM
To: dev@trafficserver.apache.org
Subject: API proposal

TSHttpConnectWithPluginID
=========================

Allows the plugin to initiate an http connection. This will tag the HTTP state 
machine with extra data that can be accessed by the logging interface.


Synopsis
--------

`#include <ts/ts.h>`

.. c:function:: TSVConn TSHttpConnectWithPluginId(sockaddr const *addr, char 
const* tag, int64_t id)


Description
-----------

This call attempts to create an HTTP state machine and a virtual connection to 
that state machine. This is more efficient than using :c:func:`TSNetConnect` 
because it avoids using the operating system stack via the loopback interface.

*addr*
   This is the network address of the target of the connection. This includes 
the port which should be stored in the :c:type:`sockaddr` structure.

*tag*
   This is a tag that is passed through to the HTTP state machine. It must be a 
persistent string that has a lifetime longer than the connection. It is 
accessible via the log field ``pitag``. This is intended as a class or type 
identifier that is consistent across all connections for this plugin. In 
effect, the name of the plugin. This can be ``NULL``.

*id*
   This is a numeric identifier that is passed through to the HTTP state 
machine. It is accessible via the log field ``piid``. This is intended as a 
connection identifier and should be distinct for every call to 
``TSHttpConnectWithPluginID``. The easist mechanism is to define a plugin 
global value and increment it for each connection. The value ``0`` is reserved 
to mean "not set" and can be used as a default if this functionality is not 
needed.

The virtual connection returned as the ``TSCVonn`` is API equivalent to a 
network virtual connection both to the plugin and to internal mechanisms. Data 
is read and written to the connection (and thence to the target system) by 
reading and writing on this virtual connection.

The combination of tag and id is intended to enable correlation in log post 
processing. The tag identifies the connection as related to the plugin and the 
id can be used in conjuction with plugin generated logs to correlate the log 
records.

This is also intended to be useful for debugging by tagging not just the HTTP 
state machine but also the connection virtual connections (if of type 
``PluginVC``) with correlated data.

.. topic:: Example

   The SPDY plugin uses this to correlate client sessions with SPDY streams. 
Each client connection is assigned a distinct numeric identifier. This is 
passed as the *id* to ``TSHttpConnectWithPluginId``. The name is selected to be 
the NPN string for the client session protocol, e.g. "spdy/3" or "spdy/3.1". 
Log post processing can then count the number of connections for the various 
supported protocols and the number of streams / sessions / transactions for 
each real client connection to Traffic Server.

Reply via email to