import type { IncomingMessage, OutgoingHttpHeaders, OutgoingMessage } from 'node:http';
import type { Context as WebContext } from '@mwcp/share';
import { SpanKind, SpanStatusCode } from '@opentelemetry/api';
import type { Attributes, Context as TraceContext, Span } from '@opentelemetry/api';
import type { Headers as UndiciHeaders } from 'undici';
import type { Config } from './types.js';
/**
 * Return the span if one exists
 *
 * @param context context to get span from
 */
export declare function getSpan(context: TraceContext): Span | undefined;
/**
 * Set the span on a context
 *
 * @param context context to use as parent
 * @param span span to set active
 */
export declare function setSpan(context: TraceContext, span: Span): TraceContext;
/**
 * Remove current span stored in the context
 *
 * @param context context to delete span from
 */
export declare function deleteSpan(context: TraceContext): TraceContext;
export declare function isSpanEnded(span: Span): boolean;
/**
 * Parse status code from HTTP response.
 */
export declare function parseResponseStatus(kind: SpanKind, statusCode?: number): SpanStatusCode;
/**
 * Adds attributes for response content-length and content-encoding HTTP headers
 * @param { IncomingMessage } Response object whose headers will be analyzed
 * @param { Attributes } SpanAttributes object to be modified
 */
export declare function setResponseContentLengthAttribute(response: IncomingMessage, attributes: Attributes): void;
/**
 * Returns incoming request attributes scoped to the request data
 */
export declare function getIncomingRequestAttributesFromWebContext(ctx: WebContext, config: Config): Promise<Attributes>;
/**
 * Key format `http.{request|response}.header.{name}`
 * @param headersKeyMap Map<low-key, normalized-key>
 */
export declare function genAttributesFromHeader(type: 'request' | 'response', headersKeyMap: Map<string, string>, getHeader: (key: string) => string | number | undefined | string[]): Attributes | undefined;
/**
 * Returns map<lower string, lower and normalized string>
 */
export type NormalizedKeyMap = Map<string, string>;
export declare function normalizeHeaderKey(inputKeys: string[]): NormalizedKeyMap;
export declare function propagateOutgoingHeader(traceContext: TraceContext, message: OutgoingMessage): void;
/**
 * Skip if header already exists
 */
export declare function propagateHeader<T extends Headers | UndiciHeaders = Headers>(traceContext: TraceContext, headers: T): void;
/**
   *
   * @param headersKey if omit then use inner prepared headers key
   */
export declare function setSpanWithRequestHeaders(span: Span, requestHeadersMap: Map<string, string> | undefined, getHeader: (key: string) => string | number | undefined | string[], headersKey?: string[]): void;
interface AddSpanEventWithIncomingRequestDataOptions {
    headers?: Headers | OutgoingHttpHeaders | UndiciHeaders;
    query?: object;
    /** request data */
    requestBody: unknown;
    span: Span;
}
/**
 * String of JSON.stringify limited to 2048 characters
 */
export declare function addSpanEventWithIncomingRequestData(options: AddSpanEventWithIncomingRequestDataOptions): void;
export interface AddSpanEventWithOutgoingResponseDataOptions {
    /** return data */
    body: unknown;
    headers?: Headers | OutgoingHttpHeaders | UndiciHeaders;
    span: Span;
    /** response status code */
    status: number;
}
/**
 * String of JSON.stringify limited to 2048 characters
 */
export declare function addSpanEventWithOutgoingResponseData(options: AddSpanEventWithOutgoingResponseDataOptions): void;
export declare function truncateString(str: string, maxLength?: number): string;
export interface GenRequestSpanNameOptions {
    /** ctx.request?.protocol */
    protocol: string;
    /** ctx.method */
    method: string;
    route: string;
}
/**
 * Generate span name from request
 * @example
 * - 'HTTP GET /api/v1/user'
 * - 'RPC /helloworld.Greeter/SayHello'
 */
export declare function genRequestSpanName(options: GenRequestSpanNameOptions, maxLength?: number): string;
export {};
