e27b7e996d
A number of changes here. I recommend viewing the diff with the <a href="?w=1">whitespace flag enabled</a>.
- OpenTelemetry is replaced with a custom and lightweight tracing solution.
- Three trace targets are currently supported: console, Zipkin, and NextJS.
- Tracing is now governed by environment variables rather than `--require instrument.js`.
+ `TRACE_TARGET`: one of `CONSOLE`, `ZIPKIN`, or `TELEMETRY`; defaults to `TELEMETRY` if unset or invalid.
+ `TRACE_ID`: an 8-byte hex-encoded value used as the Zipkin trace ID; if not provided, this value will be randomly generated and passed down to subprocesses.
Other sundry:
- I'm missing something, probably a setup step, with the Zipkin target. Traces are captured successfully, but you have to manually enter the Trace ID in order to view the trace - it doesn't show up in queries.
- I'm generally unhappy with [this commit](235cedcb3e
). It is... untidy to provide a telemetry object via `setGlobal`, but I don't have a ready alternative. Is `distDir` strictly required when creating a new Telemetry object? I didn't dig too deep here.
As noted, there are a lot of changes, so it'd be great if a reviewer could:
- [ ] pull down the branch and try to break it
- [ ] check the Zipkin traces and identify possible regressions in the functionality
Closes #22570
Fixes #22574
45 lines
902 B
TypeScript
45 lines
902 B
TypeScript
import { randomBytes } from 'crypto'
|
|
import fetch from 'node-fetch'
|
|
|
|
let traceId = process.env.TRACE_ID
|
|
if (!traceId) {
|
|
traceId = process.env.TRACE_ID = randomBytes(8).toString('hex')
|
|
}
|
|
|
|
const localEndpoint = {
|
|
serviceName: 'zipkin-query',
|
|
ipv4: '127.0.0.1',
|
|
port: 9411,
|
|
}
|
|
const zipkinUrl = `http://${localEndpoint.ipv4}:${localEndpoint.port}/api/v2/spans`
|
|
|
|
const reportToLocalHost = (
|
|
name: string,
|
|
duration: number,
|
|
timestamp: number,
|
|
id: string,
|
|
parentId?: string,
|
|
attrs?: Object
|
|
) => {
|
|
const body = [
|
|
{
|
|
traceId,
|
|
parentId,
|
|
name,
|
|
id,
|
|
timestamp,
|
|
duration,
|
|
localEndpoint,
|
|
tags: attrs,
|
|
},
|
|
]
|
|
|
|
// We intentionally do not block on I/O here.
|
|
fetch(zipkinUrl, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(body),
|
|
}).catch(() => {})
|
|
}
|
|
|
|
export default reportToLocalHost
|