762a240890
- Log system revamp: - Logs to stdout, disabled while testing - Use header `X-Request-Id`, or create a new `uuid` when no present, to identyfy log entries - Be able to set log level from env variable `LOG_LEVEL`, useful while testing: `LOG_LEVEL=info npm test`; even more human-readable: `LOG_LEVEL=info npm t | ./node_modules/.bin/pino-pretty` - Be able to reduce the footprint in the final log file depending on the environment - Use one logger for every service: Queries, Batch Queries (Jobs), and Data Ingestion (CopyTo/CopyFrom) - Stop using headers such as: `X-SQL-API-Log`, `X-SQL-API-Profiler`, and `X-SQL-API-Errors` as a way to log info. - Be able to tag requests with labels as an easier way to provide business metrics - Metro: Add log-collector utility (`metro`), it will be moved to its own repository. Attaching it here fro development purposes. Try it with the following command `LOG_LEVEL=info npm t | node metro` - Metro: Creates `metrics-collector.js` a stream to update Prometheus' counters and histograms and exposes them via Express' app (`:9145/metrics`). Use the ones defined in `grok_exporter` Announcements: - Profiler is always set. No need to check its existence anymore - Unify profiler usage for every endpoint Bug fixes: - Avoid hung requests while fetching user identifier
69 lines
2.6 KiB
JavaScript
69 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
const { Router: router } = require('express');
|
|
|
|
const SqlRouter = require('./sql/sql-router');
|
|
|
|
const HealthCheckController = require('./health-check-controller');
|
|
const VersionController = require('./version-controller');
|
|
const JobsWipController = require('./jobs-wip-controller');
|
|
const error = require('./middlewares/error');
|
|
const pubSubMetrics = require('./middlewares/pubsub-metrics');
|
|
|
|
const JobPublisher = require('../batch/pubsub/job-publisher');
|
|
const JobQueue = require('../batch/job-queue');
|
|
const JobBackend = require('../batch/job-backend');
|
|
const JobCanceller = require('../batch/job-canceller');
|
|
const JobService = require('../batch/job-service');
|
|
const PubSubMetricsService = require('../services/pubsub-metrics');
|
|
|
|
module.exports = class ApiRouter {
|
|
constructor ({ redisPool, metadataBackend, statsClient, logger }) {
|
|
const jobPublisher = new JobPublisher(redisPool);
|
|
const jobQueue = new JobQueue(metadataBackend, jobPublisher, logger);
|
|
const jobBackend = new JobBackend(metadataBackend, jobQueue, logger);
|
|
const jobCanceller = new JobCanceller();
|
|
const jobService = new JobService(jobBackend, jobCanceller, logger);
|
|
|
|
this.healthCheckController = new HealthCheckController();
|
|
this.versionController = new VersionController();
|
|
this.jobsWipController = new JobsWipController({ jobService });
|
|
this.pubSubMetricsService = PubSubMetricsService.build();
|
|
|
|
this.sqlRouter = new SqlRouter({
|
|
metadataBackend,
|
|
statsClient,
|
|
logger,
|
|
jobService
|
|
});
|
|
}
|
|
|
|
route (app, routes) {
|
|
routes.forEach(route => {
|
|
const apiRouter = router({ mergeParams: true });
|
|
|
|
const paths = route.paths;
|
|
const middlewares = route.middlewares || [];
|
|
|
|
middlewares.forEach(middleware => apiRouter.use(middleware()));
|
|
|
|
// FIXME: version controller should be attached to the main entry point: "/"
|
|
// instead of "/api/:version" or "/user/:user/api/:version"
|
|
this.healthCheckController.route(apiRouter);
|
|
|
|
// FIXME: version controller should be attached to the main entry point: "/"
|
|
// instead of "/api/:version" or "/user/:user/api/:version"
|
|
this.versionController.route(apiRouter);
|
|
|
|
this.jobsWipController.route(apiRouter);
|
|
|
|
this.sqlRouter.route(apiRouter, route.sql);
|
|
|
|
paths.forEach(path => app.use(path, apiRouter));
|
|
|
|
apiRouter.use(error());
|
|
apiRouter.use(pubSubMetrics(this.pubSubMetricsService));
|
|
});
|
|
}
|
|
};
|