]> source.dussan.org Git - nextcloud-server.git/commitdiff
feat: add request id as comment to all queries 44884/head
authorRobin Appelman <robin@icewind.nl>
Wed, 17 Apr 2024 12:26:43 +0000 (14:26 +0200)
committerRobin Appelman <robin@icewind.nl>
Wed, 17 Apr 2024 14:36:24 +0000 (16:36 +0200)
Signed-off-by: Robin Appelman <robin@icewind.nl>
config/config.sample.php
lib/private/DB/Connection.php

index 280334477a6a7a650e0428bafce2bf6ec27f40e8..f45e7dcc5e0f619ea69affda181b28adc125cf47 100644 (file)
@@ -159,6 +159,13 @@ $CONFIG = [
        ['user' => 'nextcloud', 'password' => 'password2', 'host' => 'replica2', 'dbname' => ''],
 ],
 
+/**
+ * Add request id to the database query in a comment.
+ *
+ * This can be enabled to assist in mapping database logs to Nextcloud logs.
+ */
+'db.log_request_id' => false,
+
 /**
  * Indicates whether the Nextcloud instance was installed successfully; ``true``
  * indicates a successful installation, and ``false`` indicates an unsuccessful
@@ -1965,7 +1972,7 @@ $CONFIG = [
 /**
  * Blacklist characters from being used in filenames. This is useful if you
  * have a filesystem or OS which does not support certain characters like windows.
- * 
+ *
  * The '/' and '\' characters are always forbidden.
  *
  * Example for windows systems: ``array('?', '<', '>', ':', '*', '|', '"', chr(0), "\n", "\r")``
@@ -2311,7 +2318,7 @@ $CONFIG = [
 /**
  * Timeout for the login form, after this time the login form is reset.
  * This prevents password leaks on public devices if the user forgots to clear the form.
- * 
+ *
  * Default is 5 minutes (300 seconds), a value of 0 means no timeout.
  */
 'login_form_timeout' => 300,
index 2e0582303f4b0b878cb5109c1d1ccf99fdcddc4b..1340a388571c2de0068abfc5babb0f776a465cc3 100644 (file)
@@ -91,6 +91,9 @@ class Connection extends PrimaryReadReplicaConnection {
        /** @var array<string, int> */
        protected $tableDirtyWrites = [];
 
+       protected bool $logRequestId;
+       protected string $requestId;
+
        /**
         * Initializes a new instance of the Connection class.
         *
@@ -119,6 +122,9 @@ class Connection extends PrimaryReadReplicaConnection {
                $this->clock = Server::get(ClockInterface::class);
                $this->logger = Server::get(LoggerInterface::class);
 
+               $this->logRequestId = $this->systemConfig->getValue('db.log_request_id', false);
+               $this->requestId = Server::get(IRequestId::class)->getId();
+
                /** @var \OCP\Profiler\IProfiler */
                $profiler = Server::get(IProfiler::class);
                if ($profiler->isEnabled()) {
@@ -249,8 +255,7 @@ class Connection extends PrimaryReadReplicaConnection {
                        $platform = $this->getDatabasePlatform();
                        $sql = $platform->modifyLimitQuery($sql, $limit, $offset);
                }
-               $statement = $this->replaceTablePrefix($sql);
-               $statement = $this->adapter->fixupStatement($statement);
+               $statement = $this->finishQuery($sql);
 
                return parent::prepare($statement);
        }
@@ -307,8 +312,7 @@ class Connection extends PrimaryReadReplicaConnection {
                        $this->ensureConnectedToPrimary();
                }
 
-               $sql = $this->replaceTablePrefix($sql);
-               $sql = $this->adapter->fixupStatement($sql);
+               $sql = $this->finishQuery($sql);
                $this->queriesExecuted++;
                $this->logQueryToFile($sql);
                return parent::executeQuery($sql, $params, $types, $qcp);
@@ -328,8 +332,7 @@ class Connection extends PrimaryReadReplicaConnection {
         * @throws Exception
         */
        public function executeUpdate(string $sql, array $params = [], array $types = []): int {
-               $sql = $this->replaceTablePrefix($sql);
-               $sql = $this->adapter->fixupStatement($sql);
+               $sql = $this->finishQuery($sql);
                $this->queriesExecuted++;
                $this->logQueryToFile($sql);
                return parent::executeUpdate($sql, $params, $types);
@@ -354,8 +357,7 @@ class Connection extends PrimaryReadReplicaConnection {
                foreach ($tables as $table) {
                        $this->tableDirtyWrites[$table] = $this->clock->now()->getTimestamp();
                }
-               $sql = $this->replaceTablePrefix($sql);
-               $sql = $this->adapter->fixupStatement($sql);
+               $sql = $this->finishQuery($sql);
                $this->queriesExecuted++;
                $this->logQueryToFile($sql);
                return (int)parent::executeStatement($sql, $params, $types);
@@ -587,6 +589,16 @@ class Connection extends PrimaryReadReplicaConnection {
                return $schema->tablesExist([$table]);
        }
 
+       protected function finishQuery(string $statement): string {
+               $statement = $this->replaceTablePrefix($statement);
+               $statement = $this->adapter->fixupStatement($statement);
+               if ($this->logRequestId) {
+                       return $statement . " /* reqid: " . $this->requestId . " */";
+               } else {
+                       return $statement;
+               }
+       }
+
        // internal use
        /**
         * @param string $statement