@@ -56,9 +56,7 @@ import { LoggerSpanExporter } from "./telemetry/loggerExporter.server";
5656import { CompactMetricExporter } from "./telemetry/compactMetricExporter.server" ;
5757import { logger } from "~/services/logger.server" ;
5858import { flattenAttributes } from "@trigger.dev/core/v3" ;
59- import { prisma } from "~/db.server" ;
6059import { metricsRegister } from "~/metrics.server" ;
61- import type { Prisma } from "@trigger.dev/database" ;
6260import { performance } from "node:perf_hooks" ;
6361
6462export const SEMINTATTRS_FORCE_RECORDING = "forceRecording" ;
@@ -352,221 +350,12 @@ function setupMetrics() {
352350
353351 const meter = meterProvider . getMeter ( "trigger.dev" , "3.3.12" ) ;
354352
355- configurePrismaMetrics ( { meter } ) ;
356353 configureNodejsMetrics ( { meter } ) ;
357354 configureHostMetrics ( { meterProvider } ) ;
358355
359356 return meter ;
360357}
361358
362- function configurePrismaMetrics ( { meter } : { meter : Meter } ) {
363- // Counters
364- const queriesTotal = meter . createObservableCounter ( "db.client.queries.total" , {
365- description : "Total number of Prisma Client queries executed" ,
366- unit : "queries" ,
367- } ) ;
368- const datasourceQueriesTotal = meter . createObservableCounter ( "db.datasource.queries.total" , {
369- description : "Total number of datasource queries executed" ,
370- unit : "queries" ,
371- } ) ;
372- const connectionsOpenedTotal = meter . createObservableCounter ( "db.pool.connections.opened.total" , {
373- description : "Total number of pool connections opened" ,
374- unit : "connections" ,
375- } ) ;
376- const connectionsClosedTotal = meter . createObservableCounter ( "db.pool.connections.closed.total" , {
377- description : "Total number of pool connections closed" ,
378- unit : "connections" ,
379- } ) ;
380-
381- // Gauges
382- const queriesActive = meter . createObservableGauge ( "db.client.queries.active" , {
383- description : "Number of currently active Prisma Client queries" ,
384- unit : "queries" ,
385- } ) ;
386- const queriesWait = meter . createObservableGauge ( "db.client.queries.wait" , {
387- description : "Number of queries currently waiting for a connection" ,
388- unit : "queries" ,
389- } ) ;
390- const totalGauge = meter . createObservableGauge ( "db.pool.connections.total" , {
391- description : "Open Prisma-pool connections" ,
392- unit : "connections" ,
393- } ) ;
394- const busyGauge = meter . createObservableGauge ( "db.pool.connections.busy" , {
395- description : "Connections currently executing queries" ,
396- unit : "connections" ,
397- } ) ;
398- const freeGauge = meter . createObservableGauge ( "db.pool.connections.free" , {
399- description : "Idle (free) connections in the pool" ,
400- unit : "connections" ,
401- } ) ;
402-
403- // Histogram statistics as gauges
404- const queriesWaitTimeCount = meter . createObservableGauge ( "db.client.queries.wait_time.count" , {
405- description : "Number of wait time observations" ,
406- unit : "observations" ,
407- } ) ;
408- const queriesWaitTimeSum = meter . createObservableGauge ( "db.client.queries.wait_time.sum" , {
409- description : "Total wait time across all observations" ,
410- unit : "ms" ,
411- } ) ;
412- const queriesWaitTimeMean = meter . createObservableGauge ( "db.client.queries.wait_time.mean" , {
413- description : "Average wait time for a connection" ,
414- unit : "ms" ,
415- } ) ;
416-
417- const queriesDurationCount = meter . createObservableGauge ( "db.client.queries.duration.count" , {
418- description : "Number of query duration observations" ,
419- unit : "observations" ,
420- } ) ;
421- const queriesDurationSum = meter . createObservableGauge ( "db.client.queries.duration.sum" , {
422- description : "Total query duration across all observations" ,
423- unit : "ms" ,
424- } ) ;
425- const queriesDurationMean = meter . createObservableGauge ( "db.client.queries.duration.mean" , {
426- description : "Average duration of Prisma Client queries" ,
427- unit : "ms" ,
428- } ) ;
429-
430- const datasourceQueriesDurationCount = meter . createObservableGauge (
431- "db.datasource.queries.duration.count" ,
432- {
433- description : "Number of datasource query duration observations" ,
434- unit : "observations" ,
435- }
436- ) ;
437- const datasourceQueriesDurationSum = meter . createObservableGauge (
438- "db.datasource.queries.duration.sum" ,
439- {
440- description : "Total datasource query duration across all observations" ,
441- unit : "ms" ,
442- }
443- ) ;
444- const datasourceQueriesDurationMean = meter . createObservableGauge (
445- "db.datasource.queries.duration.mean" ,
446- {
447- description : "Average duration of datasource queries" ,
448- unit : "ms" ,
449- }
450- ) ;
451-
452- // Single helper so we hit Prisma only once per scrape ---------------------
453- async function readPrismaMetrics ( ) {
454- const metrics = await prisma . $metrics . json ( ) ;
455-
456- // Extract counter values
457- const counters : Record < string , number > = { } ;
458- for ( const counter of metrics . counters ) {
459- counters [ counter . key ] = counter . value ;
460- }
461-
462- // Extract gauge values
463- const gauges : Record < string , number > = { } ;
464- for ( const gauge of metrics . gauges ) {
465- gauges [ gauge . key ] = gauge . value ;
466- }
467-
468- // Extract histogram values
469- const histograms : Record < string , Prisma . MetricHistogram > = { } ;
470- for ( const histogram of metrics . histograms ) {
471- histograms [ histogram . key ] = histogram . value ;
472- }
473-
474- return {
475- counters : {
476- queriesTotal : counters [ "prisma_client_queries_total" ] ?? 0 ,
477- datasourceQueriesTotal : counters [ "prisma_datasource_queries_total" ] ?? 0 ,
478- connectionsOpenedTotal : counters [ "prisma_pool_connections_opened_total" ] ?? 0 ,
479- connectionsClosedTotal : counters [ "prisma_pool_connections_closed_total" ] ?? 0 ,
480- } ,
481- gauges : {
482- queriesActive : gauges [ "prisma_client_queries_active" ] ?? 0 ,
483- queriesWait : gauges [ "prisma_client_queries_wait" ] ?? 0 ,
484- connectionsOpen : gauges [ "prisma_pool_connections_open" ] ?? 0 ,
485- connectionsBusy : gauges [ "prisma_pool_connections_busy" ] ?? 0 ,
486- connectionsIdle : gauges [ "prisma_pool_connections_idle" ] ?? 0 ,
487- } ,
488- histograms : {
489- queriesWait : histograms [ "prisma_client_queries_wait_histogram_ms" ] ,
490- queriesDuration : histograms [ "prisma_client_queries_duration_histogram_ms" ] ,
491- datasourceQueriesDuration : histograms [ "prisma_datasource_queries_duration_histogram_ms" ] ,
492- } ,
493- } ;
494- }
495-
496- meter . addBatchObservableCallback (
497- async ( res ) => {
498- const { counters, gauges, histograms } = await readPrismaMetrics ( ) ;
499-
500- // Observe counters
501- res . observe ( queriesTotal , counters . queriesTotal ) ;
502- res . observe ( datasourceQueriesTotal , counters . datasourceQueriesTotal ) ;
503- res . observe ( connectionsOpenedTotal , counters . connectionsOpenedTotal ) ;
504- res . observe ( connectionsClosedTotal , counters . connectionsClosedTotal ) ;
505-
506- // Observe gauges
507- res . observe ( queriesActive , gauges . queriesActive ) ;
508- res . observe ( queriesWait , gauges . queriesWait ) ;
509- res . observe ( totalGauge , gauges . connectionsOpen ) ;
510- res . observe ( busyGauge , gauges . connectionsBusy ) ;
511- res . observe ( freeGauge , gauges . connectionsIdle ) ;
512-
513- // Observe histogram statistics as gauges
514- if ( histograms . queriesWait ) {
515- res . observe ( queriesWaitTimeCount , histograms . queriesWait . count ) ;
516- res . observe ( queriesWaitTimeSum , histograms . queriesWait . sum ) ;
517- res . observe (
518- queriesWaitTimeMean ,
519- histograms . queriesWait . count > 0
520- ? histograms . queriesWait . sum / histograms . queriesWait . count
521- : 0
522- ) ;
523- }
524-
525- if ( histograms . queriesDuration ) {
526- res . observe ( queriesDurationCount , histograms . queriesDuration . count ) ;
527- res . observe ( queriesDurationSum , histograms . queriesDuration . sum ) ;
528- res . observe (
529- queriesDurationMean ,
530- histograms . queriesDuration . count > 0
531- ? histograms . queriesDuration . sum / histograms . queriesDuration . count
532- : 0
533- ) ;
534- }
535-
536- if ( histograms . datasourceQueriesDuration ) {
537- res . observe ( datasourceQueriesDurationCount , histograms . datasourceQueriesDuration . count ) ;
538- res . observe ( datasourceQueriesDurationSum , histograms . datasourceQueriesDuration . sum ) ;
539- res . observe (
540- datasourceQueriesDurationMean ,
541- histograms . datasourceQueriesDuration . count > 0
542- ? histograms . datasourceQueriesDuration . sum / histograms . datasourceQueriesDuration . count
543- : 0
544- ) ;
545- }
546- } ,
547- [
548- queriesTotal ,
549- datasourceQueriesTotal ,
550- connectionsOpenedTotal ,
551- connectionsClosedTotal ,
552- queriesActive ,
553- queriesWait ,
554- totalGauge ,
555- busyGauge ,
556- freeGauge ,
557- queriesWaitTimeCount ,
558- queriesWaitTimeSum ,
559- queriesWaitTimeMean ,
560- queriesDurationCount ,
561- queriesDurationSum ,
562- queriesDurationMean ,
563- datasourceQueriesDurationCount ,
564- datasourceQueriesDurationSum ,
565- datasourceQueriesDurationMean ,
566- ]
567- ) ;
568- }
569-
570359function configureNodejsMetrics ( { meter } : { meter : Meter } ) {
571360 if ( ! env . INTERNAL_OTEL_NODEJS_METRICS_ENABLED ) {
572361 return ;
0 commit comments