feat: add OpenTracing example (#581)
* feat: add OpenTracing example * fix: review comments - Combine `Tracer` and `.init` to one line - Use `setTimeout` to be consistent with other example - Remove unused dependency - Add missing keywords - Update README - Add missing `"use strict";` * fix: review comments - Update README - Separate shim to another file * fix: remove unnecessary file
This commit is contained in:
parent
4b25d4a26f
commit
af5a364efd
|
|
@ -0,0 +1,77 @@
|
||||||
|
# Overview
|
||||||
|
|
||||||
|
OpenTracing shim allows existing OpenTracing instrumentation to report to OpenTelemetry.
|
||||||
|
|
||||||
|
This is a simple example that demonstrates how existing OpenTracing instrumentation can be integrated with OpenTelemetry.
|
||||||
|
|
||||||
|
The example shows key aspects of tracing such as
|
||||||
|
|
||||||
|
- Root Span (on client)
|
||||||
|
- Child Span from a remote parent (on server)
|
||||||
|
- Span Tag
|
||||||
|
- Span Log
|
||||||
|
- Make a shim between OpenTracing and OpenTelemetry tracers
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
```sh
|
||||||
|
# from this directory
|
||||||
|
$ npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Run the Application
|
||||||
|
|
||||||
|
### Zipkin
|
||||||
|
- Setup [Zipkin Tracing UI](https://zipkin.io/pages/quickstart.html)
|
||||||
|
|
||||||
|
- Run the server
|
||||||
|
```sh
|
||||||
|
# from this directory
|
||||||
|
$ npm run zipkin:server
|
||||||
|
```
|
||||||
|
|
||||||
|
- Run the client
|
||||||
|
```sh
|
||||||
|
# from this directory
|
||||||
|
$ npm run zipkin:client
|
||||||
|
```
|
||||||
|
|
||||||
|
- Check trace
|
||||||
|
|
||||||
|
`zipkin:client` should output the `traceId` in the terminal.
|
||||||
|
|
||||||
|
Go to Zipkin with your browser [http://localhost:9411/zipkin/traces/(your-trace-id)]() (e.g http://localhost:9411/zipkin/traces/4815c3d576d930189725f1f1d1bdfcc6)
|
||||||
|
|
||||||
|
|
||||||
|
<p align="center"><img src="./images/zipkin-ui.png?raw=true"/></p>
|
||||||
|
|
||||||
|
### Jaeger
|
||||||
|
- Setup [Jaeger Tracing UI](https://www.jaegertracing.io/docs/latest/getting-started/#all-in-one)
|
||||||
|
|
||||||
|
- Run the server
|
||||||
|
```sh
|
||||||
|
# from this directory
|
||||||
|
$ npm run jaeger:server
|
||||||
|
```
|
||||||
|
|
||||||
|
- Run the client
|
||||||
|
```sh
|
||||||
|
# from this directory
|
||||||
|
$ npm run jaeger:client
|
||||||
|
```
|
||||||
|
|
||||||
|
- Check trace
|
||||||
|
|
||||||
|
`jaeger:client` should output the `traceId` in the terminal.
|
||||||
|
|
||||||
|
Go to Jaeger with your browser [http://localhost:16686/trace/(your-trace-id)]() (e.g http://localhost:16686/trace/4815c3d576d930189725f1f1d1bdfcc6)
|
||||||
|
|
||||||
|
<p align="center"><img src="images/jaeger-ui.png?raw=true"/></p>
|
||||||
|
|
||||||
|
## Useful links
|
||||||
|
- For more information on OpenTelemetry, visit: <https://opentelemetry.io/>
|
||||||
|
- For more information on OpenTelemetry for Node.js, visit: <https://github.com/open-telemetry/opentelemetry-js/tree/master/packages/opentelemetry-node>
|
||||||
|
- For more information on OpenTracing, visit: <https://opentracing.io/>
|
||||||
|
|
||||||
|
## LICENSE
|
||||||
|
|
||||||
|
Apache License 2.0
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const http = require("http");
|
||||||
|
const opentracing = require("opentracing");
|
||||||
|
const shim = require("./shim").shim("http_client_service");
|
||||||
|
|
||||||
|
opentracing.initGlobalTracer(shim);
|
||||||
|
const tracer = opentracing.globalTracer();
|
||||||
|
|
||||||
|
makeRequest();
|
||||||
|
|
||||||
|
async function makeRequest() {
|
||||||
|
const span = tracer.startSpan("make_request");
|
||||||
|
|
||||||
|
const headers = {};
|
||||||
|
tracer.inject(span, opentracing.FORMAT_HTTP_HEADERS, headers);
|
||||||
|
|
||||||
|
http
|
||||||
|
.get(
|
||||||
|
{
|
||||||
|
host: "localhost",
|
||||||
|
port: 3000,
|
||||||
|
path: "/",
|
||||||
|
headers
|
||||||
|
},
|
||||||
|
resp => {
|
||||||
|
let data = "";
|
||||||
|
|
||||||
|
resp.on("data", chunk => {
|
||||||
|
data += chunk;
|
||||||
|
});
|
||||||
|
|
||||||
|
resp.on("end", async () => {
|
||||||
|
console.log(JSON.parse(data));
|
||||||
|
span.finish();
|
||||||
|
|
||||||
|
console.log("Sleeping 5 seconds before shutdown to ensure all records are flushed.");
|
||||||
|
setTimeout(() => { console.log("Completed."); }, 5000);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.on("error", err => {
|
||||||
|
console.log("Error: " + err.message);
|
||||||
|
});
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 342 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 184 KiB |
|
|
@ -0,0 +1,42 @@
|
||||||
|
{
|
||||||
|
"name": "opentracing-shim",
|
||||||
|
"private": true,
|
||||||
|
"version": "0.2.0",
|
||||||
|
"description": "Example of using @opentelemetry/shim-opentracing in Node.js",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"zipkin:client": "cross-env EXPORTER=zipkin node ./client.js",
|
||||||
|
"zipkin:server": "cross-env EXPORTER=zipkin node ./server.js",
|
||||||
|
"jaeger:client": "cross-env EXPORTER=jaeger node ./client.js",
|
||||||
|
"jaeger:server": "cross-env EXPORTER=jaeger node ./server.js"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+ssh://git@github.com/open-telemetry/opentelemetry-js.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"opentelemetry",
|
||||||
|
"http",
|
||||||
|
"tracing",
|
||||||
|
"opentracing"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
},
|
||||||
|
"author": "OpenTelemetry Authors",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/open-telemetry/opentelemetry-js/issues"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@opentelemetry/exporter-jaeger": "^0.2.0",
|
||||||
|
"@opentelemetry/exporter-zipkin": "^0.2.0",
|
||||||
|
"@opentelemetry/node": "^0.2.0",
|
||||||
|
"@opentelemetry/shim-opentracing": "^0.2.0",
|
||||||
|
"opentracing": "^0.14.4"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/open-telemetry/opentelemetry-js#readme",
|
||||||
|
"devDependencies": {
|
||||||
|
"cross-env": "^6.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const http = require("http");
|
||||||
|
const opentracing = require("opentracing");
|
||||||
|
const utils = require("./utils");
|
||||||
|
const shim = require("./shim").shim("http_server_service");
|
||||||
|
|
||||||
|
opentracing.initGlobalTracer(shim);
|
||||||
|
const tracer = opentracing.globalTracer();
|
||||||
|
|
||||||
|
startServer(3000);
|
||||||
|
|
||||||
|
function startServer(port) {
|
||||||
|
const server = http.createServer(handleRequest);
|
||||||
|
|
||||||
|
server.listen(port, err => {
|
||||||
|
if (err) throw err;
|
||||||
|
|
||||||
|
console.log(`Server is listening on ${port}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleRequest(req, res) {
|
||||||
|
const parentSpan = tracer.extract(
|
||||||
|
opentracing.FORMAT_HTTP_HEADERS,
|
||||||
|
req.headers
|
||||||
|
);
|
||||||
|
|
||||||
|
const span = tracer.startSpan("handle_request", {
|
||||||
|
childOf: parentSpan
|
||||||
|
});
|
||||||
|
|
||||||
|
span.setTag("custom", "tag value");
|
||||||
|
span.setTag("alpha", "1000");
|
||||||
|
|
||||||
|
await doSomething(span);
|
||||||
|
|
||||||
|
res.writeHead(200, { "Content-Type": "application/json" });
|
||||||
|
res.write(
|
||||||
|
JSON.stringify({ status: "OK", traceId: span.context().toTraceId() })
|
||||||
|
);
|
||||||
|
|
||||||
|
res.end();
|
||||||
|
span.finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function doSomething(parentSpan) {
|
||||||
|
const span = tracer.startSpan("do_something", { childOf: parentSpan });
|
||||||
|
|
||||||
|
span.setTag("alpha", "200");
|
||||||
|
span.setTag("beta", "50");
|
||||||
|
span.log({ state: "waiting" });
|
||||||
|
|
||||||
|
// deliberately sleeping to mock some action.
|
||||||
|
await utils.sleep(1000);
|
||||||
|
|
||||||
|
span.finish();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const { NodeTracer } = require("@opentelemetry/node");
|
||||||
|
const { SimpleSpanProcessor } = require("@opentelemetry/tracing");
|
||||||
|
const { JaegerExporter } = require("@opentelemetry/exporter-jaeger");
|
||||||
|
const { ZipkinExporter } = require("@opentelemetry/exporter-zipkin");
|
||||||
|
const { TracerShim } = require("@opentelemetry/shim-opentracing");
|
||||||
|
|
||||||
|
function shim(serviceName) {
|
||||||
|
const tracer = new NodeTracer();
|
||||||
|
|
||||||
|
tracer.addSpanProcessor(new SimpleSpanProcessor(getExporter(serviceName)));
|
||||||
|
|
||||||
|
return new TracerShim(tracer);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getExporter(serviceName) {
|
||||||
|
const type = process.env.EXPORTER.toLowerCase() || "jaeger";
|
||||||
|
|
||||||
|
if (type.startsWith("z")) {
|
||||||
|
return new ZipkinExporter({ serviceName });
|
||||||
|
}
|
||||||
|
|
||||||
|
return new JaegerExporter({ serviceName, flushInterval: 100 });
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.shim = shim;
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
async function sleep(ms) {
|
||||||
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.sleep = sleep;
|
||||||
Loading…
Reference in New Issue