From d5215f353a640c846580f3bc7d0bff8c9ab839c7 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 25 Nov 2024 19:45:32 +0100 Subject: [PATCH 01/11] chore(deps): update dependency @koa/router to v13 (#2384) --- package-lock.json | 38 +++++++++---------- .../package.json | 2 +- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index b69520b6b1..03be175022 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7812,25 +7812,23 @@ } }, "node_modules/@koa/router": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/@koa/router/-/router-12.0.1.tgz", - "integrity": "sha512-ribfPYfHb+Uw3b27Eiw6NPqjhIhTpVFzEWLwyc/1Xp+DCdwRRyIlAUODX+9bPARF6aQtUu1+/PHzdNvRzcs/+Q==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@koa/router/-/router-13.1.0.tgz", + "integrity": "sha512-mNVu1nvkpSd8Q8gMebGbCkDWJ51ODetrFvLKYusej+V0ByD4btqHYnPIzTBLXnQMVUlm/oxVwqmWBY3zQfZilw==", "dev": true, "dependencies": { - "debug": "^4.3.4", "http-errors": "^2.0.0", "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.2.1" + "path-to-regexp": "^6.3.0" }, "engines": { - "node": ">= 12" + "node": ">= 18" } }, "node_modules/@koa/router/node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "dev": true }, "node_modules/@lerna/child-process": { @@ -37496,7 +37494,7 @@ "@opentelemetry/semantic-conventions": "^1.27.0" }, "devDependencies": { - "@koa/router": "12.0.1", + "@koa/router": "13.1.0", "@opentelemetry/api": "^1.3.0", "@opentelemetry/context-async-hooks": "^1.8.0", "@opentelemetry/contrib-test-utils": "^0.43.0", @@ -45183,22 +45181,20 @@ } }, "@koa/router": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/@koa/router/-/router-12.0.1.tgz", - "integrity": "sha512-ribfPYfHb+Uw3b27Eiw6NPqjhIhTpVFzEWLwyc/1Xp+DCdwRRyIlAUODX+9bPARF6aQtUu1+/PHzdNvRzcs/+Q==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@koa/router/-/router-13.1.0.tgz", + "integrity": "sha512-mNVu1nvkpSd8Q8gMebGbCkDWJ51ODetrFvLKYusej+V0ByD4btqHYnPIzTBLXnQMVUlm/oxVwqmWBY3zQfZilw==", "dev": true, "requires": { - "debug": "^4.3.4", "http-errors": "^2.0.0", "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.2.1" + "path-to-regexp": "^6.3.0" }, "dependencies": { "path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "dev": true } } @@ -48078,7 +48074,7 @@ "@opentelemetry/instrumentation-koa": { "version": "file:plugins/node/opentelemetry-instrumentation-koa", "requires": { - "@koa/router": "12.0.1", + "@koa/router": "13.1.0", "@opentelemetry/api": "^1.3.0", "@opentelemetry/context-async-hooks": "^1.8.0", "@opentelemetry/contrib-test-utils": "^0.43.0", diff --git a/plugins/node/opentelemetry-instrumentation-koa/package.json b/plugins/node/opentelemetry-instrumentation-koa/package.json index a60b71f007..1c26caa48d 100644 --- a/plugins/node/opentelemetry-instrumentation-koa/package.json +++ b/plugins/node/opentelemetry-instrumentation-koa/package.json @@ -45,7 +45,7 @@ "@opentelemetry/api": "^1.3.0" }, "devDependencies": { - "@koa/router": "12.0.1", + "@koa/router": "13.1.0", "@opentelemetry/api": "^1.3.0", "@opentelemetry/context-async-hooks": "^1.8.0", "@opentelemetry/contrib-test-utils": "^0.43.0", From 468222b5039f400c4cce10f64ba0003580a67f95 Mon Sep 17 00:00:00 2001 From: Trivikram Kamat <16024985+trivikr@users.noreply.github.com> Date: Tue, 26 Nov 2024 03:01:46 -0800 Subject: [PATCH 02/11] chore(aws): replace deprecated substr with substring (#2551) --- .../src/instrumentation.ts | 5 ++++- .../src/services/sns.ts | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/node/opentelemetry-instrumentation-aws-lambda/src/instrumentation.ts b/plugins/node/opentelemetry-instrumentation-aws-lambda/src/instrumentation.ts index 23755bb264..c6d63ca86a 100644 --- a/plugins/node/opentelemetry-instrumentation-aws-lambda/src/instrumentation.ts +++ b/plugins/node/opentelemetry-instrumentation-aws-lambda/src/instrumentation.ts @@ -90,7 +90,10 @@ export class AwsLambdaInstrumentation extends InstrumentationBase Date: Tue, 26 Nov 2024 04:42:36 -0800 Subject: [PATCH 03/11] chore(examples/redis): use crypto.randomBytes to generate uuid (#2546) Co-authored-by: Trent Mick Co-authored-by: Marc Pichler --- examples/redis/src/server.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/examples/redis/src/server.ts b/examples/redis/src/server.ts index 3227fed8bf..b3a5c1c936 100644 --- a/examples/redis/src/server.ts +++ b/examples/redis/src/server.ts @@ -7,6 +7,7 @@ const tracer = setupTracing('example-redis-server'); import * as express from 'express'; import axios from 'axios'; import * as tracerHandlers from './express-tracer-handlers'; +import { randomBytes } from 'crypto'; const redisPromise = require('./setup-redis').redis; // Setup express @@ -20,12 +21,7 @@ async function setupRoutes() { const redis = await redisPromise; app.get('/run_test', async (req: express.Request, res: express.Response) => { - const uuid = Math.random() - .toString(36) - .substring(2, 15) - + Math.random() - .toString(36) - .substring(2, 15); + const uuid = randomBytes(16).toString('hex'); await axios.get(`http://localhost:${PORT}/set?args=uuid,${uuid}`); const body = await axios.get(`http://localhost:${PORT}/get?args=uuid`); From 6ee7e7fcb781047e9d03ad8a32b99337190b8653 Mon Sep 17 00:00:00 2001 From: Steven Oxley Date: Tue, 26 Nov 2024 15:54:18 -0700 Subject: [PATCH 04/11] fix(examples/web): updated webpack deps and npm start (#2530) --- examples/web/package.json | 6 +++--- examples/web/webpack.config.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/web/package.json b/examples/web/package.json index af7ca620c9..107c379fe9 100644 --- a/examples/web/package.json +++ b/examples/web/package.json @@ -7,7 +7,7 @@ "scripts": { "docker:start": "cd ./docker && docker-compose down && docker-compose up", "docker:startd": "cd ./docker && docker-compose down && docker-compose up -d", - "start": "webpack-dev-server -d --progress --colors --port 8090 --config webpack.config.js --hot --inline --host 0.0.0.0 --content-base examples" + "start": "webpack-dev-server --progress --color --port 8090 --config ./webpack.config.js --hot --host 0.0.0.0" }, "repository": { "type": "git", @@ -31,8 +31,8 @@ "babel-loader": "^8.3.0", "ts-loader": "^6.2.2", "webpack": "5.89.0", - "webpack-cli": "^3.3.12", - "webpack-dev-server": "^3.11.3", + "webpack-cli": "^5.0.0", + "webpack-dev-server": "^4.0.0", "webpack-merge": "^4.2.2" }, "dependencies": { diff --git a/examples/web/webpack.config.js b/examples/web/webpack.config.js index fd3de03bb4..31905640e1 100644 --- a/examples/web/webpack.config.js +++ b/examples/web/webpack.config.js @@ -49,7 +49,7 @@ const common = { module.exports = webpackMerge(common, { devtool: 'eval-source-map', devServer: { - contentBase: path.resolve(__dirname), + static: path.resolve(path.join(__dirname, "examples")), }, plugins: [ new webpack.DefinePlugin({ From d7773a27d516cf1fd54a612bd533eccee20d57b8 Mon Sep 17 00:00:00 2001 From: Sudhanshu Pandey Date: Wed, 27 Nov 2024 12:24:11 -0500 Subject: [PATCH 05/11] chore: Update the express example (#2532) Signed-off-by: Sudhanshu Pandey Co-authored-by: Trent Mick --- examples/express/README.md | 46 +++++++++++------------------ examples/express/images/zipkin.jpg | Bin 104833 -> 0 bytes examples/express/package.json | 26 +++++++--------- examples/express/src/tracer.ts | 20 +++++-------- 4 files changed, 37 insertions(+), 55 deletions(-) delete mode 100644 examples/express/images/zipkin.jpg diff --git a/examples/express/README.md b/examples/express/README.md index 5794a5077e..d0251ba8fa 100644 --- a/examples/express/README.md +++ b/examples/express/README.md @@ -1,6 +1,6 @@ # Overview -OpenTelemetry Express Instrumentation allows the user to automatically collect trace data and export them to the backend of choice (we can use Zipkin or Jaeger for this example), to give observability to distributed systems. +OpenTelemetry Express Instrumentation allows the user to automatically collect trace data and export them to the backend of choice (we use Jaeger for this example), to give observability to distributed systems. This is a simple example that demonstrates tracing calls made to Express API. The example shows key aspects of tracing such as @@ -17,44 +17,34 @@ shows key aspects of tracing such as npm install ``` -Setup [Zipkin Tracing](https://zipkin.io/pages/quickstart.html) -or -Setup [Jaeger Tracing](https://www.jaegertracing.io/docs/latest/getting-started/#all-in-one) - -## Run the Application - -### Zipkin - -Run the server: - -```sh -npm run zipkin:server +Start Jaeger in Docker for receiving tracing data (see [the Jaeger docs](https://www.jaegertracing.io/docs/2.0/getting-started/#in-docker) for more details about running Jaeger): + +```bash +docker run --rm --name jaeger \ + -p 5778:5778 \ + -p 16686:16686 \ + -p 4317:4317 \ + -p 4318:4318 \ + -p 14250:14250 \ + -p 14268:14268 \ + -p 9411:9411 \ + jaegertracing/jaeger:2.0.0 \ + --set receivers.otlp.protocols.http.endpoint=0.0.0.0:4318 \ + --set receivers.otlp.protocols.grpc.endpoint=0.0.0.0:4317 ``` -Then run the client in a separate terminal: - -```sh -npm run zipkin:client -``` - -After a short time, the generated traces should be available in the Zipkin UI. -Visit and click the "RUN QUERY" button to view -recent traces, then click "SHOW" on a given trace. - -

Zipkin UI with trace

- -### Jaeger +## Run the Application Run the server: ```sh -npm run jaeger:server +npm run server ``` Then run the client in a separate terminal: ```sh -npm run jaeger:client +npm run client ``` Visit the Jaeger UI at , select a service (e.g. "example-express-client"), click "Find Traces", then click on a trace to view it. diff --git a/examples/express/images/zipkin.jpg b/examples/express/images/zipkin.jpg deleted file mode 100644 index 5b13e03c7897d3192c56b02b4f496ed9de21fb30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104833 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

W2tw70AYBU@a%Ye9J_kuzxo`K8C5kL)#ltWa<1O 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 { const provider = new NodeTracerProvider({ resource: new Resource({ - [SEMRESATTRS_SERVICE_NAME]: serviceName, + [ATTR_SERVICE_NAME]: serviceName, }), sampler: filterSampler(ignoreHealthCheck, new AlwaysOnSampler()), }); @@ -31,14 +29,12 @@ export const setupTracing = (serviceName: string) => { tracerProvider: provider, instrumentations: [ // Express instrumentation expects HTTP layer to be instrumented - HttpInstrumentation, - ExpressInstrumentation, + new HttpInstrumentation(), + new ExpressInstrumentation(), ], }); - const exporter = new Exporter({ - serviceName, - }); + const exporter = new OTLPTraceExporter({}); provider.addSpanProcessor(new SimpleSpanProcessor(exporter)); @@ -65,5 +61,5 @@ function filterSampler(filterFn: FilterFunction, parent: Sampler): Sampler { } function ignoreHealthCheck(spanName: string, spanKind: SpanKind, attributes: Attributes) { - return spanKind !== opentelemetry.SpanKind.SERVER || attributes[SEMATTRS_HTTP_ROUTE] !== "/health"; + return spanKind !== opentelemetry.SpanKind.SERVER || attributes[ATTR_HTTP_ROUTE] !== "/health"; } From 4aba20169579fd24340ba6357e4ebee451a18d1a Mon Sep 17 00:00:00 2001 From: Trent Mick Date: Wed, 27 Nov 2024 13:16:36 -0800 Subject: [PATCH 06/11] refactor(examples/express): small refactor of imports (#2562) --- examples/express/src/tracer.ts | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/examples/express/src/tracer.ts b/examples/express/src/tracer.ts index a5eaf1c7d1..b86e92b712 100644 --- a/examples/express/src/tracer.ts +++ b/examples/express/src/tracer.ts @@ -1,22 +1,14 @@ 'use strict'; -import { SpanKind, Attributes } from "@opentelemetry/api"; - -import opentelemetry = require('@opentelemetry/api'); - -// Not functionally required but gives some insight what happens behind the scenes -const { diag, DiagConsoleLogger, DiagLogLevel } = opentelemetry; -diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO); - +import { trace, SamplingDecision, SpanKind, Attributes } from '@opentelemetry/api'; import { registerInstrumentations } from '@opentelemetry/instrumentation'; import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'; import { Sampler, AlwaysOnSampler, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto'; import { Resource } from '@opentelemetry/resources'; import { ATTR_SERVICE_NAME, ATTR_HTTP_ROUTE } from '@opentelemetry/semantic-conventions'; - import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'; -import {HttpInstrumentation} from '@opentelemetry/instrumentation-http'; +import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; export const setupTracing = (serviceName: string) => { const provider = new NodeTracerProvider({ @@ -41,7 +33,7 @@ export const setupTracing = (serviceName: string) => { // Initialize the OpenTelemetry APIs to use the NodeTracerProvider bindings provider.register(); - return opentelemetry.trace.getTracer(serviceName); + return trace.getTracer(serviceName); }; type FilterFunction = (spanName: string, spanKind: SpanKind, attributes: Attributes) => boolean; @@ -50,7 +42,7 @@ function filterSampler(filterFn: FilterFunction, parent: Sampler): Sampler { return { shouldSample(ctx, tid, spanName, spanKind, attr, links) { if (!filterFn(spanName, spanKind, attr)) { - return { decision: opentelemetry.SamplingDecision.NOT_RECORD }; + return { decision: SamplingDecision.NOT_RECORD }; } return parent.shouldSample(ctx, tid, spanName, spanKind, attr, links); }, @@ -61,5 +53,5 @@ function filterSampler(filterFn: FilterFunction, parent: Sampler): Sampler { } function ignoreHealthCheck(spanName: string, spanKind: SpanKind, attributes: Attributes) { - return spanKind !== opentelemetry.SpanKind.SERVER || attributes[ATTR_HTTP_ROUTE] !== "/health"; + return spanKind !== SpanKind.SERVER || attributes[ATTR_HTTP_ROUTE] !== "/health"; } From e7cc441ed41ba2e6a4a851353207ca1907ba5f46 Mon Sep 17 00:00:00 2001 From: Trent Mick Date: Wed, 27 Nov 2024 14:20:18 -0800 Subject: [PATCH 07/11] chore(examples/web): modernize the docker compose & collector setup for this example (#2556) --- examples/web/.npmrc | 1 + examples/web/README.md | 14 +++++++++++++- examples/web/docker/collector-config.yaml | 7 ++++--- examples/web/docker/docker-compose.yaml | 5 +---- examples/web/package.json | 4 ++-- 5 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 examples/web/.npmrc diff --git a/examples/web/.npmrc b/examples/web/.npmrc new file mode 100644 index 0000000000..43c97e719a --- /dev/null +++ b/examples/web/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/examples/web/README.md b/examples/web/README.md index b9862d9651..deedf55252 100644 --- a/examples/web/README.md +++ b/examples/web/README.md @@ -9,6 +9,15 @@ This example shows how to use [@opentelemetry/sdk-trace-web][] with different in npm install ``` +## Start a collector and trace viewer + +Optionally, you can use the provided Docker Compose file to start an OpenTelemetry Collector and a Zipkin to view collected traces. +You can skip this step if you have your own collector already setup. + +```sh +npm run docker:start +``` + ## Run the Application ```sh @@ -16,7 +25,10 @@ npm install npm start ``` -By default, the application will run on port `8090`. +- Open the application at . +- Click around in each of the example sub-paths to create some tracing data. +- Open Zipkin at and search for some traces (click "Run Query"). + ## More information diff --git a/examples/web/docker/collector-config.yaml b/examples/web/docker/collector-config.yaml index c4c7b0c49f..ea27d199b7 100644 --- a/examples/web/docker/collector-config.yaml +++ b/examples/web/docker/collector-config.yaml @@ -3,9 +3,10 @@ receivers: protocols: grpc: http: - cors_allowed_origins: - - http://* - - https://* + cors: + allowed_origins: + - http://* + - https://* exporters: zipkin: diff --git a/examples/web/docker/docker-compose.yaml b/examples/web/docker/docker-compose.yaml index 02d6ac7215..71725949aa 100644 --- a/examples/web/docker/docker-compose.yaml +++ b/examples/web/docker/docker-compose.yaml @@ -1,8 +1,6 @@ -version: "3" services: - # Collector collector: - image: otel/opentelemetry-collector:0.38.0 + image: otel/opentelemetry-collector:0.99.0 command: ["--config=/conf/collector-config.yaml"] volumes: - ./collector-config.yaml:/conf/collector-config.yaml @@ -13,7 +11,6 @@ services: depends_on: - zipkin-all-in-one - # Zipkin zipkin-all-in-one: image: openzipkin/zipkin:latest ports: diff --git a/examples/web/package.json b/examples/web/package.json index 107c379fe9..cd10bfd3d0 100644 --- a/examples/web/package.json +++ b/examples/web/package.json @@ -5,8 +5,8 @@ "description": "Example of using web plugins in browser", "main": "index.js", "scripts": { - "docker:start": "cd ./docker && docker-compose down && docker-compose up", - "docker:startd": "cd ./docker && docker-compose down && docker-compose up -d", + "docker:start": "cd ./docker && docker compose down && docker compose up", + "docker:startd": "cd ./docker && docker compose down && docker compose up -d", "start": "webpack-dev-server --progress --color --port 8090 --config ./webpack.config.js --hot --host 0.0.0.0" }, "repository": { From 2f5d1de0c45c36c8b16aab059b048baf6aa11aea Mon Sep 17 00:00:00 2001 From: Trivikram Kamat <16024985+trivikr@users.noreply.github.com> Date: Wed, 27 Nov 2024 14:21:41 -0800 Subject: [PATCH 08/11] chore: replace deprecated substr() with substring() (#2553) --- .../src/instrumentation.ts | 2 +- .../test/cassandra-driver.test.ts | 2 +- .../src/instrumentation.ts | 2 +- plugins/node/opentelemetry-instrumentation-knex/src/utils.ts | 2 +- .../opentelemetry-instrumentation-knex/test/index.test.ts | 2 +- .../src/OTTracePropagator.ts | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/node/opentelemetry-instrumentation-cassandra/src/instrumentation.ts b/plugins/node/opentelemetry-instrumentation-cassandra/src/instrumentation.ts index 3a65a0bd6a..477bbb1126 100644 --- a/plugins/node/opentelemetry-instrumentation-cassandra/src/instrumentation.ts +++ b/plugins/node/opentelemetry-instrumentation-cassandra/src/instrumentation.ts @@ -392,5 +392,5 @@ function wrapPromise( } function truncateQuery(query: unknown, maxQueryLength: number) { - return String(query).substr(0, maxQueryLength); + return String(query).substring(0, maxQueryLength); } diff --git a/plugins/node/opentelemetry-instrumentation-cassandra/test/cassandra-driver.test.ts b/plugins/node/opentelemetry-instrumentation-cassandra/test/cassandra-driver.test.ts index c663ab0abe..00171c8426 100644 --- a/plugins/node/opentelemetry-instrumentation-cassandra/test/cassandra-driver.test.ts +++ b/plugins/node/opentelemetry-instrumentation-cassandra/test/cassandra-driver.test.ts @@ -244,7 +244,7 @@ describe('CassandraDriverInstrumentation', () => { it('truncates long queries', async () => { const query = 'select userid, count from ot.test'; await client.execute(query); - assertSingleSpan('cassandra-driver.execute', query.substr(0, 25)); + assertSingleSpan('cassandra-driver.execute', query.substring(0, 25)); }); }); diff --git a/plugins/node/opentelemetry-instrumentation-fastify/src/instrumentation.ts b/plugins/node/opentelemetry-instrumentation-fastify/src/instrumentation.ts index 08df2aa533..72d8b8c9b7 100644 --- a/plugins/node/opentelemetry-instrumentation-fastify/src/instrumentation.ts +++ b/plugins/node/opentelemetry-instrumentation-fastify/src/instrumentation.ts @@ -251,7 +251,7 @@ export class FastifyInstrumentation extends InstrumentationBase { 0 < maxLength && maxLength < str.length ) { - return str.substr(0, maxLength) + '..'; + return str.substring(0, maxLength) + '..'; } return str; }; diff --git a/plugins/node/opentelemetry-instrumentation-knex/test/index.test.ts b/plugins/node/opentelemetry-instrumentation-knex/test/index.test.ts index e84dcbc398..aa00a3a9f2 100644 --- a/plugins/node/opentelemetry-instrumentation-knex/test/index.test.ts +++ b/plugins/node/opentelemetry-instrumentation-knex/test/index.test.ts @@ -150,7 +150,7 @@ describe('Knex instrumentation', () => { const [span] = memoryExporter.getFinishedSpans(); const limitedStatement = span?.attributes?.['db.statement'] as string; assert.strictEqual(limitedStatement.length, 52); - assert.ok(statement.startsWith(limitedStatement.substr(0, 50))); + assert.ok(statement.startsWith(limitedStatement.substring(0, 50))); }); it('should catch errors', async () => { diff --git a/propagators/opentelemetry-propagator-ot-trace/src/OTTracePropagator.ts b/propagators/opentelemetry-propagator-ot-trace/src/OTTracePropagator.ts index 9ca68f3d50..362c2bddba 100644 --- a/propagators/opentelemetry-propagator-ot-trace/src/OTTracePropagator.ts +++ b/propagators/opentelemetry-propagator-ot-trace/src/OTTracePropagator.ts @@ -67,7 +67,7 @@ export class OTTracePropagator implements TextMapPropagator { const spanContext = trace.getSpan(context)?.spanContext(); if (!spanContext || !isSpanContextValid(spanContext)) return; - setter.set(carrier, OT_TRACE_ID_HEADER, spanContext.traceId.substr(16)); + setter.set(carrier, OT_TRACE_ID_HEADER, spanContext.traceId.substring(16)); setter.set(carrier, OT_SPAN_ID_HEADER, spanContext.spanId); setter.set( carrier, @@ -110,7 +110,7 @@ export class OTTracePropagator implements TextMapPropagator { getter.keys(carrier).forEach(k => { if (!k.startsWith(OT_BAGGAGE_PREFIX)) return; const value = readHeader(carrier, getter, k); - baggage = baggage.setEntry(k.substr(OT_BAGGAGE_PREFIX.length), { + baggage = baggage.setEntry(k.substring(OT_BAGGAGE_PREFIX.length), { value, }); }); From 0fc1ed316f097817af1ac00a3d2820adc834f7c9 Mon Sep 17 00:00:00 2001 From: David VanLaningham <64915094+dsvanlani@users.noreply.github.com> Date: Thu, 28 Nov 2024 16:56:40 -0500 Subject: [PATCH 09/11] chore(examples/mongodb): Update mongodb example dependencies (#2531) --- examples/mongodb/package.json | 21 ++++++++-------- examples/mongodb/src/server.ts | 44 ++++++++++++++++++---------------- examples/mongodb/src/tracer.ts | 13 +++++----- 3 files changed, 40 insertions(+), 38 deletions(-) diff --git a/examples/mongodb/package.json b/examples/mongodb/package.json index fac44e38b9..03d745eeba 100644 --- a/examples/mongodb/package.json +++ b/examples/mongodb/package.json @@ -30,21 +30,20 @@ "url": "https://github.com/open-telemetry/opentelemetry-js-contrib/issues" }, "dependencies": { - "@opentelemetry/api": "^1.0.0", - "@opentelemetry/exporter-jaeger": "^1.0.0", - "@opentelemetry/exporter-zipkin": "^1.0.0", - "@opentelemetry/instrumentation": "^0.48.0", - "@opentelemetry/instrumentation-http": "^0.48.0", - "@opentelemetry/instrumentation-mongodb": "^0.32.0", - "@opentelemetry/sdk-trace-node": "^1.0.0", - "@opentelemetry/sdk-trace-base": "^1.0.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/exporter-zipkin": "^1.27.0", + "@opentelemetry/instrumentation": "^0.54.2", + "@opentelemetry/instrumentation-http": "^0.54.2", + "@opentelemetry/instrumentation-mongodb": "^0.48.0", + "@opentelemetry/sdk-trace-node": "^1.27.0", + "@opentelemetry/sdk-trace-base": "^1.27.0", "@opentelemetry/semantic-conventions": "^1.27.0", - "mongodb": "^3.6.11" + "mongodb": "^6.10.0" }, "homepage": "https://github.com/open-telemetry/opentelemetry-js-contrib#readme", "devDependencies": { "cross-env": "^7.0.3", - "ts-node": "^10.6.0", - "typescript": "4.4.4" + "ts-node": "^10.9.2", + "typescript": "5.6.3" } } diff --git a/examples/mongodb/src/server.ts b/examples/mongodb/src/server.ts index b308fdc934..aa16cfa1e6 100644 --- a/examples/mongodb/src/server.ts +++ b/examples/mongodb/src/server.ts @@ -2,17 +2,17 @@ import * as api from '@opentelemetry/api'; import { setupTracing } from './tracer'; -setupTracing('example-mongodb-server') +setupTracing('example-mongodb-server'); import { accessDB } from './utils'; import * as http from 'http'; import { IncomingMessage, ServerResponse } from 'http'; import * as mongodb from 'mongodb'; -import {Collection} from "mongodb"; +import { Collection } from 'mongodb'; -const DB_NAME = 'mydb' -const COLLECTION_NAME = 'users' +const DB_NAME = 'mydb'; +const COLLECTION_NAME = 'users'; const URL = `mongodb://localhost:27017/${DB_NAME}`; let db: mongodb.Db; @@ -28,7 +28,6 @@ function startServer(port: number) { throw err; }); - // Creates a server const server = http.createServer(handleRequest); // Starts the server @@ -40,16 +39,20 @@ function startServer(port: number) { /** A function which handles requests and send response. */ function handleRequest(request: IncomingMessage, response: ServerResponse) { const currentSpan = api.trace.getSpan(api.context.active()); - // display traceID in the terminal - const traceId = currentSpan?.spanContext(); - console.log(`traceid: ${traceId}`); - console.log(`Jaeger URL: http://localhost:16686/trace/${traceId}`); - console.log(`Zipkin URL: http://localhost:9411/zipkin/traces/${traceId}`); + if (currentSpan) { + // display traceID in the terminal + const { traceId } = currentSpan?.spanContext(); + console.log(`traceid: ${traceId}`); + console.log(`Jaeger URL: http://localhost:16686/trace/${traceId}`); + console.log(`Zipkin URL: http://localhost:9411/zipkin/traces/${traceId}`); + } else { + console.log('No active span found'); + } try { const body = []; - request.on('error', (err) => console.log(err)); - request.on('data', (chunk) => body.push(chunk)); + request.on('error', err => console.log(err)); + request.on('data', chunk => body.push(chunk)); request.on('end', async () => { if (request.url === '/collection/') { handleCreateCollection(response); @@ -71,12 +74,13 @@ startServer(8080); function handleInsertQuery(response: ServerResponse) { const obj = { name: 'John', age: '20' }; const usersCollection: Collection = db.collection(COLLECTION_NAME); - usersCollection.insertOne(obj) + usersCollection + .insertOne(obj) .then(() => { console.log('1 document inserted'); - // find document to test context propagation using callback - usersCollection.findOne({}, function () { - response.end(); + // find document to test context + usersCollection.findOne({}).then(res => { + console.log(JSON.stringify(res)); }); }) .catch(err => { @@ -87,8 +91,8 @@ function handleInsertQuery(response: ServerResponse) { function handleGetQuery(response: ServerResponse) { const usersCollection: Collection = db.collection(COLLECTION_NAME); - usersCollection. - find({}) + usersCollection + .find({}) .toArray() .then(() => { console.log('1 document served'); @@ -96,7 +100,7 @@ function handleGetQuery(response: ServerResponse) { }) .catch(err => { throw err; - }) + }); } function handleCreateCollection(response: ServerResponse) { @@ -108,7 +112,7 @@ function handleCreateCollection(response: ServerResponse) { .catch(err => { console.log('Error code:', err.code); response.end(err.message); - }); + }); } function handleNotFound(response: ServerResponse) { diff --git a/examples/mongodb/src/tracer.ts b/examples/mongodb/src/tracer.ts index 4e63724503..a9599dec35 100644 --- a/examples/mongodb/src/tracer.ts +++ b/examples/mongodb/src/tracer.ts @@ -1,21 +1,20 @@ -import * as api from "@opentelemetry/api"; +import * as api from '@opentelemetry/api'; import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'; import { Resource } from '@opentelemetry/resources'; import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base'; -import { JaegerExporter } from '@opentelemetry/exporter-jaeger'; +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; import { ZipkinExporter } from '@opentelemetry/exporter-zipkin'; import { registerInstrumentations } from '@opentelemetry/instrumentation'; import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; import { MongoDBInstrumentation } from '@opentelemetry/instrumentation-mongodb'; -import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions'; - +import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'; export const setupTracing = (serviceName: string): api.Tracer => { const provider = new NodeTracerProvider({ resource: new Resource({ - [SEMRESATTRS_SERVICE_NAME]: serviceName - }) + [ATTR_SERVICE_NAME]: serviceName, + }), }); // Initialize the OpenTelemetry APIs to use the NodeTracerProvider bindings @@ -32,7 +31,7 @@ export const setupTracing = (serviceName: string): api.Tracer => { }); provider.addSpanProcessor(new SimpleSpanProcessor(new ZipkinExporter())); - provider.addSpanProcessor(new SimpleSpanProcessor(new JaegerExporter())); + provider.addSpanProcessor(new SimpleSpanProcessor(new OTLPTraceExporter())); return api.trace.getTracer('mongodb-example'); }; From 97ebd4fbc891811dd17c6d2a425911dcc39a3e62 Mon Sep 17 00:00:00 2001 From: Trivikram Kamat <16024985+trivikr@users.noreply.github.com> Date: Sun, 1 Dec 2024 08:51:45 -0800 Subject: [PATCH 10/11] chore(aws-sdk): add @trivikr as component owner (#2557) Co-authored-by: Marc Pichler --- .github/component_owners.yml | 1 + plugins/node/opentelemetry-instrumentation-aws-sdk/README.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/component_owners.yml b/.github/component_owners.yml index d688e6f833..ac8556dbdc 100644 --- a/.github/component_owners.yml +++ b/.github/component_owners.yml @@ -74,6 +74,7 @@ components: plugins/node/opentelemetry-instrumentation-aws-sdk: - blumamir - jj22ee + - trivikr plugins/node/opentelemetry-instrumentation-bunyan: - seemk - trentm diff --git a/plugins/node/opentelemetry-instrumentation-aws-sdk/README.md b/plugins/node/opentelemetry-instrumentation-aws-sdk/README.md index 0538603631..ea51d907d4 100644 --- a/plugins/node/opentelemetry-instrumentation-aws-sdk/README.md +++ b/plugins/node/opentelemetry-instrumentation-aws-sdk/README.md @@ -3,7 +3,7 @@ [![NPM Published Version][npm-img]][npm-url] [![Apache License][license-image]][license-image] -[component owners](https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/.github/component_owners.yml): @blumamir @jj22ee +[component owners](https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/.github/component_owners.yml): @blumamir @jj22ee @trivikr This module provides automatic instrumentation for the [`aws-sdk` v2](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/) and [`@aws-sdk` v3](https://github.com/aws/aws-sdk-js-v3) modules, which may be loaded using the [`@opentelemetry/sdk-trace-node`](https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-sdk-trace-node) package and is included in the [`@opentelemetry/auto-instrumentations-node`](https://www.npmjs.com/package/@opentelemetry/auto-instrumentations-node) bundle. From bf8117e541c42616cb2e39399cbdc3bdbf3d5013 Mon Sep 17 00:00:00 2001 From: David Luna Date: Mon, 2 Dec 2024 15:50:42 +0100 Subject: [PATCH 11/11] chore(instr-koa): update instrumentation-koa tests (#2566) --- package-lock.json | 2 ++ .../.tav.yml | 14 ++++++--- .../package.json | 1 + .../test/koa.test.ts | 30 +++++++++++++++---- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 03be175022..f50df50692 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37509,6 +37509,7 @@ "koa": "2.13.1", "nyc": "15.1.0", "rimraf": "5.0.10", + "semver": "7.6.3", "sinon": "15.2.0", "test-all-versions": "6.1.0", "typescript": "4.4.4" @@ -48092,6 +48093,7 @@ "koa": "2.13.1", "nyc": "15.1.0", "rimraf": "5.0.10", + "semver": "7.6.3", "sinon": "15.2.0", "test-all-versions": "6.1.0", "typescript": "4.4.4" diff --git a/plugins/node/opentelemetry-instrumentation-koa/.tav.yml b/plugins/node/opentelemetry-instrumentation-koa/.tav.yml index 973c1fb861..d329351f69 100644 --- a/plugins/node/opentelemetry-instrumentation-koa/.tav.yml +++ b/plugins/node/opentelemetry-instrumentation-koa/.tav.yml @@ -1,8 +1,14 @@ "@koa/router": - versions: - include: ">=8.0.0" - mode: latest-minors - commands: npm run test + jobs: + - versions: + include: ">=8.0.0 <13" + mode: latest-minors + commands: npm run test + - versions: + include: ">=13 <14" + mode: latest-minors + node: '>=18' + commands: npm run test koa: # Testing ^2.7.0 covers at least 97% of the downloaded koa versions diff --git a/plugins/node/opentelemetry-instrumentation-koa/package.json b/plugins/node/opentelemetry-instrumentation-koa/package.json index 1c26caa48d..7a75a46804 100644 --- a/plugins/node/opentelemetry-instrumentation-koa/package.json +++ b/plugins/node/opentelemetry-instrumentation-koa/package.json @@ -60,6 +60,7 @@ "koa": "2.13.1", "nyc": "15.1.0", "rimraf": "5.0.10", + "semver": "7.6.3", "sinon": "15.2.0", "test-all-versions": "6.1.0", "typescript": "4.4.4" diff --git a/plugins/node/opentelemetry-instrumentation-koa/test/koa.test.ts b/plugins/node/opentelemetry-instrumentation-koa/test/koa.test.ts index a40cd033c1..c1b894a026 100644 --- a/plugins/node/opentelemetry-instrumentation-koa/test/koa.test.ts +++ b/plugins/node/opentelemetry-instrumentation-koa/test/koa.test.ts @@ -41,6 +41,7 @@ import * as assert from 'assert'; import * as koa from 'koa'; import * as http from 'http'; import * as sinon from 'sinon'; +import * as semver from 'semver'; import { AddressInfo } from 'net'; import { KoaLayerType, KoaRequestInfo } from '../src/types'; import { AttributeNames } from '../src/enums/AttributeNames'; @@ -65,7 +66,13 @@ const httpRequest = { }, }; -describe('Koa Instrumentation', () => { +const LIB_VERSION = require('@koa/router/package.json').version; +const NODE_VERSION = process.version; +const isrouterCompat = + semver.lt(LIB_VERSION, '13.0.0') || + (semver.gte(LIB_VERSION, '13.0.0') && semver.gte(NODE_VERSION, '18.0.0')); + +describe('Koa Instrumentation', function () { const provider = new NodeTracerProvider(); const memoryExporter = new InMemorySpanExporter(); const spanProcessor = new SimpleSpanProcessor(memoryExporter); @@ -77,7 +84,7 @@ describe('Koa Instrumentation', () => { let server: http.Server; let port: number; - before(() => { + before(function () { plugin.enable(); }); @@ -141,7 +148,13 @@ describe('Koa Instrumentation', () => { yield next; }; - describe('Instrumenting @koa/router calls', () => { + describe('Instrumenting @koa/router calls', function () { + before(function () { + if (!isrouterCompat) { + this.skip(); + } + }); + it('should create a child span for middlewares (string route)', async () => { const rootSpan = tracer.startSpan('rootSpan'); const rpcMetadata: RPCMetadata = { type: RPCType.HTTP, span: rootSpan }; @@ -585,7 +598,13 @@ describe('Koa Instrumentation', () => { }); }); - describe('Using requestHook', () => { + describe('Using requestHook', function () { + before(function () { + if (!isrouterCompat) { + this.skip(); + } + }); + it('should ignore requestHook which throws exception', async () => { const rootSpan = tracer.startSpan('rootSpan'); const rpcMetadata = { type: RPCType.HTTP, span: rootSpan }; @@ -721,7 +740,8 @@ describe('Koa Instrumentation', () => { }); }); - it('should work with ESM usage', async () => { + const itFn = isrouterCompat ? it : it.skip; + itFn('should work with ESM usage', async () => { await testUtils.runTestFixture({ cwd: __dirname, argv: ['fixtures/use-koa.mjs'],