@smithers-orchestrator/observability 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/package.json +44 -0
- package/src/MetricName.ts +1 -0
- package/src/MetricsServiceLive.js +9 -0
- package/src/ResolvedSmithersObservabilityOptions.ts +10 -0
- package/src/SmithersEvent.ts +603 -0
- package/src/SmithersLogFormat.ts +1 -0
- package/src/SmithersMetricDefinition.ts +15 -0
- package/src/SmithersMetricType.ts +1 -0
- package/src/SmithersMetricUnit.ts +8 -0
- package/src/SmithersObservability.js +6 -0
- package/src/SmithersObservabilityOptions.ts +10 -0
- package/src/SmithersObservabilityService.ts +15 -0
- package/src/_coreCorrelation/CorrelationContext.ts +10 -0
- package/src/_coreCorrelation/CorrelationContextLive.js +11 -0
- package/src/_coreCorrelation/CorrelationContextService.js +6 -0
- package/src/_coreCorrelation/CorrelationContextServiceShape.ts +14 -0
- package/src/_coreCorrelation/CorrelationPatch.ts +3 -0
- package/src/_coreCorrelation/_correlationStorage.js +4 -0
- package/src/_coreCorrelation/correlationContextFiberRef.js +2 -0
- package/src/_coreCorrelation/correlationContextToLogAnnotations.js +28 -0
- package/src/_coreCorrelation/getCurrentCorrelationContext.js +9 -0
- package/src/_coreCorrelation/getCurrentCorrelationContextEffect.js +11 -0
- package/src/_coreCorrelation/index.js +14 -0
- package/src/_coreCorrelation/mergeCorrelationContext.js +61 -0
- package/src/_coreCorrelation/runWithCorrelationContext.js +14 -0
- package/src/_coreCorrelation/updateCurrentCorrelationContext.js +19 -0
- package/src/_coreCorrelation/withCorrelationContext.js +15 -0
- package/src/_coreCorrelation/withCurrentCorrelationContext.js +13 -0
- package/src/_coreMetrics.js +510 -0
- package/src/_coreMetricsShape.ts +55 -0
- package/src/_corePrometheus.js +93 -0
- package/src/_corePrometheusShape.ts +11 -0
- package/src/_coreTracing.js +142 -0
- package/src/_coreTracingShape.ts +17 -0
- package/src/_smithersSpanAttributeAliases.js +19 -0
- package/src/_smithersTraceSpanStorage.js +3 -0
- package/src/annotateSmithersTrace.js +11 -0
- package/src/correlation.js +20 -0
- package/src/createSmithersObservabilityLayer.js +49 -0
- package/src/createSmithersOtelLayer.js +21 -0
- package/src/createSmithersRuntimeLayer.js +2 -0
- package/src/getCurrentSmithersTraceAnnotations.js +14 -0
- package/src/getCurrentSmithersTraceSpan.js +7 -0
- package/src/index.d.ts +1032 -0
- package/src/index.js +35 -0
- package/src/logging.js +91 -0
- package/src/makeSmithersSpanAttributes.js +20 -0
- package/src/metrics/SmithersMetricDefinition.ts +17 -0
- package/src/metrics/SmithersMetricType.ts +1 -0
- package/src/metrics/SmithersMetricUnit.ts +8 -0
- package/src/metrics/_asyncExternalWaitCounts.js +4 -0
- package/src/metrics/_buckets.js +43 -0
- package/src/metrics/_processStartMs.js +1 -0
- package/src/metrics/activeNodes.js +2 -0
- package/src/metrics/activeRuns.js +2 -0
- package/src/metrics/agentActionsTotal.js +2 -0
- package/src/metrics/agentDurationMs.js +3 -0
- package/src/metrics/agentErrorsTotal.js +2 -0
- package/src/metrics/agentEventsTotal.js +2 -0
- package/src/metrics/agentInvocationsTotal.js +2 -0
- package/src/metrics/agentRetriesTotal.js +2 -0
- package/src/metrics/agentSessionsTotal.js +2 -0
- package/src/metrics/agentTokensTotal.js +2 -0
- package/src/metrics/alertDeliveriesAttempted.js +2 -0
- package/src/metrics/alertDeliveriesSuppressed.js +2 -0
- package/src/metrics/alertsAcknowledgedTotal.js +2 -0
- package/src/metrics/alertsActive.js +2 -0
- package/src/metrics/alertsEscalatedTotal.js +2 -0
- package/src/metrics/alertsFiredTotal.js +2 -0
- package/src/metrics/alertsReopenedTotal.js +2 -0
- package/src/metrics/alertsResolvedTotal.js +2 -0
- package/src/metrics/alertsSilencedTotal.js +2 -0
- package/src/metrics/approvalPending.js +2 -0
- package/src/metrics/approvalWaitDuration.js +3 -0
- package/src/metrics/approvalsDenied.js +2 -0
- package/src/metrics/approvalsGranted.js +2 -0
- package/src/metrics/approvalsRequested.js +2 -0
- package/src/metrics/attemptDuration.js +3 -0
- package/src/metrics/attentionBacklog.js +2 -0
- package/src/metrics/cacheHits.js +2 -0
- package/src/metrics/cacheMisses.js +2 -0
- package/src/metrics/dbQueryDuration.js +3 -0
- package/src/metrics/dbRetries.js +2 -0
- package/src/metrics/dbTransactionDuration.js +3 -0
- package/src/metrics/dbTransactionRetries.js +2 -0
- package/src/metrics/dbTransactionRollbacks.js +2 -0
- package/src/metrics/devtoolsActiveSubscribers.js +2 -0
- package/src/metrics/devtoolsBackpressureDisconnectTotal.js +2 -0
- package/src/metrics/devtoolsDeltaBuildMs.js +3 -0
- package/src/metrics/devtoolsEventBytes.js +3 -0
- package/src/metrics/devtoolsEventTotal.js +2 -0
- package/src/metrics/devtoolsSnapshotBuildMs.js +3 -0
- package/src/metrics/devtoolsSubscribeTotal.js +2 -0
- package/src/metrics/errorsTotal.js +2 -0
- package/src/metrics/eventsEmittedTotal.js +2 -0
- package/src/metrics/externalWaitAsyncPending.js +2 -0
- package/src/metrics/gatewayApprovalDecisionsTotal.js +2 -0
- package/src/metrics/gatewayAuthEventsTotal.js +2 -0
- package/src/metrics/gatewayConnectionsActive.js +2 -0
- package/src/metrics/gatewayConnectionsClosedTotal.js +2 -0
- package/src/metrics/gatewayConnectionsTotal.js +2 -0
- package/src/metrics/gatewayCronTriggersTotal.js +2 -0
- package/src/metrics/gatewayErrorsTotal.js +2 -0
- package/src/metrics/gatewayHeartbeatTicksTotal.js +2 -0
- package/src/metrics/gatewayMessagesReceivedTotal.js +2 -0
- package/src/metrics/gatewayMessagesSentTotal.js +2 -0
- package/src/metrics/gatewayRpcCallsTotal.js +2 -0
- package/src/metrics/gatewayRpcDuration.js +3 -0
- package/src/metrics/gatewayRunsCompletedTotal.js +2 -0
- package/src/metrics/gatewayRunsStartedTotal.js +2 -0
- package/src/metrics/gatewaySignalsTotal.js +2 -0
- package/src/metrics/gatewayWebhooksReceivedTotal.js +2 -0
- package/src/metrics/gatewayWebhooksRejectedTotal.js +2 -0
- package/src/metrics/gatewayWebhooksVerifiedTotal.js +2 -0
- package/src/metrics/heartbeatDataSizeBytes.js +3 -0
- package/src/metrics/heartbeatIntervalMs.js +3 -0
- package/src/metrics/hotReloadDuration.js +3 -0
- package/src/metrics/hotReloadFailures.js +2 -0
- package/src/metrics/hotReloads.js +2 -0
- package/src/metrics/httpRequestDuration.js +3 -0
- package/src/metrics/httpRequests.js +2 -0
- package/src/metrics/index.js +151 -0
- package/src/metrics/metricsServiceAdapter.js +188 -0
- package/src/metrics/nodeDuration.js +3 -0
- package/src/metrics/nodeRetriesTotal.js +2 -0
- package/src/metrics/nodesFailed.js +2 -0
- package/src/metrics/nodesFinished.js +2 -0
- package/src/metrics/nodesStarted.js +2 -0
- package/src/metrics/processHeapUsedBytes.js +2 -0
- package/src/metrics/processMemoryRssBytes.js +2 -0
- package/src/metrics/processUptimeSeconds.js +2 -0
- package/src/metrics/promptSizeBytes.js +3 -0
- package/src/metrics/responseSizeBytes.js +3 -0
- package/src/metrics/rewindDurationMs.js +3 -0
- package/src/metrics/rewindFramesDeleted.js +3 -0
- package/src/metrics/rewindRollbackTotal.js +2 -0
- package/src/metrics/rewindSandboxesReverted.js +3 -0
- package/src/metrics/rewindTotal.js +2 -0
- package/src/metrics/runDuration.js +3 -0
- package/src/metrics/runsAncestryDepth.js +3 -0
- package/src/metrics/runsCancelledTotal.js +2 -0
- package/src/metrics/runsCarriedStateBytes.js +3 -0
- package/src/metrics/runsContinuedTotal.js +2 -0
- package/src/metrics/runsFailedTotal.js +2 -0
- package/src/metrics/runsFinishedTotal.js +2 -0
- package/src/metrics/runsResumedTotal.js +2 -0
- package/src/metrics/runsTotal.js +2 -0
- package/src/metrics/sandboxActive.js +2 -0
- package/src/metrics/sandboxBundleSizeBytes.js +3 -0
- package/src/metrics/sandboxCompletedTotal.js +2 -0
- package/src/metrics/sandboxCreatedTotal.js +2 -0
- package/src/metrics/sandboxDurationMs.js +3 -0
- package/src/metrics/sandboxPatchCount.js +3 -0
- package/src/metrics/sandboxTransportDurationMs.js +3 -0
- package/src/metrics/schedulerConcurrencyUtilization.js +2 -0
- package/src/metrics/schedulerQueueDepth.js +2 -0
- package/src/metrics/schedulerWaitDuration.js +3 -0
- package/src/metrics/scorerEventsFailed.js +2 -0
- package/src/metrics/scorerEventsFinished.js +2 -0
- package/src/metrics/scorerEventsStarted.js +2 -0
- package/src/metrics/smithersMetricCatalog.js +484 -0
- package/src/metrics/smithersMetricCatalogByKey.js +2 -0
- package/src/metrics/smithersMetricCatalogByName.js +2 -0
- package/src/metrics/smithersMetricCatalogByPrometheusName.js +2 -0
- package/src/metrics/supervisorPollDuration.js +3 -0
- package/src/metrics/supervisorPollsTotal.js +2 -0
- package/src/metrics/supervisorResumeLag.js +3 -0
- package/src/metrics/supervisorResumedTotal.js +2 -0
- package/src/metrics/supervisorSkippedTotal.js +2 -0
- package/src/metrics/supervisorStaleDetected.js +2 -0
- package/src/metrics/taskHeartbeatTimeoutTotal.js +2 -0
- package/src/metrics/taskHeartbeatsTotal.js +2 -0
- package/src/metrics/timerDelayDuration.js +3 -0
- package/src/metrics/timersCancelled.js +2 -0
- package/src/metrics/timersCreated.js +2 -0
- package/src/metrics/timersFired.js +2 -0
- package/src/metrics/timersPending.js +2 -0
- package/src/metrics/toPrometheusMetricName.js +8 -0
- package/src/metrics/tokensCacheReadTotal.js +2 -0
- package/src/metrics/tokensCacheWriteTotal.js +2 -0
- package/src/metrics/tokensContextWindowBucketTotal.js +2 -0
- package/src/metrics/tokensContextWindowPerCall.js +3 -0
- package/src/metrics/tokensInputPerCall.js +3 -0
- package/src/metrics/tokensInputTotal.js +2 -0
- package/src/metrics/tokensOutputPerCall.js +3 -0
- package/src/metrics/tokensOutputTotal.js +2 -0
- package/src/metrics/tokensReasoningTotal.js +2 -0
- package/src/metrics/toolCallErrorsTotal.js +2 -0
- package/src/metrics/toolCallsTotal.js +2 -0
- package/src/metrics/toolDuration.js +3 -0
- package/src/metrics/toolOutputTruncatedTotal.js +2 -0
- package/src/metrics/trackEvent.js +604 -0
- package/src/metrics/updateAsyncExternalWaitPending.js +14 -0
- package/src/metrics/updateProcessMetrics.js +17 -0
- package/src/metrics/vcsDuration.js +3 -0
- package/src/prometheusContentType.js +1 -0
- package/src/renderPrometheusMetrics.js +205 -0
- package/src/resolveSmithersObservabilityOptions.js +79 -0
- package/src/smithersMetrics.js +2 -0
- package/src/smithersSpanNames.js +6 -0
- package/src/withSmithersSpan.js +15 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Context } from "effect";
|
|
2
|
+
/** @typedef {import("./SmithersObservabilityService.ts").SmithersObservabilityService} SmithersObservabilityService */
|
|
3
|
+
|
|
4
|
+
const _SmithersObservabilityBase = /** @type {Context.TagClass<SmithersObservability, "SmithersObservability", SmithersObservabilityService>} */ (/** @type {unknown} */ (Context.Tag("SmithersObservability")()));
|
|
5
|
+
export class SmithersObservability extends _SmithersObservabilityBase {
|
|
6
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LogLevel } from "effect";
|
|
2
|
+
import type { SmithersLogFormat } from "./SmithersLogFormat";
|
|
3
|
+
|
|
4
|
+
export type SmithersObservabilityOptions = {
|
|
5
|
+
readonly enabled?: boolean;
|
|
6
|
+
readonly endpoint?: string;
|
|
7
|
+
readonly serviceName?: string;
|
|
8
|
+
readonly logFormat?: SmithersLogFormat;
|
|
9
|
+
readonly logLevel?: LogLevel.LogLevel | string;
|
|
10
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Effect } from "effect";
|
|
2
|
+
import type * as Tracer from "effect/Tracer";
|
|
3
|
+
import type { ResolvedSmithersObservabilityOptions } from "./ResolvedSmithersObservabilityOptions";
|
|
4
|
+
|
|
5
|
+
export type SmithersObservabilityService = {
|
|
6
|
+
readonly options: ResolvedSmithersObservabilityOptions;
|
|
7
|
+
readonly annotate: (
|
|
8
|
+
attributes: Readonly<Record<string, unknown>>,
|
|
9
|
+
) => Effect.Effect<void>;
|
|
10
|
+
readonly withSpan: <A, E, R>(
|
|
11
|
+
name: string,
|
|
12
|
+
effect: Effect.Effect<A, E, R>,
|
|
13
|
+
attributes?: Readonly<Record<string, unknown>>,
|
|
14
|
+
) => Effect.Effect<A, E, Exclude<R, Tracer.ParentSpan>>;
|
|
15
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Layer } from "effect";
|
|
2
|
+
import { CorrelationContextService } from "./CorrelationContextService.js";
|
|
3
|
+
import { correlationContextToLogAnnotations } from "./correlationContextToLogAnnotations.js";
|
|
4
|
+
import { getCurrentCorrelationContextEffect } from "./getCurrentCorrelationContextEffect.js";
|
|
5
|
+
import { withCorrelationContext } from "./withCorrelationContext.js";
|
|
6
|
+
/** @type {Layer.Layer<CorrelationContextService, never, never>} */
|
|
7
|
+
export const CorrelationContextLive = Layer.succeed(CorrelationContextService, {
|
|
8
|
+
current: () => getCurrentCorrelationContextEffect(),
|
|
9
|
+
withCorrelation: (patch, effect) => withCorrelationContext(effect, patch),
|
|
10
|
+
toLogAnnotations: correlationContextToLogAnnotations,
|
|
11
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Context } from "effect";
|
|
2
|
+
/** @typedef {import("./CorrelationContextServiceShape.ts").CorrelationContextServiceShape} CorrelationContextServiceShape */
|
|
3
|
+
|
|
4
|
+
const _CorrelationContextServiceBase = /** @type {Context.TagClass<CorrelationContextService, "CorrelationContextService", CorrelationContextServiceShape>} */ (/** @type {unknown} */ (Context.Tag("CorrelationContextService")()));
|
|
5
|
+
export class CorrelationContextService extends _CorrelationContextServiceBase {
|
|
6
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Effect } from "effect";
|
|
2
|
+
import type { CorrelationContext } from "./CorrelationContext.ts";
|
|
3
|
+
import type { CorrelationPatch } from "./CorrelationPatch.ts";
|
|
4
|
+
|
|
5
|
+
export type CorrelationContextServiceShape = {
|
|
6
|
+
readonly current: () => Effect.Effect<CorrelationContext | undefined>;
|
|
7
|
+
readonly withCorrelation: <A, E, R>(
|
|
8
|
+
patch: CorrelationPatch,
|
|
9
|
+
effect: Effect.Effect<A, E, R>,
|
|
10
|
+
) => Effect.Effect<A, E, R>;
|
|
11
|
+
readonly toLogAnnotations: (
|
|
12
|
+
context?: CorrelationContext | null,
|
|
13
|
+
) => Record<string, unknown> | undefined;
|
|
14
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
|
|
2
|
+
/** @typedef {import("./CorrelationContext.ts").CorrelationContext} CorrelationContext */
|
|
3
|
+
/**
|
|
4
|
+
* @param {CorrelationContext | null} [context]
|
|
5
|
+
* @returns {Record<string, unknown> | undefined}
|
|
6
|
+
*/
|
|
7
|
+
export function correlationContextToLogAnnotations(context) {
|
|
8
|
+
if (!context)
|
|
9
|
+
return undefined;
|
|
10
|
+
const annotations = {};
|
|
11
|
+
if (context.runId)
|
|
12
|
+
annotations.runId = context.runId;
|
|
13
|
+
if (context.nodeId)
|
|
14
|
+
annotations.nodeId = context.nodeId;
|
|
15
|
+
if (context.workflowName)
|
|
16
|
+
annotations.workflowName = context.workflowName;
|
|
17
|
+
if (context.parentRunId)
|
|
18
|
+
annotations.parentRunId = context.parentRunId;
|
|
19
|
+
if (context.traceId)
|
|
20
|
+
annotations.traceId = context.traceId;
|
|
21
|
+
if (context.spanId)
|
|
22
|
+
annotations.spanId = context.spanId;
|
|
23
|
+
if (typeof context.iteration === "number")
|
|
24
|
+
annotations.iteration = context.iteration;
|
|
25
|
+
if (typeof context.attempt === "number")
|
|
26
|
+
annotations.attempt = context.attempt;
|
|
27
|
+
return Object.keys(annotations).length > 0 ? annotations : undefined;
|
|
28
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { correlationStorage } from "./_correlationStorage.js";
|
|
2
|
+
/** @typedef {import("./CorrelationContext.ts").CorrelationContext} CorrelationContext */
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @returns {CorrelationContext | undefined}
|
|
6
|
+
*/
|
|
7
|
+
export function getCurrentCorrelationContext() {
|
|
8
|
+
return correlationStorage.getStore();
|
|
9
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Effect, FiberRef } from "effect";
|
|
2
|
+
import { correlationContextFiberRef } from "./correlationContextFiberRef.js";
|
|
3
|
+
import { correlationStorage } from "./_correlationStorage.js";
|
|
4
|
+
/** @typedef {import("./CorrelationContext.ts").CorrelationContext} CorrelationContext */
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @returns {Effect.Effect< CorrelationContext | undefined >}
|
|
8
|
+
*/
|
|
9
|
+
export function getCurrentCorrelationContextEffect() {
|
|
10
|
+
return FiberRef.get(correlationContextFiberRef).pipe(Effect.map((fiberContext) => fiberContext ?? correlationStorage.getStore()));
|
|
11
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** @typedef {import("./CorrelationContext.ts").CorrelationContext} CorrelationContext */
|
|
2
|
+
/** @typedef {import("./CorrelationPatch.ts").CorrelationPatch} CorrelationPatch */
|
|
3
|
+
|
|
4
|
+
export { correlationContextFiberRef } from "./correlationContextFiberRef.js";
|
|
5
|
+
export { CorrelationContextService } from "./CorrelationContextService.js";
|
|
6
|
+
export { CorrelationContextLive } from "./CorrelationContextLive.js";
|
|
7
|
+
export { mergeCorrelationContext } from "./mergeCorrelationContext.js";
|
|
8
|
+
export { getCurrentCorrelationContext } from "./getCurrentCorrelationContext.js";
|
|
9
|
+
export { getCurrentCorrelationContextEffect } from "./getCurrentCorrelationContextEffect.js";
|
|
10
|
+
export { updateCurrentCorrelationContext } from "./updateCurrentCorrelationContext.js";
|
|
11
|
+
export { runWithCorrelationContext } from "./runWithCorrelationContext.js";
|
|
12
|
+
export { withCorrelationContext } from "./withCorrelationContext.js";
|
|
13
|
+
export { withCurrentCorrelationContext } from "./withCurrentCorrelationContext.js";
|
|
14
|
+
export { correlationContextToLogAnnotations } from "./correlationContextToLogAnnotations.js";
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
|
|
2
|
+
/** @typedef {import("./CorrelationContext.ts").CorrelationContext} CorrelationContext */
|
|
3
|
+
/** @typedef {import("./CorrelationPatch.ts").CorrelationPatch} CorrelationPatch */
|
|
4
|
+
/**
|
|
5
|
+
* @param {unknown} value
|
|
6
|
+
* @returns {string | undefined}
|
|
7
|
+
*/
|
|
8
|
+
function cleanString(value) {
|
|
9
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* @param {unknown} value
|
|
13
|
+
* @returns {number | undefined}
|
|
14
|
+
*/
|
|
15
|
+
function cleanNumber(value) {
|
|
16
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* @param {CorrelationPatch} patch
|
|
20
|
+
* @returns {Partial<CorrelationContext> | undefined}
|
|
21
|
+
*/
|
|
22
|
+
function normalizePatch(patch) {
|
|
23
|
+
if (!patch)
|
|
24
|
+
return undefined;
|
|
25
|
+
const normalized = {};
|
|
26
|
+
const runId = cleanString(patch.runId);
|
|
27
|
+
const nodeId = cleanString(patch.nodeId);
|
|
28
|
+
const workflowName = cleanString(patch.workflowName);
|
|
29
|
+
const parentRunId = cleanString(patch.parentRunId);
|
|
30
|
+
const traceId = cleanString(patch.traceId);
|
|
31
|
+
const spanId = cleanString(patch.spanId);
|
|
32
|
+
const iteration = cleanNumber(patch.iteration);
|
|
33
|
+
const attempt = cleanNumber(patch.attempt);
|
|
34
|
+
if (runId)
|
|
35
|
+
normalized.runId = runId;
|
|
36
|
+
if (nodeId)
|
|
37
|
+
normalized.nodeId = nodeId;
|
|
38
|
+
if (workflowName)
|
|
39
|
+
normalized.workflowName = workflowName;
|
|
40
|
+
if (parentRunId)
|
|
41
|
+
normalized.parentRunId = parentRunId;
|
|
42
|
+
if (traceId)
|
|
43
|
+
normalized.traceId = traceId;
|
|
44
|
+
if (spanId)
|
|
45
|
+
normalized.spanId = spanId;
|
|
46
|
+
if (iteration !== undefined)
|
|
47
|
+
normalized.iteration = iteration;
|
|
48
|
+
if (attempt !== undefined)
|
|
49
|
+
normalized.attempt = attempt;
|
|
50
|
+
return Object.keys(normalized).length > 0 ? normalized : undefined;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* @param {CorrelationContext | null} [base]
|
|
54
|
+
* @param {CorrelationPatch} [patch]
|
|
55
|
+
* @returns {CorrelationContext | undefined}
|
|
56
|
+
*/
|
|
57
|
+
export function mergeCorrelationContext(base, patch) {
|
|
58
|
+
const normalizedPatch = normalizePatch(patch);
|
|
59
|
+
const merged = { ...base, ...normalizedPatch };
|
|
60
|
+
return merged.runId ? merged : undefined;
|
|
61
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { correlationStorage } from "./_correlationStorage.js";
|
|
2
|
+
import { mergeCorrelationContext } from "./mergeCorrelationContext.js";
|
|
3
|
+
/** @typedef {import("./CorrelationPatch.ts").CorrelationPatch} CorrelationPatch */
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @template T
|
|
7
|
+
* @param {CorrelationPatch} patch
|
|
8
|
+
* @param {() => T} fn
|
|
9
|
+
* @returns {T}
|
|
10
|
+
*/
|
|
11
|
+
export function runWithCorrelationContext(patch, fn) {
|
|
12
|
+
const next = mergeCorrelationContext(correlationStorage.getStore(), patch);
|
|
13
|
+
return next ? correlationStorage.run(next, fn) : fn();
|
|
14
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Effect, FiberRef } from "effect";
|
|
2
|
+
import { correlationContextFiberRef } from "./correlationContextFiberRef.js";
|
|
3
|
+
import { getCurrentCorrelationContextEffect } from "./getCurrentCorrelationContextEffect.js";
|
|
4
|
+
import { mergeCorrelationContext } from "./mergeCorrelationContext.js";
|
|
5
|
+
/** @typedef {import("./CorrelationContext.ts").CorrelationContext} CorrelationContext */
|
|
6
|
+
/** @typedef {import("./CorrelationPatch.ts").CorrelationPatch} CorrelationPatch */
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @param {CorrelationPatch} patch
|
|
10
|
+
* @returns {Effect.Effect<CorrelationContext | undefined>}
|
|
11
|
+
*/
|
|
12
|
+
export function updateCurrentCorrelationContext(patch) {
|
|
13
|
+
return Effect.gen(function* () {
|
|
14
|
+
const current = yield* getCurrentCorrelationContextEffect();
|
|
15
|
+
const next = mergeCorrelationContext(current, patch);
|
|
16
|
+
yield* FiberRef.set(correlationContextFiberRef, next);
|
|
17
|
+
return next;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { correlationContextFiberRef } from "./correlationContextFiberRef.js";
|
|
3
|
+
import { correlationStorage } from "./_correlationStorage.js";
|
|
4
|
+
import { mergeCorrelationContext } from "./mergeCorrelationContext.js";
|
|
5
|
+
/** @typedef {import("./CorrelationPatch.ts").CorrelationPatch} CorrelationPatch */
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @template A, E, R
|
|
9
|
+
* @param {Effect.Effect<A, E, R>} effect
|
|
10
|
+
* @param {CorrelationPatch} patch
|
|
11
|
+
*/
|
|
12
|
+
export function withCorrelationContext(effect, patch) {
|
|
13
|
+
const next = mergeCorrelationContext(correlationStorage.getStore(), patch);
|
|
14
|
+
return next ? effect.pipe(Effect.locally(correlationContextFiberRef, next)) : effect;
|
|
15
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { correlationContextFiberRef } from "./correlationContextFiberRef.js";
|
|
3
|
+
import { correlationStorage } from "./_correlationStorage.js";
|
|
4
|
+
/**
|
|
5
|
+
* @template A, E, R
|
|
6
|
+
* @param {Effect.Effect<A, E, R>} effect
|
|
7
|
+
*/
|
|
8
|
+
export function withCurrentCorrelationContext(effect) {
|
|
9
|
+
const current = correlationStorage.getStore();
|
|
10
|
+
return current
|
|
11
|
+
? effect.pipe(Effect.locally(correlationContextFiberRef, current))
|
|
12
|
+
: effect;
|
|
13
|
+
}
|