```js
// app.js
constexpress= require("express");
consthttps= require("https");
constapp= express;
app.get("/",async(req,res)=> {
https.get("https://jsonplaceholder.typicode.com/todos/1",(incoming)=> {
incoming.on("data",(data)=> {
console.log(JSON.parse(data))
});
incoming.on("end",=> {
res.send("OK")
});
});
});
app.listen(3000,=> {
console.log(`Listening forrequests on http://localhost:3000`);
});
```
现在,让我们用上OTel。我们将添加一些依赖关系并引入tracing.js文件初始化OTel SDK。
```json
"dependencies": {
"@grpc/grpc-js": "1.3.7",
"@opentelemetry/api": "1.0.3",
"@opentelemetry/auto-instrumentations-node": "0.25.0",
"@opentelemetry/exporter-collector-grpc": "0.25.0",
"@opentelemetry/sdk-node": "0.25.0",
"express": "~4.16.1"
}
```
```js
// tracing.js
constopentelemetry= require('@opentelemetry/sdk-node');
const{getNodeAutoInstrumentations}= require('@opentelemetry/auto-instrumentations-node');
const{CollectorTraceExporter}= require("@opentelemetry/exporter-collector-grpc");
const{credentials}= require("@grpc/grpc-js");
consttraceExporter= newCollectorTraceExporter({
credentials: credentials.createSsl,
});
let sdk= newopentelemetry.NodeSDK({
traceExporter,
instrumentations: [getNodeAutoInstrumentations]
});
sdk.start
```
我们将通过环境变量配置OTel管道的其余部分。首先,让我们把它指向Honeycomb。
```sh
export OTEL_EXPORTER_OTLP_ENDPOINT=“ https://api.honeycomb.io”
export OTEL_EXPORTER_OTLP_HEADERS=“ x-honeycomb-team=MY_HNY_KEY,x-honeycomb-dataset=otel-node”
export OTEL_SERVICE_NAME=“ express-backend”
```
现在,当运行跟踪应用程序并点击端点时,我们在Honeycomb UI中看到了一些跟踪数据。
```sh
node-rtracing.js app.js
```
当然,我们不会就此止步。让我们添加一个属性为todo title的span。
```js
// app.js
constotel= require("@opentelemetry/api");
let tracer= otel.trace.getTracer("my-tracer");
app.get("/",async(req,res)=> {
https.get("https://jsonplaceholder.typicode.com/todos/1",(incoming)=> {
let span= tracer.startSpan("reading-todo");
incoming.on("data",(data)=> {
span.setAttribute("title",JSON.parse(data).title)
});
incoming.on("end",=> {
span.end;
res.send("OK")
});
});
});
```
我们追踪到另一个span,它显示了待办事项标题。
现在,假设你想将数据发送到Honeycomb以外的其他地方,只需交换端点和标题。让我们以New Relic为例。
```sh
export OTEL_EXPORTER_OTLP_ENDPOINT=“ https://otlp.nr-data.net:4317/”
export OTEL_EXPORTER_OTLP_HEADERS=“ api-key=MY_NR_KEY”
```
现在,在重新运行应用程序并点击端点后,我们可以在New Relic中看到跟踪,包括非常有用的待办事项标题。
但是,如果你还没有完全准备好进行切换,该怎么办?OpenTelemetry Collector是一个OTel组件,允许你通过配置数据管道接收、处理和导出遥测数据。它不是必需的组件,但在这种情况下,我们可以利用它将trace发送到Honeycomb和New Relic。首先在Docker容器中本地运行收集器。
```sh
docker run-p4317:4317-v/collector-config.yaml:/etc/collector-config.yaml otel/opentelemetry-collector— config=/etc/collector-config.yaml
```
以下是向2个供应商导出的collector-config.yaml文件:
```yaml
receivers:
otlp:
protocols:
grpc:
exporters:
otlp/hny:
endpoint: api-dogfood.honeycomb.io:443
headers:
"x-honeycomb-team": "MY_HNY_KEY"
"x-honeycomb-dataset": "otel-node"
otlp/nr:
endpoint: otlp.nr-data.net:4317
headers:
"api-key": "MY_NR_KEY"
service:
pipelines:
traces:
receivers: [otlp]
exporters: [otlp/hny,otlp/nr]
```
因为Node.js应用程序将向localhost上的收集器发送数据,我们需要更新gRPC凭据。
```js
// tracing.js
consttraceExporter= newCollectorTraceExporter({
credentials: credentials.createInsecure,
});
```
最后,我们为收集器地址交换端点。
```sh
export OTEL_EXPORTER_OTLP_ENDPOINT=localhost:4317
```
现在,运行应用程序并点击端点后,追踪会出现在Honeycomb和New Relic中,让你比较和对比不同的供应商解决方案。
打破供应商锁定的循环
本文中的例子并不重要,但想想几十个(或数百个)端点和代码路径的情况。有了OpenTelemetry,就不需要将特定于供应商的逻辑硬编码到应用程序中,只需要一直使用它们就好了。
原文链接: