Skip to content

Commit 5c073de

Browse files
Merge branch 'main' into infra-000-otel-exclusions
2 parents b6f68fa + b03994a commit 5c073de

File tree

4 files changed

+781
-768
lines changed

4 files changed

+781
-768
lines changed

package.json

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -72,66 +72,66 @@
7272
"dependencies": {
7373
"@godaddy/terminus": "^4.12.1",
7474
"@opentelemetry/api": "^1.9.0",
75-
"@opentelemetry/auto-instrumentations-node": "^0.52.0",
76-
"@opentelemetry/exporter-prometheus": "^0.54.0",
77-
"@opentelemetry/instrumentation-dns": "^0.40.0",
78-
"@opentelemetry/instrumentation-express": "^0.44.0",
79-
"@opentelemetry/instrumentation-generic-pool": "^0.40.0",
80-
"@opentelemetry/instrumentation-graphql": "^0.44.0",
81-
"@opentelemetry/instrumentation-http": "^0.54.0",
82-
"@opentelemetry/instrumentation-ioredis": "^0.44.0",
83-
"@opentelemetry/instrumentation-net": "^0.40.0",
84-
"@opentelemetry/instrumentation-pg": "^0.47.0",
85-
"@opentelemetry/instrumentation-pino": "^0.43.0",
86-
"@opentelemetry/instrumentation-undici": "^0.7.0",
87-
"@opentelemetry/resource-detector-container": "^0.5.0",
88-
"@opentelemetry/resource-detector-gcp": "^0.29.13",
89-
"@opentelemetry/sdk-node": "^0.54.0",
90-
"@opentelemetry/semantic-conventions": "^1.27.0",
75+
"@opentelemetry/auto-instrumentations-node": "^0.55.0",
76+
"@opentelemetry/exporter-prometheus": "^0.57.0",
77+
"@opentelemetry/instrumentation-dns": "^0.43.0",
78+
"@opentelemetry/instrumentation-express": "^0.47.0",
79+
"@opentelemetry/instrumentation-generic-pool": "^0.43.0",
80+
"@opentelemetry/instrumentation-graphql": "^0.47.0",
81+
"@opentelemetry/instrumentation-http": "^0.57.0",
82+
"@opentelemetry/instrumentation-ioredis": "^0.47.0",
83+
"@opentelemetry/instrumentation-net": "^0.43.0",
84+
"@opentelemetry/instrumentation-pg": "^0.50.0",
85+
"@opentelemetry/instrumentation-pino": "^0.46.0",
86+
"@opentelemetry/instrumentation-undici": "^0.10.0",
87+
"@opentelemetry/resource-detector-container": "^0.5.3",
88+
"@opentelemetry/resource-detector-gcp": "^0.32.0",
89+
"@opentelemetry/sdk-node": "^0.57.0",
90+
"@opentelemetry/semantic-conventions": "^1.28.0",
9191
"@sesamecare-oss/confit": "^2.2.1",
9292
"@sesamecare-oss/opentelemetry-node-metrics": "^1.1.0",
9393
"ajv": "^8.17.1",
9494
"clean-stack": "^5.2.0",
9595
"cookie-parser": "^1.4.7",
96-
"dotenv": "^16.4.5",
96+
"dotenv": "^16.4.7",
9797
"express": "^5.0.1",
98-
"express-openapi-validator": "^5.3.8",
98+
"express-openapi-validator": "^5.3.9",
9999
"glob": "^11.0.0",
100-
"import-in-the-middle": "^1.11.2",
100+
"import-in-the-middle": "^1.12.0",
101101
"minimist": "^1.2.8",
102-
"moderndash": "^3.12.0",
102+
"moderndash": "^4.0.0",
103103
"pino": "^9.5.0",
104104
"read-package-up": "^11.0.0",
105105
"request-ip": "^3.3.0"
106106
},
107107
"devDependencies": {
108-
"@commitlint/cli": "^19.5.0",
109-
"@commitlint/config-conventional": "^19.5.0",
108+
"@commitlint/cli": "^19.6.1",
109+
"@commitlint/config-conventional": "^19.6.0",
110110
"@openapi-typescript-infra/coconfig": "^4.6.0",
111111
"@semantic-release/commit-analyzer": "^13.0.0",
112112
"@semantic-release/exec": "^6.0.3",
113-
"@semantic-release/github": "^11.0.0",
114-
"@semantic-release/release-notes-generator": "^14.0.1",
115-
"@types/cookie-parser": "^1.4.7",
113+
"@semantic-release/github": "^11.0.1",
114+
"@semantic-release/release-notes-generator": "^14.0.2",
115+
"@types/cookie-parser": "^1.4.8",
116116
"@types/express": "^5.0.0",
117117
"@types/minimist": "^1.2.5",
118-
"@types/node": "^22.8.1",
118+
"@types/node": "^22.10.2",
119119
"@types/request-ip": "^0.0.41",
120120
"@types/supertest": "^6.0.2",
121121
"@typescript-eslint/eslint-plugin": "^7.18.0",
122122
"@typescript-eslint/parser": "^7.18.0",
123123
"coconfig": "^1.6.1",
124124
"eslint": "^8.57.1",
125125
"eslint-config-prettier": "^9.1.0",
126-
"eslint-import-resolver-typescript": "^3.6.3",
126+
"eslint-import-resolver-typescript": "^3.7.0",
127127
"eslint-plugin-import": "^2.31.0",
128-
"pino-pretty": "^11.3.0",
128+
"pino-pretty": "^13.0.0",
129129
"pinst": "^3.0.0",
130130
"supertest": "^7.0.0",
131131
"tsconfig-paths": "^4.2.0",
132132
"tsx": "^4.19.2",
133-
"typescript": "^5.6.3",
134-
"vitest": "^2.1.4"
133+
"typescript": "^5.7.2",
134+
"vitest": "^2.1.8"
135135
},
136136
"resolutions": {
137137
"qs": "^6.11.0"

src/development/repl.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ export function serviceRepl<SLocals extends AnyServiceLocals = ServiceLocals<Con
2828
// eslint-disable-next-line no-console
2929
console.log(JSON.stringify(o, null, '\t'));
3030
},
31+
// Use iTerm2's escape code to copy to clipboard
32+
pbcopy(str: string) {
33+
const encoded = Buffer.from(str.toString(), 'utf8').toString('base64');
34+
process.stdout.write(`\x1b]52;c;${encoded}\x07`);
35+
},
3136
});
3237
rl.setupHistory(path.resolve('.node_repl_history'), (err) => {
3338
if (err) {

src/telemetry/requestLogger.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { ConfigurationSchema } from '../config/schema.js';
1010
import { getNodeEnv } from '../env.js';
1111

1212
const LOG_PREFS = Symbol('Logging information');
13+
const LOGGED_SEMAPHORE = Symbol('Logged semaphore');
1314

1415
interface LogPrefs {
1516
start: [number, number];
@@ -57,9 +58,13 @@ function finishLog<SLocals extends AnyServiceLocals = ServiceLocals<Configuratio
5758
app: ServiceExpress<SLocals>,
5859
error: Error | undefined,
5960
req: Request,
60-
res: Response,
61+
res: Response & { [LOGGED_SEMAPHORE]?: boolean },
6162
histogram: Histogram,
6263
) {
64+
if (res[LOGGED_SEMAPHORE]) {
65+
return;
66+
}
67+
6368
const prefs = (res.locals as WithLogPrefs)[LOG_PREFS];
6469
if (prefs.logged) {
6570
// This happens when error handler runs, but onEnd hasn't fired yet. We only log the first one.
@@ -71,9 +76,22 @@ function finishLog<SLocals extends AnyServiceLocals = ServiceLocals<Configuratio
7176

7277
const dur = hrdur[0] + hrdur[1] / 1000000000;
7378
const [url, preInfo] = getBasicInfo(req);
79+
80+
let responseType: string = 'finished';
81+
82+
// ts warning is known and incorrect—`aborted` is a subset of `destroyed`
83+
if (req.aborted) {
84+
responseType = 'aborted';
85+
} else if (req.destroyed) {
86+
responseType = 'destroyed';
87+
} else if (error) {
88+
responseType = 'errored';
89+
}
90+
7491
const endLog: Record<string, string | string[] | number | undefined> = {
7592
...preInfo,
7693
t: 'req',
94+
r: responseType,
7795
s: (error as ErrorWithStatus)?.status || res.statusCode || 0,
7896
dur,
7997
};
@@ -124,6 +142,8 @@ function finishLog<SLocals extends AnyServiceLocals = ServiceLocals<Configuratio
124142
} else {
125143
logger.info(endLog, msg);
126144
}
145+
146+
res[LOGGED_SEMAPHORE] = true;
127147
}
128148

129149
export function loggerMiddleware<
@@ -180,8 +200,10 @@ export function loggerMiddleware<
180200
logger.info(preLog, msg);
181201
}
182202

183-
const logWriter = () => finishLog(app, undefined, req, res, histogram);
203+
const logWriter = (err?: Error) => finishLog(app, err, req, res, histogram);
184204
res.on('finish', logWriter);
205+
res.on('close', logWriter);
206+
res.on('error', logWriter);
185207
next();
186208
};
187209
}

0 commit comments

Comments
 (0)