|
1 | 1 | import * as backend from "../backend";
|
2 | 2 | import * as clc from "colorette";
|
3 | 3 |
|
| 4 | +import * as args from "../args"; |
4 | 5 | import { logger } from "../../../logger";
|
5 |
| -import { track } from "../../../track"; |
| 6 | +import { trackGA4 } from "../../../track"; |
6 | 7 | import * as utils from "../../../utils";
|
7 | 8 | import { getFunctionLabel } from "../functionsDeployHelper";
|
8 | 9 |
|
@@ -56,62 +57,76 @@ export class AbortedDeploymentError extends DeploymentError {
|
56 | 57 | }
|
57 | 58 |
|
58 | 59 | /** Add debugger logs and GA metrics for deploy stats. */
|
59 |
| -export async function logAndTrackDeployStats(summary: Summary): Promise<void> { |
| 60 | +export async function logAndTrackDeployStats( |
| 61 | + summary: Summary, |
| 62 | + context?: args.Context |
| 63 | +): Promise<void> { |
60 | 64 | let totalTime = 0;
|
61 | 65 | let totalErrors = 0;
|
62 | 66 | let totalSuccesses = 0;
|
63 | 67 | let totalAborts = 0;
|
64 | 68 | const reports: Array<Promise<void>> = [];
|
65 | 69 |
|
66 | 70 | const regions = new Set<string>();
|
| 71 | + const codebases = new Set<string>(); |
67 | 72 | for (const result of summary.results) {
|
68 |
| - const tag = triggerTag(result.endpoint); |
| 73 | + const fnDeployEvent = { |
| 74 | + platform: result.endpoint.platform, |
| 75 | + trigger_type: backend.endpointTriggerType(result.endpoint), |
| 76 | + region: result.endpoint.region, |
| 77 | + runtime: result.endpoint.runtime, |
| 78 | + status: !result.error |
| 79 | + ? "success" |
| 80 | + : result.error instanceof AbortedDeploymentError |
| 81 | + ? "aborted" |
| 82 | + : "failure", |
| 83 | + duration: result.durationMs, |
| 84 | + }; |
| 85 | + reports.push(trackGA4("function_deploy", fnDeployEvent)); |
| 86 | + |
69 | 87 | regions.add(result.endpoint.region);
|
| 88 | + codebases.add(result.endpoint.codebase || "default"); |
70 | 89 | totalTime += result.durationMs;
|
71 | 90 | if (!result.error) {
|
72 | 91 | totalSuccesses++;
|
73 |
| - reports.push(track("function_deploy_success", tag, result.durationMs)); |
| 92 | + if (context?.codebaseDeployEvents?.[result.endpoint.codebase || "default"] !== undefined) { |
| 93 | + context.codebaseDeployEvents[result.endpoint.codebase || "default"] |
| 94 | + .fn_deploy_num_successes++; |
| 95 | + } |
74 | 96 | } else if (result.error instanceof AbortedDeploymentError) {
|
75 | 97 | totalAborts++;
|
76 |
| - reports.push(track("function_deploy_abort", tag, result.durationMs)); |
| 98 | + if (context?.codebaseDeployEvents?.[result.endpoint.codebase || "default"] !== undefined) { |
| 99 | + context.codebaseDeployEvents[result.endpoint.codebase || "default"] |
| 100 | + .fn_deploy_num_canceled++; |
| 101 | + } |
77 | 102 | } else {
|
78 | 103 | totalErrors++;
|
79 |
| - reports.push(track("function_deploy_failure", tag, result.durationMs)); |
| 104 | + if (context?.codebaseDeployEvents?.[result.endpoint.codebase || "default"] !== undefined) { |
| 105 | + context.codebaseDeployEvents[result.endpoint.codebase || "default"] |
| 106 | + .fn_deploy_num_failures++; |
| 107 | + } |
80 | 108 | }
|
81 | 109 | }
|
82 | 110 |
|
83 |
| - const regionCountTag = regions.size < 5 ? regions.size.toString() : ">=5"; |
84 |
| - reports.push(track("functions_region_count", regionCountTag, 1)); |
85 |
| - |
86 |
| - const gcfv1 = summary.results.find((r) => r.endpoint.platform === "gcfv1"); |
87 |
| - const gcfv2 = summary.results.find((r) => r.endpoint.platform === "gcfv2"); |
88 |
| - const tag = gcfv1 && gcfv2 ? "v1+v2" : gcfv1 ? "v1" : "v2"; |
89 |
| - reports.push(track("functions_codebase_deploy", tag, summary.results.length)); |
| 111 | + for (const codebase of codebases) { |
| 112 | + if (context?.codebaseDeployEvents) { |
| 113 | + reports.push(trackGA4("codebase_deploy", { ...context.codebaseDeployEvents[codebase] })); |
| 114 | + } |
| 115 | + } |
| 116 | + const fnDeployGroupEvent = { |
| 117 | + codebase_deploy_count: codebases.size >= 5 ? "5+" : codebases.size.toString(), |
| 118 | + fn_deploy_num_successes: totalSuccesses, |
| 119 | + fn_deploy_num_canceled: totalAborts, |
| 120 | + fn_deploy_num_failures: totalErrors, |
| 121 | + }; |
| 122 | + reports.push(trackGA4("function_deploy_group", fnDeployGroupEvent)); |
90 | 123 |
|
91 | 124 | const avgTime = totalTime / (totalSuccesses + totalErrors);
|
92 |
| - |
93 | 125 | logger.debug(`Total Function Deployment time: ${summary.totalTime}`);
|
94 | 126 | logger.debug(`${totalErrors + totalSuccesses + totalAborts} Functions Deployed`);
|
95 | 127 | logger.debug(`${totalErrors} Functions Errored`);
|
96 | 128 | logger.debug(`${totalAborts} Function Deployments Aborted`);
|
97 | 129 | logger.debug(`Average Function Deployment time: ${avgTime}`);
|
98 |
| - if (totalErrors + totalSuccesses > 0) { |
99 |
| - if (totalErrors === 0) { |
100 |
| - reports.push(track("functions_deploy_result", "success", totalSuccesses)); |
101 |
| - } else if (totalSuccesses > 0) { |
102 |
| - reports.push(track("functions_deploy_result", "partial_success", totalSuccesses)); |
103 |
| - reports.push(track("functions_deploy_result", "partial_failure", totalErrors)); |
104 |
| - reports.push( |
105 |
| - track( |
106 |
| - "functions_deploy_result", |
107 |
| - "partial_error_ratio", |
108 |
| - totalErrors / (totalSuccesses + totalErrors) |
109 |
| - ) |
110 |
| - ); |
111 |
| - } else { |
112 |
| - reports.push(track("functions_deploy_result", "failure", totalErrors)); |
113 |
| - } |
114 |
| - } |
115 | 130 |
|
116 | 131 | await utils.allSettled(reports);
|
117 | 132 | }
|
|
0 commit comments