LP1492793: Support Application Name Postgres Option
authorJason Boyer <jboyer@library.in.gov>
Sun, 6 Sep 2015 16:58:49 +0000 (12:58 -0400)
committerMike Rylander <mrylander@gmail.com>
Wed, 2 Mar 2016 20:58:31 +0000 (15:58 -0500)
If app_settings/database/application_name is defined,
connections by that service will have the application_name
postgres option set, allowing log analyzers to associate
queries and services.

To test:

[1] Apply the patch and restart OpenSRF services.
[2] Query the pg_stat_activity table in the PostgreSQL
    database; the application_name column should now
    be populated with values like 'open-ils.cstore'
    or 'open-ils.storage' that indicate which Evergreen
    service holds the database connection.

Signed-off-by: Jason Boyer <jboyer@library.in.gov>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/examples/opensrf.xml.example
Open-ILS/src/c-apps/oils_sql.c
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg.pm

index 59f737a..7b6484c 100644 (file)
@@ -159,6 +159,7 @@ vim:et:ts=4:sw=4:
                     <db>evergreen</db>
                     <user>postgres</user>
                     <pw>postgres</pw>
+                    <application_name>open-ils.reporter</application_name>
                 </database>
                 <state_store>
                     <driver>Pg</driver>
@@ -167,6 +168,7 @@ vim:et:ts=4:sw=4:
                     <db>evergreen</db>
                     <user>postgres</user>
                     <pw>postgres</pw>
+                    <application_name>open-ils.reporter-state</application_name>
                 </state_store>
                 <files>
                     <!-- successful report outputs go here -->
@@ -880,6 +882,7 @@ vim:et:ts=4:sw=4:
                             <pw>postgres</pw>
                             <db>evergreen</db>
                             <client_encoding>UTF-8</client_encoding>
+                            <application_name>open-ils.storage</application_name>
                         </database>
                     </databases>
                 </app_settings>
@@ -909,6 +912,7 @@ vim:et:ts=4:sw=4:
                         <pw>postgres</pw>
                         <db>evergreen</db>
                         <client_encoding>UTF-8</client_encoding>
+                        <application_name>open-ils.cstore</application_name>
                     </database>
                 </app_settings>
             </open-ils.cstore>
@@ -943,6 +947,7 @@ vim:et:ts=4:sw=4:
                         <pw>postgres</pw>
                         <db>evergreen</db>
                         <client_encoding>UTF-8</client_encoding>
+                        <application_name>open-ils.pcrud</application_name>
                     </database>
                 </app_settings>
             </open-ils.pcrud>
@@ -970,6 +975,7 @@ vim:et:ts=4:sw=4:
                         <pw>postgres</pw>
                         <db>evergreen</db>
                         <client_encoding>UTF-8</client_encoding>
+                        <application_name>open-ils.qstore</application_name>
                     </database>
                 </app_settings>
             </open-ils.qstore>
@@ -1055,6 +1061,7 @@ vim:et:ts=4:sw=4:
                         <pw>postgres</pw>
                         <db>evergreen</db>
                         <client_encoding>UTF-8</client_encoding>
+                        <application_name>open-ils.reporter-store</application_name>
                     </database>
                 </app_settings>
             </open-ils.reporter-store>
index 8169f42..bacb867 100644 (file)
@@ -167,6 +167,7 @@ dbi_conn oilsConnectDB( const char* mod_name ) {
        char* port   = osrf_settings_host_value( "/apps/%s/app_settings/database/port", mod_name );
        char* db     = osrf_settings_host_value( "/apps/%s/app_settings/database/db", mod_name );
        char* pw     = osrf_settings_host_value( "/apps/%s/app_settings/database/pw", mod_name );
+       char* pg_app = osrf_settings_host_value( "/apps/%s/app_settings/database/application_name", mod_name );
 
        osrfLogDebug( OSRF_LOG_MARK, "Attempting to load the database driver [%s]...", driver );
        dbi_conn handle = dbi_conn_new( driver );
@@ -180,17 +181,19 @@ dbi_conn oilsConnectDB( const char* mod_name ) {
        osrfLogInfo(OSRF_LOG_MARK, "%s connecting to database.  host=%s, "
                "port=%s, user=%s, db=%s", mod_name, host, port, user, db );
 
-       if( host ) dbi_conn_set_option( handle, "host", host );
-       if( port ) dbi_conn_set_option_numeric( handle, "port", atoi( port ));
-       if( user ) dbi_conn_set_option( handle, "username", user );
-       if( pw )   dbi_conn_set_option( handle, "password", pw );
-       if( db )   dbi_conn_set_option( handle, "dbname", db );
+       if( host )   dbi_conn_set_option( handle, "host", host );
+       if( port )   dbi_conn_set_option_numeric( handle, "port", atoi( port ));
+       if( user )   dbi_conn_set_option( handle, "username", user );
+       if( pw )     dbi_conn_set_option( handle, "password", pw );
+       if( db )     dbi_conn_set_option( handle, "dbname", db );
+       if( pg_app ) dbi_conn_set_option( handle, "pgsql_application_name", pg_app );
 
        free( user );
        free( host );
        free( port );
        free( db );
        free( pw );
+       free( pg_app );
 
        if( dbi_conn_connect( handle ) < 0 ) {
                sleep( 1 );
index a3e360b..3a64595 100644 (file)
@@ -71,7 +71,8 @@
                 "dbi:Pg:".
                     "host=$$master{host};".
                     "port=$$master{port};".
-                    "dbname=$$master{db}",
+                    "dbname=$$master{db}".
+                    ($$master{application_name} ? ";application_name='$$master{application_name}'": ""),
                 $$master{user},
                 $$master{pw},
                 \%attrs)
@@ -80,7 +81,8 @@
                     "dbi:Pg:".
                         "host=$$master{host};".
                         "port=$$master{port};".
-                        "dbname=$$master{db}",
+                        "dbname=$$master{db}".
+                        ($$master{application_name} ? ";application_name='$$master{application_name}'": ""),
                     $$master{user},
                     $$master{pw},
                     \%attrs) }
 
         for my $db (@$_db_params) {
             try {
-                push @slave_dbs, DBI->connect("dbi:Pg:host=$$db{host};port=$$db{port};dbname=$$db{db}",$$db{user},$$db{pw}, \%attrs)
-                    || do { sleep(1); DBI->connect("dbi:Pg:host=$$db{host};port=$$db{port};dbname=$$db{db}",$$db{user},$$db{pw}, \%attrs) }
+                push @slave_dbs, DBI->connect("dbi:Pg:host=$$db{host};port=$$db{port};dbname=$$db{db}". ($$db{application_name} ? ";application_name='$$db{application_name}'" : ""),$$db{user},$$db{pw}, \%attrs)
+                    || do { sleep(1); DBI->connect("dbi:Pg:host=$$db{host};port=$$db{port};dbname=$$db{db}". ($$db{application_name} ? ";application_name='$$db{application_name}'" : ""),$$db{user},$$db{pw}, \%attrs) }
                     || throw OpenSRF::EX::ERROR
                         ("Couldn't connect to $$db{db}".
                         " on $$db{host}::$$db{port}".