From 66873ac73dbac4730347c8e02123eb971a544d1f Mon Sep 17 00:00:00 2001 From: Max Rozen <3822106+rozenmd@users.noreply.github.com> Date: Mon, 12 Jun 2023 14:45:33 +0200 Subject: [PATCH 1/9] fix: add 24h read/write metrics to d1 info --- package-lock.json | 38 +++++++++------- packages/wrangler/package.json | 1 + packages/wrangler/src/cfetch/index.ts | 21 +++++++++ packages/wrangler/src/d1/info.tsx | 62 +++++++++++++++++++++++++-- packages/wrangler/src/d1/types.ts | 31 ++++++++++++++ 5 files changed, 133 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 03d1f3565f12..516f13e16b74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2471,9 +2471,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", - "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -2802,7 +2802,7 @@ }, "node_modules/@clack/prompts/node_modules/is-unicode-supported": { "version": "1.3.0", - "extraneous": true, + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -10138,10 +10138,12 @@ "license": "BSD-3-Clause" }, "node_modules/date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", - "dev": true, + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, "engines": { "node": ">=0.11" }, @@ -31511,6 +31513,7 @@ "@esbuild-plugins/node-modules-polyfill": "^0.1.4", "blake3-wasm": "^2.1.5", "chokidar": "^3.5.3", + "date-fns": "^2.30.0", "esbuild": "0.16.3", "miniflare": "^3.0.0", "nanoid": "^3.3.3", @@ -34655,9 +34658,9 @@ "dev": true }, "@babel/runtime": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", - "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", "requires": { "regenerator-runtime": "^0.13.11" } @@ -34937,7 +34940,7 @@ "is-unicode-supported": { "version": "1.3.0", "bundled": true, - "extraneous": true + "dev": true } } }, @@ -40810,10 +40813,12 @@ "version": "1.4.0" }, "date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", - "dev": true + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "requires": { + "@babel/runtime": "^7.21.0" + } }, "date-time": { "version": "3.1.0", @@ -54426,6 +54431,7 @@ "cmd-shim": "^4.1.0", "command-exists": "^1.2.9", "concurrently": "^7.2.2", + "date-fns": "*", "devtools-protocol": "^0.0.955664", "dotenv": "^16.0.0", "esbuild": "0.16.3", diff --git a/packages/wrangler/package.json b/packages/wrangler/package.json index 76110034f622..31980157a632 100644 --- a/packages/wrangler/package.json +++ b/packages/wrangler/package.json @@ -102,6 +102,7 @@ "@esbuild-plugins/node-modules-polyfill": "^0.1.4", "blake3-wasm": "^2.1.5", "chokidar": "^3.5.3", + "date-fns": "^2.30.0", "esbuild": "0.16.3", "miniflare": "^3.0.0", "nanoid": "^3.3.3", diff --git a/packages/wrangler/src/cfetch/index.ts b/packages/wrangler/src/cfetch/index.ts index bda9e41ae0c2..0dc3a09303f7 100644 --- a/packages/wrangler/src/cfetch/index.ts +++ b/packages/wrangler/src/cfetch/index.ts @@ -43,6 +43,27 @@ export async function fetchResult( } } +/** + * Make a fetch request to the GraphQL API, and return the JSON response. + */ +export async function fetchGraphqlResult( + init: RequestInit = {}, + + abortSignal?: AbortSignal +): Promise { + const json = await fetchInternal( + "/graphql", + init, + undefined, + abortSignal + ); + if (json) { + return json; + } else { + throw new Error("A request to the Cloudflare API (/graphql) failed."); + } +} + /** * Make a fetch request for a list of values, * extracting the `result` from the JSON response, diff --git a/packages/wrangler/src/d1/info.tsx b/packages/wrangler/src/d1/info.tsx index fe76e2a44b91..5c888ef067c9 100644 --- a/packages/wrangler/src/d1/info.tsx +++ b/packages/wrangler/src/d1/info.tsx @@ -1,7 +1,8 @@ +import { subDays } from "date-fns"; import Table from "ink-table"; import prettyBytes from "pretty-bytes"; import React from "react"; -import { fetchResult } from "../cfetch"; +import { fetchGraphqlResult, fetchResult } from "../cfetch"; import { withConfig } from "../config"; import { logger } from "../logger"; import { requireAuth } from "../user"; @@ -11,7 +12,7 @@ import type { CommonYargsArgv, StrictYargsOptionsToInterface, } from "../yargs-types"; -import type { Database } from "./types"; +import type { D1MetricsGraphQLResponse, Database } from "./types"; export function Options(d1ListYargs: CommonYargsArgv) { return d1ListYargs @@ -46,12 +47,65 @@ export const Handler = withConfig( }, } ); + const today = new Date(); + const yesterday = subDays(today, 1); + const graphqlResult = await fetchGraphqlResult({ + method: "POST", + body: JSON.stringify({ + query: `query getD1MetricsOverviewQuery($accountTag: string, $filter: ZoneWorkersRequestsFilter_InputObject) { + viewer { + accounts(filter: {accountTag: $accountTag}) { + d1AnalyticsAdaptiveGroups(limit: 10000, filter: $filter) { + sum { + readQueries + writeQueries + } + dimensions { + datetimeHour + } + } + } + } + }`, + operationName: "getD1MetricsOverviewQuery", + variables: { + accountTag: accountId, + filter: { + AND: [ + { + datetimeHour_geq: yesterday.toISOString(), + datetimeHour_leq: today.toISOString(), + }, + ], + }, + }, + }), + headers: { + "Content-Type": "application/json", + }, + }); + + const metrics = { readQueries: 0, writeQueries: 0 }; + graphqlResult?.data?.viewer?.accounts[0]?.d1AnalyticsAdaptiveGroups?.forEach( + (row) => { + metrics.readQueries += row?.sum?.readQueries ?? 0; + metrics.writeQueries += row?.sum?.writeQueries ?? 0; + } + ); + const output = { + ...result, + ...(graphqlResult && { + read_queries_24h: metrics.readQueries, + write_queries_24h: metrics.writeQueries, + }), + }; + if (json) { - logger.log(JSON.stringify(result, null, 2)); + logger.log(JSON.stringify(output, null, 2)); } else { // Snip off the "uuid" property from the response and use those as the header - const entries = Object.entries(result).filter(([k, _v]) => k !== "uuid"); + const entries = Object.entries(output).filter(([k, _v]) => k !== "uuid"); const data = entries.map(([k, v]) => ({ [db.binding || ""]: k, [db.uuid]: k === "file_size" ? prettyBytes(Number(v)) : v, diff --git a/packages/wrangler/src/d1/types.ts b/packages/wrangler/src/d1/types.ts index ec2cce5ab293..5fa24c792ebe 100644 --- a/packages/wrangler/src/d1/types.ts +++ b/packages/wrangler/src/d1/types.ts @@ -30,3 +30,34 @@ export type Migration = { name: string; applied_at: string; }; + +export interface D1Metrics { + sum?: { + readQueries?: number; + writeQueries?: number; + queryBatchResponseBytes?: number; + }; + quantiles?: { + queryBatchTimeMsP90?: number; + }; + avg?: { + queryBatchTimeMs?: number; + }; + dimensions: { + databaseId?: string; + date?: string; + datetime?: string; + datetimeMinute?: string; + datetimeFiveMinutes?: string; + datetimeFifteenMinutes?: string; + datetimeHour?: string; + }; +} + +export interface D1MetricsGraphQLResponse { + data: { + viewer: { + accounts: { d1AnalyticsAdaptiveGroups?: D1Metrics[] }[]; + }; + }; +} From e8e0abb801120ad498b8cbfc7e6ac0e6c8bc197a Mon Sep 17 00:00:00 2001 From: Max Rozen <3822106+rozenmd@users.noreply.github.com> Date: Mon, 12 Jun 2023 16:50:15 +0200 Subject: [PATCH 2/9] add test --- .../__tests__/fetch-graphql-result.test.ts | 42 +++++++++++++++++++ packages/wrangler/src/cfetch/index.ts | 3 +- 2 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 packages/wrangler/src/__tests__/fetch-graphql-result.test.ts diff --git a/packages/wrangler/src/__tests__/fetch-graphql-result.test.ts b/packages/wrangler/src/__tests__/fetch-graphql-result.test.ts new file mode 100644 index 000000000000..ad8912c7e5f2 --- /dev/null +++ b/packages/wrangler/src/__tests__/fetch-graphql-result.test.ts @@ -0,0 +1,42 @@ +import { rest } from "msw"; +import { fetchGraphqlResult } from "../cfetch"; +import { mockAccountId, mockApiToken } from "./helpers/mock-account-id"; +import { mockOAuthFlow } from "./helpers/mock-oauth-flow"; +import { msw } from "./helpers/msw"; + +describe("fetchGraphqlResult", () => { + mockAccountId({ accountId: null }); + mockApiToken(); + const { mockOAuthServerCallback } = mockOAuthFlow(); + + it("should make a request against the graphql endpoint by default", async () => { + mockOAuthServerCallback(); + msw.use( + rest.post("*/graphql", async (req, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ + data: { + viewer: { + __typename: "viewer", + }, + }, + errors: null, + }) + ); + }) + ); + expect( + await fetchGraphqlResult({ + method: "POST", + body: JSON.stringify({ + query: `{ + viewer { + __typename + } + }`, + }), + }) + ).toEqual({ data: { viewer: { __typename: "viewer" } }, errors: null }); + }); +}); diff --git a/packages/wrangler/src/cfetch/index.ts b/packages/wrangler/src/cfetch/index.ts index 0dc3a09303f7..c69f8dae6ba0 100644 --- a/packages/wrangler/src/cfetch/index.ts +++ b/packages/wrangler/src/cfetch/index.ts @@ -48,12 +48,11 @@ export async function fetchResult( */ export async function fetchGraphqlResult( init: RequestInit = {}, - abortSignal?: AbortSignal ): Promise { const json = await fetchInternal( "/graphql", - init, + init, //you might be tempted to hardcode method = 'POST', but GET is allowed: https://graphql.org/learn/serving-over-http/#get-request undefined, abortSignal ); From ba9a49324f1f681b64c934bccb5af487ae30f40b Mon Sep 17 00:00:00 2001 From: Max Rozen <3822106+rozenmd@users.noreply.github.com> Date: Mon, 12 Jun 2023 17:03:10 +0200 Subject: [PATCH 3/9] add test --- .../__tests__/fetch-graphql-result.test.ts | 37 ++++++++++++++++++- packages/wrangler/src/cfetch/index.ts | 2 +- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/packages/wrangler/src/__tests__/fetch-graphql-result.test.ts b/packages/wrangler/src/__tests__/fetch-graphql-result.test.ts index ad8912c7e5f2..fb84e1d1a70c 100644 --- a/packages/wrangler/src/__tests__/fetch-graphql-result.test.ts +++ b/packages/wrangler/src/__tests__/fetch-graphql-result.test.ts @@ -28,7 +28,6 @@ describe("fetchGraphqlResult", () => { ); expect( await fetchGraphqlResult({ - method: "POST", body: JSON.stringify({ query: `{ viewer { @@ -39,4 +38,40 @@ describe("fetchGraphqlResult", () => { }) ).toEqual({ data: { viewer: { __typename: "viewer" } }, errors: null }); }); + + it("should accept a request with no init, but return no data", async () => { + mockOAuthServerCallback(); + const now = new Date().toISOString(); + msw.use( + rest.post("*/graphql", async (req, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ + data: null, + errors: [ + { + message: "failed to recognize JSON request: 'EOF'", + path: null, + extensions: { + timestamp: now, + }, + }, + ], + }) + ); + }) + ); + expect(await fetchGraphqlResult()).toEqual({ + data: null, + errors: [ + { + message: "failed to recognize JSON request: 'EOF'", + path: null, + extensions: { + timestamp: now, + }, + }, + ], + }); + }); }); diff --git a/packages/wrangler/src/cfetch/index.ts b/packages/wrangler/src/cfetch/index.ts index c69f8dae6ba0..45f8574c6f2f 100644 --- a/packages/wrangler/src/cfetch/index.ts +++ b/packages/wrangler/src/cfetch/index.ts @@ -52,7 +52,7 @@ export async function fetchGraphqlResult( ): Promise { const json = await fetchInternal( "/graphql", - init, //you might be tempted to hardcode method = 'POST', but GET is allowed: https://graphql.org/learn/serving-over-http/#get-request + { ...init, method: "POST" }, //Cloudflare API v4 doesn't allow POSTs to /graphql undefined, abortSignal ); From c82b248ce218f5882a35769f2707a57291678abd Mon Sep 17 00:00:00 2001 From: Max Rozen <3822106+rozenmd@users.noreply.github.com> Date: Mon, 12 Jun 2023 17:25:50 +0200 Subject: [PATCH 4/9] filter by db.uuid --- .changeset/six-horses-punch.md | 5 +++++ packages/wrangler/src/d1/info.tsx | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/six-horses-punch.md diff --git a/.changeset/six-horses-punch.md b/.changeset/six-horses-punch.md new file mode 100644 index 000000000000..bf7410311388 --- /dev/null +++ b/.changeset/six-horses-punch.md @@ -0,0 +1,5 @@ +--- +"wrangler": patch +--- + +fix: add the number of read queries and write queries in the last 24 hours to the `d1 info` command diff --git a/packages/wrangler/src/d1/info.tsx b/packages/wrangler/src/d1/info.tsx index 5c888ef067c9..3898e5bd8819 100644 --- a/packages/wrangler/src/d1/info.tsx +++ b/packages/wrangler/src/d1/info.tsx @@ -75,6 +75,7 @@ export const Handler = withConfig( { datetimeHour_geq: yesterday.toISOString(), datetimeHour_leq: today.toISOString(), + databaseId: db.uuid, }, ], }, From 56a751d7678e4699b3051155d173e5d55787df4b Mon Sep 17 00:00:00 2001 From: Max Rozen <3822106+rozenmd@users.noreply.github.com> Date: Mon, 12 Jun 2023 17:49:44 +0200 Subject: [PATCH 5/9] fix: we can only fetch metrics for new dbs --- packages/wrangler/src/d1/info.tsx | 102 ++++++++++++++++-------------- 1 file changed, 53 insertions(+), 49 deletions(-) diff --git a/packages/wrangler/src/d1/info.tsx b/packages/wrangler/src/d1/info.tsx index 3898e5bd8819..f90858ce30ba 100644 --- a/packages/wrangler/src/d1/info.tsx +++ b/packages/wrangler/src/d1/info.tsx @@ -47,59 +47,63 @@ export const Handler = withConfig( }, } ); - const today = new Date(); - const yesterday = subDays(today, 1); - const graphqlResult = await fetchGraphqlResult({ - method: "POST", - body: JSON.stringify({ - query: `query getD1MetricsOverviewQuery($accountTag: string, $filter: ZoneWorkersRequestsFilter_InputObject) { - viewer { - accounts(filter: {accountTag: $accountTag}) { - d1AnalyticsAdaptiveGroups(limit: 10000, filter: $filter) { - sum { - readQueries - writeQueries - } - dimensions { - datetimeHour - } + + let output: Record = { ...result }; + if (result.version === "beta") { + const today = new Date(); + const yesterday = subDays(today, 1); + const graphqlResult = await fetchGraphqlResult({ + method: "POST", + body: JSON.stringify({ + query: `query getD1MetricsOverviewQuery($accountTag: string, $filter: ZoneWorkersRequestsFilter_InputObject) { + viewer { + accounts(filter: {accountTag: $accountTag}) { + d1AnalyticsAdaptiveGroups(limit: 10000, filter: $filter) { + sum { + readQueries + writeQueries + } + dimensions { + datetimeHour + } + } } - } - } - }`, - operationName: "getD1MetricsOverviewQuery", - variables: { - accountTag: accountId, - filter: { - AND: [ - { - datetimeHour_geq: yesterday.toISOString(), - datetimeHour_leq: today.toISOString(), - databaseId: db.uuid, - }, - ], + } + }`, + operationName: "getD1MetricsOverviewQuery", + variables: { + accountTag: accountId, + filter: { + AND: [ + { + datetimeHour_geq: yesterday.toISOString(), + datetimeHour_leq: today.toISOString(), + databaseId: db.uuid, + }, + ], + }, }, + }), + headers: { + "Content-Type": "application/json", }, - }), - headers: { - "Content-Type": "application/json", - }, - }); + }); - const metrics = { readQueries: 0, writeQueries: 0 }; - graphqlResult?.data?.viewer?.accounts[0]?.d1AnalyticsAdaptiveGroups?.forEach( - (row) => { - metrics.readQueries += row?.sum?.readQueries ?? 0; - metrics.writeQueries += row?.sum?.writeQueries ?? 0; - } - ); - const output = { - ...result, - ...(graphqlResult && { - read_queries_24h: metrics.readQueries, - write_queries_24h: metrics.writeQueries, - }), - }; + const metrics = { readQueries: 0, writeQueries: 0 }; + graphqlResult?.data?.viewer?.accounts[0]?.d1AnalyticsAdaptiveGroups?.forEach( + (row) => { + metrics.readQueries += row?.sum?.readQueries ?? 0; + metrics.writeQueries += row?.sum?.writeQueries ?? 0; + } + ); + output = { + ...output, + ...(graphqlResult && { + read_queries_24h: metrics.readQueries, + write_queries_24h: metrics.writeQueries, + }), + }; + } if (json) { logger.log(JSON.stringify(output, null, 2)); From aab483040b4ef231d0f65b5794e328ce66d7d224 Mon Sep 17 00:00:00 2001 From: Max Rozen <3822106+rozenmd@users.noreply.github.com> Date: Mon, 12 Jun 2023 18:07:18 +0200 Subject: [PATCH 6/9] fix: use toLocaleString to get human-readable numbers for now --- packages/wrangler/src/d1/info.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/wrangler/src/d1/info.tsx b/packages/wrangler/src/d1/info.tsx index f90858ce30ba..154f104c1e02 100644 --- a/packages/wrangler/src/d1/info.tsx +++ b/packages/wrangler/src/d1/info.tsx @@ -99,8 +99,8 @@ export const Handler = withConfig( output = { ...output, ...(graphqlResult && { - read_queries_24h: metrics.readQueries, - write_queries_24h: metrics.writeQueries, + read_queries_24h: metrics.readQueries.toLocaleString(), + write_queries_24h: metrics.writeQueries.toLocaleString(), }), }; } From a2900f3091101f9e37a4f3e0409a0ec8451cd717 Mon Sep 17 00:00:00 2001 From: Max Rozen <3822106+rozenmd@users.noreply.github.com> Date: Mon, 12 Jun 2023 18:42:30 +0200 Subject: [PATCH 7/9] fix: don't prettify json output --- packages/wrangler/src/d1/info.tsx | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/wrangler/src/d1/info.tsx b/packages/wrangler/src/d1/info.tsx index 154f104c1e02..6beb0696d42f 100644 --- a/packages/wrangler/src/d1/info.tsx +++ b/packages/wrangler/src/d1/info.tsx @@ -99,8 +99,8 @@ export const Handler = withConfig( output = { ...output, ...(graphqlResult && { - read_queries_24h: metrics.readQueries.toLocaleString(), - write_queries_24h: metrics.writeQueries.toLocaleString(), + read_queries_24h: metrics.readQueries, + write_queries_24h: metrics.writeQueries, }), }; } @@ -111,10 +111,20 @@ export const Handler = withConfig( // Snip off the "uuid" property from the response and use those as the header const entries = Object.entries(output).filter(([k, _v]) => k !== "uuid"); - const data = entries.map(([k, v]) => ({ - [db.binding || ""]: k, - [db.uuid]: k === "file_size" ? prettyBytes(Number(v)) : v, - })); + const data = entries.map(([k, v]) => { + let value; + if (k === "file_size") { + value = prettyBytes(Number(v)); + } else if (k === "read_queries_24h" || k === "write_queries_24h") { + value = v.toLocaleString(); + } else { + value = v; + } + return { + [db.binding || ""]: k, + [db.uuid]: value, + }; + }); logger.log(renderToString()); } From 790a089241c408634d619f3e7e2f9efeea189a9c Mon Sep 17 00:00:00 2001 From: Max Rozen <3822106+rozenmd@users.noreply.github.com> Date: Mon, 12 Jun 2023 19:31:03 +0200 Subject: [PATCH 8/9] file_size -> database_size --- packages/wrangler/src/d1/info.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/wrangler/src/d1/info.tsx b/packages/wrangler/src/d1/info.tsx index 6beb0696d42f..a5494d1de127 100644 --- a/packages/wrangler/src/d1/info.tsx +++ b/packages/wrangler/src/d1/info.tsx @@ -49,6 +49,10 @@ export const Handler = withConfig( ); let output: Record = { ...result }; + if (output["file_size"]) { + output["database_size"] = output["file_size"]; + delete output["file_size"]; + } if (result.version === "beta") { const today = new Date(); const yesterday = subDays(today, 1); @@ -113,7 +117,7 @@ export const Handler = withConfig( const entries = Object.entries(output).filter(([k, _v]) => k !== "uuid"); const data = entries.map(([k, v]) => { let value; - if (k === "file_size") { + if (k === "database_size") { value = prettyBytes(Number(v)); } else if (k === "read_queries_24h" || k === "write_queries_24h") { value = v.toLocaleString(); From 9bd778ff81702254dc317b3e2282d6ad580312f2 Mon Sep 17 00:00:00 2001 From: Max Rozen <3822106+rozenmd@users.noreply.github.com> Date: Tue, 13 Jun 2023 13:28:04 +0200 Subject: [PATCH 9/9] remove date-fns, fix up some logic --- package-lock.json | 8 ++++---- packages/wrangler/package.json | 1 - packages/wrangler/src/cfetch/index.ts | 2 +- packages/wrangler/src/d1/info.tsx | 29 ++++++++++++--------------- 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 516f13e16b74..53cf71db94c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2802,7 +2802,7 @@ }, "node_modules/@clack/prompts/node_modules/is-unicode-supported": { "version": "1.3.0", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -10141,6 +10141,7 @@ "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, "dependencies": { "@babel/runtime": "^7.21.0" }, @@ -31513,7 +31514,6 @@ "@esbuild-plugins/node-modules-polyfill": "^0.1.4", "blake3-wasm": "^2.1.5", "chokidar": "^3.5.3", - "date-fns": "^2.30.0", "esbuild": "0.16.3", "miniflare": "^3.0.0", "nanoid": "^3.3.3", @@ -34940,7 +34940,7 @@ "is-unicode-supported": { "version": "1.3.0", "bundled": true, - "dev": true + "extraneous": true } } }, @@ -40816,6 +40816,7 @@ "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, "requires": { "@babel/runtime": "^7.21.0" } @@ -54431,7 +54432,6 @@ "cmd-shim": "^4.1.0", "command-exists": "^1.2.9", "concurrently": "^7.2.2", - "date-fns": "*", "devtools-protocol": "^0.0.955664", "dotenv": "^16.0.0", "esbuild": "0.16.3", diff --git a/packages/wrangler/package.json b/packages/wrangler/package.json index 31980157a632..76110034f622 100644 --- a/packages/wrangler/package.json +++ b/packages/wrangler/package.json @@ -102,7 +102,6 @@ "@esbuild-plugins/node-modules-polyfill": "^0.1.4", "blake3-wasm": "^2.1.5", "chokidar": "^3.5.3", - "date-fns": "^2.30.0", "esbuild": "0.16.3", "miniflare": "^3.0.0", "nanoid": "^3.3.3", diff --git a/packages/wrangler/src/cfetch/index.ts b/packages/wrangler/src/cfetch/index.ts index 45f8574c6f2f..34a169c910fe 100644 --- a/packages/wrangler/src/cfetch/index.ts +++ b/packages/wrangler/src/cfetch/index.ts @@ -52,7 +52,7 @@ export async function fetchGraphqlResult( ): Promise { const json = await fetchInternal( "/graphql", - { ...init, method: "POST" }, //Cloudflare API v4 doesn't allow POSTs to /graphql + { ...init, method: "POST" }, //Cloudflare API v4 doesn't allow GETs to /graphql undefined, abortSignal ); diff --git a/packages/wrangler/src/d1/info.tsx b/packages/wrangler/src/d1/info.tsx index a5494d1de127..e45c28a01202 100644 --- a/packages/wrangler/src/d1/info.tsx +++ b/packages/wrangler/src/d1/info.tsx @@ -1,4 +1,3 @@ -import { subDays } from "date-fns"; import Table from "ink-table"; import prettyBytes from "pretty-bytes"; import React from "react"; @@ -48,14 +47,15 @@ export const Handler = withConfig( } ); - let output: Record = { ...result }; + const output: Record = { ...result }; if (output["file_size"]) { output["database_size"] = output["file_size"]; delete output["file_size"]; } if (result.version === "beta") { const today = new Date(); - const yesterday = subDays(today, 1); + const yesterday = new Date(new Date(today).setDate(today.getDate() - 1)); + const graphqlResult = await fetchGraphqlResult({ method: "POST", body: JSON.stringify({ @@ -94,19 +94,16 @@ export const Handler = withConfig( }); const metrics = { readQueries: 0, writeQueries: 0 }; - graphqlResult?.data?.viewer?.accounts[0]?.d1AnalyticsAdaptiveGroups?.forEach( - (row) => { - metrics.readQueries += row?.sum?.readQueries ?? 0; - metrics.writeQueries += row?.sum?.writeQueries ?? 0; - } - ); - output = { - ...output, - ...(graphqlResult && { - read_queries_24h: metrics.readQueries, - write_queries_24h: metrics.writeQueries, - }), - }; + if (graphqlResult) { + graphqlResult.data?.viewer?.accounts[0]?.d1AnalyticsAdaptiveGroups?.forEach( + (row) => { + metrics.readQueries += row?.sum?.readQueries ?? 0; + metrics.writeQueries += row?.sum?.writeQueries ?? 0; + } + ); + output.read_queries_24h = metrics.readQueries; + output.write_queries_24h = metrics.writeQueries; + } } if (json) {