Skip to content

Commit

Permalink
feat: add 'http.request.id' field, @elastic/[email protected], bump e…
Browse files Browse the repository at this point in the history
…cs.version to 8.10.0 (#163)

Closes: #133
Closes: #76
  • Loading branch information
trentm authored Oct 27, 2023
1 parent 16a11e8 commit 7c82a8d
Show file tree
Hide file tree
Showing 17 changed files with 107 additions and 33 deletions.
2 changes: 1 addition & 1 deletion docs/intro.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ popular web frameworks. A minimal log record includes the following fields:
"@timestamp": "2021-01-13T21:32:38.095Z",
"log.level": "info",
"message": "hi",
"ecs.version": "1.6.0"
"ecs.version": "8.10.0"
}
----

Expand Down
2 changes: 1 addition & 1 deletion docs/morgan.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ similar to the following:
"@timestamp": "2021-01-16T00:03:23.279Z",
"log.level": "info",
"message": "::1 - - [16/Jan/2021:00:03:23 +0000] \"GET / HTTP/1.1\" 200 13 \"-\" \"curl/7.64.1\"",
"ecs.version": "1.6.0",
"ecs.version": "8.10.0",
"http": {
"version": "1.1",
"request": {
Expand Down
6 changes: 3 additions & 3 deletions docs/pino.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ Running this will produce log output similar to the following:

[source,cmd]
----
{"log.level":"info","@timestamp":"2023-10-14T02:07:47.901Z","process.pid":56645,"host.hostname":"pink.local","ecs.version":"1.6.0","message":"Hello world"}
{"log.level":"warn","@timestamp":"2023-10-14T02:07:47.901Z","process.pid":56645,"host.hostname":"pink.local","ecs.version":"1.6.0","module":"foo","message":"From child"}
{"log.level":"info","@timestamp":"2023-10-14T02:07:47.901Z","process.pid":56645,"host.hostname":"pink.local","ecs.version":"8.10.0","message":"Hello world"}
{"log.level":"warn","@timestamp":"2023-10-14T02:07:47.901Z","process.pid":56645,"host.hostname":"pink.local","ecs.version":"8.10.0","module":"foo","message":"From child"}
----

[float]
Expand Down Expand Up @@ -162,7 +162,7 @@ For example:
"@timestamp": "2023-10-14T02:10:14.477Z",
"process.pid": 56697,
"host.hostname": "pink.local",
"ecs.version": "1.6.0",
"ecs.version": "8.10.0",
"http": {
"version": "1.1",
"request": {
Expand Down
8 changes: 4 additions & 4 deletions docs/winston.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,8 @@ Running this script (available https://github.com/elastic/ecs-logging-nodejs/blo
[source,cmd]
----
% node examples/basic.js
{"@timestamp":"2023-10-14T02:14:17.302Z","log.level":"info","message":"hi","ecs.version":"1.6.0"}
{"@timestamp":"2023-10-14T02:14:17.304Z","log.level":"error","message":"oops there is a problem","ecs.version":"1.6.0","foo":"bar"}
{"@timestamp":"2023-10-14T02:14:17.302Z","log.level":"info","message":"hi","ecs.version":"8.10.0"}
{"@timestamp":"2023-10-14T02:14:17.304Z","log.level":"error","message":"oops there is a problem","ecs.version":"8.10.0","foo":"bar"}
----

The formatter handles serialization to JSON, so you don't need to add the
Expand Down Expand Up @@ -126,7 +126,7 @@ will yield (pretty-printed for readability):
"message": "boom",
"stack_trace": "Error: boom\n at Object.<anonymous> (..."
},
"ecs.version": "1.6.0"
"ecs.version": "8.10.0"
}
----

Expand Down Expand Up @@ -220,7 +220,7 @@ For https://github.com/elastic/ecs-logging-nodejs/blob/main/packages/ecs-winston
"user_agent": {
"original": "curl/8.1.2"
},
"ecs.version": "1.6.0"
"ecs.version": "8.10.0"
}
----

Expand Down
16 changes: 16 additions & 0 deletions packages/ecs-helpers/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
# @elastic/ecs-helpers Changelog

## v2.1.0

- Bump the `ecs.version` from "1.6.0" to "8.10.0".
(https://github.com/elastic/ecs-logging-nodejs/issues/133)

- `formatHttpRequest()` will now attempt to determine request ID and add it
to the [`http.request.id` field](https://www.elastic.co/guide/en/ecs/current/ecs-http.html#field-http-request-id).
This first attempts `req.id` (Fastify, express-request-id), `req.id()`
(Restify), and then falls back to the `request-id` or `x-request-id` headers.
(https://github.com/elastic/ecs-logging-nodejs/issues/76)

Note: In previous versions a `req.id` value would be added to the `event.id`
field. This has been removed. Please [open an issue](https://github.com/elastic/ecs-logging-nodejs/issues/new)
if this impacts you.


## v2.0.0

- [Breaking change.] Drop the `serialize` method. Serialization will move to
Expand Down
47 changes: 41 additions & 6 deletions packages/ecs-helpers/lib/http-formatters.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@

'use strict'

// Likely HTTP request header names that would include a request ID value,
// drawn from Fastify's [`requestIdHeader`](https://fastify.dev/docs/latest/Reference/Server/#requestidheader)
// default, Restify's defaults (https://github.com/restify/node-restify/blob/9f1d249/lib/plugins/pre/reqIdHeaders.js#L5).
const REQUEST_ID_HEADERS = [
'request-id',
'x-request-id'
]

// Write ECS fields for the given HTTP request (expected to be
// `http.IncomingMessage`-y) into the `ecs` object. This returns true iff
// the given `req` was a request object it could process.
Expand All @@ -36,7 +44,6 @@ function formatHttpRequest (ecs, req) {
}

const {
id,
method,
url,
headers,
Expand All @@ -45,11 +52,6 @@ function formatHttpRequest (ecs, req) {
socket
} = req

if (id) {
ecs.event = ecs.event || {}
ecs.event.id = id
}

ecs.http = ecs.http || {}
ecs.http.version = httpVersion
ecs.http.request = ecs.http.request || {}
Expand Down Expand Up @@ -114,6 +116,39 @@ function formatHttpRequest (ecs, req) {
}
}

// Attempt to set `http.request.id` field from well-known web framework APIs
// or from some likely headers.
// Note: I'm not sure whether to include Hapi's `request.info.id` generated
// value (https://hapi.dev/api/?v=21.3.2#-requestinfo). IIUC it does NOT
// consider an incoming header.
let id = null
switch (typeof (req.id)) {
case 'string':
// Fastify https://fastify.dev/docs/latest/Reference/Request/, also
// Express if using https://www.npmjs.com/package/express-request-id.
id = req.id
break
case 'number':
id = req.id.toString()
break
case 'function':
// Restify http://restify.com/docs/request-api/#id
id = req.id()
break
}
if (!id && hasHeaders) {
for (let i = 0; i < REQUEST_ID_HEADERS.length; i++) {
const k = REQUEST_ID_HEADERS[i]
if (headers[k]) {
id = headers[k]
break
}
}
}
if (id) {
ecs.http.request.id = id
}

return true
}

Expand Down
2 changes: 1 addition & 1 deletion packages/ecs-helpers/lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const errorFormatters = require('./error-formatters')
const httpFormatters = require('./http-formatters')

module.exports = {
version: '1.6.0',
version: '8.10.0',
...errorFormatters,
...httpFormatters
}
2 changes: 1 addition & 1 deletion packages/ecs-helpers/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@elastic/ecs-helpers",
"version": "2.0.0",
"version": "2.1.0",
"description": "ecs-logging-nodejs helpers",
"main": "lib/index.js",
"files": [
Expand Down
19 changes: 13 additions & 6 deletions packages/ecs-helpers/test/express.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ test('express res/req serialization', t => {
const app = express()
let server

app.get('/', (req, res) => {
app.get('/apath', (req, res) => {
const rec = {}

res.setHeader('Foo', 'Bar')
Expand All @@ -45,17 +45,20 @@ test('express res/req serialization', t => {

t.same(rec.user_agent, { original: 'cool-agent' })
t.same(rec.url, {
path: '/',
full: `http://127.0.0.1:${server.address().port}/`,
full: `http://127.0.0.1:${server.address().port}/apath?aquery`,
path: '/apath',
query: 'aquery',
domain: '127.0.0.1'
})
t.same(rec.http, {
version: '1.1',
request: {
id: 'arequestid',
method: 'GET',
headers: {
'user-agent': 'cool-agent',
host: `127.0.0.1:${server.address().port}`,
'x-request-id': 'arequestid',
connection: 'close'
}
},
Expand All @@ -78,9 +81,13 @@ test('express res/req serialization', t => {
app.listen(0, '127.0.0.1', function () {
server = this
const req = http.get(
`http://127.0.0.1:${server.address().port}/`,
`http://127.0.0.1:${server.address().port}/apath?aquery#ahash`,
{
headers: { 'user-agent': 'cool-agent', connection: 'close' }
headers: {
'user-agent': 'cool-agent',
connection: 'close',
'x-request-id': 'arequestid'
}
},
function (res) {
res.on('data', function () {})
Expand All @@ -91,6 +98,6 @@ test('express res/req serialization', t => {
})
}
)
req.on('error', t.ifErr)
req.on('error', t.error)
})
})
18 changes: 14 additions & 4 deletions packages/ecs-helpers/test/hapi.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,10 @@ test('hapi res/req serialization', testOpts, t => {
headers: {
'user-agent': 'cool-agent',
host: `127.0.0.1:${server.info.port}`,
connection: 'close'
}
connection: 'close',
'request-id': 'arequestid'
},
id: 'arequestid'
},
response: {
status_code: 200,
Expand Down Expand Up @@ -98,8 +100,16 @@ test('hapi res/req serialization', testOpts, t => {
t.comment('hapi server running on %s', server.info.uri)

// Make a request so we trigger a 'response' event above.
const req = http.get(`http://127.0.0.1:${server.info.port}/`,
{ headers: { 'user-agent': 'cool-agent', connection: 'close' } })
const req = http.get(
`http://127.0.0.1:${server.info.port}/`,
{
headers: {
'user-agent': 'cool-agent',
connection: 'close',
'request-id': 'arequestid'
}
}
)
req.on('error', t.ifErr)
})
})
2 changes: 2 additions & 0 deletions packages/ecs-morgan-format/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
protects against circular references and bigints.
(https://github.com/elastic/ecs-logging-nodejs/pull/155)

- Set `http.request.id` field (see [ecs-helpers CHANGELOG](../ecs-helpers/CHANGELOG.md#v210)).

## v1.4.0

- Add `service.version`, `service.environment`, and `service.node.name` log
Expand Down
2 changes: 1 addition & 1 deletion packages/ecs-morgan-format/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ produce log output similar to the following:
"user_agent": {
"original": "curl/8.1.2"
},
"ecs.version": "1.6.0"
"ecs.version": "8.10.0"
}
```

Expand Down
2 changes: 2 additions & 0 deletions packages/ecs-pino-format/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
`fast-safe-stringify` lib that resulted in a maintenance warning about
the `string-similarity` transitive dep.

- Set `http.request.id` field (see [ecs-helpers CHANGELOG](../ecs-helpers/CHANGELOG.md#v210)).

## v1.4.0

- Add `service.version`, `service.environment`, and `service.node.name` log
Expand Down
4 changes: 2 additions & 2 deletions packages/ecs-pino-format/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ child.warn('From child')
Running this will produce log output similar to the following:

```sh
{"log.level":"info","@timestamp":"2023-10-16T18:08:02.601Z","process.pid":74325,"host.hostname":"pink.local","ecs.version":"1.6.0","message":"Hello world"}
{"log.level":"warn","@timestamp":"2023-10-16T18:08:02.602Z","process.pid":74325,"host.hostname":"pink.local","ecs.version":"1.6.0","module":"foo","message":"From child"}
{"log.level":"info","@timestamp":"2023-10-16T18:08:02.601Z","process.pid":74325,"host.hostname":"pink.local","ecs.version":"8.10.0","message":"Hello world"}
{"log.level":"warn","@timestamp":"2023-10-16T18:08:02.602Z","process.pid":74325,"host.hostname":"pink.local","ecs.version":"8.10.0","module":"foo","message":"From child"}
```

Please see the [Node.js ECS pino documentation](https://www.elastic.co/guide/en/ecs-logging/nodejs/current/pino.html) for more.
Expand Down
2 changes: 1 addition & 1 deletion packages/ecs-pino-format/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
"node": ">=10"
},
"dependencies": {
"@elastic/ecs-helpers": "^2.0.0"
"@elastic/ecs-helpers": "^2.1.0"
},
"devDependencies": {
"@types/pino": "^6.3.9",
Expand Down
2 changes: 2 additions & 0 deletions packages/ecs-winston-format/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@
mechanism.
(https://github.com/elastic/ecs-logging-nodejs/issues/108)

- Set `http.request.id` field (see [ecs-helpers CHANGELOG](../ecs-helpers/CHANGELOG.md#v210)).

## v1.4.0

- Add `service.version`, `service.environment`, and `service.node.name` log
Expand Down
4 changes: 2 additions & 2 deletions packages/ecs-winston-format/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ Running this script will produce log output similar to the following:

```sh
% node examples/basic.js
{"@timestamp":"2021-01-13T21:32:38.095Z","log.level":"info","message":"hi","ecs":{"version":"1.6.0"}}
{"@timestamp":"2021-01-13T21:32:38.096Z","log.level":"error","message":"oops there is a problem","ecs":{"version":"1.6.0"},"foo":"bar"}
{"@timestamp":"2021-01-13T21:32:38.095Z","log.level":"info","message":"hi","ecs":{"version":"8.10.0"}}
{"@timestamp":"2021-01-13T21:32:38.096Z","log.level":"error","message":"oops there is a problem","ecs":{"version":"8.10.0"},"foo":"bar"}
```

Please see the [Node.js ECS winston documentation](https://www.elastic.co/guide/en/ecs-logging/nodejs/current/winston.html) for more.
Expand Down

0 comments on commit 7c82a8d

Please sign in to comment.