通过OpenTelemetry上报Node.js应用数据
- 引入依赖包。
"dependencies": {
"@hapi/hapi": "^19.2.0",
"@opentelemetry/api": "^1.0.2",
"@opentelemetry/exporter-jaeger": "^0.25.0",
"@opentelemetry/exporter-zipkin": "^0.25.0",
"@opentelemetry/instrumentation": "^0.25.0",
"@opentelemetry/instrumentation-hapi": "^0.23.0",
"@opentelemetry/instrumentation-http": "^0.25.0",
"@opentelemetry/sdk-trace-node": "^0.25.0",
"@opentelemetry/sdk-trace-base": "^0.25.0",
"axios": "^0.21.1"
}
- 初始化nodejs Provider。
const { Resource } = require("@opentelemetry/resources");
const {
OTLPTraceExporter,
} = require("@opentelemetry/exporter-trace-otlp-proto");
const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node");
const { registerInstrumentations } = require("@opentelemetry/instrumentation");
const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http");
const {
SemanticResourceAttributes,
} = require("@opentelemetry/semantic-conventions");
const {
SimpleSpanProcessor,
ConsoleSpanExporter,
BatchSpanProcessor
} = require("@opentelemetry/sdk-trace-base");
const provider = new NodeTracerProvider({
resource: new Resource({
[SemanticResourceAttributes.HOST_NAME]: require("os").hostname(), // 主机名
[SemanticResourceAttributes.SERVICE_NAME]: "service-name",
}),
});
registerInstrumentations({
tracerProvider: provider,
instrumentations: [new HttpInstrumentation()],
});
const exporter = new OTLPTraceExporter({ url: "", headers: {},});
//
provider.addSpanProcessor(new BatchSpanProcessor(exporter)); // 通过HTTP上报Trace数据
provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter())); // 可选,Trace数据打印到终端
provider.register();
- client 上报demo。
const api = require('@opentelemetry/api');
const { Span } = require('@opentelemetry/sdk-trace-base');
const axios = require('axios').default;
const tracer = api.trace.getTracer('hapi-example');
function makeRequest() {
const span = tracer.startSpan('client.makeRequest()', {
kind: api.SpanKind.CLIENT,
});
api.context.with(api.trace.setSpan(api.ROOT_CONTEXT, span), async () => {
try {
const res = await axios.get('addr');
span.setStatus({ code: api.SpanStatusCode.OK });
console.log(res.statusText);
} catch (e) {
span.setStatus({ code: api.SpanStatusCode.ERROR, message: e.message });
}
span.end();
console.log('Sleeping 5 seconds before shutdown to ensure all records are flushed.');
setTimeout(() => { console.log('Completed.'); }, 5000);
});
}
makeRequest();
- 服务端上报demo。
const api = require('@opentelemetry/api');
function runTest(_, h) {
const currentSpan = api.trace.getSpan(api.context.active());
const { traceId } = currentSpan.spanContext();
console.log(`traceid: ${traceId}`);
}
- 通过上面步骤就可以在控制台查看nodejs 产生的链路数据了。更详细的接入demo请参考