FiberRuntimeMetricsServiceDefault implementation of the fiber runtime metrics service.
Example (Accessing the default fiber metrics implementation)
import { Data, Effect, Layer, Metric } from "effect"
class MetricsError extends Data.TaggedError("MetricsError")<{
readonly operation: string
}> {}
const program = Effect.gen(function*() {
// Use the default metrics implementation
const metrics = Metric.FiberRuntimeMetricsImpl
console.log("Metrics implementation:", metrics)
// Enable runtime metrics using the default implementation
const layer = Layer.succeed(Metric.FiberRuntimeMetrics)(metrics)
return yield* Effect.gen(function*() {
// Run some Effects to trigger metric collection
yield* Effect.forkChild(Effect.sleep("50 millis"))
yield* Effect.forkChild(Effect.sleep("100 millis"))
// Wait a bit and check the metrics
yield* Effect.sleep("200 millis")
// Create test metrics to demonstrate the implementation
const testCounter = Metric.counter("test_counter")
const testGauge = Metric.gauge("test_gauge")
yield* Metric.update(testCounter, 3)
yield* Metric.update(testGauge, 42)
const counterValue = yield* Metric.value(testCounter)
const gaugeValue = yield* Metric.value(testGauge)
return { counter: counterValue, gauge: gaugeValue }
}).pipe(Effect.provide(layer))
})metrics
Source effect/Metric.ts:367214 lines
export const const FiberRuntimeMetricsImpl: FiberRuntimeMetricsServiceconst FiberRuntimeMetricsImpl: {
recordFiberStart: (context: Context.Context<never>) => void;
recordFiberEnd: (context: Context.Context<never>, exit: Exit<unknown, unknown>) => void;
}
Default implementation of the fiber runtime metrics service.
Example (Accessing the default fiber metrics implementation)
import { Data, Effect, Layer, Metric } from "effect"
class MetricsError extends Data.TaggedError("MetricsError")<{
readonly operation: string
}> {}
const program = Effect.gen(function*() {
// Use the default metrics implementation
const metrics = Metric.FiberRuntimeMetricsImpl
console.log("Metrics implementation:", metrics)
// Enable runtime metrics using the default implementation
const layer = Layer.succeed(Metric.FiberRuntimeMetrics)(metrics)
return yield* Effect.gen(function*() {
// Run some Effects to trigger metric collection
yield* Effect.forkChild(Effect.sleep("50 millis"))
yield* Effect.forkChild(Effect.sleep("100 millis"))
// Wait a bit and check the metrics
yield* Effect.sleep("200 millis")
// Create test metrics to demonstrate the implementation
const testCounter = Metric.counter("test_counter")
const testGauge = Metric.gauge("test_gauge")
yield* Metric.update(testCounter, 3)
yield* Metric.update(testGauge, 42)
const counterValue = yield* Metric.value(testCounter)
const gaugeValue = yield* Metric.value(testGauge)
return { counter: counterValue, gauge: gaugeValue }
}).pipe(Effect.provide(layer))
})
FiberRuntimeMetricsImpl: FiberRuntimeMetricsService = {
FiberRuntimeMetricsService.recordFiberStart: (context: Context.Context<never>) => voidrecordFiberStart(context: Context.Context<never>(parameter) context: {
mapUnsafe: ReadonlyMap<string, any>;
mutable: boolean;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
context: import ContextContext.type Context.Context = /*unresolved*/ anyContext<never>) {
const fibersStarted: Counter<number>const fibersStarted: {
Input: Contravariant<Input>;
State: Covariant<State>;
id: string;
type: Metric.Type;
description: string | undefined;
attributes: Metric.AttributeSet | undefined;
valueUnsafe: (context: Context.Context<never>) => State;
updateUnsafe: (input: Input, context: Context.Context<never>) => void;
modifyUnsafe: (input: Input, context: Context.Context<never>) => void;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
fibersStarted.Metric<number, CounterState<number>>.updateUnsafe: (input: Input, context: Context.Context<never>) => voidupdateUnsafe(1, context: Context.Context<never>(parameter) context: {
mapUnsafe: ReadonlyMap<string, any>;
mutable: boolean;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
context)
const fibersActive: Gauge<number>const fibersActive: {
Input: Contravariant<Input>;
State: Covariant<State>;
id: string;
type: Metric.Type;
description: string | undefined;
attributes: Metric.AttributeSet | undefined;
valueUnsafe: (context: Context.Context<never>) => State;
updateUnsafe: (input: Input, context: Context.Context<never>) => void;
modifyUnsafe: (input: Input, context: Context.Context<never>) => void;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
fibersActive.Metric<number, GaugeState<number>>.modifyUnsafe: (input: Input, context: Context.Context<never>) => voidmodifyUnsafe(1, context: Context.Context<never>(parameter) context: {
mapUnsafe: ReadonlyMap<string, any>;
mutable: boolean;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
context)
},
FiberRuntimeMetricsService.recordFiberEnd: (context: Context.Context<never>, exit: Exit<unknown, unknown>) => voidrecordFiberEnd(context: Context.Context<never>(parameter) context: {
mapUnsafe: ReadonlyMap<string, any>;
mutable: boolean;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
context: import ContextContext.type Context.Context = /*unresolved*/ anyContext<never>, exit: Exit<unknown, unknown>exit: import ExitExit<unknown, unknown>) {
const fibersActive: Gauge<number>const fibersActive: {
Input: Contravariant<Input>;
State: Covariant<State>;
id: string;
type: Metric.Type;
description: string | undefined;
attributes: Metric.AttributeSet | undefined;
valueUnsafe: (context: Context.Context<never>) => State;
updateUnsafe: (input: Input, context: Context.Context<never>) => void;
modifyUnsafe: (input: Input, context: Context.Context<never>) => void;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
fibersActive.Metric<number, GaugeState<number>>.modifyUnsafe: (input: Input, context: Context.Context<never>) => voidmodifyUnsafe(-1, context: Context.Context<never>(parameter) context: {
mapUnsafe: ReadonlyMap<string, any>;
mutable: boolean;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
context)
if (import InternalEffectInternalEffect.const exitIsSuccess: <A, E>(
self: Exit.Exit<A, E>
) => self is Exit.Success<A, E>
exitIsSuccess(exit: Exit<unknown, unknown>exit)) {
const fiberSuccesses: Counter<number>const fiberSuccesses: {
Input: Contravariant<Input>;
State: Covariant<State>;
id: string;
type: Metric.Type;
description: string | undefined;
attributes: Metric.AttributeSet | undefined;
valueUnsafe: (context: Context.Context<never>) => State;
updateUnsafe: (input: Input, context: Context.Context<never>) => void;
modifyUnsafe: (input: Input, context: Context.Context<never>) => void;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
fiberSuccesses.Metric<number, CounterState<number>>.updateUnsafe: (input: Input, context: Context.Context<never>) => voidupdateUnsafe(1, context: Context.Context<never>(parameter) context: {
mapUnsafe: ReadonlyMap<string, any>;
mutable: boolean;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
context)
} else {
const fiberFailures: Counter<number>const fiberFailures: {
Input: Contravariant<Input>;
State: Covariant<State>;
id: string;
type: Metric.Type;
description: string | undefined;
attributes: Metric.AttributeSet | undefined;
valueUnsafe: (context: Context.Context<never>) => State;
updateUnsafe: (input: Input, context: Context.Context<never>) => void;
modifyUnsafe: (input: Input, context: Context.Context<never>) => void;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
fiberFailures.Metric<number, CounterState<number>>.updateUnsafe: (input: Input, context: Context.Context<never>) => voidupdateUnsafe(1, context: Context.Context<never>(parameter) context: {
mapUnsafe: ReadonlyMap<string, any>;
mutable: boolean;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
context)
}
}
}Referenced by 2 symbols