From cd6feb8d59f1aad186ac7b51a51332b479ecbbfc Mon Sep 17 00:00:00 2001 From: Hailey Date: Tue, 23 Sep 2025 10:22:59 -0700 Subject: [PATCH] update ts util lib with new express metrics registration --- bskylink/package.json | 2 +- bskylink/src/index.ts | 25 ++-------------------- bskylink/yarn.lock | 50 ++++++++++++++++++++++++++++++++++++++----- 3 files changed, 48 insertions(+), 29 deletions(-) diff --git a/bskylink/package.json b/bskylink/package.json index 9e3cf0110b..f0a3978b89 100644 --- a/bskylink/package.json +++ b/bskylink/package.json @@ -10,7 +10,7 @@ "dependencies": { "@atproto/api": "^0.16.7", "@atproto/common": "^0.4.11", - "@haileyok/ts-util": "^1.0.0", + "@haileyok/ts-util": "^1.3.3", "@types/escape-html": "^1.0.4", "body-parser": "^1.20.2", "cors": "^2.8.5", diff --git a/bskylink/src/index.ts b/bskylink/src/index.ts index b9a58e1709..bc8f3253eb 100644 --- a/bskylink/src/index.ts +++ b/bskylink/src/index.ts @@ -2,7 +2,7 @@ import events from 'node:events' import type http from 'node:http' import cors from 'cors' -import express, {type Response} from 'express' +import express from 'express' import {createHttpTerminator, type HttpTerminator} from 'http-terminator' import {type Config} from './config.js' @@ -32,28 +32,7 @@ export class LinkService { app = routes(ctx, app) app.use(errorHandler) - // request duration logging - app.use((req, res, next) => { - const start = process.hrtime.bigint() - const originalEnd = res.end.bind(res) as Response['end'] - res.end = function ( - this: Response, - ...args: Parameters - ): ReturnType { - const end = process.hrtime.bigint() - const respTimeMs = Number(end - start) / 1_000_000 // ns to ms :3 - - if (req.route) { - ctx.metrics - .getHistogram('requestDuration') - .labels(req.route.path, req.method, res.statusCode.toString()) - .observe(respTimeMs) - } - - return originalEnd(...args) - } as Response['end'] - next() - }) + ctx.metrics.registerExpressMetrics(app) return new LinkService(app, ctx) } diff --git a/bskylink/yarn.lock b/bskylink/yarn.lock index 7efc624a0f..5ee2bc2748 100644 --- a/bskylink/yarn.lock +++ b/bskylink/yarn.lock @@ -113,14 +113,16 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@haileyok/ts-util@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@haileyok/ts-util/-/ts-util-1.0.0.tgz#30ea08c8cfdcd673d821a35a670285e83c2ac4b1" - integrity sha512-tszfjVXXFJt93ii7COtlJzGsjkI6trNgXd3hbhvTvs9muIbbd4F7zkB3RzNVARytyK4emlMa7hj7jscBIGogSA== +"@haileyok/ts-util@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@haileyok/ts-util/-/ts-util-1.3.3.tgz#2bc5005c58ef9251765676f9707e1671bd712d33" + integrity sha512-1Djml2jn7hG8pniQfN3TaZQJ+IijIdNzlcEFhB3bBBoGz7/vjHNDfWMwbGLCpsP0vdGrbhjE7YIZy0U1CGLUXw== dependencies: cors "^2.8.5" events "^3.3.0" express "^5.1.0" + express-prom-bundle "^8.0.0" + kafkajs "^2.2.4" prom-client "^15.1.3" tslint "^6.1.3" typescript "^5.9.2" @@ -249,6 +251,16 @@ "@types/range-parser" "*" "@types/send" "*" +"@types/express-serve-static-core@^5.0.0": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz#2fa94879c9d46b11a5df4c74ac75befd6b283de6" + integrity sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + "@types/express@^4.17.21": version "4.17.23" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.23.tgz#35af3193c640bfd4d7fe77191cd0ed411a433bef" @@ -259,6 +271,15 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/express@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.3.tgz#6c4bc6acddc2e2a587142e1d8be0bce20757e956" + integrity sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/serve-static" "*" + "@types/http-errors@*": version "2.0.5" resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.5.tgz#5b749ab2b16ba113423feb1a64a95dcd30398472" @@ -734,6 +755,15 @@ events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +express-prom-bundle@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/express-prom-bundle/-/express-prom-bundle-8.0.0.tgz#22a434b87854d98a1ea75c487c9d65f669e8e93e" + integrity sha512-UHdpaMks6Z/tvxQsNzhsE7nkdXb4/zEh/jwN0tfZSZOEF+aD0dlfl085EU4jveOq09v01c5sIUfjV4kJODZ2eQ== + dependencies: + "@types/express" "^5.0.0" + on-finished "^2.3.0" + url-value-parser "^2.0.0" + express@^4.19.2: version "4.19.2" resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" @@ -1071,6 +1101,11 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +kafkajs@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/kafkajs/-/kafkajs-2.2.4.tgz#59e6e16459d87fdf8b64be73970ed5aa42370a5b" + integrity sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA== + kysely@^0.27.3: version "0.27.3" resolved "https://registry.yarnpkg.com/kysely/-/kysely-0.27.3.tgz#6cc6c757040500b43c4ac596cdbb12be400ee276" @@ -1246,7 +1281,7 @@ on-exit-leak-free@^2.1.0: resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== -on-finished@2.4.1, on-finished@^2.4.1: +on-finished@2.4.1, on-finished@^2.3.0, on-finished@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -1942,6 +1977,11 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +url-value-parser@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/url-value-parser/-/url-value-parser-2.2.0.tgz#f38ae8cd24604ec69bc219d66929ddbbd93a2b32" + integrity sha512-yIQdxJpgkPamPPAPuGdS7Q548rLhny42tg8d4vyTNzFqvOnwqrgHXvgehT09U7fwrzxi3RxCiXjoNUNnNOlQ8A== + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"