Skip to content

Commit ab5ae9f

Browse files
authoredMar 21, 2024··
chore(schema): add tracing for schema extraction (#6019)
1 parent 6c894c3 commit ab5ae9f

File tree

2 files changed

+50
-13
lines changed

2 files changed

+50
-13
lines changed
 

‎packages/sanity/src/_internal/cli/actions/schema/extractAction.ts

+34-13
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
type ExtractSchemaWorkerData,
1010
type ExtractSchemaWorkerResult,
1111
} from '../../threads/extractSchema'
12+
import {SchemaExtractedTrace} from './extractSchema.telemetry'
1213

1314
interface ExtractFlags {
1415
workspace?: string
@@ -21,10 +22,11 @@ export type SchemaValidationFormatter = (result: ExtractSchemaWorkerResult) => s
2122

2223
export default async function extractAction(
2324
args: CliCommandArguments<ExtractFlags>,
24-
{workDir, output}: CliCommandContext,
25+
{workDir, output, telemetry}: CliCommandContext,
2526
): Promise<void> {
2627
const flags = args.extOptions
27-
const formatFlat = flags.format || 'groq-type-nodes'
28+
const formatFlag = flags.format || 'groq-type-nodes'
29+
const enforceRequiredFields = flags['enforce-required-fields'] || false
2830

2931
const rootPkgPath = readPkgUp.sync({cwd: __dirname})?.path
3032
if (!rootPkgPath) {
@@ -43,32 +45,51 @@ export default async function extractAction(
4345
const spinner = output
4446
.spinner({})
4547
.start(
46-
flags['enforce-required-fields']
48+
enforceRequiredFields
4749
? 'Extracting schema, with enforced required fields'
4850
: 'Extracting schema',
4951
)
5052

53+
const trace = telemetry.trace(SchemaExtractedTrace)
54+
trace.start()
55+
5156
const worker = new Worker(workerPath, {
5257
workerData: {
5358
workDir,
5459
workspaceName: flags.workspace,
55-
enforceRequiredFields: flags['enforce-required-fields'],
56-
format: formatFlat,
60+
enforceRequiredFields,
61+
format: formatFlag,
5762
} satisfies ExtractSchemaWorkerData,
5863
// eslint-disable-next-line no-process-env
5964
env: process.env,
6065
})
6166

62-
const {schema} = await new Promise<ExtractSchemaWorkerResult>((resolve, reject) => {
63-
worker.addListener('message', resolve)
64-
worker.addListener('error', reject)
65-
})
67+
try {
68+
const {schema} = await new Promise<ExtractSchemaWorkerResult>((resolve, reject) => {
69+
worker.addListener('message', resolve)
70+
worker.addListener('error', reject)
71+
})
72+
73+
trace.log({
74+
schemaAllTypesCount: schema.length,
75+
schemaDocumentTypesCount: schema.filter((type) => type.type === 'document').length,
76+
schemaTypesCount: schema.filter((type) => type.type === 'type').length,
77+
enforceRequiredFields,
78+
schemaFormat: formatFlag,
79+
})
6680

67-
const path = flags.path || join(process.cwd(), 'schema.json')
81+
const path = flags.path || join(process.cwd(), 'schema.json')
6882

69-
spinner.text = `Writing schema to ${path}`
83+
spinner.text = `Writing schema to ${path}`
7084

71-
await writeFile(path, JSON.stringify(schema, null, 2))
85+
await writeFile(path, JSON.stringify(schema, null, 2))
7286

73-
spinner.succeed('Extracted schema')
87+
trace.complete()
88+
89+
spinner.succeed('Extracted schema')
90+
} catch (err) {
91+
trace.error(err)
92+
spinner.fail('Failed to extract schema')
93+
throw err
94+
}
7495
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import {defineTrace} from '@sanity/telemetry'
2+
3+
interface SchemaExtractedTraceAttrubutes {
4+
schemaAllTypesCount: number
5+
schemaDocumentTypesCount: number
6+
schemaTypesCount: number
7+
8+
enforceRequiredFields: boolean
9+
schemaFormat: string
10+
}
11+
12+
export const SchemaExtractedTrace = defineTrace<SchemaExtractedTraceAttrubutes>({
13+
name: 'Schema Extracted',
14+
version: 0,
15+
description: 'Trace emitted when extracting schema',
16+
})

0 commit comments

Comments
 (0)
Please sign in to comment.