/**
 * Prometheus metrics exporter for Effect's Metric system.
 *
 * This module snapshots the metrics registered in the current Effect context
 * and renders them in the Prometheus text exposition format. It is intended for
 * services that already record `Metric` counters, gauges, histograms,
 * frequencies, or summaries and need a pull-based `/metrics` endpoint, or for
 * integrations that want the formatted scrape body for a custom HTTP server.
 *
 * Use `format` when you need the current runtime's registry rendered as a
 * string, `formatUnsafe` when you already have the `Context`, and `layerHttp`
 * when an `HttpRouter` should serve `GET /metrics` directly. Formatting happens
 * at scrape time; the module does not push metrics, schedule exports, or start
 * an HTTP server on its own. Make sure the route is installed in the same
 * application context that records the metrics you want to expose.
 *
 * Metric and label names are sanitized for Prometheus, optional prefixes and
 * name mappers are applied before output, and metric attributes become labels.
 * Keep attributes low-cardinality, avoid relying on invalid characters being
 * preserved exactly, and configure Prometheus to scrape the route served by
 * `layerHttp` with the expected `text/plain; version=0.0.4` response.
 *
 * **Example** (Exporting Prometheus metrics)
 *
 * ```ts
 * import { Effect, Metric } from "effect"
 * import { PrometheusMetrics } from "effect/unstable/observability"
 *
 * const program = Effect.gen(function*() {
 *   // Create and update metrics
 *   const counter = Metric.counter("http_requests_total", {
 *     description: "Total HTTP requests"
 *   })
 *   yield* Metric.update(counter, 42)
 *
 *   // Format metrics for Prometheus
 *   const output = yield* PrometheusMetrics.format()
 *   console.log(output)
 *   // # HELP http_requests_total Total HTTP requests
 *   // # TYPE http_requests_total counter
 *   // http_requests_total 42
 * })
 * ```
 *
 * @since 4.0.0
 */
import type * as Context from "../../Context.ts";
import * as Effect from "../../Effect.ts";
import * as Layer from "../../Layer.ts";
import * as HttpRouter from "../http/HttpRouter.ts";
/**
 * A function that transforms metric names before formatting.
 *
 * **Example** (Mapping metric names)
 *
 * ```ts
 * import type { PrometheusMetrics } from "effect/unstable/observability"
 *
 * // Convert camelCase to snake_case
 * const mapper: PrometheusMetrics.MetricNameMapper = (name) =>
 *   name.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase()
 * ```
 *
 * @category models
 * @since 4.0.0
 */
export type MetricNameMapper = (name: string) => string;
/**
 * Options for formatting metrics.
 *
 * @category options
 * @since 4.0.0
 */
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;
}
/**
 * Options for exporting Prometheus metrics over HTTP.
 *
 * @category options
 * @since 4.0.0
 */
export interface HttpOptions extends FormatOptions {
    /**
     * The path to the HTTP route on which Prometheus metrics should be served.
     */
    readonly path?: HttpRouter.PathInput | undefined;
}
/**
 * Formats all metrics in the registry to Prometheus exposition format.
 *
 * **Example** (Formatting metrics)
 *
 * ```ts
 * 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" })
 * })
 * ```
 *
 * @category formatting
 * @since 4.0.0
 */
export declare const format: (options?: FormatOptions | undefined) => Effect.Effect<string>;
/**
 * Formats all metrics in the registry to Prometheus exposition format synchronously.
 *
 * **When to use**
 *
 * Use when you use this low-level function when you already have access to the context. Most
 * users should use `format` instead.
 *
 * @category formatting
 * @since 4.0.0
 */
export declare const formatUnsafe: (context: Context.Context<never>, options?: FormatOptions | undefined) => string;
/**
 * 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)
 *
 * ```ts
 * import { PrometheusMetrics } from "effect/unstable/observability"
 *
 * // Create a layer that adds /metrics endpoint to the router
 * const PrometheusLayer = PrometheusMetrics.layerHttp()
 *
 * // Or customize the path and add a prefix to all metric names
 * const CustomPrometheusLayer = PrometheusMetrics.layerHttp({
 *   path: "/prometheus/metrics",
 *   prefix: "myapp"
 * })
 * ```
 *
 * @category Http
 * @since 4.0.0
 */
export declare const layerHttp: (options?: HttpOptions | undefined) => Layer.Layer<never, never, HttpRouter.HttpRouter>;
//# sourceMappingURL=PrometheusMetrics.d.ts.map