Migrate to MetricsService

Signed-off-by: Kurt King <kurtaking@gmail.com>
This commit is contained in:
Kurt King
2026-04-02 23:47:59 -06:00
parent b8158ed1bf
commit eacf362bd8
9 changed files with 44 additions and 15 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-events-backend-module-google-pubsub': patch
---
Migrated internal metrics in `GooglePubSubConsumingEventPublisher` and `EventConsumingGooglePubSubPublisher` to use the new alpha `MetricsService`
@@ -40,8 +40,7 @@
"@backstage/filter-predicates": "workspace:^",
"@backstage/plugin-events-node": "workspace:^",
"@backstage/types": "workspace:^",
"@google-cloud/pubsub": "^4.10.0",
"@opentelemetry/api": "^1.9.0"
"@google-cloud/pubsub": "^4.10.0"
},
"devDependencies": {
"@backstage/backend-defaults": "workspace:^",
@@ -15,6 +15,7 @@
*/
import { mockServices } from '@backstage/backend-test-utils';
import { metricsServiceMock } from '@backstage/backend-test-utils/alpha';
import { EventParams } from '@backstage/plugin-events-node';
import { PubSub } from '@google-cloud/pubsub';
import waitFor from 'wait-for-expect';
@@ -23,6 +24,7 @@ import { EventConsumingGooglePubSubPublisher } from './EventConsumingGooglePubSu
describe('EventConsumingGooglePubSubPublisher', () => {
const logger = mockServices.logger.mock();
const events = mockServices.events.mock();
const metrics = metricsServiceMock.mock();
let onEvent: undefined | ((event: EventParams) => void);
events.subscribe.mockImplementation(async options => {
@@ -47,6 +49,7 @@ describe('EventConsumingGooglePubSubPublisher', () => {
const publisher = new EventConsumingGooglePubSubPublisher({
logger,
events,
metrics,
tasks: [
{
id: 'my-id',
@@ -21,7 +21,10 @@ import {
} from '@backstage/backend-plugin-api';
import { EventsService } from '@backstage/plugin-events-node';
import { PubSub } from '@google-cloud/pubsub';
import { Counter, metrics } from '@opentelemetry/api';
import type {
MetricsService,
MetricsServiceCounter,
} from '@backstage/backend-plugin-api/alpha';
import { readSubscriptionTasksFromConfig } from './config';
import { EventContext, SubscriptionTask } from './types';
import { JsonValue } from '@backstage/types';
@@ -35,7 +38,9 @@ export class EventConsumingGooglePubSubPublisher {
readonly #events: EventsService;
readonly #tasks: SubscriptionTask[];
readonly #pubSubFactory: (projectId: string) => PubSub;
readonly #metrics: { messages: Counter };
readonly #metrics: {
messages: MetricsServiceCounter<{ subscription: string; status: string }>;
};
#activeClientsByProjectId: Map<string, PubSub>;
static create(options: {
@@ -43,10 +48,12 @@ export class EventConsumingGooglePubSubPublisher {
logger: LoggerService;
rootLifecycle: RootLifecycleService;
events: EventsService;
metrics: MetricsService;
}) {
const publisher = new EventConsumingGooglePubSubPublisher({
logger: options.logger,
events: options.events,
metrics: options.metrics,
tasks: readSubscriptionTasksFromConfig(options.config),
pubSubFactory: projectId => new PubSub({ projectId }),
});
@@ -65,6 +72,7 @@ export class EventConsumingGooglePubSubPublisher {
constructor(options: {
logger: LoggerService;
events: EventsService;
metrics: MetricsService;
tasks: SubscriptionTask[];
pubSubFactory: (projectId: string) => PubSub;
}) {
@@ -73,14 +81,13 @@ export class EventConsumingGooglePubSubPublisher {
this.#tasks = options.tasks;
this.#pubSubFactory = options.pubSubFactory;
const meter = metrics.getMeter('default');
this.#metrics = {
messages: meter.createCounter(
messages: options.metrics.createCounter(
'events.google.pubsub.publisher.messages.total',
{
description:
'Number of Pub/Sub messages sent by EventConsumingGooglePubSubPublisher',
unit: 'short',
unit: '{message}',
},
),
};
@@ -18,6 +18,7 @@ import {
coreServices,
createBackendModule,
} from '@backstage/backend-plugin-api';
import { metricsServiceRef } from '@backstage/backend-plugin-api/alpha';
import { eventsServiceRef } from '@backstage/plugin-events-node';
import { EventConsumingGooglePubSubPublisher } from './EventConsumingGooglePubSubPublisher';
@@ -38,13 +39,15 @@ export const eventsModuleEventConsumingGooglePubSubPublisher =
logger: coreServices.logger,
rootLifecycle: coreServices.rootLifecycle,
events: eventsServiceRef,
metrics: metricsServiceRef,
},
async init({ config, logger, rootLifecycle, events }) {
async init({ config, logger, rootLifecycle, events, metrics }) {
EventConsumingGooglePubSubPublisher.create({
config,
logger,
rootLifecycle,
events,
metrics,
});
},
});
@@ -15,6 +15,7 @@
*/
import { mockServices } from '@backstage/backend-test-utils';
import { metricsServiceMock } from '@backstage/backend-test-utils/alpha';
import { Message, PubSub } from '@google-cloud/pubsub';
import { GooglePubSubConsumingEventPublisher } from './GooglePubSubConsumingEventPublisher';
import { JsonObject } from '@backstage/types';
@@ -36,6 +37,7 @@ function makeMessage(
describe('GooglePubSubConsumingEventPublisher', () => {
const logger = mockServices.logger.mock();
const events = mockServices.events.mock();
const metrics = metricsServiceMock.mock();
let onMessage: undefined | ((message: Message) => void);
const subscription = {
@@ -62,6 +64,7 @@ describe('GooglePubSubConsumingEventPublisher', () => {
const publisher = new GooglePubSubConsumingEventPublisher({
logger,
events,
metrics,
tasks: [
{
id: 'my-id',
@@ -23,7 +23,10 @@ import { ForwardedError } from '@backstage/errors';
import { EventParams, EventsService } from '@backstage/plugin-events-node';
import { JsonValue } from '@backstage/types';
import { Message, PubSub, Subscription } from '@google-cloud/pubsub';
import { Counter, metrics } from '@opentelemetry/api';
import type {
MetricsService,
MetricsServiceCounter,
} from '@backstage/backend-plugin-api/alpha';
import { readSubscriptionTasksFromConfig } from './config';
import { MessageContext, SubscriptionTask } from './types';
@@ -36,7 +39,9 @@ export class GooglePubSubConsumingEventPublisher {
readonly #events: EventsService;
readonly #tasks: SubscriptionTask[];
readonly #pubSubFactory: (projectId: string) => PubSub;
readonly #metrics: { messages: Counter };
readonly #metrics: {
messages: MetricsServiceCounter<{ subscription: string; status: string }>;
};
#activeClientsByProjectId: Map<string, PubSub>;
#activeSubscriptions: Subscription[];
@@ -45,10 +50,12 @@ export class GooglePubSubConsumingEventPublisher {
logger: LoggerService;
rootLifecycle: RootLifecycleService;
events: EventsService;
metrics: MetricsService;
}) {
const publisher = new GooglePubSubConsumingEventPublisher({
logger: options.logger,
events: options.events,
metrics: options.metrics,
tasks: readSubscriptionTasksFromConfig(options.config),
pubSubFactory: projectId => new PubSub({ projectId }),
});
@@ -67,6 +74,7 @@ export class GooglePubSubConsumingEventPublisher {
constructor(options: {
logger: LoggerService;
events: EventsService;
metrics: MetricsService;
tasks: SubscriptionTask[];
pubSubFactory: (projectId: string) => PubSub;
}) {
@@ -75,14 +83,13 @@ export class GooglePubSubConsumingEventPublisher {
this.#tasks = options.tasks;
this.#pubSubFactory = options.pubSubFactory;
const meter = metrics.getMeter('default');
this.#metrics = {
messages: meter.createCounter(
messages: options.metrics.createCounter(
'events.google.pubsub.consumer.messages.total',
{
description:
'Number of Pub/Sub messages received by GooglePubSubConsumingEventPublisher',
unit: 'short',
unit: '{message}',
},
),
};
@@ -18,6 +18,7 @@ import {
coreServices,
createBackendModule,
} from '@backstage/backend-plugin-api';
import { metricsServiceRef } from '@backstage/backend-plugin-api/alpha';
import { eventsServiceRef } from '@backstage/plugin-events-node';
import { GooglePubSubConsumingEventPublisher } from './GooglePubSubConsumingEventPublisher';
@@ -36,13 +37,15 @@ export const eventsModuleGooglePubsubConsumingEventPublisher =
logger: coreServices.logger,
rootLifecycle: coreServices.rootLifecycle,
events: eventsServiceRef,
metrics: metricsServiceRef,
},
async init({ config, logger, rootLifecycle, events }) {
async init({ config, logger, rootLifecycle, events, metrics }) {
GooglePubSubConsumingEventPublisher.create({
config,
logger,
rootLifecycle,
events,
metrics,
});
},
});
-1
View File
@@ -5727,7 +5727,6 @@ __metadata:
"@backstage/plugin-events-node": "workspace:^"
"@backstage/types": "workspace:^"
"@google-cloud/pubsub": "npm:^4.10.0"
"@opentelemetry/api": "npm:^1.9.0"
wait-for-expect: "npm:^4.0.0"
languageName: unknown
linkType: soft