/// <reference types="node" />
import { IncomingMessage } from 'http';
import { Context } from 'koa';
import { ReportHandler } from './ReportHandler';
import { CaptureLogOptions, CaptureMonitor, CaptureSpanLogOptions, CaptureSpanOptions, Carrier, Counter, Format, Histogram, KnownLabel, Labels, LogErrorOptions, Logger, LogLevel, LogOptions, Monitor, Report, Span, SpanContext, SpanOptions, Summary } from './types';
export interface FullLogLevelOption {
    readonly log: LogLevel;
    readonly span: LogLevel;
}
export interface TracerSpan {
    readonly log: (data: object) => void;
    readonly setTag: (name: string, value: string | number | boolean) => void;
    readonly finish: (finishTime?: number) => void;
    readonly context: () => SpanContext;
}
export interface TracerReference {
    readonly __tracer: undefined;
}
export interface TracerStartSpanOptions {
    readonly references?: readonly TracerReference[];
    readonly tags?: object;
    readonly startTime?: number;
}
export interface Tracer {
    readonly startSpan: (name: string, options?: TracerStartSpanOptions) => TracerSpan;
    readonly childOf: (span: SpanContext | TracerSpan) => TracerReference;
    readonly followsFrom: (span: SpanContext | TracerSpan) => TracerReference;
    readonly extract: (format: Format, carrier: Carrier) => SpanContext | undefined;
    readonly inject: (context: SpanContext, format: Format, carrier: Carrier) => void;
    readonly close: (callback: () => void) => void;
}
export declare type Now = () => number;
export interface SpanData {
    readonly metric?: {
        readonly total: Histogram | Summary;
        readonly error: Counter;
    };
    readonly time: number;
    readonly span?: TracerSpan;
    readonly parent?: MonitorBase;
}
export interface MonitorBaseOptions {
    readonly service: string;
    readonly component: string;
    readonly labels?: Labels;
    readonly data?: Labels;
    readonly logger: Logger;
    readonly tracer?: Tracer;
    readonly now: Now;
    readonly spanLogLevel?: LogLevel;
    readonly span?: SpanData | void;
    readonly reportHandler?: ReportHandler;
}
export declare class MonitorBase implements Span {
    readonly labels: typeof KnownLabel;
    readonly formats: typeof Format;
    readonly now: Now;
    private readonly service;
    private readonly component;
    private mutableCurrentLabels;
    private mutableData;
    private readonly logger;
    private readonly spanLogLevel;
    private readonly tracer;
    private readonly span;
    private readonly reportHandler;
    constructor({ service, component, labels, data, logger, spanLogLevel, tracer, now, span, reportHandler, }: MonitorBaseOptions);
    nowSeconds(): number;
    at(component: string): Monitor;
    withLabels(labels: Labels): Monitor;
    withData(data: Labels): Monitor;
    forContext(_ctx: Context): Monitor;
    forMessage(_ctx: IncomingMessage): Monitor;
    log({ name, message, level, metric, error }: LogOptions): void;
    captureLog(func: (monitor: CaptureMonitor) => any, options: CaptureLogOptions, cloned?: boolean): any;
    logError({ name, message, level, error, metric }: LogErrorOptions): void;
    startSpan({ name, level, metric, references, trace }: SpanOptions): MonitorBase;
    end(error?: boolean): void;
    captureSpan(func: (span: MonitorBase) => any, options: CaptureSpanOptions): any;
    captureSpanLog(func: (span: CaptureMonitor) => any, options: CaptureSpanLogOptions): any;
    childOf(span: SpanContext | Monitor | void): any;
    followsFrom(span: SpanContext | Monitor | void): any;
    extract(format: Format, carrier: Carrier): SpanContext | undefined;
    inject(format: Format, carrier: Carrier): void;
    report(report: Report): void;
    serveMetrics(_port: number): void;
    close(callback: () => void): void;
    setLabels(labels: Labels): void;
    setData(data: Labels): void;
    hasSpan(): boolean;
    getSpan(): SpanData;
    protected closeInternal(): Promise<void>;
    private invokeMetric;
    private commonLog;
    private getErrorKind;
    private getSpanTags;
    private getAllRawLabels;
    private getAllRawData;
    private setSpanLabels;
    private getFullLevel;
    private clone;
}
