|
|
@@ -1,5 +1,5 @@
|
|
|
// Metrics must be initialized before importing anything else
|
|
|
-import '@overleaf/metrics/initialize.js'
|
|
|
+import { metricsModuleImportStartTime } from '@overleaf/metrics/initialize.js'
|
|
|
|
|
|
import Modules from './app/src/infrastructure/Modules.js'
|
|
|
import metrics from '@overleaf/metrics'
|
|
|
@@ -20,6 +20,13 @@ import FileWriter from './app/src/infrastructure/FileWriter.js'
|
|
|
import { fileURLToPath } from 'node:url'
|
|
|
import Features from './app/src/infrastructure/Features.js'
|
|
|
|
|
|
+metrics.gauge(
|
|
|
+ 'web_startup',
|
|
|
+ performance.now() - metricsModuleImportStartTime,
|
|
|
+ 1,
|
|
|
+ { path: 'imports' }
|
|
|
+)
|
|
|
+
|
|
|
logger.initialize(process.env.METRICS_APP_NAME || 'web')
|
|
|
logger.logger.serializers.user = Serializers.user
|
|
|
logger.logger.serializers.docs = Serializers.docs
|
|
|
@@ -58,6 +65,29 @@ if (
|
|
|
)
|
|
|
}
|
|
|
|
|
|
+// handle SIGTERM for graceful shutdown in kubernetes
|
|
|
+process.on('SIGTERM', function (signal) {
|
|
|
+ triggerGracefulShutdown(Server.server, signal)
|
|
|
+})
|
|
|
+
|
|
|
+const beforeWaitForMongoAndGlobalBlobs = performance.now()
|
|
|
+try {
|
|
|
+ await Promise.all([
|
|
|
+ mongodb.connectionPromise,
|
|
|
+ mongoose.connectionPromise,
|
|
|
+ HistoryManager.promises.loadGlobalBlobs(),
|
|
|
+ ])
|
|
|
+} catch (err) {
|
|
|
+ logger.fatal({ err }, 'Cannot connect to mongo. Exiting.')
|
|
|
+ process.exit(1)
|
|
|
+}
|
|
|
+metrics.gauge(
|
|
|
+ 'web_startup',
|
|
|
+ performance.now() - beforeWaitForMongoAndGlobalBlobs,
|
|
|
+ 1,
|
|
|
+ { path: 'waitForMongoAndGlobalBlobs' }
|
|
|
+)
|
|
|
+
|
|
|
const port = Settings.port || Settings.internal.web.port || 3000
|
|
|
const host = Settings.internal.web.host || '127.0.0.1'
|
|
|
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
|
@@ -69,42 +99,33 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
|
|
|
|
PlansLocator.ensurePlansAreSetupCorrectly()
|
|
|
|
|
|
- Promise.all([
|
|
|
- mongodb.connectionPromise,
|
|
|
- mongoose.connectionPromise,
|
|
|
- HistoryManager.promises.loadGlobalBlobs(),
|
|
|
- ])
|
|
|
- .then(async () => {
|
|
|
- Server.server.listen(port, host, function () {
|
|
|
- logger.debug(`web starting up, listening on ${host}:${port}`)
|
|
|
- logger.debug(`${http.globalAgent.maxSockets} sockets enabled`)
|
|
|
- // wait until the process is ready before monitoring the event loop
|
|
|
- metrics.event_loop.monitor(logger)
|
|
|
- })
|
|
|
- QueueWorkers.start()
|
|
|
- await Modules.start()
|
|
|
- })
|
|
|
- .catch(err => {
|
|
|
- logger.fatal({ err }, 'Cannot connect to mongo. Exiting.')
|
|
|
- process.exit(1)
|
|
|
- })
|
|
|
-}
|
|
|
+ Server.server.listen(port, host, function () {
|
|
|
+ logger.debug(`web starting up, listening on ${host}:${port}`)
|
|
|
+ logger.debug(`${http.globalAgent.maxSockets} sockets enabled`)
|
|
|
+ // wait until the process is ready before monitoring the event loop
|
|
|
+ metrics.event_loop.monitor(logger)
|
|
|
|
|
|
-// initialise site admin tasks
|
|
|
-Promise.all([
|
|
|
- mongodb.connectionPromise,
|
|
|
- mongoose.connectionPromise,
|
|
|
- HistoryManager.promises.loadGlobalBlobs(),
|
|
|
-])
|
|
|
- .then(() => SiteAdminHandler.initialise())
|
|
|
- .catch(err => {
|
|
|
- logger.fatal({ err }, 'Cannot connect to mongo. Exiting.')
|
|
|
- process.exit(1)
|
|
|
+ // Record metrics for the total startup time before listening on HTTP.
|
|
|
+ metrics.gauge(
|
|
|
+ 'web_startup',
|
|
|
+ performance.now() - metricsModuleImportStartTime,
|
|
|
+ 1,
|
|
|
+ { path: 'metricsModuleImportToHTTPListen' }
|
|
|
+ )
|
|
|
})
|
|
|
+ try {
|
|
|
+ QueueWorkers.start()
|
|
|
+ } catch (err) {
|
|
|
+ logger.fatal({ err }, 'failed to start queue processing')
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ await Modules.start()
|
|
|
+ } catch (err) {
|
|
|
+ logger.fatal({ err }, 'failed to start web module background jobs')
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
-// handle SIGTERM for graceful shutdown in kubernetes
|
|
|
-process.on('SIGTERM', function (signal) {
|
|
|
- triggerGracefulShutdown(Server.server, signal)
|
|
|
-})
|
|
|
+// initialise site admin tasks
|
|
|
+SiteAdminHandler.initialise()
|
|
|
|
|
|
export default Server.server
|