diff --git a/packages/ecs-helpers/CHANGELOG.md b/packages/ecs-helpers/CHANGELOG.md index a9188be..3335f8f 100644 --- a/packages/ecs-helpers/CHANGELOG.md +++ b/packages/ecs-helpers/CHANGELOG.md @@ -1,5 +1,13 @@ # @elastic/ecs-helpers Changelog +## v2.2.0 + +- `formatError()` now includes the [`error.id`](https://www.elastic.co/docs/reference/ecs/ecs-error#field-error-id) + and [`error.code`](https://www.elastic.co/docs/reference/ecs/ecs-error#field-error-code) + fields on the emitted `error` object when the source `Error` instance has + matching `id` or `code` properties. Previously these were silently dropped, + even though they are part of the ECS [error field set](https://www.elastic.co/docs/reference/ecs/ecs-error). + ## v2.1.1 - fix: Use `req.originalUrl`, if available, when converting `req` to ECS fields. diff --git a/packages/ecs-helpers/lib/error-formatters.js b/packages/ecs-helpers/lib/error-formatters.js index ae505a1..050f983 100644 --- a/packages/ecs-helpers/lib/error-formatters.js +++ b/packages/ecs-helpers/lib/error-formatters.js @@ -35,6 +35,12 @@ function formatError (ecsFields, err) { message: err.message, stack_trace: err.stack } + if (err.code !== undefined) { + ecsFields.error.code = err.code + } + if (err.id !== undefined) { + ecsFields.error.id = err.id + } return true } diff --git a/packages/ecs-helpers/package.json b/packages/ecs-helpers/package.json index b3f2abc..a55119d 100644 --- a/packages/ecs-helpers/package.json +++ b/packages/ecs-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@elastic/ecs-helpers", - "version": "2.1.1", + "version": "2.2.0", "description": "ecs-logging-nodejs helpers", "publishConfig": { "access": "public", diff --git a/packages/ecs-helpers/test/basic.test.js b/packages/ecs-helpers/test/basic.test.js index 2f0055e..b88ec85 100644 --- a/packages/ecs-helpers/test/basic.test.js +++ b/packages/ecs-helpers/test/basic.test.js @@ -265,6 +265,25 @@ test('formatError: MyError with removed constructor', t => { t.end() }) +test('formatError: Error with code and id', t => { + const rec = {} + const err = new Error('boom') + err.code = 'ESOMETHING' + err.id = 'req-123' + formatError(rec, err) + t.equal(rec.error.code, 'ESOMETHING') + t.equal(rec.error.id, 'req-123') + t.end() +}) + +test('formatError: Error without code or id', t => { + const rec = {} + formatError(rec, new Error('boom')) + t.notOk('code' in rec.error, 'error.code should be absent') + t.notOk('id' in rec.error, 'error.id should be absent') + t.end() +}) + test('formatError: non-Error', t => { const rec = {} const nonError = { foo: 'bar' }