Skip to content

Commit af5a364

Browse files
hievenmayurkale22
authored andcommitted
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
1 parent 4b25d4a commit af5a364

File tree

8 files changed

+256
-0
lines changed

8 files changed

+256
-0
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# Overview
2+
3+
OpenTracing shim allows existing OpenTracing instrumentation to report to OpenTelemetry.
4+
5+
This is a simple example that demonstrates how existing OpenTracing instrumentation can be integrated with OpenTelemetry.
6+
7+
The example shows key aspects of tracing such as
8+
9+
- Root Span (on client)
10+
- Child Span from a remote parent (on server)
11+
- Span Tag
12+
- Span Log
13+
- Make a shim between OpenTracing and OpenTelemetry tracers
14+
15+
## Installation
16+
```sh
17+
# from this directory
18+
$ npm install
19+
```
20+
21+
## Run the Application
22+
23+
### Zipkin
24+
- Setup [Zipkin Tracing UI](https://zipkin.io/pages/quickstart.html)
25+
26+
- Run the server
27+
```sh
28+
# from this directory
29+
$ npm run zipkin:server
30+
```
31+
32+
- Run the client
33+
```sh
34+
# from this directory
35+
$ npm run zipkin:client
36+
```
37+
38+
- Check trace
39+
40+
`zipkin:client` should output the `traceId` in the terminal.
41+
42+
Go to Zipkin with your browser [http://localhost:9411/zipkin/traces/(your-trace-id)]() (e.g http://localhost:9411/zipkin/traces/4815c3d576d930189725f1f1d1bdfcc6)
43+
44+
45+
<p align="center"><img src="./images/zipkin-ui.png?raw=true"/></p>
46+
47+
### Jaeger
48+
- Setup [Jaeger Tracing UI](https://www.jaegertracing.io/docs/latest/getting-started/#all-in-one)
49+
50+
- Run the server
51+
```sh
52+
# from this directory
53+
$ npm run jaeger:server
54+
```
55+
56+
- Run the client
57+
```sh
58+
# from this directory
59+
$ npm run jaeger:client
60+
```
61+
62+
- Check trace
63+
64+
`jaeger:client` should output the `traceId` in the terminal.
65+
66+
Go to Jaeger with your browser [http://localhost:16686/trace/(your-trace-id)]() (e.g http://localhost:16686/trace/4815c3d576d930189725f1f1d1bdfcc6)
67+
68+
<p align="center"><img src="images/jaeger-ui.png?raw=true"/></p>
69+
70+
## Useful links
71+
- For more information on OpenTelemetry, visit: <https://opentelemetry.io/>
72+
- For more information on OpenTelemetry for Node.js, visit: <https://github.com/open-telemetry/opentelemetry-js/tree/master/packages/opentelemetry-node>
73+
- For more information on OpenTracing, visit: <https://opentracing.io/>
74+
75+
## LICENSE
76+
77+
Apache License 2.0
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
"use strict";
2+
3+
const http = require("http");
4+
const opentracing = require("opentracing");
5+
const shim = require("./shim").shim("http_client_service");
6+
7+
opentracing.initGlobalTracer(shim);
8+
const tracer = opentracing.globalTracer();
9+
10+
makeRequest();
11+
12+
async function makeRequest() {
13+
const span = tracer.startSpan("make_request");
14+
15+
const headers = {};
16+
tracer.inject(span, opentracing.FORMAT_HTTP_HEADERS, headers);
17+
18+
http
19+
.get(
20+
{
21+
host: "localhost",
22+
port: 3000,
23+
path: "/",
24+
headers
25+
},
26+
resp => {
27+
let data = "";
28+
29+
resp.on("data", chunk => {
30+
data += chunk;
31+
});
32+
33+
resp.on("end", async () => {
34+
console.log(JSON.parse(data));
35+
span.finish();
36+
37+
console.log("Sleeping 5 seconds before shutdown to ensure all records are flushed.");
38+
setTimeout(() => { console.log("Completed."); }, 5000);
39+
});
40+
}
41+
)
42+
.on("error", err => {
43+
console.log("Error: " + err.message);
44+
});
45+
}
342 KB
Loading
184 KB
Loading
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
{
2+
"name": "opentracing-shim",
3+
"private": true,
4+
"version": "0.2.0",
5+
"description": "Example of using @opentelemetry/shim-opentracing in Node.js",
6+
"main": "index.js",
7+
"scripts": {
8+
"zipkin:client": "cross-env EXPORTER=zipkin node ./client.js",
9+
"zipkin:server": "cross-env EXPORTER=zipkin node ./server.js",
10+
"jaeger:client": "cross-env EXPORTER=jaeger node ./client.js",
11+
"jaeger:server": "cross-env EXPORTER=jaeger node ./server.js"
12+
},
13+
"repository": {
14+
"type": "git",
15+
"url": "git+ssh://[email protected]/open-telemetry/opentelemetry-js.git"
16+
},
17+
"keywords": [
18+
"opentelemetry",
19+
"http",
20+
"tracing",
21+
"opentracing"
22+
],
23+
"engines": {
24+
"node": ">=8"
25+
},
26+
"author": "OpenTelemetry Authors",
27+
"license": "Apache-2.0",
28+
"bugs": {
29+
"url": "https://github.com/open-telemetry/opentelemetry-js/issues"
30+
},
31+
"dependencies": {
32+
"@opentelemetry/exporter-jaeger": "^0.2.0",
33+
"@opentelemetry/exporter-zipkin": "^0.2.0",
34+
"@opentelemetry/node": "^0.2.0",
35+
"@opentelemetry/shim-opentracing": "^0.2.0",
36+
"opentracing": "^0.14.4"
37+
},
38+
"homepage": "https://github.com/open-telemetry/opentelemetry-js#readme",
39+
"devDependencies": {
40+
"cross-env": "^6.0.0"
41+
}
42+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
"use strict";
2+
3+
const http = require("http");
4+
const opentracing = require("opentracing");
5+
const utils = require("./utils");
6+
const shim = require("./shim").shim("http_server_service");
7+
8+
opentracing.initGlobalTracer(shim);
9+
const tracer = opentracing.globalTracer();
10+
11+
startServer(3000);
12+
13+
function startServer(port) {
14+
const server = http.createServer(handleRequest);
15+
16+
server.listen(port, err => {
17+
if (err) throw err;
18+
19+
console.log(`Server is listening on ${port}`);
20+
});
21+
}
22+
23+
async function handleRequest(req, res) {
24+
const parentSpan = tracer.extract(
25+
opentracing.FORMAT_HTTP_HEADERS,
26+
req.headers
27+
);
28+
29+
const span = tracer.startSpan("handle_request", {
30+
childOf: parentSpan
31+
});
32+
33+
span.setTag("custom", "tag value");
34+
span.setTag("alpha", "1000");
35+
36+
await doSomething(span);
37+
38+
res.writeHead(200, { "Content-Type": "application/json" });
39+
res.write(
40+
JSON.stringify({ status: "OK", traceId: span.context().toTraceId() })
41+
);
42+
43+
res.end();
44+
span.finish();
45+
}
46+
47+
async function doSomething(parentSpan) {
48+
const span = tracer.startSpan("do_something", { childOf: parentSpan });
49+
50+
span.setTag("alpha", "200");
51+
span.setTag("beta", "50");
52+
span.log({ state: "waiting" });
53+
54+
// deliberately sleeping to mock some action.
55+
await utils.sleep(1000);
56+
57+
span.finish();
58+
}

examples/opentracing-shim/shim.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"use strict";
2+
3+
const { NodeTracer } = require("@opentelemetry/node");
4+
const { SimpleSpanProcessor } = require("@opentelemetry/tracing");
5+
const { JaegerExporter } = require("@opentelemetry/exporter-jaeger");
6+
const { ZipkinExporter } = require("@opentelemetry/exporter-zipkin");
7+
const { TracerShim } = require("@opentelemetry/shim-opentracing");
8+
9+
function shim(serviceName) {
10+
const tracer = new NodeTracer();
11+
12+
tracer.addSpanProcessor(new SimpleSpanProcessor(getExporter(serviceName)));
13+
14+
return new TracerShim(tracer);
15+
}
16+
17+
function getExporter(serviceName) {
18+
const type = process.env.EXPORTER.toLowerCase() || "jaeger";
19+
20+
if (type.startsWith("z")) {
21+
return new ZipkinExporter({ serviceName });
22+
}
23+
24+
return new JaegerExporter({ serviceName, flushInterval: 100 });
25+
}
26+
27+
exports.shim = shim;

examples/opentracing-shim/utils.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"use strict";
2+
3+
async function sleep(ms) {
4+
return new Promise(resolve => setTimeout(resolve, ms));
5+
}
6+
7+
exports.sleep = sleep;

0 commit comments

Comments
 (0)