Hi Alan,

So AFAICT this is not a true superset of the TSClientProtoStack API. FWIW, I 
also think that removing that API should have been reviewed.

TSClientProtoStack would distinguish between requests triggered by SPDY over 
TLS and raw SPDY, as well as HTTP vs. HTTPS. I don't know whether that 
capability is still desired, but it's worth pointing the difference. Unless 
this API chains the new VC up to a parent VC and logs the full chain? I know 
you proposed doing that ...

On May 23, 2014, at 1:39 PM, Alan M. Carroll <a...@network-geographics.com> 
wrote:

> 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.

If you increment a global counter, how would you correlate logs across a 
Traffic Server restart? You'll end up with duplicate transaction IDs; so how is 
a plugin supposed to handle that?

> 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.

How would this work in practice? It's common for a plugin to hold a request up 
while it makes sub-requets. How would this let you correlate the sub-requests 
with the original client-originated request?

> 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