```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,就不需要将特定于供应商的逻辑硬编码到应用程序中,只需要一直使用它们就好了。

原文链接: