Skip to content

Commit 1bcb339

Browse files
authored
feat(worker): Custom Metrics (#1705)
1 parent 9aae0d2 commit 1bcb339

40 files changed

+2092
-170
lines changed

packages/activity/src/index.ts

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
*/
7171

7272
import { AsyncLocalStorage } from 'node:async_hooks';
73-
import { Logger, Duration, LogLevel, LogMetadata, Priority } from '@temporalio/common';
73+
import { Logger, Duration, LogLevel, LogMetadata, MetricMeter, Priority } from '@temporalio/common';
7474
import { msToNumber } from '@temporalio/common/lib/time';
7575
import { SymbolBasedInstanceOfError } from '@temporalio/common/lib/type-helpers';
7676

@@ -281,6 +281,14 @@ export class Context {
281281
*/
282282
public log: Logger;
283283

284+
/**
285+
* Get the metric meter for this activity with activity-specific tags.
286+
*
287+
* To add custom tags, register a {@link ActivityOutboundCallsInterceptor} that
288+
* intercepts the `getMetricTags()` method.
289+
*/
290+
public readonly metricMeter: MetricMeter;
291+
284292
/**
285293
* **Not** meant to instantiated by Activity code, used by the worker.
286294
*
@@ -291,13 +299,15 @@ export class Context {
291299
cancelled: Promise<never>,
292300
cancellationSignal: AbortSignal,
293301
heartbeat: (details?: any) => void,
294-
log: Logger
302+
log: Logger,
303+
metricMeter: MetricMeter
295304
) {
296305
this.info = info;
297306
this.cancelled = cancelled;
298307
this.cancellationSignal = cancellationSignal;
299308
this.heartbeatFn = heartbeat;
300309
this.log = log;
310+
this.metricMeter = metricMeter;
301311
}
302312

303313
/**
@@ -434,3 +444,26 @@ export function cancelled(): Promise<never> {
434444
export function cancellationSignal(): AbortSignal {
435445
return Context.current().cancellationSignal;
436446
}
447+
448+
/**
449+
* Get the metric meter for the current activity, with activity-specific tags.
450+
*
451+
* To add custom tags, register a {@link ActivityOutboundCallsInterceptor} that
452+
* intercepts the `getMetricTags()` method.
453+
*
454+
* This is a shortcut for `Context.current().metricMeter` (see {@link Context.metricMeter}).
455+
*/
456+
export const metricMeter: MetricMeter = {
457+
createCounter(name, unit, description) {
458+
return Context.current().metricMeter.createCounter(name, unit, description);
459+
},
460+
createHistogram(name, valueType = 'int', unit, description) {
461+
return Context.current().metricMeter.createHistogram(name, valueType, unit, description);
462+
},
463+
createGauge(name, valueType = 'int', unit, description) {
464+
return Context.current().metricMeter.createGauge(name, valueType, unit, description);
465+
},
466+
withTags(tags) {
467+
return Context.current().metricMeter.withTags(tags);
468+
},
469+
};

packages/client/src/async-completion-client.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import { status as grpcStatus } from '@grpc/grpc-js';
22
import { ensureTemporalFailure } from '@temporalio/common';
3-
import {
4-
encodeErrorToFailure,
5-
encodeToPayloads,
6-
filterNullAndUndefined,
7-
} from '@temporalio/common/lib/internal-non-workflow';
3+
import { encodeErrorToFailure, encodeToPayloads } from '@temporalio/common/lib/internal-non-workflow';
4+
import { filterNullAndUndefined } from '@temporalio/common/lib/internal-workflow';
85
import { SymbolBasedInstanceOfError } from '@temporalio/common/lib/type-helpers';
96
import {
107
BaseClient,

packages/client/src/client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { filterNullAndUndefined } from '@temporalio/common/lib/internal-non-workflow';
1+
import { filterNullAndUndefined } from '@temporalio/common/lib/internal-workflow';
22
import { AsyncCompletionClient } from './async-completion-client';
33
import { BaseClient, BaseClientOptions, defaultBaseClientOptions, LoadedWithDefaults } from './base-client';
44
import { ClientInterceptors } from './interceptors';

packages/client/src/connection.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import { AsyncLocalStorage } from 'node:async_hooks';
22
import * as grpc from '@grpc/grpc-js';
33
import type * as proto from 'protobufjs';
44
import {
5-
filterNullAndUndefined,
65
normalizeTlsConfig,
76
TLSConfig,
87
normalizeGrpcEndpointAddress,
98
} from '@temporalio/common/lib/internal-non-workflow';
9+
import { filterNullAndUndefined } from '@temporalio/common/lib/internal-workflow';
1010
import { Duration, msOptionalToNumber } from '@temporalio/common/lib/time';
1111
import { type temporal } from '@temporalio/proto';
1212
import { isGrpcServiceError, ServiceError } from './errors';

packages/client/src/schedule-client.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,8 @@ import {
77
encodeUnifiedSearchAttributes,
88
} from '@temporalio/common/lib/converter/payload-search-attributes';
99
import { composeInterceptors, Headers } from '@temporalio/common/lib/interceptors';
10-
import {
11-
encodeMapToPayloads,
12-
decodeMapFromPayloads,
13-
filterNullAndUndefined,
14-
} from '@temporalio/common/lib/internal-non-workflow';
10+
import { encodeMapToPayloads, decodeMapFromPayloads } from '@temporalio/common/lib/internal-non-workflow';
11+
import { filterNullAndUndefined } from '@temporalio/common/lib/internal-workflow';
1512
import { temporal } from '@temporalio/proto';
1613
import {
1714
optionalDateToTs,

packages/client/src/task-queue-client.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { status } from '@grpc/grpc-js';
2-
import { filterNullAndUndefined } from '@temporalio/common/lib/internal-non-workflow';
32
import { assertNever, SymbolBasedInstanceOfError, RequireAtLeastOne } from '@temporalio/common/lib/type-helpers';
4-
import { makeProtoEnumConverters } from '@temporalio/common/lib/internal-workflow';
3+
import { filterNullAndUndefined, makeProtoEnumConverters } from '@temporalio/common/lib/internal-workflow';
54
import { temporal } from '@temporalio/proto';
65
import { BaseClient, BaseClientOptions, defaultBaseClientOptions, LoadedWithDefaults } from './base-client';
76
import { WorkflowService } from './types';

packages/client/src/workflow-client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ import {
3434
decodeOptionalFailureToOptionalError,
3535
encodeMapToPayloads,
3636
encodeToPayloads,
37-
filterNullAndUndefined,
3837
} from '@temporalio/common/lib/internal-non-workflow';
38+
import { filterNullAndUndefined } from '@temporalio/common/lib/internal-workflow';
3939
import { temporal } from '@temporalio/proto';
4040
import {
4141
ServiceError,

packages/cloud/src/cloud-operations-client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import { AsyncLocalStorage } from 'node:async_hooks';
22
import * as grpc from '@grpc/grpc-js';
33
import type { RPCImpl } from 'protobufjs';
44
import {
5-
filterNullAndUndefined,
65
normalizeTlsConfig,
76
TLSConfig,
87
normalizeGrpcEndpointAddress,
98
} from '@temporalio/common/lib/internal-non-workflow';
9+
import { filterNullAndUndefined } from '@temporalio/common/lib/internal-workflow';
1010
import { Duration, msOptionalToNumber } from '@temporalio/common/lib/time';
1111
import {
1212
CallContext,

packages/common/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export { Headers, Next } from './interceptors';
2020
export * from './interfaces';
2121
export * from './logger';
2222
export * from './priority';
23+
export * from './metrics';
2324
export * from './retry-policy';
2425
export type { Timestamp, Duration, StringValue } from './time';
2526
export * from './worker-deployments';

packages/common/src/internal-non-workflow/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,3 @@ export * from './data-converter-helpers';
99
export * from './parse-host-uri';
1010
export * from './proxy-config';
1111
export * from './tls-config';
12-
export * from './utils';

0 commit comments

Comments
 (0)