From ebe386acd96995d91209b4e918f5fee14682ce58 Mon Sep 17 00:00:00 2001 From: Binyamin Yawitz <316103+byawitz@users.noreply.github.com> Date: Thu, 23 May 2024 12:44:19 -0400 Subject: [PATCH 1/2] feat(logger): Unifying logger environment variable and adapting to the latest Logger version --- .env | 3 +-- app/config/variables.php | 4 ++-- app/init.php | 29 +++++++++++++++++++++-- app/views/install/compose.phtml | 15 ------------ docker-compose.yml | 16 ------------- src/Appwrite/Platform/Tasks/Doctor.php | 17 +++++++++---- tests/resources/docker/docker-compose.yml | 5 ++-- 7 files changed, 44 insertions(+), 45 deletions(-) diff --git a/.env b/.env index 09abb07be26..5eceb3a8196 100644 --- a/.env +++ b/.env @@ -83,7 +83,6 @@ _APP_USAGE_AGGREGATION_INTERVAL=30 _APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000 _APP_MAINTENANCE_RETENTION_SCHEDULES=86400 _APP_USAGE_STATS=enabled -_APP_LOGGING_PROVIDER= _APP_LOGGING_CONFIG= _APP_GRAPHQL_MAX_BATCH_SIZE=10 _APP_GRAPHQL_MAX_COMPLEXITY=250 @@ -103,4 +102,4 @@ _APP_MESSAGE_SMS_TEST_DSN= _APP_MESSAGE_EMAIL_TEST_DSN= _APP_MESSAGE_PUSH_TEST_DSN= _APP_WEBHOOK_MAX_FAILED_ATTEMPTS=10 -_APP_PROJECT_REGIONS=default \ No newline at end of file +_APP_PROJECT_REGIONS=default diff --git a/app/config/variables.php b/app/config/variables.php index 185ab29d0c1..68b8c6c9b29 100644 --- a/app/config/variables.php +++ b/app/config/variables.php @@ -180,7 +180,7 @@ ], [ 'name' => '_APP_LOGGING_PROVIDER', - 'description' => 'This variable allows you to enable logging errors to 3rd party providers. This value is empty by default, set the value to one of \'sentry\', \'raygun\', \'appSignal\', \'logOwl\' to enable the logger.', + 'description' => 'Deprecated since 1.6.0, use `_APP_LOGGING_CONFIG` with DSN value instead. This variable allows you to enable logging errors to 3rd party providers. This value is empty by default, set the value to one of \'sentry\', \'raygun\', \'appSignal\', \'logOwl\' to enable the logger.', 'introduction' => '0.12.0', 'default' => '', 'required' => false, @@ -189,7 +189,7 @@ ], [ 'name' => '_APP_LOGGING_CONFIG', - 'description' => 'This variable configures authentication to 3rd party error logging providers. If using Sentry, this should be \'SENTRY_API_KEY;SENTRY_APP_ID\'. If using Raygun, this should be Raygun API key. If using AppSignal, this should be AppSignal API key. If using LogOwl, this should be LogOwl Service Ticket.', + 'description' => 'This variable allows you to enable logging errors to third party providers. This value is empty by default, set a DSN value to one of the following `sentry://PROJECT_ID:SENTRY_API_KEY@SENTRY_HOST/`, , `logowl://SERVICE_TICKET@SERIVCE_HOST/` `raygun://RAYGUN_API_KEY/`, `appSignal://API_KEY/` to enable the logger.\n\nFor versions prior `1.5.6` you can use the old syntax.\n\nOld syntax: If using Sentry, this should be \'SENTRY_API_KEY;SENTRY_APP_ID\'. If using Raygun, this should be Raygun API key. If using AppSignal, this should be AppSignal API key. If using LogOwl, this should be LogOwl Service Ticket.', 'introduction' => '0.12.0', 'default' => '', 'required' => false, diff --git a/app/init.php b/app/init.php index f69bd323c6a..65088df0fdc 100644 --- a/app/init.php +++ b/app/init.php @@ -724,6 +724,25 @@ function (mixed $value) { $providerName = System::getEnv('_APP_LOGGING_PROVIDER', ''); $providerConfig = System::getEnv('_APP_LOGGING_CONFIG', ''); + try { + $loggingProvider = new DSN($providerConfig ?? ''); + + $providerName = $loggingProvider->getScheme(); + $providerConfig = match ($providerName) { + 'sentry' => ['key' => $loggingProvider->getPassword(), 'projectId' => $loggingProvider->getUser() ?? '', 'host' => $loggingProvider->getHost()], + 'logowl' => ['ticket' => $loggingProvider->getUser() ?? '', 'host' => $loggingProvider->getHost()], + default => ['key' => $loggingProvider->getHost()], + }; + } catch (Throwable) { + $configChunks = \explode(";", $providerConfig); + + $providerConfig = match ($providerName) { + 'sentry' => [ 'key' => $configChunks[0], 'projectId' => $configChunks[1] ?? '', 'host' => '',], + 'logowl' => ['ticket' => $configChunks[0] ?? '', 'host' => ''], + default => ['key' => $providerConfig], + }; + } + if (empty($providerName) || empty($providerConfig)) { return; } @@ -732,8 +751,14 @@ function (mixed $value) { throw new Exception(Exception::GENERAL_SERVER_ERROR, "Logging provider not supported. Logging is disabled"); } - $classname = '\\Utopia\\Logger\\Adapter\\' . \ucfirst($providerName); - $adapter = new $classname($providerConfig); + $adapter = match ($providerName) { + 'sentry' => new Sentry($providerConfig['projectId'], $providerConfig['key'], $providerConfig['host']), + 'logowl' => new LogOwl($providerConfig['ticket'], $providerConfig['host']), + 'raygun' => new Raygun($providerConfig['key']), + 'appsignal' => new AppSignal($providerConfig['key']), + default => throw new Exception('Provider "' . $providerName . '" not supported.') + }; + return new Logger($adapter); }); $register->set('pools', function () { diff --git a/app/views/install/compose.phtml b/app/views/install/compose.phtml index 88fb1197f71..f265f53c19d 100644 --- a/app/views/install/compose.phtml +++ b/app/views/install/compose.phtml @@ -140,7 +140,6 @@ services: - _APP_FUNCTIONS_RUNTIMES - _APP_EXECUTOR_SECRET - _APP_EXECUTOR_HOST - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_MAINTENANCE_INTERVAL - _APP_MAINTENANCE_DELAY @@ -206,7 +205,6 @@ services: - _APP_DB_USER - _APP_DB_PASS - _APP_USAGE_STATS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG appwrite-worker-audits: @@ -233,7 +231,6 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG appwrite-worker-webhooks: @@ -261,7 +258,6 @@ services: - _APP_REDIS_PORT - _APP_REDIS_USER - _APP_REDIS_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG appwrite-worker-deletes: @@ -315,7 +311,6 @@ services: - _APP_STORAGE_WASABI_SECRET - _APP_STORAGE_WASABI_REGION - _APP_STORAGE_WASABI_BUCKET - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_EXECUTOR_SECRET - _APP_EXECUTOR_HOST @@ -344,7 +339,6 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG appwrite-worker-builds: @@ -376,7 +370,6 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_VCS_GITHUB_APP_NAME - _APP_VCS_GITHUB_PRIVATE_KEY @@ -442,7 +435,6 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG appwrite-worker-functions: @@ -480,7 +472,6 @@ services: - _APP_DOCKER_HUB_USERNAME - _APP_DOCKER_HUB_PASSWORD - _APP_LOGGING_CONFIG - - _APP_LOGGING_PROVIDER appwrite-worker-mails: image: /: @@ -512,7 +503,6 @@ services: - _APP_SMTP_SECURE - _APP_SMTP_USERNAME - _APP_SMTP_PASSWORD - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG appwrite-worker-messaging: @@ -538,7 +528,6 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_SMS_FROM - _APP_SMS_PROVIDER @@ -569,7 +558,6 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_MIGRATIONS_FIREBASE_CLIENT_ID - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET @@ -633,7 +621,6 @@ services: - _APP_REDIS_USER - _APP_REDIS_PASS - _APP_USAGE_STATS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_USAGE_AGGREGATION_INTERVAL @@ -661,7 +648,6 @@ services: - _APP_REDIS_USER - _APP_REDIS_PASS - _APP_USAGE_STATS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_USAGE_AGGREGATION_INTERVAL @@ -751,7 +737,6 @@ services: - OPR_EXECUTOR_ENV=$_APP_ENV - OPR_EXECUTOR_RUNTIMES=$_APP_FUNCTIONS_RUNTIMES - OPR_EXECUTOR_SECRET=$_APP_EXECUTOR_SECRET - - OPR_EXECUTOR_LOGGING_PROVIDER=$_APP_LOGGING_PROVIDER - OPR_EXECUTOR_LOGGING_CONFIG=$_APP_LOGGING_CONFIG - OPR_EXECUTOR_STORAGE_DEVICE=$_APP_STORAGE_DEVICE - OPR_EXECUTOR_STORAGE_S3_ACCESS_KEY=$_APP_STORAGE_S3_ACCESS_KEY diff --git a/docker-compose.yml b/docker-compose.yml index 6fa7a05201a..bf69f7caf4d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -161,7 +161,6 @@ services: - _APP_FUNCTIONS_RUNTIMES - _APP_EXECUTOR_SECRET - _APP_EXECUTOR_HOST - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_MAINTENANCE_INTERVAL - _APP_MAINTENANCE_RETENTION_EXECUTION @@ -235,7 +234,6 @@ services: - _APP_DB_USER - _APP_DB_PASS - _APP_USAGE_STATS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG appwrite-worker-audits: @@ -264,7 +262,6 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG appwrite-worker-webhooks: @@ -295,7 +292,6 @@ services: - _APP_REDIS_PORT - _APP_REDIS_USER - _APP_REDIS_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_WEBHOOK_MAX_FAILED_ATTEMPTS @@ -351,7 +347,6 @@ services: - _APP_STORAGE_WASABI_SECRET - _APP_STORAGE_WASABI_REGION - _APP_STORAGE_WASABI_BUCKET - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_EXECUTOR_SECRET - _APP_EXECUTOR_HOST @@ -382,7 +377,6 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_WORKERS_NUM - _APP_QUEUE_NAME @@ -417,7 +411,6 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_VCS_GITHUB_APP_NAME - _APP_VCS_GITHUB_PRIVATE_KEY @@ -484,7 +477,6 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG appwrite-worker-functions: @@ -524,7 +516,6 @@ services: - _APP_DOCKER_HUB_USERNAME - _APP_DOCKER_HUB_PASSWORD - _APP_LOGGING_CONFIG - - _APP_LOGGING_PROVIDER appwrite-worker-mails: entrypoint: worker-mails @@ -555,7 +546,6 @@ services: - _APP_SMTP_SECURE - _APP_SMTP_USERNAME - _APP_SMTP_PASSWORD - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_DOMAIN - _APP_OPTIONS_FORCE_HTTPS @@ -586,7 +576,6 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_SMS_FROM - _APP_SMS_PROVIDER @@ -622,7 +611,6 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_MIGRATIONS_FIREBASE_CLIENT_ID - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET @@ -691,7 +679,6 @@ services: - _APP_REDIS_USER - _APP_REDIS_PASS - _APP_USAGE_STATS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_USAGE_AGGREGATION_INTERVAL @@ -722,7 +709,6 @@ services: - _APP_REDIS_USER - _APP_REDIS_PASS - _APP_USAGE_STATS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_USAGE_AGGREGATION_INTERVAL @@ -815,7 +801,6 @@ services: - OPR_EXECUTOR_RUNTIMES=$_APP_FUNCTIONS_RUNTIMES - OPR_EXECUTOR_SECRET=$_APP_EXECUTOR_SECRET - OPR_EXECUTOR_RUNTIME_VERSIONS=v2,v3 - - OPR_EXECUTOR_LOGGING_PROVIDER=$_APP_LOGGING_PROVIDER - OPR_EXECUTOR_LOGGING_CONFIG=$_APP_LOGGING_CONFIG - OPR_EXECUTOR_STORAGE_DEVICE=$_APP_STORAGE_DEVICE - OPR_EXECUTOR_STORAGE_S3_ACCESS_KEY=$_APP_STORAGE_S3_ACCESS_KEY @@ -853,7 +838,6 @@ services: - OPR_PROXY_ENV=$_APP_ENV - OPR_PROXY_EXECUTOR_SECRET=$_APP_EXECUTOR_SECRET - OPR_PROXY_SECRET=$_APP_EXECUTOR_SECRET - - OPR_PROXY_LOGGING_PROVIDER=$_APP_LOGGING_PROVIDER - OPR_PROXY_LOGGING_CONFIG=$_APP_LOGGING_CONFIG - OPR_PROXY_ALGORITHM=random - OPR_PROXY_EXECUTORS=appwrite-executor diff --git a/src/Appwrite/Platform/Tasks/Doctor.php b/src/Appwrite/Platform/Tasks/Doctor.php index 91554c73be2..dbf1b4ed56c 100644 --- a/src/Appwrite/Platform/Tasks/Doctor.php +++ b/src/Appwrite/Platform/Tasks/Doctor.php @@ -100,13 +100,20 @@ public function action(Registry $register): void Console::log('🟢 HTTPS force option is enabled for function domains'); } - $providerName = System::getEnv('_APP_LOGGING_PROVIDER', ''); $providerConfig = System::getEnv('_APP_LOGGING_CONFIG', ''); - if (empty($providerName) || empty($providerConfig) || !Logger::hasProvider($providerName)) { - Console::log('🔴 Logging adapter is disabled'); - } else { - Console::log('🟢 Logging adapter is enabled (' . $providerName . ')'); + try { + $loggingProvider = new DSN($providerConfig ?? ''); + + $providerName = $loggingProvider->getScheme(); + + if (empty($providerName) || !Logger::hasProvider($providerName)) { + Console::log('🔴 Logging adapter is disabled'); + } else { + Console::log('🟢 Logging adapter is enabled (' . $providerName . ')'); + } + } catch (\Throwable $th) { + Console::log('🔴 Logging adapter is misconfigured'); } \usleep(200 * 1000); // Sleep for 0.2 seconds diff --git a/tests/resources/docker/docker-compose.yml b/tests/resources/docker/docker-compose.yml index cd3c3b64bac..9b4c2de11a0 100644 --- a/tests/resources/docker/docker-compose.yml +++ b/tests/resources/docker/docker-compose.yml @@ -27,7 +27,7 @@ services: networks: - gateway - appwrite - + appwrite: container_name: appwrite build: @@ -291,7 +291,6 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS - - _APP_LOGGING_PROVIDER - _APP_LOGGING_CONFIG - _APP_EXECUTOR_SECRET - _APP_EXECUTOR_HOST @@ -395,4 +394,4 @@ volumes: appwrite-uploads: appwrite-certificates: appwrite-functions: - appwrite-config: \ No newline at end of file + appwrite-config: From b98930e5a063c5ef2a1d8146fe569fcb1b483910 Mon Sep 17 00:00:00 2001 From: Binyamin Yawitz <316103+byawitz@users.noreply.github.com> Date: Tue, 28 May 2024 10:18:29 -0400 Subject: [PATCH 2/2] feat(logger): Adding fallback comment --- app/init.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/init.php b/app/init.php index 65088df0fdc..f94f7e380ba 100644 --- a/app/init.php +++ b/app/init.php @@ -734,6 +734,7 @@ function (mixed $value) { default => ['key' => $loggingProvider->getHost()], }; } catch (Throwable) { + // Fallback for older Appwrite versions up to 1.5.x that use _APP_LOGGING_PROVIDER and _APP_LOGGING_CONFIG environment variables $configChunks = \explode(";", $providerConfig); $providerConfig = match ($providerName) {