@mwcp/otel
Version:
midway component for open telemetry
100 lines (99 loc) • 4.07 kB
TypeScript
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 {};