1- import { sqlDatabaseSchema } from "~/db.server" ;
1+ import { PrismaClientOrTransaction , sqlDatabaseSchema } from "~/db.server" ;
22import { env } from "~/env.server" ;
33import { getUsage , getUsageSeries } from "~/services/platform.v3.server" ;
44import { createTimeSeriesData } from "~/utils/graphs" ;
55import { BasePresenter } from "./basePresenter.server" ;
66import { DataPoint , linear } from "regression" ;
7+ import { clickhouseClient } from "~/services/clickhouseInstance.server" ;
78
89type Options = {
910 organizationId : string ;
@@ -103,27 +104,69 @@ export class UsagePresenter extends BasePresenter {
103104 } ) ;
104105
105106 //usage by task
106- const tasks = this . _replica . $queryRaw < TaskUsageItem [ ] > `
107+ const tasks = await getTaskUsageByOrganization (
108+ organizationId ,
109+ startOfMonth ,
110+ endOfMonth ,
111+ this . _replica
112+ ) ;
113+
114+ return {
115+ usage,
116+ tasks,
117+ } ;
118+ }
119+ }
120+
121+ async function getTaskUsageByOrganization (
122+ organizationId : string ,
123+ startOfMonth : Date ,
124+ endOfMonth : Date ,
125+ replica : PrismaClientOrTransaction
126+ ) {
127+ if ( clickhouseClient ) {
128+ const [ queryError , tasks ] = await clickhouseClient . taskRuns . getTaskUsageByOrganization ( {
129+ startTime : startOfMonth . getTime ( ) ,
130+ endTime : endOfMonth . getTime ( ) ,
131+ organizationId,
132+ } ) ;
133+
134+ if ( queryError ) {
135+ throw queryError ;
136+ }
137+
138+ return tasks
139+ . map ( ( task ) => ( {
140+ taskIdentifier : task . task_identifier ,
141+ runCount : Number ( task . run_count ) ,
142+ averageDuration : Number ( task . average_duration ) ,
143+ averageCost : Number ( task . average_cost ) + env . CENTS_PER_RUN / 100 ,
144+ totalDuration : Number ( task . total_duration ) ,
145+ totalCost : Number ( task . total_cost ) + Number ( task . total_base_cost ) ,
146+ } ) )
147+ . sort ( ( a , b ) => b . totalCost - a . totalCost ) ;
148+ } else {
149+ return replica . $queryRaw < TaskUsageItem [ ] > `
107150 SELECT
108- tr."taskIdentifier",
109- COUNT(*) AS "runCount",
110- AVG(tr."usageDurationMs") AS "averageDuration",
111- SUM(tr."usageDurationMs") AS "totalDuration",
112- AVG(tr."costInCents") / 100.0 AS "averageCost",
113- SUM(tr."costInCents") / 100.0 AS "totalCost",
114- SUM(tr."baseCostInCents") / 100.0 AS "totalBaseCost"
115- FROM
116- ${ sqlDatabaseSchema } ."TaskRun" tr
117- JOIN ${ sqlDatabaseSchema } ."Project" pr ON pr.id = tr."projectId"
118- JOIN ${ sqlDatabaseSchema } ."Organization" org ON org.id = pr."organizationId"
119- JOIN ${ sqlDatabaseSchema } ."RuntimeEnvironment" env ON env."id" = tr."runtimeEnvironmentId"
120- WHERE
121- env.type <> 'DEVELOPMENT'
122- AND tr."createdAt" > ${ startOfMonth }
123- AND tr."createdAt" < ${ endOfMonth }
124- AND org.id = ${ organizationId }
125- GROUP BY
126- tr."taskIdentifier";
151+ tr."taskIdentifier",
152+ COUNT(*) AS "runCount",
153+ AVG(tr."usageDurationMs") AS "averageDuration",
154+ SUM(tr."usageDurationMs") AS "totalDuration",
155+ AVG(tr."costInCents") / 100.0 AS "averageCost",
156+ SUM(tr."costInCents") / 100.0 AS "totalCost",
157+ SUM(tr."baseCostInCents") / 100.0 AS "totalBaseCost"
158+ FROM
159+ ${ sqlDatabaseSchema } ."TaskRun" tr
160+ JOIN ${ sqlDatabaseSchema } ."Project" pr ON pr.id = tr."projectId"
161+ JOIN ${ sqlDatabaseSchema } ."Organization" org ON org.id = pr."organizationId"
162+ JOIN ${ sqlDatabaseSchema } ."RuntimeEnvironment" env ON env."id" = tr."runtimeEnvironmentId"
163+ WHERE
164+ env.type <> 'DEVELOPMENT'
165+ AND tr."createdAt" > ${ startOfMonth }
166+ AND tr."createdAt" < ${ endOfMonth }
167+ AND org.id = ${ organizationId }
168+ GROUP BY
169+ tr."taskIdentifier";
127170 ` . then ( ( data ) => {
128171 return data
129172 . map ( ( item ) => ( {
@@ -136,10 +179,5 @@ export class UsagePresenter extends BasePresenter {
136179 } ) )
137180 . sort ( ( a , b ) => b . totalCost - a . totalCost ) ;
138181 } ) ;
139-
140- return {
141- usage,
142- tasks,
143- } ;
144182 }
145183}
0 commit comments