diff --git a/api/package-lock.json b/api/package-lock.json index 831c8da..c9f138e 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -24,6 +24,7 @@ "mongoose": "^7.5.0", "morgan": "^1.10.0", "nocache": "^4.0.0", + "prom-client": "^15.1.0", "winston": "^3.8.2" }, "devDependencies": { @@ -57,6 +58,14 @@ "sparse-bitfield": "^3.0.3" } }, + "node_modules/@opentelemetry/api": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", + "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@types/luxon": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.2.tgz", @@ -206,6 +215,11 @@ "node": ">=8" } }, + "node_modules/bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" + }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -1328,6 +1342,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/prom-client": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-15.1.0.tgz", + "integrity": "sha512-cCD7jLTqyPdjEPBo/Xk4Iu8jxjuZgZJ3e/oET3L+ZwOuap/7Cw3dH/TJSsZKs1TQLZ2IHpIlRAKw82ef06kmMw==", + "dependencies": { + "@opentelemetry/api": "^1.4.0", + "tdigest": "^0.1.1" + }, + "engines": { + "node": "^16 || ^18 || >=20" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1627,6 +1653,14 @@ "node": ">=4" } }, + "node_modules/tdigest": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", + "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", + "dependencies": { + "bintrees": "1.0.2" + } + }, "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", diff --git a/api/package.json b/api/package.json index 2ddf50f..5a509a2 100644 --- a/api/package.json +++ b/api/package.json @@ -18,6 +18,7 @@ "mongoose": "^7.5.0", "morgan": "^1.10.0", "nocache": "^4.0.0", + "prom-client": "^15.1.0", "winston": "^3.8.2" }, "devDependencies": { diff --git a/api/src/app.js b/api/src/app.js index d9e3630..9f477f4 100644 --- a/api/src/app.js +++ b/api/src/app.js @@ -8,9 +8,13 @@ const app = express(); const apiRouter = express.Router(); const pubcodeRouter = require("./routes/pubcode-router"); const log = require("./logger"); +const prom = require('prom-client'); +const register = new prom.Registry(); +prom.collectDefaultMetrics({ register }); + const rateLimit = require('express-rate-limit'); const limiter = rateLimit({ - windowMs: 1 * 60 * 1000, // 1 minute + windowMs: 60 * 1000, // 1 minute max: 100, // Limit each IP to 100 requests per `window` (here, per 1 minutes) standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers legacyHeaders: false, // Disable the `X-RateLimit-*` headers @@ -25,7 +29,10 @@ app.use(limiter); app.use(cors()); app.use(helmet()); app.use(nocache()); - +app.get('/metrics', async (_req, res) => { + const appMetrics = await register.metrics(); + res.end(appMetrics); +}); //tells the app to use json as means of transporting data app.use(bodyParser.json({ limit: "50mb", extended: true })); app.use(bodyParser.urlencoded({ diff --git a/charts/pubcode/values.yaml b/charts/pubcode/values.yaml index 9b6f5f9..197f82f 100644 --- a/charts/pubcode/values.yaml +++ b/charts/pubcode/values.yaml @@ -89,6 +89,10 @@ api: enabled: true host: "{{ .Release.Name }}-api.{{ .Values.global.domain }}" targetPort: http # look at line#164 refer to the name. + podAnnotations: + prometheus.io/scrape: "true" + prometheus.io/port: "3000" + prometheus.io/path: "/metrics" frontend: enabled: true @@ -160,6 +164,10 @@ frontend: enabled: true host: "{{ .Release.Name }}.{{ .Values.global.domain }}" targetPort: http # look at line#164 refer to the name. + podAnnotations: + prometheus.io/scrape: "true" + prometheus.io/port: "3002" + prometheus.io/path: "/metrics" database: enabled: true diff --git a/frontend/Caddyfile b/frontend/Caddyfile index b80e6d1..0e508ec 100644 --- a/frontend/Caddyfile +++ b/frontend/Caddyfile @@ -1,6 +1,9 @@ { auto_https off - admin off + admin 0.0.0.0:3002 + servers { + metrics + } } :3000 { log {