CounterState<Input>State interface for Counter metrics containing the current count and increment mode.
Example (Reading counter state)
import { Data, Effect, Metric } from "effect"
class CounterStateError extends Data.TaggedError("CounterStateError")<{
readonly operation: string
}> {}
const program = Effect.gen(function*() {
// Create different types of counters
const requestCounter = Metric.counter("http_requests_total")
const errorCounter = Metric.counter("errors_total", { incremental: true })
const byteCounter = Metric.counter("bytes_processed", { bigint: true })
// Update counters
yield* Metric.update(requestCounter, 5) // Add 5 requests
yield* Metric.update(requestCounter, -2) // Subtract 2 (allowed for non-incremental)
yield* Metric.update(errorCounter, 3) // Add 3 errors
yield* Metric.update(errorCounter, -1) // Attempt to subtract (ignored for incremental)
yield* Metric.update(byteCounter, 1024000n) // Add bytes as bigint
// Read counter states
const requestState: Metric.CounterState<number> = yield* Metric.value(
requestCounter
)
const errorState: Metric.CounterState<number> = yield* Metric.value(
errorCounter
)
const byteState: Metric.CounterState<bigint> = yield* Metric.value(
byteCounter
)
// CounterState contains:
// - count: current count value (number or bigint based on counter type)
// - incremental: whether counter only allows increases
return {
requests: {
total: requestState.count, // 3 (5 - 2, decrements allowed)
canDecrease: !requestState.incremental // true
},
errors: {
total: errorState.count, // 3 (subtract ignored)
canDecrease: !errorState.incremental // false
},
bytes: {
total: byteState.count, // 1024000n
canDecrease: !byteState.incremental // true
}
}
})Counter
Source effect/Metric.ts:2484 lines
export interface interface CounterState<in Input extends number | bigint>State interface for Counter metrics containing the current count and increment mode.
Example (Reading counter state)
import { Data, Effect, Metric } from "effect"
class CounterStateError extends Data.TaggedError("CounterStateError")<{
readonly operation: string
}> {}
const program = Effect.gen(function*() {
// Create different types of counters
const requestCounter = Metric.counter("http_requests_total")
const errorCounter = Metric.counter("errors_total", { incremental: true })
const byteCounter = Metric.counter("bytes_processed", { bigint: true })
// Update counters
yield* Metric.update(requestCounter, 5) // Add 5 requests
yield* Metric.update(requestCounter, -2) // Subtract 2 (allowed for non-incremental)
yield* Metric.update(errorCounter, 3) // Add 3 errors
yield* Metric.update(errorCounter, -1) // Attempt to subtract (ignored for incremental)
yield* Metric.update(byteCounter, 1024000n) // Add bytes as bigint
// Read counter states
const requestState: Metric.CounterState<number> = yield* Metric.value(
requestCounter
)
const errorState: Metric.CounterState<number> = yield* Metric.value(
errorCounter
)
const byteState: Metric.CounterState<bigint> = yield* Metric.value(
byteCounter
)
// CounterState contains:
// - count: current count value (number or bigint based on counter type)
// - incremental: whether counter only allows increases
return {
requests: {
total: requestState.count, // 3 (5 - 2, decrements allowed)
canDecrease: !requestState.incremental // true
},
errors: {
total: errorState.count, // 3 (subtract ignored)
canDecrease: !errorState.incremental // false
},
bytes: {
total: byteState.count, // 1024000n
canDecrease: !byteState.incremental // true
}
}
})
CounterState<in function (type parameter) Input in CounterState<in Input extends number | bigint>Input extends number | bigint> {
readonly CounterState<in Input extends number | bigint>.count: Input extends bigint ? bigint : numbercount: function (type parameter) Input in CounterState<in Input extends number | bigint>Input extends bigint ? bigint : number
readonly CounterState<in Input extends number | bigint>.incremental: booleanincremental: boolean
}Referenced by 2 symbols