@glasstrace/sdk 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,5 @@
1
+ import "../chunk-PZ5AY32C.js";
2
+
1
3
  // src/adapters/drizzle.ts
2
4
  import { trace, SpanKind } from "@opentelemetry/api";
3
5
  function extractOperation(query) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/drizzle.ts"],"sourcesContent":["import { trace, SpanKind, type Tracer } from \"@opentelemetry/api\";\n\n/**\n * Options for the Glasstrace Drizzle logger.\n */\nexport interface GlasstraceDrizzleLoggerOptions {\n /** Whether to capture query parameters. Defaults to false (safe default). */\n captureParams?: boolean;\n}\n\n/**\n * Extracts the SQL operation (SELECT, INSERT, UPDATE, DELETE) from a query.\n * Returns 'unknown' if the operation cannot be determined.\n */\nfunction extractOperation(query: string): string {\n const trimmed = query.trimStart().toUpperCase();\n if (trimmed.startsWith(\"SELECT\")) return \"SELECT\";\n if (trimmed.startsWith(\"INSERT\")) return \"INSERT\";\n if (trimmed.startsWith(\"UPDATE\")) return \"UPDATE\";\n if (trimmed.startsWith(\"DELETE\")) return \"DELETE\";\n return \"unknown\";\n}\n\n/**\n * Extracts the table name from a SQL query using best-effort regex.\n * Returns undefined if the table cannot be determined.\n */\nfunction extractTable(query: string): string | undefined {\n // FROM table_name (SELECT, DELETE)\n const fromMatch = /\\bFROM\\s+[\"'`]?(\\w+)[\"'`]?/i.exec(query);\n if (fromMatch) return fromMatch[1];\n\n // INSERT INTO table_name\n const insertMatch = /\\bINSERT\\s+INTO\\s+[\"'`]?(\\w+)[\"'`]?/i.exec(query);\n if (insertMatch) return insertMatch[1];\n\n // UPDATE table_name\n const updateMatch = /\\bUPDATE\\s+[\"'`]?(\\w+)[\"'`]?/i.exec(query);\n if (updateMatch) return updateMatch[1];\n\n return undefined;\n}\n\n/**\n * Implements Drizzle's Logger interface to create OTel spans for Drizzle queries.\n *\n * Exported via `@glasstrace/sdk/drizzle` subpath to avoid bundling Drizzle\n * for Prisma-only users.\n *\n * When OTel is not initialized, tracer.startSpan() returns a no-op span\n * and the logger still executes without errors.\n */\nexport class GlasstraceDrizzleLogger {\n private readonly tracer: Tracer;\n private readonly captureParams: boolean;\n\n constructor(options?: GlasstraceDrizzleLoggerOptions) {\n this.tracer = trace.getTracer(\"glasstrace-drizzle\");\n this.captureParams = options?.captureParams ?? false;\n }\n\n /**\n * Called by Drizzle ORM for each query execution.\n * Creates an OTel span with query metadata.\n */\n logQuery(query: string, params: unknown[]): void {\n const operation = extractOperation(query);\n const spanName =\n operation === \"unknown\" ? \"drizzle.query\" : `drizzle.${operation}`;\n\n const span = this.tracer.startSpan(spanName, {\n kind: SpanKind.CLIENT,\n attributes: {\n \"db.system\": \"drizzle\",\n \"db.statement\": query,\n \"db.operation\": operation,\n \"glasstrace.orm.provider\": \"drizzle\",\n },\n });\n\n // Table extraction\n const table = extractTable(query);\n if (table !== undefined) {\n span.setAttribute(\"db.sql.table\", table);\n }\n\n // Param handling\n if (this.captureParams) {\n try {\n span.setAttribute(\"db.sql.params\", JSON.stringify(params));\n } catch {\n span.setAttribute(\"db.sql.params\", \"[serialization_error]\");\n }\n } else {\n span.setAttribute(\"db.sql.params\", \"[REDACTED]\");\n }\n\n span.end();\n }\n}\n"],"mappings":";AAAA,SAAS,OAAO,gBAA6B;AAc7C,SAAS,iBAAiB,OAAuB;AAC/C,QAAM,UAAU,MAAM,UAAU,EAAE,YAAY;AAC9C,MAAI,QAAQ,WAAW,QAAQ,EAAG,QAAO;AACzC,MAAI,QAAQ,WAAW,QAAQ,EAAG,QAAO;AACzC,MAAI,QAAQ,WAAW,QAAQ,EAAG,QAAO;AACzC,MAAI,QAAQ,WAAW,QAAQ,EAAG,QAAO;AACzC,SAAO;AACT;AAMA,SAAS,aAAa,OAAmC;AAEvD,QAAM,YAAY,8BAA8B,KAAK,KAAK;AAC1D,MAAI,UAAW,QAAO,UAAU,CAAC;AAGjC,QAAM,cAAc,uCAAuC,KAAK,KAAK;AACrE,MAAI,YAAa,QAAO,YAAY,CAAC;AAGrC,QAAM,cAAc,gCAAgC,KAAK,KAAK;AAC9D,MAAI,YAAa,QAAO,YAAY,CAAC;AAErC,SAAO;AACT;AAWO,IAAM,0BAAN,MAA8B;AAAA,EAClB;AAAA,EACA;AAAA,EAEjB,YAAY,SAA0C;AACpD,SAAK,SAAS,MAAM,UAAU,oBAAoB;AAClD,SAAK,gBAAgB,SAAS,iBAAiB;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAe,QAAyB;AAC/C,UAAM,YAAY,iBAAiB,KAAK;AACxC,UAAM,WACJ,cAAc,YAAY,kBAAkB,WAAW,SAAS;AAElE,UAAM,OAAO,KAAK,OAAO,UAAU,UAAU;AAAA,MAC3C,MAAM,SAAS;AAAA,MACf,YAAY;AAAA,QACV,aAAa;AAAA,QACb,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,2BAA2B;AAAA,MAC7B;AAAA,IACF,CAAC;AAGD,UAAM,QAAQ,aAAa,KAAK;AAChC,QAAI,UAAU,QAAW;AACvB,WAAK,aAAa,gBAAgB,KAAK;AAAA,IACzC;AAGA,QAAI,KAAK,eAAe;AACtB,UAAI;AACF,aAAK,aAAa,iBAAiB,KAAK,UAAU,MAAM,CAAC;AAAA,MAC3D,QAAQ;AACN,aAAK,aAAa,iBAAiB,uBAAuB;AAAA,MAC5D;AAAA,IACF,OAAO;AACL,WAAK,aAAa,iBAAiB,YAAY;AAAA,IACjD;AAEA,SAAK,IAAI;AAAA,EACX;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/adapters/drizzle.ts"],"sourcesContent":["import { trace, SpanKind, type Tracer } from \"@opentelemetry/api\";\n\n/**\n * Options for the Glasstrace Drizzle logger.\n */\nexport interface GlasstraceDrizzleLoggerOptions {\n /** Whether to capture query parameters. Defaults to false (safe default). */\n captureParams?: boolean;\n}\n\n/**\n * Extracts the SQL operation (SELECT, INSERT, UPDATE, DELETE) from a query.\n * Returns 'unknown' if the operation cannot be determined.\n */\nfunction extractOperation(query: string): string {\n const trimmed = query.trimStart().toUpperCase();\n if (trimmed.startsWith(\"SELECT\")) return \"SELECT\";\n if (trimmed.startsWith(\"INSERT\")) return \"INSERT\";\n if (trimmed.startsWith(\"UPDATE\")) return \"UPDATE\";\n if (trimmed.startsWith(\"DELETE\")) return \"DELETE\";\n return \"unknown\";\n}\n\n/**\n * Extracts the table name from a SQL query using best-effort regex.\n * Returns undefined if the table cannot be determined.\n */\nfunction extractTable(query: string): string | undefined {\n // FROM table_name (SELECT, DELETE)\n const fromMatch = /\\bFROM\\s+[\"'`]?(\\w+)[\"'`]?/i.exec(query);\n if (fromMatch) return fromMatch[1];\n\n // INSERT INTO table_name\n const insertMatch = /\\bINSERT\\s+INTO\\s+[\"'`]?(\\w+)[\"'`]?/i.exec(query);\n if (insertMatch) return insertMatch[1];\n\n // UPDATE table_name\n const updateMatch = /\\bUPDATE\\s+[\"'`]?(\\w+)[\"'`]?/i.exec(query);\n if (updateMatch) return updateMatch[1];\n\n return undefined;\n}\n\n/**\n * Implements Drizzle's Logger interface to create OTel spans for Drizzle queries.\n *\n * Exported via `@glasstrace/sdk/drizzle` subpath to avoid bundling Drizzle\n * for Prisma-only users.\n *\n * When OTel is not initialized, tracer.startSpan() returns a no-op span\n * and the logger still executes without errors.\n */\nexport class GlasstraceDrizzleLogger {\n private readonly tracer: Tracer;\n private readonly captureParams: boolean;\n\n constructor(options?: GlasstraceDrizzleLoggerOptions) {\n this.tracer = trace.getTracer(\"glasstrace-drizzle\");\n this.captureParams = options?.captureParams ?? false;\n }\n\n /**\n * Called by Drizzle ORM for each query execution.\n * Creates an OTel span with query metadata.\n */\n logQuery(query: string, params: unknown[]): void {\n const operation = extractOperation(query);\n const spanName =\n operation === \"unknown\" ? \"drizzle.query\" : `drizzle.${operation}`;\n\n const span = this.tracer.startSpan(spanName, {\n kind: SpanKind.CLIENT,\n attributes: {\n \"db.system\": \"drizzle\",\n \"db.statement\": query,\n \"db.operation\": operation,\n \"glasstrace.orm.provider\": \"drizzle\",\n },\n });\n\n // Table extraction\n const table = extractTable(query);\n if (table !== undefined) {\n span.setAttribute(\"db.sql.table\", table);\n }\n\n // Param handling\n if (this.captureParams) {\n try {\n span.setAttribute(\"db.sql.params\", JSON.stringify(params));\n } catch {\n span.setAttribute(\"db.sql.params\", \"[serialization_error]\");\n }\n } else {\n span.setAttribute(\"db.sql.params\", \"[REDACTED]\");\n }\n\n span.end();\n }\n}\n"],"mappings":";;;AAAA,SAAS,OAAO,gBAA6B;AAc7C,SAAS,iBAAiB,OAAuB;AAC/C,QAAM,UAAU,MAAM,UAAU,EAAE,YAAY;AAC9C,MAAI,QAAQ,WAAW,QAAQ,EAAG,QAAO;AACzC,MAAI,QAAQ,WAAW,QAAQ,EAAG,QAAO;AACzC,MAAI,QAAQ,WAAW,QAAQ,EAAG,QAAO;AACzC,MAAI,QAAQ,WAAW,QAAQ,EAAG,QAAO;AACzC,SAAO;AACT;AAMA,SAAS,aAAa,OAAmC;AAEvD,QAAM,YAAY,8BAA8B,KAAK,KAAK;AAC1D,MAAI,UAAW,QAAO,UAAU,CAAC;AAGjC,QAAM,cAAc,uCAAuC,KAAK,KAAK;AACrE,MAAI,YAAa,QAAO,YAAY,CAAC;AAGrC,QAAM,cAAc,gCAAgC,KAAK,KAAK;AAC9D,MAAI,YAAa,QAAO,YAAY,CAAC;AAErC,SAAO;AACT;AAWO,IAAM,0BAAN,MAA8B;AAAA,EAClB;AAAA,EACA;AAAA,EAEjB,YAAY,SAA0C;AACpD,SAAK,SAAS,MAAM,UAAU,oBAAoB;AAClD,SAAK,gBAAgB,SAAS,iBAAiB;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAe,QAAyB;AAC/C,UAAM,YAAY,iBAAiB,KAAK;AACxC,UAAM,WACJ,cAAc,YAAY,kBAAkB,WAAW,SAAS;AAElE,UAAM,OAAO,KAAK,OAAO,UAAU,UAAU;AAAA,MAC3C,MAAM,SAAS;AAAA,MACf,YAAY;AAAA,QACV,aAAa;AAAA,QACb,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,2BAA2B;AAAA,MAC7B;AAAA,IACF,CAAC;AAGD,UAAM,QAAQ,aAAa,KAAK;AAChC,QAAI,UAAU,QAAW;AACvB,WAAK,aAAa,gBAAgB,KAAK;AAAA,IACzC;AAGA,QAAI,KAAK,eAAe;AACtB,UAAI;AACF,aAAK,aAAa,iBAAiB,KAAK,UAAU,MAAM,CAAC;AAAA,MAC3D,QAAQ;AACN,aAAK,aAAa,iBAAiB,uBAAuB;AAAA,MAC5D;AAAA,IACF,OAAO;AACL,WAAK,aAAa,iBAAiB,YAAY;AAAA,IACjD;AAEA,SAAK,IAAI;AAAA,EACX;AACF;","names":[]}