Skip to content

Commit dc7e3b1

Browse files
authored
feat: log query execution time (#172)
1 parent a1f7abf commit dc7e3b1

10 files changed

Lines changed: 498 additions & 175 deletions

File tree

.changeset/hot-candies-attack.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@stackspulse/server": patch
3+
---
4+
5+
Add logs for query time.

apps/server/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
"@stackspulse/protocols": "workspace:*",
1818
"@t3-oss/env-core": "0.13.4",
1919
"better-sqlite3": "11.10.0",
20-
"db0": "0.2.4",
20+
"consola": "3.4.2",
21+
"db0": "0.3.2",
2122
"drizzle-orm": "0.39.3",
2223
"h3": "1.15.3",
2324
"nitro-cors": "0.7.1",
@@ -29,6 +30,6 @@
2930
},
3031
"devDependencies": {
3132
"nitropack": "2.11.11",
32-
"prisma": "6.3.1"
33+
"prisma": "6.7.0"
3334
}
3435
}

apps/server/src/api/protocols/stackingdao/index.get.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { sql } from "~/db/db";
22
import { apiCacheConfig } from "~/lib/api";
3+
import { consola } from "~/lib/consola";
34

45
type StackingDAOProtocolStatsResponse = {
56
month: string;
67
deposits: number;
78
withdrawals: number;
89
}[];
910

10-
export default defineCachedEventHandler(async (event) => {
11+
export default defineCachedEventHandler(async () => {
12+
const queryStartTime = Date.now();
1113
const result = await sql`
1214
WITH monthly_blocks AS (
1315
SELECT
@@ -26,16 +28,16 @@ deposits AS (
2628
SELECT
2729
mb.month,
2830
SUM(se.amount) AS deposits
29-
FROM
31+
FROM
3032
monthly_blocks mb
31-
JOIN
33+
JOIN
3234
stx_events se ON se.block_height BETWEEN mb.min_block_height AND mb.max_block_height
3335
WHERE
3436
se.recipient = 'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.reserve-v1'
3537
AND se.sender NOT LIKE 'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG%'
3638
AND canonical = TRUE
3739
AND microblock_canonical = TRUE
38-
GROUP BY
40+
GROUP BY
3941
mb.month
4042
),
4143
@@ -70,6 +72,13 @@ ORDER BY
7072
month ASC
7173
`;
7274

75+
const queryEndTime = Date.now();
76+
consola.debug(
77+
`StackingDAOProtocolStats: Query executed in ${
78+
queryEndTime - queryStartTime
79+
}ms`,
80+
);
81+
7382
const stats: StackingDAOProtocolStatsResponse = result.map((row) => ({
7483
// format of the month is "2021-08-01 00:00:00+00"
7584
// we want to output "2021-08"

apps/server/src/api/protocols/users/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type postgres from "postgres";
33
import { z } from "zod";
44
import { sql } from "~/db/db";
55
import { apiCacheConfig } from "~/lib/api";
6+
import { consola } from "~/lib/consola";
67
import { getValidatedQueryZod } from "~/lib/nitro";
78

89
const protocolUsersRouteSchema = z.object({
@@ -92,6 +93,7 @@ const getProtocolUsersNested = async ({
9293
dateCondition = `AND txs.block_time >= EXTRACT(EPOCH FROM (NOW() - INTERVAL '${daysToSubtract} days'))`;
9394
}
9495

96+
const queryStartTime = Date.now();
9597
const result = await sql`
9698
WITH protocol_contracts AS (
9799
SELECT id, UNNEST(contracts) AS contract_address
@@ -147,5 +149,10 @@ ORDER BY
147149
LIMIT ${limit};
148150
`;
149151

152+
const queryEndTime = Date.now();
153+
consola.debug(
154+
`ProtocolUsersRoute: Query executed in ${queryEndTime - queryStartTime}ms`,
155+
);
156+
150157
return result;
151158
};

apps/server/src/api/transactions/index.get.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { type Protocol, protocols } from "@stackspulse/protocols";
33
import { z } from "zod";
44
import { sql } from "~/db/db";
55
import { apiCacheConfig } from "~/lib/api";
6+
import { consola } from "~/lib/consola";
67
import { getValidatedQueryZod } from "~/lib/nitro";
78
import { stacksClient } from "~/lib/stacks";
89

@@ -22,6 +23,7 @@ export default defineCachedEventHandler(async (event) => {
2223
protocolCondition = `AND dapps.id = '${query.protocol}'`;
2324
}
2425

26+
const queryStartTime = Date.now();
2527
const result = await sql<
2628
{
2729
protocol: Protocol;
@@ -46,6 +48,11 @@ ORDER BY
4648
LIMIT 50
4749
`;
4850

51+
const queryEndTime = Date.now();
52+
consola.debug(
53+
`TransactionsRoute: Query executed in ${queryEndTime - queryStartTime}ms`,
54+
);
55+
4956
const formattedResult = result.map((r) => ({
5057
protocol: r.protocol,
5158
tx_id: `0x${r.tx_id.toString("hex")}`,

apps/server/src/api/transactions/stats/index.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { protocols } from "@stackspulse/protocols";
22
import { z } from "zod";
33
import { sql } from "~/db/db";
44
import { apiCacheConfig } from "~/lib/api";
5+
import { consola } from "~/lib/consola";
56
import { getValidatedQueryZod } from "~/lib/nitro";
67

78
const transactionStatsRouteSchema = z.object({
@@ -21,6 +22,7 @@ export default defineCachedEventHandler(async (event) => {
2122
protocolContractsCondition = `WHERE dapps.id = '${query.protocol}'`;
2223
}
2324

25+
const queryStartTime = Date.now();
2426
const result = await sql`
2527
WITH protocol_contracts AS (
2628
SELECT UNNEST(contracts) AS contract_address
@@ -69,6 +71,13 @@ JOIN
6971
AND atxs.microblock_hash = txs.microblock_hash
7072
`;
7173

74+
const queryEndTime = Date.now();
75+
consola.debug(
76+
`TransactionStatsRoute: Query executed in ${
77+
queryEndTime - queryStartTime
78+
}ms`,
79+
);
80+
7281
const stats: TransactionStatsRouteResponse = {
7382
count: Number.parseInt(result[0].count),
7483
unique_senders: Number.parseInt(result[0].unique_senders),

apps/server/src/api/transactions/unique-senders/index.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { protocols } from "@stackspulse/protocols";
22
import { z } from "zod";
33
import { sql } from "~/db/db";
44
import { apiCacheConfig } from "~/lib/api";
5+
import { consola } from "~/lib/consola";
56
import { getValidatedQueryZod } from "~/lib/nitro";
67

78
const transactionUniqueSendersRouteSchema = z.object({
@@ -19,6 +20,7 @@ export default defineCachedEventHandler(async (event) => {
1920
transactionUniqueSendersRouteSchema,
2021
);
2122

23+
const queryStartTime = Date.now();
2224
const result = await sql`
2325
WITH monthly_blocks AS (
2426
SELECT
@@ -82,6 +84,13 @@ ORDER BY
8284
mb.month ASC
8385
`;
8486

87+
const queryEndTime = Date.now();
88+
consola.debug(
89+
`TransactionUniqueSendersRoute: Query executed in ${
90+
queryEndTime - queryStartTime
91+
}ms`,
92+
);
93+
8594
const stats: TransactionUniqueSendersRouteResponse = result.map((row) => ({
8695
// format of the month is "2021-08-01 00:00:00+00"
8796
// we want to output "2021-08"

apps/server/src/env.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export const env = createEnv({
1515
TWITTER_API_SECRET_KEY: z.string().min(1),
1616
TWITTER_ACCESS_TOKEN: z.string().min(1),
1717
TWITTER_ACCESS_TOKEN_SECRET: z.string().min(1),
18+
CONSOLA_LEVEL: z.coerce.number().optional(),
1819
},
1920

2021
runtimeEnv: process.env,

apps/server/src/lib/consola.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { createConsola } from "consola";
2+
import { env } from "~/env";
3+
4+
export const consola = createConsola({
5+
level: env.CONSOLA_LEVEL
6+
? env.CONSOLA_LEVEL
7+
: env.NODE_ENV === "development"
8+
? 4
9+
: 3,
10+
});

0 commit comments

Comments
 (0)