I’ve just pushed the first iteration of a plugin for adding a correlation id to requests. This is to enable us to track requests across multiple services and is available on github and nuget.
Any feedback is greatly appreciated. There are more details in the readme of the repository.
The initial implementation of the plugin added the correlation id to the request in PreRequestFilter
and the response in GlobalResponseFilter
. However, after I saw this post regarding the new IServiceGateway
interface I tried to implement something using this that would allow external calls to have the correlation id appended to them, internal calls are fine as the same IRequest
is used.
In addition to the PreRequest/Response filters I check the IoC container for implementation of IServiceGatewayFactory
then check if it is a ServiceGatewayFactoryBase
, if it is I then use a decorator (source) to add the correlation id to request. The reason for this is that I need to access the IRequest
(via IServiceGateway GetServiceGateway(IRequest request)
) to get the correlation id from the current request. I then override IServiceGateway GetGateway(Type requestType)
, the only way I could see to add the header to outgoing external calls was to check if the IServiceGateway
is a ServiceClientBase
, and if so add the header to the ServiceClientBase.Headers
collection. Is this the best way to achieve adding the correlation Id to an outgoing request?
It seems that it could be a bit brittle as it relies on an implementation of ServiceGatewayFactoryBase
that internally uses and implementation of ServiceClientBase
(although if these are the general way that external calls are made it may not be too much of a problem).