Hyperlinkv0.8.0-beta.28

Metric

Metric.timerconsteffect/Metric.ts:2622
(
  name: string,
  options?: {
    readonly description?: string | undefined
    readonly attributes?: Metric.Attributes | undefined
    readonly boundaries?: ReadonlyArray<number>
  }
): Histogram<Duration.Duration>

Creates a timer metric, based on a Histogram, which keeps track of durations in milliseconds.

Details

The unit of time will automatically be added to the metric as a tag (i.e. "time_unit: milliseconds").

If options.boundaries is not provided, the boundaries will be computed using Metric.exponentialBoundaries({ start: 0.5, factor: 2, count: 35 }).

Example (Recording durations with a timer)

import { Data, Duration, Effect, Metric } from "effect"

class TimerError extends Data.TaggedError("TimerError")<{
  readonly operation: string
}> {}

// Create a timer metric to track API request durations
const apiRequestTimer = Metric.timer("api_request_duration", {
  description: "Duration of API requests",
  attributes: { service: "user-api" }
})

// Record a measured API operation duration
const apiOperation = Effect.gen(function*() {
  const duration = Duration.millis(120)
  yield* Metric.update(apiRequestTimer, duration)

  const state = yield* Metric.value(apiRequestTimer)
  console.log({
    count: state.count,
    min: state.min,
    max: state.max,
    sum: state.sum
  }) // { count: 1, min: 120, max: 120, sum: 120 }
})
constructors
Source effect/Metric.ts:262212 lines
export const timer = (name: string, options?: {
  readonly description?: string | undefined
  readonly attributes?: Metric.Attributes | undefined
  readonly boundaries?: ReadonlyArray<number>
}): Histogram<Duration.Duration> => {
  const boundaries = Predicate.isNotUndefined(options?.boundaries)
    ? options.boundaries
    : exponentialBoundaries({ start: 0.5, factor: 2, count: 35 })
  const attributes = mergeAttributes(options?.attributes, { time_unit: "milliseconds" })
  const metric = new HistogramMetric(name, { ...options, boundaries, attributes })
  return mapInput(metric, Duration.toMillis)
}