Skip to content

Commit

Permalink
feat: add support for OTel context propagation and harmonized spans (#…
Browse files Browse the repository at this point in the history
…1833)

* feat: use the propagation inject framework for OpenTelemetry publishes

* feat: add propagation extraction to subscriber for OpenTelemetry

* feat: work in progress on adding sub-spans

* add more spans

* wrap subscriber on() handlers to get better receive process spans

* update otel core version for tests

* fix: change some span names for doc updates

* fix: move emitter wrapper out one level, to catch user functions properly

* fix: don't send anything besides what's actually needed during publish

* fix: close the publish span at RPC time, not up front

* fix: delay caching of the trace provider so the user has a chance to make one

* build: bring OTel versions back to compatible with Node 12

* fix: clean up a few more namespace pollution issues in OTel support

* tests: manually end the publish span for tests

* build: update package names for recent version updates

* chore: get versions of OTel that work together and with Node 12

* chore: linter nit

* chore: another linter nit

* chore: OTel sample formatting

* chore: some internal renaming to reflect the function rather than name of telemetry tracing

* fix: more work towards the Promise-first publish flow

* tests: remove unnecessary init line

* fix: add tracing support for updating the topic name in publisher spans

* fix: use the most up to date name for topic, subscription, and iam

* fix: update telemetry spans before publishing, in case the topic name wasn't ready

* chore: calm linter qualms

* 🦉 Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* fix: update drain() not to promisify

* tests: update unit tests for recent promise changes to publish()

* feat: add modAck spans during leasing

* docs: add more code comment docs

* 🦉 Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* tests: unit test fixes, also include deadline and initial parameters for modAck

* fix: make sure the subscriber span ends, update sample

* 🦉 Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* tests: update unit test for latest changes

* chore: pull promise-based publish out of OTel change

* tests: update otel sample test

* wip: end all telemetry spans when clear() is called

* wip: add more unit tests

* fix: include batch size with each published message span

* chore: fix lint

* fix: separate out the getter and setter classes

* chore: rename span related objects in subscriber

* chore: rename SpanMaker

* docs: improved comments and lint fixes

* docs: more class/comment updating

* fix: missing spans caused by renames; also do more renames

* tests: more renaming issues

* tests: add otel test for FlowControlledPublisher

* tests: add lease manager tests for otel

* tests: add SubscriberSpans unit tests

* fix: simplify logic for HTTP/1.1 REST fallback option (#1809)

* fix: simplify logic for HTTP/1.1 REST fallback option

For the `fallback` parameter, all values considered as `true`
in Boolean context will enable HTTP/1.1 REST fallback,
since the other fallback transport, proto over HTTP, is
removed from `google-gax` v4.

PiperOrigin-RevId: 559812260

Source-Link: googleapis/googleapis@6a6fd29

Source-Link: googleapis/googleapis-gen@56c1665
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiNTZjMTY2NTdlN2E1OTEyMmIxZGE5NDc3MWE5ZWY0MDk4OWMyODJjMCJ9

* 🦉 Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* 🦉 Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

---------

Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>

* build: update Node.js version and base Debian version (#1793)

* build: update Node.js version and base Debian version

* test: update Python and Node versions in container test YAMLs

Source-Link: googleapis/synthtool@f54a720
Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-nodejs:latest@sha256:aeccbef8061fc122542e8f381c4e7b66b32e23dda522e94c68346585dc408f0d

Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
Co-authored-by: Megan Potter <[email protected]>

* docs: fix node release schedule link (#1794)

Co-authored-by: Jeffrey Rennie <[email protected]>

Source-Link: googleapis/synthtool@1a24315
Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-nodejs:latest@sha256:e08f9a3757808cdaf7a377e962308c65c4d7eff12db206d4fae702dd50d43430

Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
Co-authored-by: Megan Potter <[email protected]>

* chore: update release-please post-processing for nodejs apiary (#1805)

* chore: update release-please post-processing for nodejs apiary

Source-Link: googleapis/synthtool@59fe44f
Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-nodejs:latest@sha256:606f3d9d99a1c7cdfa7158cbb1a75bfeef490655e246a2052f9ee741740d736c

Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>

* fix: Make retry policy back off more aggressively for RPCs that retry RESOURCE_EXHAUSTD (#1806)

* fix: Make retry policy back off more aggressively for RPCs that retry RESOURCE_EXHAUSTD

PiperOrigin-RevId: 557935020

Source-Link: googleapis/googleapis@38e1f31

Source-Link: googleapis/googleapis-gen@5bbe39d
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiNWJiZTM5ZDM3MjE4YTQyMGIyMzY4YzM3NTQxZGU1ODg3ZGI3ZDZhZiJ9

* 🦉 Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* 🦉 Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

---------

Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>

* fix: set grpc keepalive time|outs by default (#1814)

* fix: always fill the topic and sub names when creating from a PubSub object (#1816)

* chore(legacy-v3): release 3.7.4 (#1820)

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>

* docs: update copyrights to make header-check happy

* chore: remove left-in console.trace

* feat: update opentelemetry packages to latest

* 🦉 Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* samples: mostly whitespace, but updated OTel sample

* feat: updates for the new design doc: batching, events, separate RPC span

* tests: fix / update tests for batch changes

* feat: change ack/nack/modack to be events

* fix: fixes for previous commits

* fix: move span closing to subscriber, upon (n)ack

* docs: update custom gcp attributes

* 🦉 Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* docs: update subscriber comments

* tests: add unit tests for shutdown events

* fix: missed commits from previous

* fix: update span attributes for ordering key

Co-authored-by: Anna Levenberg <[email protected]>

* fix: update gcp.pubsub to gcp_pubsub

* feat: add back in receive response spans

* docs: fix inadequate comments for deadline

* feat: add ack/nack/modack events in processing

* fix: publisher -> publish scheduler

Co-authored-by: Anna Levenberg <[email protected]>

* chore: fix intermediate samples build exclusion

* feat: update otel span names and attributes to latest spec

* chore: remove extraneous import

* feat: add publish start/end events

* docs: comment updates about modack spans

* tests: add a bunch of unit tests for new otel stuff

* fix: subId might be undefined

* fix: revert incorrect attribute change

* docs: clarify some comments

* tests: update the test for the last commit

* fix: change processing span to use ack/nack instead of callback time

* docs: fix copyright ranges on renamed/updated files

* chore: OTel changed how semantic attribute names are specified

* tests: update otel sample tests for latest changes

* samples: update JS otel sample from TS

* 🦉 Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* samples: update otel tracing sample with the correct tags and some other cleanup

* samples: split otel samples into listen/publish

* tests: fix resource name for otel

* build: remove defunct typing

* feat: add support for globally enabling (and disabling) otel tracing

* feat: add bidi links between RPC and message spans, and filter by isSampled

* feat: track code.function

* docs: update comment based on CR

* tests: publishSpan might be undefined if tracing isn't enabled

* chore: small merge issue

* fix: update spans for ack/modack to match newest spec

* 🦉 Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* samples: add the otel enable flag to new otel samples

* 🦉 Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* 🦉 Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* docs: last minute review, mostly adding private/internal doc tags

---------

Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
Co-authored-by: gcf-owl-bot[bot] <78513119+gcf-owl-bot[bot]@users.noreply.github.com>
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: Anna Levenberg <[email protected]>
  • Loading branch information
5 people authored Aug 24, 2024
1 parent b8b625d commit 4b5c90d
Show file tree
Hide file tree
Showing 41 changed files with 2,708 additions and 557 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/.nyc_output
/docs/
/out/
/build/
**/build/
system-test/secrets.js
system-test/*key.json
*.lock
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,15 +163,16 @@ Samples are in the [`samples/`](https://github.com/googleapis/nodejs-pubsub/tree
| Listen with exactly-once delivery | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/listenForMessagesWithExactlyOnceDelivery.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/listenForMessagesWithExactlyOnceDelivery.js,samples/README.md) |
| Listen For Protobuf Messages | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/listenForProtobufMessages.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/listenForProtobufMessages.js,samples/README.md) |
| Listen For Messages With Custom Attributes | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/listenWithCustomAttributes.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/listenWithCustomAttributes.js,samples/README.md) |
| Subscribe with OpenTelemetry Tracing | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/listenWithOpenTelemetryTracing.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/listenWithOpenTelemetryTracing.js,samples/README.md) |
| Modify Push Configuration | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/modifyPushConfig.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/modifyPushConfig.js,samples/README.md) |
| OpenTelemetry Tracing | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/openTelemetryTracing.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/openTelemetryTracing.js,samples/README.md) |
| Publish Avro Records to a Topic | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/publishAvroRecords.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/publishAvroRecords.js,samples/README.md) |
| Publish Batched Messages | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/publishBatchedMessages.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/publishBatchedMessages.js,samples/README.md) |
| Publish Message | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/publishMessage.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/publishMessage.js,samples/README.md) |
| Publish Message With Custom Attributes | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/publishMessageWithCustomAttributes.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/publishMessageWithCustomAttributes.js,samples/README.md) |
| Publish Ordered Message | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/publishOrderedMessage.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/publishOrderedMessage.js,samples/README.md) |
| Publish Protobuf Messages to a Topic | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/publishProtobufMessages.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/publishProtobufMessages.js,samples/README.md) |
| Publish with flow control | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/publishWithFlowControl.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/publishWithFlowControl.js,samples/README.md) |
| Publish with OpenTelemetry Tracing | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/publishWithOpenTelemetryTracing.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/publishWithOpenTelemetryTracing.js,samples/README.md) |
| Publish With Retry Settings | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/publishWithRetrySettings.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/publishWithRetrySettings.js,samples/README.md) |
| Quickstart | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/quickstart.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/quickstart.js,samples/README.md) |
| Remove Dead Letter Policy | [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/removeDeadLetterPolicy.js) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/removeDeadLetterPolicy.js,samples/README.md) |
Expand Down
7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@
"@google-cloud/precise-date": "^4.0.0",
"@google-cloud/projectify": "^4.0.0",
"@google-cloud/promisify": "^4.0.0",
"@opentelemetry/api": "~1.8.0",
"@opentelemetry/semantic-conventions": "~1.21.0",
"@opentelemetry/api": "~1.9.0",
"@opentelemetry/semantic-conventions": "~1.25.1",
"arrify": "^2.0.0",
"extend": "^3.0.2",
"google-auth-library": "^9.3.0",
Expand All @@ -64,7 +64,8 @@
},
"devDependencies": {
"@grpc/proto-loader": "^0.7.0",
"@opentelemetry/tracing": "^0.24.0",
"@opentelemetry/core": "^1.17.0",
"@opentelemetry/sdk-trace-base": "^1.17.0",
"@types/duplexify": "^3.6.4",
"@types/extend": "^3.0.0",
"@types/lodash.snakecase": "^4.1.6",
Expand Down
3 changes: 3 additions & 0 deletions protos/protos.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

42 changes: 31 additions & 11 deletions samples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,16 @@ guides.
* [Listen with exactly-once delivery](#listen-with-exactly-once-delivery)
* [Listen For Protobuf Messages](#listen-for-protobuf-messages)
* [Listen For Messages With Custom Attributes](#listen-for-messages-with-custom-attributes)
* [Subscribe with OpenTelemetry Tracing](#subscribe-with-opentelemetry-tracing)
* [Modify Push Configuration](#modify-push-configuration)
* [OpenTelemetry Tracing](#opentelemetry-tracing)
* [Publish Avro Records to a Topic](#publish-avro-records-to-a-topic)
* [Publish Batched Messages](#publish-batched-messages)
* [Publish Message](#publish-message)
* [Publish Message With Custom Attributes](#publish-message-with-custom-attributes)
* [Publish Ordered Message](#publish-ordered-message)
* [Publish Protobuf Messages to a Topic](#publish-protobuf-messages-to-a-topic)
* [Publish with flow control](#publish-with-flow-control)
* [Publish with OpenTelemetry Tracing](#publish-with-opentelemetry-tracing)
* [Publish With Retry Settings](#publish-with-retry-settings)
* [Quickstart](#quickstart)
* [Remove Dead Letter Policy](#remove-dead-letter-policy)
Expand Down Expand Up @@ -862,37 +863,37 @@ __Usage:__



### Modify Push Configuration
### Subscribe with OpenTelemetry Tracing

Modifies the configuration of an existing push subscription.
Demonstrates how to enable OpenTelemetry tracing in a subscriber.

View the [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/modifyPushConfig.js).
View the [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/listenWithOpenTelemetryTracing.js).

[![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/modifyPushConfig.js,samples/README.md)
[![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/listenWithOpenTelemetryTracing.js,samples/README.md)

__Usage:__


`node modifyPushConfig.js <topic-name-or-id> <subscription-name-or-id>`
`node listenWithOpenTelemetryTracing.js <subscription-name-or-id>`


-----




### OpenTelemetry Tracing
### Modify Push Configuration

Demonstrates how to enable OpenTelemetry tracing in a publisher or subscriber.
Modifies the configuration of an existing push subscription.

View the [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/openTelemetryTracing.js).
View the [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/modifyPushConfig.js).

[![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/openTelemetryTracing.js,samples/README.md)
[![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/modifyPushConfig.js,samples/README.md)

__Usage:__


`node openTelemetryTracing.js <topic-name-or-id> <subscription-name-or-id>`
`node modifyPushConfig.js <topic-name-or-id> <subscription-name-or-id>`


-----
Expand Down Expand Up @@ -1033,6 +1034,25 @@ __Usage:__



### Publish with OpenTelemetry Tracing

Demonstrates how to enable OpenTelemetry tracing in a publisher.

View the [source code](https://github.com/googleapis/nodejs-pubsub/blob/main/samples/publishWithOpenTelemetryTracing.js).

[![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/nodejs-pubsub&page=editor&open_in_editor=samples/publishWithOpenTelemetryTracing.js,samples/README.md)

__Usage:__


`node openTelemetryTracing.js <topic-name-or-id>`


-----




### Publish With Retry Settings

Publishes a message to a topic with retry settings.
Expand Down
134 changes: 134 additions & 0 deletions samples/listenWithOpenTelemetryTracing.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
// Copyright 2020-2024 Google LLC
//
// 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.

// This is a generated sample, using the typeless sample bot. Please
// look for the source TypeScript sample (.ts) for modifications.
'use strict';

/**
* This sample demonstrates how to add OpenTelemetry tracing to the
* Google Cloud Pub/Sub API.
*
* For more information, see the README.md under /pubsub and the documentation
* at https://cloud.google.com/pubsub/docs.
*/

// sample-metadata:
// title: Subscribe with OpenTelemetry Tracing
// description: Demonstrates how to enable OpenTelemetry tracing in a subscriber.
// usage: node listenWithOpenTelemetryTracing.js <subscription-name-or-id>

const OTEL_TIMEOUT = 2;
const SUBSCRIBER_TIMEOUT = 10;

// [START pubsub_subscribe_otel_tracing]
/**
* TODO(developer): Uncomment these variables before running the sample.
*/
// const subscriptionNameOrId = 'YOUR_SUBSCRIPTION_OR_ID';

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Imports the OpenTelemetry API
const {NodeTracerProvider} = require('@opentelemetry/sdk-trace-node');
const {diag, DiagConsoleLogger, DiagLogLevel} = require('@opentelemetry/api');
const {SimpleSpanProcessor} = require('@opentelemetry/sdk-trace-base');

// To output to the console for testing, use the ConsoleSpanExporter.
// import {ConsoleSpanExporter} from '@opentelemetry/sdk-trace-base';

// To output to Cloud Trace, import the OpenTelemetry bridge library.
const {
TraceExporter,
} = require('@google-cloud/opentelemetry-cloud-trace-exporter');

const {Resource} = require('@opentelemetry/resources');
const {
SEMRESATTRS_SERVICE_NAME,
} = require('@opentelemetry/semantic-conventions');

// Enable the diagnostic logger for OpenTelemetry
diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);

// Log spans out to the console, for testing.
// const exporter = new ConsoleSpanExporter();

// Log spans out to Cloud Trace, for production.
const exporter = new TraceExporter();

// Build a tracer provider and a span processor to do
// something with the spans we're generating.
const provider = new NodeTracerProvider({
resource: new Resource({
[SEMRESATTRS_SERVICE_NAME]: 'otel subscriber example',
}),
});
const processor = new SimpleSpanProcessor(exporter);
provider.addSpanProcessor(processor);
provider.register();

// Creates a client; cache this for further use.
const pubSubClient = new PubSub({enableOpenTelemetryTracing: true});

async function subscriptionListen(subscriptionNameOrId) {
const subscriber = pubSubClient.subscription(subscriptionNameOrId);

// Message handler for subscriber
const messageHandler = async message => {
console.log(`Message ${message.id} received.`);
message.ack();
};

// Error handler for subscriber
const errorHandler = async error => {
console.log('Received error:', error);
};

// Listens for new messages from the topic
subscriber.on('message', messageHandler);
subscriber.on('error', errorHandler);

// Ensures that all spans got flushed by the exporter. This function
// is in service to making sure that any buffered Pub/Sub messages
// and/or OpenTelemetry spans are properly flushed to the server
// side. In normal usage, you'd only need to do something like this
// on process shutdown.
async function shutdown() {
await subscriber.close();
await processor.forceFlush();
await new Promise(r => setTimeout(r, OTEL_TIMEOUT * 1000));
}

// Wait a bit for the subscription to receive messages, then shut down
// gracefully. This is for the sample only; normally you would not need
// this delay.
await new Promise(r =>
setTimeout(async () => {
subscriber.removeAllListeners();
await shutdown();
r();
}, SUBSCRIBER_TIMEOUT * 1000)
);
}
// [END pubsub_subscribe_otel_tracing]

function main(subscriptionNameOrId = 'YOUR_SUBSCRIPTION_NAME_OR_ID') {
subscriptionListen(subscriptionNameOrId).catch(err => {
console.error(err.message);
process.exitCode = 1;
});
}

main(...process.argv.slice(2));
Loading

0 comments on commit 4b5c90d

Please sign in to comment.