PrometheusMetrics.ts
PrometheusMetrics.ts overview
Section titled “PrometheusMetrics.ts overview”Formats Effect metrics for Prometheus.
This module reads metrics from the current Effect context and renders them in
the Prometheus text format. It can also register a pull-based HTTP endpoint,
such as /metrics, for Prometheus to scrape.
Since v4.0.0
Exports Grouped by Category
Section titled “Exports Grouped by Category”layerHttp
Section titled “layerHttp”Creates a Layer that registers a /metrics HTTP endpoint for Prometheus
scraping.
Details
This layer automatically adds a GET route to your HTTP router that serves
metrics in Prometheus exposition format. By default, the endpoint is
registered at /metrics, but this can be customized via the path option.
Example (Serving metrics over HTTP)
import { PrometheusMetrics } from "effect/unstable/observability"
// Create a layer that adds /metrics endpoint to the routerconst PrometheusLayer = PrometheusMetrics.layerHttp()
// Or customize the path and add a prefix to all metric namesconst CustomPrometheusLayer = PrometheusMetrics.layerHttp({ path: "/prometheus/metrics", prefix: "myapp"})Signature
declare const layerHttp: (options?: HttpOptions | undefined) => Layer.Layer<never, never, HttpRouter.HttpRouter>Since v4.0.0
formatting
Section titled “formatting”format
Section titled “format”Formats all metrics in the registry to Prometheus exposition format.
Example (Formatting metrics)
import { Effect, Metric } from "effect"import { PrometheusMetrics } from "effect/unstable/observability"
const program = Effect.gen(function* () { const counter = Metric.counter("api_requests_total", { description: "Total API requests" }) const gauge = Metric.gauge("active_connections", { description: "Number of active connections" })
yield* Metric.update(counter, 100) yield* Metric.update(gauge, 25)
// Format without prefix const output1 = yield* PrometheusMetrics.format()
// Format with prefix const output2 = yield* PrometheusMetrics.format({ prefix: "myapp" })})Signature
declare const format: (options?: FormatOptions | undefined) => Effect.Effect<string>Since v4.0.0
formatUnsafe
Section titled “formatUnsafe”Formats all metrics in the registry to Prometheus exposition format synchronously.
When to use
Use when you already have access to the context and need low-level synchronous formatting.
See
formatfor effectful formatting from the current context
Signature
declare const formatUnsafe: (context: Context.Context<never>, options?: FormatOptions | undefined) => stringSince v4.0.0
models
Section titled “models”MetricNameMapper (type alias)
Section titled “MetricNameMapper (type alias)”A function that transforms metric names before formatting.
Example (Mapping metric names)
import type { PrometheusMetrics } from "effect/unstable/observability"
// Convert camelCase to snake_caseconst mapper: PrometheusMetrics.MetricNameMapper = (name) => name.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase()Signature
type MetricNameMapper = (name: string) => stringSince v4.0.0
options
Section titled “options”FormatOptions (interface)
Section titled “FormatOptions (interface)”Options for formatting metrics.
Signature
export interface FormatOptions { /** * Optional prefix to prepend to all metric names. * The prefix will be sanitized and joined with an underscore. */ readonly prefix?: string | undefined /** * Optional function to transform metric names before sanitization. */ readonly metricNameMapper?: MetricNameMapper | undefined}Since v4.0.0
HttpOptions (interface)
Section titled “HttpOptions (interface)”Options for exporting Prometheus metrics over HTTP.
Signature
export interface HttpOptions extends FormatOptions { /** * The path to the HTTP route on which Prometheus metrics should be served. */ readonly path?: HttpRouter.PathInput | undefined}Since v4.0.0