otel-instrumentation-postgres
Version:
OpenTelemetry instrumentation for postgres.js
96 lines (88 loc) • 3.18 kB
text/typescript
import postgres from 'postgres';
import { Span } from '@opentelemetry/api';
import { InstrumentationBase, InstrumentationConfig, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';
type Logger = {
debug?: (msg: string, ...args: unknown[]) => void;
info?: (msg: string, ...args: unknown[]) => void;
error?: (msg: string, ...args: unknown[]) => void;
};
// Type for the postgres client
type PostgresClient = ReturnType<typeof postgres>;
declare function createOTELEmitter(client: PostgresClient, logger?: Logger): PostgresClient;
type DbQueryEvent = {
sql: string;
params: unknown[];
result?: unknown;
error?: unknown;
durationMs: number;
databaseName?: string;
context?: unknown;
};
/** biome-ignore-all assist/source/organizeImports: TODO: My editor doesn't support this. */
type ParameterSanitizer = (param: unknown) => string;
type BeforeSpanHook = (span: Span, event: DbQueryEvent) => void;
type AfterSpanHook = (span: Span, event: DbQueryEvent) => void;
type ResponseHook = (span: Span, result: unknown) => void;
interface PostgresInstrumentationConfig extends InstrumentationConfig {
serviceName?: string;
logger?: Logger;
enableHistogram?: boolean;
histogramBuckets?: number[];
collectQueryParameters?: boolean;
serverAddress?: string;
serverPort?: number;
databaseName?: string;
parameterSanitizer?: ParameterSanitizer;
beforeSpan?: BeforeSpanHook;
afterSpan?: AfterSpanHook;
responseHook?: ResponseHook;
}
declare class PostgresInstrumentation extends InstrumentationBase {
private customLogger;
private serviceName;
private listener;
private enableHistogram;
private histogramBuckets;
private collectQueryParameters;
private serverAddress;
private serverPort;
private databaseName;
private parameterSanitizer;
private beforeSpan?;
private afterSpan?;
private responseHook?;
private queryDurationHistogram;
private queryCounter;
private errorCounter;
private connectionCounter;
private connectionDurationHistogram;
private connectionStartTimes;
constructor(config?: PostgresInstrumentationConfig);
protected init(): InstrumentationNodeModuleDefinition[];
protected onMeterInitialized(): void;
private initializeMetrics;
enable(): void;
disable(): void;
private setupEventListeners;
private removeEventListeners;
private handleQueryEvent;
private handleConnectionEvent;
private sanitizeQuery;
private addQueryParameters;
private defaultParameterSanitizer;
private getErrorType;
private recordMetrics;
private getQueryType;
static registerDbQueryReceiver(options?: {
serviceName?: string;
enableHistogram?: boolean;
collectQueryParameters?: boolean;
serverAddress?: string;
serverPort?: number;
parameterSanitizer?: ParameterSanitizer;
beforeSpan?: BeforeSpanHook;
afterSpan?: AfterSpanHook;
responseHook?: ResponseHook;
}, logger?: Logger): PostgresInstrumentation;
}
export { type Logger, PostgresInstrumentation, createOTELEmitter };