Re: [HACKERS] idea: custom log_line_prefix components besidesapplication_name - Mailing list pgsql-hackers
From | Chapman Flack |
---|---|
Subject | Re: [HACKERS] idea: custom log_line_prefix components besidesapplication_name |
Date | |
Msg-id | 25a7f149-da7f-01d9-35e4-9b79704a329f@anastigmatix.net Whole thread Raw |
In response to | Re: [HACKERS] idea: custom log_line_prefix components besides application_name (Mark Dilger <hornschnorter@gmail.com>) |
Responses |
Re: [HACKERS] idea: custom log_line_prefix components besides application_name
|
List | pgsql-hackers |
On 05/09/2017 01:25 PM, Mark Dilger wrote: > Consensus, no, but utility, yes. > > In three tier architectures there is a general problem that the database > role used by the middle tier to connect to the database does not entail > information about the user who, such as a visitor to your website, made > the request of the middle tier. Chapman wants this information so he > can include it in the logs, but stored procedures that work in support > of the middle tier might want it for locale information, etc. As things > currently stand, there is no good way to get this passed all the way down > into the database stored procedure that needs it, given that you are > typically calling down through third party code that doesn't play along. I like this framing. Clearly a good part of the story is outside of PostgreSQL proper, and has to be written elsewhere. There could be a picture like this: middle tier receiving request (webapp?) - knows user/origin info | Vthird-party code (rails? web2py? spring?) -doesn't play along | VPQ protocol driver (pg? psycopg2? pgjdbc?) - could offer support . . VPostgreSQL(what to do here?) What to do on the client side of the . . > can only be suggested and would have to be independently implemented by several drivers, but I could imagine a driver offering some API to tuck a bit of application-specific data into some form of thread-local storage. In the picture above, the top layer, where the user/origin info is known, would need a small modification to call that driver API and provide that info. The request could then be processed on down through the third-party layer(s) that don't play along. When it reaches the driver, something magic will happen to forward the thread-local preserved information on to PostgreSQL along with the query. That of course isn't enough if the intervening layers that don't play along use thread pools, and the request could ultimately reach the driver on a different thread. But for the simple case it gives an idea. As to how the driver then propagates the info to PostgreSQL, seems to me it could generate a SET in front of the actual query. Most or all of what would be needed in PostgreSQL might be possible in an extension, which I could try my hand at writing. Here's the idea: The extension would define one or more custom GUCs, with flags / check hooks to enforce strict limits on when and how they can be set. If the client stack is using a simple connection-per-request approach, they could just be PGC_BACKEND, and the client part of the picture could just be that the top layer supplies them as options= in the conninfo string, which various drivers already support. But if connections may be pooled and re-used for different identities and origins, that isn't enough. So the extension would provide a function that can be called once in the session, returning a random magic cookie. The driver itself would call this function upon connecting, and save the cookie in a per-connection private variable. Code above the driver in the stack would have no access to it, as the function can't be called a second time, and so could not spoof identities just by sending arbitrary SET commands. The extension would reject any attempts to set or reset those GUCs unless accompanied by the cookie. Stored procedures could then look at those GUCs for locale / identity / origin information and trust that they haven't been spoofed by injected commands. If there were such a thing as a log_line_prefix_hook, then such an extension could also support my original idea and add some new escapes to log the added information. But there doesn't seem to be such a hook at present. Or, if there were simply a %{name-of-GUC} escape supported in log_line_prefix, nothing more would even be needed. Does this sound workable? -Chap
pgsql-hackers by date: