From e3fdea8eac1a7bfc6fd54acd70c12bd811621504 Mon Sep 17 00:00:00 2001 From: Trent Mick Date: Thu, 13 Jun 2024 10:08:28 -0700 Subject: [PATCH] feat: add instr-grpc (#224) --- package-lock.json | 42 +++++++++-- packages/opentelemetry-node/NOTICE.md | 23 ++++++ .../docs/supported-technologies.mdx | 31 ++++---- .../lib/instrumentations.js | 4 ++ packages/opentelemetry-node/package.json | 3 + .../test/fixtures/use-grpc.js | 70 +++++++++++++++++++ .../test/fixtures/use-grpc.proto | 42 +++++++++++ .../test/instr-grpc.test.js | 55 +++++++++++++++ .../types/instrumentations.d.ts | 1 + 9 files changed, 250 insertions(+), 21 deletions(-) create mode 100644 packages/opentelemetry-node/test/fixtures/use-grpc.js create mode 100644 packages/opentelemetry-node/test/fixtures/use-grpc.proto create mode 100644 packages/opentelemetry-node/test/instr-grpc.test.js diff --git a/package-lock.json b/package-lock.json index 064e7143..54bab949 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2558,9 +2558,9 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.8.tgz", - "integrity": "sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==", + "version": "1.10.9", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.9.tgz", + "integrity": "sha512-5tcgUctCG0qoNyfChZifz2tJqbRbXVO9J7X6duFcOjY3HUNCxg5D0ZCK7EP9vIcZ0zRpLU9bWkyCqVCLZ46IbQ==", "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" @@ -4299,6 +4299,21 @@ "@opentelemetry/api": "^1.3.0" } }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.52.0.tgz", + "integrity": "sha512-YYhA2pbhMWgF5Hp6eR7AHp1utzZQ3Y0VB8GIwd8zJoLtAuQRZa1N29DUtZ+t/pGRJF+xGPVI+vP+7ugHgeN0zQ==", + "dependencies": { + "@opentelemetry/instrumentation": "0.52.0", + "@opentelemetry/semantic-conventions": "1.25.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, "node_modules/@opentelemetry/instrumentation-hapi": { "version": "0.39.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.39.0.tgz", @@ -12152,6 +12167,7 @@ "@opentelemetry/instrumentation-bunyan": "^0.39.0", "@opentelemetry/instrumentation-express": "^0.40.1", "@opentelemetry/instrumentation-fastify": "^0.37.0", + "@opentelemetry/instrumentation-grpc": "^0.52.0", "@opentelemetry/instrumentation-hapi": "^0.39.0", "@opentelemetry/instrumentation-http": "^0.52.0", "@opentelemetry/instrumentation-ioredis": "^0.41.0", @@ -12178,6 +12194,8 @@ "@aws-sdk/client-sns": "^3.592.0", "@aws-sdk/client-sqs": "^3.592.0", "@elastic/mockotlpserver": "*", + "@grpc/grpc-js": "^1.10.9", + "@grpc/proto-loader": "^0.7.13", "@hapi/hapi": "^21.3.9", "@opentelemetry/api": "^1.3.0", "@types/tape": "^5.6.4", @@ -14323,6 +14341,8 @@ "@aws-sdk/client-sns": "^3.592.0", "@aws-sdk/client-sqs": "^3.592.0", "@elastic/mockotlpserver": "*", + "@grpc/grpc-js": "^1.10.9", + "@grpc/proto-loader": "^0.7.13", "@hapi/hapi": "^21.3.9", "@opentelemetry/api": "^1.3.0", "@opentelemetry/exporter-logs-otlp-grpc": "^0.52.0", @@ -14337,6 +14357,7 @@ "@opentelemetry/instrumentation-bunyan": "^0.39.0", "@opentelemetry/instrumentation-express": "^0.40.1", "@opentelemetry/instrumentation-fastify": "^0.37.0", + "@opentelemetry/instrumentation-grpc": "^0.52.0", "@opentelemetry/instrumentation-hapi": "^0.39.0", "@opentelemetry/instrumentation-http": "^0.52.0", "@opentelemetry/instrumentation-ioredis": "^0.41.0", @@ -14478,9 +14499,9 @@ } }, "@grpc/grpc-js": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.8.tgz", - "integrity": "sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==", + "version": "1.10.9", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.9.tgz", + "integrity": "sha512-5tcgUctCG0qoNyfChZifz2tJqbRbXVO9J7X6duFcOjY3HUNCxg5D0ZCK7EP9vIcZ0zRpLU9bWkyCqVCLZ46IbQ==", "requires": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" @@ -15729,6 +15750,15 @@ "@opentelemetry/semantic-conventions": "^1.22.0" } }, + "@opentelemetry/instrumentation-grpc": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.52.0.tgz", + "integrity": "sha512-YYhA2pbhMWgF5Hp6eR7AHp1utzZQ3Y0VB8GIwd8zJoLtAuQRZa1N29DUtZ+t/pGRJF+xGPVI+vP+7ugHgeN0zQ==", + "requires": { + "@opentelemetry/instrumentation": "0.52.0", + "@opentelemetry/semantic-conventions": "1.25.0" + } + }, "@opentelemetry/instrumentation-hapi": { "version": "0.39.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.39.0.tgz", diff --git a/packages/opentelemetry-node/NOTICE.md b/packages/opentelemetry-node/NOTICE.md index 00107864..fc955937 100644 --- a/packages/opentelemetry-node/NOTICE.md +++ b/packages/opentelemetry-node/NOTICE.md @@ -39,3 +39,26 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` + +## `@grpc/grpc-js` examples + +- **path:** `test/fixtures/use-grpc.*` +- **author:** gRPC authors +- **project url:** https://github.com/grpc/grpc-node/blob/master/examples +- **license:** Apache 2.0, http://www.apache.org/licenses/LICENSE-2.0 + +``` +Copyright 2015 gRPC authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` diff --git a/packages/opentelemetry-node/docs/supported-technologies.mdx b/packages/opentelemetry-node/docs/supported-technologies.mdx index 9b604a47..131b5824 100644 --- a/packages/opentelemetry-node/docs/supported-technologies.mdx +++ b/packages/opentelemetry-node/docs/supported-technologies.mdx @@ -21,21 +21,22 @@ This follows from the [OpenTelemetry JS supported runtimes](https://github.com/o ## Instrumentations -| Name | Short description | Reference | -| ---------------------------------------- | --------------------------------------------------------------- | --------- | -| `@opentelemetry/instrumentation-http` | Instruments Node.js `http` module for all supported versions | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-http#readme) | -| `@opentelemetry/instrumentation-express` | Instruments `express` package for version range `^4.0.0` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-express#readme) | -| `@opentelemetry/instrumentation-fastify` | Instruments `fastify` package for version range `>=3 <5` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-fastify#readme) | -| `@opentelemetry/instrumentation-hapi` | Instruments `@hapi/hapi >=17.0.0 <21` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-hapi#readme) | -| `@opentelemetry/instrumentation-ioredis` | Instruments `ioredis` package for version range `>=2 <6` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-ioredis#readme) | -| `@opentelemetry/instrumentation-pg` | Instruments `pg` package for version range `>=8 <9` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-pg#readme) | -| `@opentelemetry/instrumentation-mongodb` | Instruments `mongodb` package for version range `>=3.3 <7` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-mongodb#readme) | -| `@opentelemetry/instrumentation-bunyan` | Instruments `bunyan` package for version range `^1.0.0` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-bunyan#readme) | -| `@opentelemetry/instrumentation-winston` | Instruments `winston` package for version range `>1 <4` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-winston#readme) | -| `@opentelemetry/instrumentation-tedious` | Instruments `tedious` package for version range `>=1.11.0 <=15` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/instrumentation-tedious#readme) | -| `@opentelemetry/instrumentation-undici` | Instruments `undici` package for version range `>=5.12.0` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/instrumentation-undici#readme) | -| `@opentelemetry/instrumentation-aws-sdk` | Instruments `aws-sdk` version 2 and `@aws-sdk/client-*` version 3 | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-aws-sdk#readme) | -| `@opentelemetry/instrumentation-redis-4` | Instruments `redis` package for version range `^4.0.0` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-redis-4#readme) | +| Name | Packages instrumented | Reference | +| ---------------------------------------- | --------------------------------------- | --------- | +| `@opentelemetry/instrumentation-aws-sdk` | `aws-sdk` v2 and `@aws-sdk/client-*` v3 | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-aws-sdk#readme) | +| `@opentelemetry/instrumentation-bunyan` | `bunyan` version range `^1.0.0` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-bunyan#readme) | +| `@opentelemetry/instrumentation-express` | `express` version range `^4.0.0` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-express#readme) | +| `@opentelemetry/instrumentation-fastify` | `fastify` version range `>=3 <5` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-fastify#readme) | +| `@opentelemetry/instrumentation-grpc` | `@grpc/grpc-js` version range `^1.0.0` | [README](https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-grpc#readme) | +| `@opentelemetry/instrumentation-hapi` | `@hapi/hapi >=17.0.0 <21` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-hapi#readme) | +| `@opentelemetry/instrumentation-http` | `http` module for Node.js `>=14` | [README](https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-http#readme) | +| `@opentelemetry/instrumentation-ioredis` | `ioredis` version range `>=2 <6` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-ioredis#readme) | +| `@opentelemetry/instrumentation-mongodb` | `mongodb` version range `>=3.3 <7` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-mongodb#readme) | +| `@opentelemetry/instrumentation-pg` | `pg` version range `>=8 <9` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-pg#readme) | +| `@opentelemetry/instrumentation-redis-4` | `redis` version range `^4.0.0` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-redis-4#readme) | +| `@opentelemetry/instrumentation-tedious` | `tedious` version range `>=1.11.0 <=15` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/instrumentation-tedious#readme) | +| `@opentelemetry/instrumentation-undici` | `undici` version range `>=5.12.0` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/instrumentation-undici#readme) | +| `@opentelemetry/instrumentation-winston` | `winston` version range `>1 <4` | [README](https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/opentelemetry-instrumentation-winston#readme) | ## ECMAScript Modules (ESM) diff --git a/packages/opentelemetry-node/lib/instrumentations.js b/packages/opentelemetry-node/lib/instrumentations.js index e3ff508a..3cd41f6d 100644 --- a/packages/opentelemetry-node/lib/instrumentations.js +++ b/packages/opentelemetry-node/lib/instrumentations.js @@ -30,6 +30,7 @@ * "@opentelemetry/instrumentation-ioredis": import('@opentelemetry/instrumentation-ioredis').IORedisInstrumentationConfig | InstrumentationFactory, * "@opentelemetry/instrumentation-express": import('@opentelemetry/instrumentation-express').ExpressInstrumentationConfig | InstrumentationFactory, * "@opentelemetry/instrumentation-fastify": import('@opentelemetry/instrumentation-fastify').FastifyInstrumentation | InstrumentationFactory, + * "@opentelemetry/instrumentation-grpc": import('@opentelemetry/instrumentation-grpc').GrpcInstrumentation | InstrumentationFactory, * "@opentelemetry/instrumentation-hapi": import('@opentelemetry/instrumentation-hapi').HapiInstrumentation | InstrumentationFactory, * "@opentelemetry/instrumentation-mongodb": import('@opentelemetry/instrumentation-mongodb').MongoDBInstrumentation | InstrumentationFactory * "@opentelemetry/instrumentation-pg": import('@opentelemetry/instrumentation-pg').PgInstrumentation | InstrumentationFactory @@ -48,6 +49,7 @@ const { BunyanInstrumentation, } = require('@opentelemetry/instrumentation-bunyan'); const {HttpInstrumentation} = require('@opentelemetry/instrumentation-http'); +const {GrpcInstrumentation} = require('@opentelemetry/instrumentation-grpc'); const {HapiInstrumentation} = require('@opentelemetry/instrumentation-hapi'); const { IORedisInstrumentation, @@ -90,6 +92,8 @@ const INSTRUMENTATIONS = { new ExpressInstrumentation(cfg), '@opentelemetry/instrumentation-fastify': (cfg) => new FastifyInstrumentation(cfg), + '@opentelemetry/instrumentation-grpc': (cfg) => + new GrpcInstrumentation(cfg), '@opentelemetry/instrumentation-hapi': (cfg) => new HapiInstrumentation(cfg), '@opentelemetry/instrumentation-http': (cfg) => diff --git a/packages/opentelemetry-node/package.json b/packages/opentelemetry-node/package.json index 908bb8b2..37566bbd 100644 --- a/packages/opentelemetry-node/package.json +++ b/packages/opentelemetry-node/package.json @@ -76,6 +76,7 @@ "@opentelemetry/instrumentation-bunyan": "^0.39.0", "@opentelemetry/instrumentation-express": "^0.40.1", "@opentelemetry/instrumentation-fastify": "^0.37.0", + "@opentelemetry/instrumentation-grpc": "^0.52.0", "@opentelemetry/instrumentation-hapi": "^0.39.0", "@opentelemetry/instrumentation-http": "^0.52.0", "@opentelemetry/instrumentation-ioredis": "^0.41.0", @@ -102,6 +103,8 @@ "@aws-sdk/client-sns": "^3.592.0", "@aws-sdk/client-sqs": "^3.592.0", "@elastic/mockotlpserver": "*", + "@grpc/grpc-js": "^1.10.9", + "@grpc/proto-loader": "^0.7.13", "@hapi/hapi": "^21.3.9", "@opentelemetry/api": "^1.3.0", "@types/tape": "^5.6.4", diff --git a/packages/opentelemetry-node/test/fixtures/use-grpc.js b/packages/opentelemetry-node/test/fixtures/use-grpc.js new file mode 100644 index 00000000..ae6b1d6c --- /dev/null +++ b/packages/opentelemetry-node/test/fixtures/use-grpc.js @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// Usage: node -r @elastic/opentelemetry-node use-grpc.js +// +// This starts a simple gRPC server, makes a requests to it, then stops the +// server. This is to test `@grpc/grpc-js` instrumentation. +// Adapted from https://github.com/grpc/grpc-node/blob/master/examples/helloworld/dynamic_codegen + +const path = require('path'); +const grpc = require('@grpc/grpc-js'); +const protoLoader = require('@grpc/proto-loader'); + +const PROTO_PATH = path.join(__dirname, '/use-grpc.proto'); +const packageDefinition = protoLoader.loadSync(PROTO_PATH, { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}); +const proto = grpc.loadPackageDefinition(packageDefinition).helloworld; + +function sayHello(call, callback) { + callback(null, {message: 'Hello ' + call.request.name}); +} + +function main() { + const server = new grpc.Server(); + server.addService(proto.Greeter.service, {sayHello}); + + server.bindAsync( + '127.0.0.1:0', + grpc.ServerCredentials.createInsecure(), + (err, port) => { + if (err) { + throw err; + } + const client = new proto.Greeter( + `127.0.0.1:${port}`, + grpc.credentials.createInsecure() + ); + client.sayHello({name: 'Bob'}, (err, res) => { + if (err) { + throw err; + } + console.log('client response:', res); + server.forceShutdown(); + }); + } + ); +} + +main(); diff --git a/packages/opentelemetry-node/test/fixtures/use-grpc.proto b/packages/opentelemetry-node/test/fixtures/use-grpc.proto new file mode 100644 index 00000000..a7e013a6 --- /dev/null +++ b/packages/opentelemetry-node/test/fixtures/use-grpc.proto @@ -0,0 +1,42 @@ +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Copied from https://github.com/grpc/grpc-node/blob/master/examples/protos/helloworld.proto + +syntax = "proto3"; + +option java_multiple_files = true; +option java_package = "io.grpc.examples.helloworld"; +option java_outer_classname = "HelloWorldProto"; +option objc_class_prefix = "HLW"; + +package helloworld; + +// The greeting service definition. +service Greeter { + // Sends a greeting + rpc SayHello (HelloRequest) returns (HelloReply) {} + + rpc SayHelloStreamReply (HelloRequest) returns (stream HelloReply) {} +} + +// The request message containing the user's name. +message HelloRequest { + string name = 1; +} + +// The response message containing the greetings +message HelloReply { + string message = 1; +} diff --git a/packages/opentelemetry-node/test/instr-grpc.test.js b/packages/opentelemetry-node/test/instr-grpc.test.js new file mode 100644 index 00000000..33f2a1d9 --- /dev/null +++ b/packages/opentelemetry-node/test/instr-grpc.test.js @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// Test that instrumentation-grpc generates the telemetry we expect. + +const test = require('tape'); +const {runTestFixtures} = require('./testutils'); + +/** @type {import('./testutils').TestFixture[]} */ +const testFixtures = [ + { + name: 'use-grpc', + args: ['./fixtures/use-grpc.js'], + cwd: __dirname, + env: { + NODE_OPTIONS: '--require=@elastic/opentelemetry-node', + }, + // verbose: true, + checkTelemetry: (t, col) => { + const spans = col.sortedSpans; + t.equal(spans.length, 2); + t.equal(spans[0].kind, 'SPAN_KIND_CLIENT'); + t.equal(spans[1].kind, 'SPAN_KIND_SERVER'); + for (let span of spans) { + t.equal(span.scope.name, '@opentelemetry/instrumentation-grpc'); + t.equal(span.name, 'grpc.helloworld.Greeter/SayHello'); + t.equal(span.attributes['rpc.system'], 'grpc'); + t.equal(span.attributes['rpc.method'], 'SayHello'); + t.equal(span.attributes['rpc.service'], 'helloworld.Greeter'); + t.equal(span.attributes['rpc.grpc.status_code'], 0); + } + }, + }, +]; + +test('grpc instrumentation', (suite) => { + runTestFixtures(suite, testFixtures); + suite.end(); +}); diff --git a/packages/opentelemetry-node/types/instrumentations.d.ts b/packages/opentelemetry-node/types/instrumentations.d.ts index 5c643b2e..609310bf 100644 --- a/packages/opentelemetry-node/types/instrumentations.d.ts +++ b/packages/opentelemetry-node/types/instrumentations.d.ts @@ -7,6 +7,7 @@ export type InstrumentaionsMap = { "@opentelemetry/instrumentation-ioredis": import('@opentelemetry/instrumentation-ioredis').IORedisInstrumentationConfig | InstrumentationFactory; "@opentelemetry/instrumentation-express": import('@opentelemetry/instrumentation-express').ExpressInstrumentationConfig | InstrumentationFactory; "@opentelemetry/instrumentation-fastify": import('@opentelemetry/instrumentation-fastify').FastifyInstrumentation | InstrumentationFactory; + "@opentelemetry/instrumentation-grpc": import('@opentelemetry/instrumentation-grpc').GrpcInstrumentation | InstrumentationFactory; "@opentelemetry/instrumentation-hapi": import('@opentelemetry/instrumentation-hapi').HapiInstrumentation | InstrumentationFactory; "@opentelemetry/instrumentation-mongodb": import('@opentelemetry/instrumentation-mongodb').MongoDBInstrumentation | InstrumentationFactory; "@opentelemetry/instrumentation-pg": import('@opentelemetry/instrumentation-pg').PgInstrumentation | InstrumentationFactory;