import { WebTracerProvider, Tracer } from '@opentelemetry/sdk-trace-web';
import { Logger } from '@opentelemetry/api-logs';
import { LoggerProvider } from '@opentelemetry/sdk-logs';
import { MeterOptions, Meter } from '@opentelemetry/api';
import { MeterProvider } from '@opentelemetry/sdk-metrics';

type LogLevel = "DEBUG" | "INFO" | "WARN" | "ERROR";
interface ConsoleArgs {
    level_from: LogLevel;
    custom_out?: (message: string) => void;
}
interface OltpArgs {
    level_from: LogLevel;
    endpoint: string;
    service_name: string;
    service_version: string;
}
type ConsoleFns = Record<"log" | "debug" | "info" | "warn" | "error", (message: string, ...optionalParams: any[]) => void>;
declare class GlobalLog {
    loggerProvider: LoggerProvider;
    logger: Logger;
    tracerProvider: WebTracerProvider;
    tracer: Tracer;
    meterProvider: MeterProvider;
    console: ConsoleArgs | null;
    oltp: OltpArgs;
    orig_console_fns: ConsoleFns;
    /**
     * Get a new Meter instance to record metrics with.
     *
     * @example
     *  ```typescript
     * const meter = globalLog.getMeter("example-meter");
     * const counter = meter.createCounter('metric_name');
     * counter.add(10, { 'key': 'value' });
     * ```
     */
    meter(name: string, opts?: MeterOptions | {
        version?: string;
    }): Meter;
    /**
     * Run a sync callback inside a span.
     */
    withSpan<T>(name: string, cb: (span: any) => T): T;
    /**
     * Run an async callback inside a span.
     */
    withSpanAsync<T>(name: string, cb: (span: any) => Promise<T>): Promise<T>;
    /** Log a debug message. */
    debug(message: string, ...attrs: any[]): void;
    /** Log an info message. */
    info(message: string, ...attrs: any[]): void;
    /** Log a warning message. */
    warn(message: string, ...attrs: any[]): void;
    /** Log an error message. */
    error(message: string, ...attrs: any[]): void;
    _joined_msg_and_attrs(message: string, attrs: any[]): string;
    _log_inner(severityText: LogLevel, message: string, ...attrs: any[]): void;
    _set_console_fns(): void;
    /** Create the global logger, must setup oltp (http), console can be optionally setup and will just print logs. */
    constructor({ otlp, console, }: {
        console?: ConsoleArgs;
        otlp: OltpArgs;
    });
}
declare const LOG: GlobalLog;

export { GlobalLog, LOG, type LogLevel };
