Skip to content

Commit fd881e8

Browse files
authored
Merge pull request #239 from yandex-cloud/otel
OTEL tracing support
2 parents 4c4edb0 + e6981dc commit fd881e8

9 files changed

Lines changed: 434 additions & 42 deletions

File tree

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,24 @@ const response = await cloudServiceClient.list(cloudService.ListCloudsRequest.fr
5757
}));
5858
```
5959

60+
### Tracing (OpenTelemetry)
61+
62+
The SDK can wrap every gRPC call in an OpenTelemetry span via [`nice-grpc-opentelemetry`](https://www.npmjs.com/package/nice-grpc-opentelemetry).
63+
Install the peer packages and pass `tracing: true`:
64+
65+
```bash
66+
npm install @opentelemetry/api nice-grpc-opentelemetry
67+
```
68+
69+
```typescript
70+
import { Session } from '@yandex-cloud/nodejs-sdk';
71+
72+
const session = new Session({ iamToken: 'YOUR_TOKEN', tracing: true });
73+
```
74+
75+
A span is produced per RPC attempt (i.e. inside the SDK's retry loop), and trace context is propagated via gRPC metadata using the OpenTelemetry global propagator.
76+
See [`examples/opentelemetry.ts`](./examples/opentelemetry.ts) for a runnable end-to-end setup.
77+
6078
Check [examples](./examples) directory for more examples.
6179

6280
To run example scripts, you should execute the following commands:

examples/opentelemetry.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
2+
import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
3+
import { Session } from '@yandex-cloud/nodejs-sdk';
4+
import { cloudService } from '@yandex-cloud/nodejs-sdk/resourcemanager-v1';
5+
import { getEnv } from './utils/get-env';
6+
import { log } from './utils/logger';
7+
8+
const IAM_TOKEN = getEnv('YC_IAM_TOKEN');
9+
10+
const provider = new NodeTracerProvider({
11+
spanProcessors: [new SimpleSpanProcessor(new ConsoleSpanExporter())],
12+
});
13+
14+
provider.register();
15+
16+
(async () => {
17+
const session = new Session({ iamToken: IAM_TOKEN, tracing: true });
18+
const client = session.client(cloudService.CloudServiceClient);
19+
20+
const response = await client.list(
21+
cloudService.ListCloudsRequest.fromPartial({ pageSize: 200 }),
22+
);
23+
24+
for (const cloud of response.clouds) {
25+
log(`Found cloud id = ${cloud.id}, name = ${cloud.name}`);
26+
}
27+
28+
await provider.shutdown();
29+
})();

0 commit comments

Comments
 (0)