Skip to content

Commit

Permalink
chore: adding instrumentation for connect
Browse files Browse the repository at this point in the history
  • Loading branch information
obecny committed Jul 23, 2021
1 parent 76893cb commit 07a5341
Show file tree
Hide file tree
Showing 21 changed files with 1,123 additions and 0 deletions.
56 changes: 56 additions & 0 deletions examples/connect/README.md
@@ -0,0 +1,56 @@
# Overview

OpenTelemetry Connect Instrumentation allows the user to automatically collect trace data and export them to the backend of choice (Collector Exporter), to give observability to distributed systems.

This is a simple example that demonstrates tracing calls made to Connect API. The example shows key aspects of tracing such as
- Root Span (on Client)
- Child Span (on Client)
- Span Events
- Span Attributes

## Installation

```sh
$ # from this directory
$ npm install
```

## Run the Application

### Collector - docker container

- Run docker container with collector

```sh
# from this directory
$ npm run docker:start
```

### Server

- Run the server

```sh
# from this directory
$ npm run server
```

- Run the client

```sh
# from this directory
npm run client
```

#### Zipkin UI
Go to Zipkin with your browser [http://localhost:9411/]()

<p align="center"><img src="images/trace1.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/main/packages/opentelemetry-node>

## LICENSE

Apache License 2.0
31 changes: 31 additions & 0 deletions examples/connect/client.js
@@ -0,0 +1,31 @@
'use strict';

// eslint-disable-next-line import/order
const tracing = require('./tracing')('example-connect-client');
const tracer = tracing.tracer;
const api = require('@opentelemetry/api');
const axios = require('axios').default;

function makeRequest() {
tracing.log('starting');
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.post('http://localhost:8080/run_test');
tracing.log('status:', res.statusText);
span.setStatus({ code: api.SpanStatusCode.OK });
} catch (e) {
tracing.log('failed:', e.message);
span.setStatus({ code: api.SpanStatusCode.ERROR, message: e.message });
}
span.end();
tracing.log('forcing spans to be exported');
await tracing.provider.shutdown();
tracing.log('all spans exported successfully.');
});
}

makeRequest();
28 changes: 28 additions & 0 deletions examples/connect/docker/collector-config.yaml
@@ -0,0 +1,28 @@
receivers:
otlp:
protocols:
grpc:
http:
cors_allowed_origins:
- http://*
- https://*

exporters:
zipkin:
endpoint: "http://zipkin-all-in-one:9411/api/v2/spans"
prometheus:
endpoint: "0.0.0.0:9464"

processors:
batch:

service:
pipelines:
traces:
receivers: [otlp]
exporters: [zipkin]
processors: [batch]
metrics:
receivers: [otlp]
exporters: [prometheus]
processors: [batch]
21 changes: 21 additions & 0 deletions examples/connect/docker/docker-compose.yaml
@@ -0,0 +1,21 @@
version: "3"
services:
# Collector
collector:
image: otel/opentelemetry-collector:0.30.0
# image: otel/opentelemetry-collector:latest
command: ["--config=/conf/collector-config.yaml", "--log-level=DEBUG"]
volumes:
- ./collector-config.yaml:/conf/collector-config.yaml
ports:
- "9464:9464"
- "4317:4317"
- "55681:55681"
depends_on:
- zipkin-all-in-one

# Zipkin
zipkin-all-in-one:
image: openzipkin/zipkin:latest
ports:
- "9411:9411"
Binary file added examples/connect/images/trace1.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
56 changes: 56 additions & 0 deletions examples/connect/package.json
@@ -0,0 +1,56 @@
{
"name": "express-connect",
"private": true,
"version": "0.23.0",
"description": "Example of Connect integration with OpenTelemetry",
"main": "index.js",
"scripts": {
"client": "node ./client.js",
"docker:start": "cd ./docker && docker-compose down && docker-compose up",
"docker:stop": "cd ./docker && docker-compose down",
"server": "node ./server.js"
},
"repository": {
"type": "git",
"url": "git+ssh://git@github.com/open-telemetry/opentelemetry-js.git"
},
"keywords": [
"opentelemetry",
"express",
"tracing"
],
"engines": {
"node": ">=8"
},
"files": [
"build/src/**/*.js",
"build/src/**/*.map",
"build/src/**/*.d.ts",
"doc",
"LICENSE",
"README.md"
],
"author": "OpenTelemetry Authors",
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/open-telemetry/opentelemetry-js/issues"
},
"dependencies": {
"@opentelemetry/api": "^1.0.1",
"@opentelemetry/exporter-jaeger": "^0.23.0",
"@opentelemetry/exporter-zipkin": "^0.23.0",
"@opentelemetry/exporter-collector": "^0.23.0",
"@opentelemetry/instrumentation": "^0.23.0",
"@opentelemetry/instrumentation-connect": "^0.23.0",
"@opentelemetry/instrumentation-http": "^0.23.0",
"@opentelemetry/node": "^0.23.0",
"@opentelemetry/resources": "^0.23.0",
"@opentelemetry/semantic-conventions": "^0.23.0",
"@opentelemetry/tracing": "^0.23.0",
"axios": "^0.21.1",
"cross-env": "^7.0.3",
"connect": "^3.7.0"
},
"homepage": "https://github.com/open-telemetry/opentelemetry-js#readme",
"devDependencies": {}
}
35 changes: 35 additions & 0 deletions examples/connect/server.js
@@ -0,0 +1,35 @@
'use strict';

// eslint-disable-next-line
const tracing = require('./tracing')('example-connect-server');

// Require in rest of modules
const connect = require('connect');
const axios = require('axios');

// Setup express
const app = connect();
const PORT = 8080;

app.use(function middleware1(req, res, next) {
next();
});

app.use((req, res, next) => {
next();
});

app.use('/run_test', async (req, res) => {
const result = await axios.get('https://raw.githubusercontent.com/open-telemetry/opentelemetry-js/main/package.json');
tracing.log('sending response');
res.end(`OK ${result.data.version}`);
if (tracing.connectInstrumentation.isEnabled()) {
tracing.log('disabling connect');
tracing.connectInstrumentation.disable();
} else {
tracing.log('enabling connect');
tracing.connectInstrumentation.enable();
}
});

app.listen(PORT);
52 changes: 52 additions & 0 deletions examples/connect/tracing.js
@@ -0,0 +1,52 @@
'use strict';

const opentelemetry = require('@opentelemetry/api');

const { diag, DiagConsoleLogger, DiagLogLevel } = opentelemetry;
diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO);

const { Resource } = require('@opentelemetry/resources');
const { ResourceAttributes: SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions');
const { registerInstrumentations } = require('@opentelemetry/instrumentation');
const { NodeTracerProvider } = require('@opentelemetry/node');
const { SimpleSpanProcessor } = require('@opentelemetry/tracing');
const { CollectorTraceExporter } = require('@opentelemetry/exporter-collector');

const { ConnectInstrumentation } = require('@opentelemetry/instrumentation-connect');
const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http');

function log() {
const args = Array.from(arguments) || [];
args.unshift(new Date());
console.log.apply(this, args);
}

module.exports = (serviceName) => {
const provider = new NodeTracerProvider({
resource: new Resource({
[SemanticResourceAttributes.SERVICE_NAME]: serviceName,
}),
});
const connectInstrumentation = new ConnectInstrumentation();
registerInstrumentations({
tracerProvider: provider,
instrumentations: [
// Connect instrumentation expects HTTP layer to be instrumented
HttpInstrumentation,
connectInstrumentation,
],
});

const exporter = new CollectorTraceExporter();

provider.addSpanProcessor(new SimpleSpanProcessor(exporter));

// Initialize the OpenTelemetry APIs to use the NodeTracerProvider bindings
provider.register({});
return {
log,
connectInstrumentation,
provider,
tracer: opentelemetry.trace.getTracer('connect-example'),
}
};
@@ -0,0 +1,2 @@
build
coverage
@@ -0,0 +1,7 @@
module.exports = {
"env": {
"mocha": true,
"node": true
},
...require('../../../eslint.config.js')
}
4 changes: 4 additions & 0 deletions plugins/node/opentelemetry-instrumentation-connect/.npmignore
@@ -0,0 +1,4 @@
/bin
/coverage
/doc
/test

0 comments on commit 07a5341

Please sign in to comment.