Skip to content

Commit ee59175

Browse files
authored
Merge pull request #203 from muxinc/bp/telemetry-updates
Update telemetry calls to include the upload id & send on error
2 parents 86845b0 + 2306c45 commit ee59175

File tree

3 files changed

+73
-73
lines changed

3 files changed

+73
-73
lines changed

components/upload-progress-fullpage.tsx

Lines changed: 20 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,11 @@ import useSwr from 'swr';
55
import Layout from './layout';
66
import Button from './button';
77
import Cookies from 'js-cookie';
8+
import { reportUploadTelemetry, UploadTelemetry } from '../lib/telemetry';
89

910
const fetcher = (url: string) => fetch(url).then((res) => res.json());
1011
const MAX_VIDEO_DURATION_MIN = 60;
1112

12-
type ChunkInfo = {
13-
size: number;
14-
uploadStarted: number;
15-
uploadFinished?: number;
16-
}
17-
18-
type UploadTelemetry = {
19-
fileSize: number;
20-
uploadStarted: number;
21-
uploadFinished?: number;
22-
chunkSize: number;
23-
dynamicChunkSize: boolean;
24-
chunks: ChunkInfo[];
25-
};
26-
2713
type Props = {
2814
file: File;
2915
resetPage: () => void;
@@ -32,6 +18,8 @@ type Props = {
3218
const UploadProgressFullpage: React.FC<Props> = ({ file, resetPage }) => {
3319
const [isUploading, setIsUploading] = useState(false);
3420
const [uploadId, setUploadId] = useState('');
21+
// Add this ref to store the current upload ID
22+
const currentUploadIdRef = useRef('');
3523
const [progress, setProgress] = useState(0);
3624
const [isPreparing, setIsPreparing] = useState(false);
3725
const [errorMessage, setErrorMessage] = useState('');
@@ -46,18 +34,15 @@ const UploadProgressFullpage: React.FC<Props> = ({ file, resetPage }) => {
4634

4735
const createUpload = async () => {
4836
try {
49-
return fetch('/api/uploads', {
50-
method: 'POST',
51-
})
52-
.then((res) => res.json())
53-
.then(({ id, url }) => {
54-
setUploadId(id);
55-
return url;
56-
});
37+
const res = await fetch('/api/uploads', { method: 'POST' });
38+
const { id, url } = await res.json();
39+
setUploadId(id);
40+
currentUploadIdRef.current = id; // Store the current upload ID in the ref
41+
return url;
5742
} catch (e) {
5843
console.error('Error in createUpload', e); // eslint-disable-line no-console
5944
setErrorMessage('Error creating upload');
60-
return Promise.reject(e);
45+
return e;
6146
}
6247
};
6348

@@ -100,26 +85,25 @@ const UploadProgressFullpage: React.FC<Props> = ({ file, resetPage }) => {
10085

10186
upChunk.on('error', (err) => {
10287
setErrorMessage(err.detail);
88+
reportUploadTelemetry({
89+
...uploadAnalytics,
90+
uploadId: currentUploadIdRef.current,
91+
uploadFinished: Date.now(),
92+
uploadErrored: true,
93+
message: err.detail,
94+
});
10395
});
10496

10597
upChunk.on('progress', (progressEvt) => {
10698
setProgress(Math.floor(progressEvt.detail));
10799
});
108100

109101
upChunk.on('success', () => {
110-
uploadAnalytics.uploadFinished = Date.now();
111-
112-
fetch('/api/telemetry', {
113-
method: 'POST',
114-
headers: {
115-
'Content-Type': 'application/json',
116-
},
117-
body: JSON.stringify({
118-
type: 'upload',
119-
data: uploadAnalytics,
120-
})
102+
reportUploadTelemetry({
103+
...uploadAnalytics,
104+
uploadId: currentUploadIdRef.current,
105+
uploadFinished: Date.now(),
121106
});
122-
123107
setIsPreparing(true);
124108
});
125109
} catch (err) {

lib/telemetry.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
export type ChunkInfo = {
2+
size: number;
3+
uploadStarted: number;
4+
uploadFinished?: number;
5+
};
6+
7+
export type UploadTelemetry = {
8+
uploadId?: string;
9+
message?: string;
10+
fileSize?: number;
11+
uploadStarted?: number;
12+
uploadFinished?: number;
13+
uploadErrored?: boolean;
14+
dynamicChunkSize?: boolean;
15+
chunkSize?: number;
16+
chunks: ChunkInfo[];
17+
}
18+
19+
export function reportUploadTelemetry(data: UploadTelemetry) {
20+
fetch('/api/telemetry', {
21+
method: 'POST',
22+
headers: {
23+
'Content-Type': 'application/json',
24+
},
25+
body: JSON.stringify({
26+
type: 'upload',
27+
data,
28+
}),
29+
});
30+
}

pages/index.tsx

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,12 @@ import Link from 'next/link';
88
import Button from '../components/button';
99
import Layout from '../components/layout';
1010
import { breakpoints } from '../style-vars';
11+
import { reportUploadTelemetry, UploadTelemetry, ChunkInfo } from '../lib/telemetry';
1112

1213
const fetcher = (url: string) => fetch(url).then((res) => res.json());
1314

1415
type Props = null;
1516

16-
type ChunkInfo = {
17-
size: number;
18-
uploadStarted: number;
19-
uploadFinished?: number;
20-
}
21-
22-
type UploadTelemetry = {
23-
fileSize: number;
24-
uploadStarted: number;
25-
uploadFinished?: number;
26-
dynamicChunkSize?: boolean;
27-
chunkSize: number;
28-
chunks: ChunkInfo[];
29-
};
30-
3117
const Index: React.FC<Props> = () => {
3218
const [isUploading, setIsUploading] = useState<boolean>(false);
3319
const [uploadId, setUploadId] = useState<string>('');
@@ -45,18 +31,14 @@ const Index: React.FC<Props> = () => {
4531

4632
const createUpload = async () => {
4733
try {
48-
return fetch('/api/uploads', {
49-
method: 'POST',
50-
})
51-
.then((res) => res.json())
52-
.then(({ id, url }) => {
53-
setUploadId(id);
54-
return url;
55-
});
34+
const res = await fetch('/api/uploads', { method: 'POST' });
35+
const { id, url } = await res.json();
36+
setUploadId(id);
37+
return url;
5638
} catch (e) {
5739
console.error('Error in createUpload', e);
5840
setErrorMessage('Error creating upload.');
59-
return Promise.reject(e);
41+
return e;
6042
}
6143
};
6244

@@ -99,23 +81,26 @@ const Index: React.FC<Props> = () => {
9981
};
10082

10183
const handleSuccess: MuxUploaderProps['onSuccess'] = () => {
102-
const finalAnalytics = {...uploadAnalytics};
103-
finalAnalytics.uploadFinished = Date.now();
104-
105-
fetch('/api/telemetry', {
106-
method: 'POST',
107-
headers: {
108-
'Content-Type': 'application/json',
109-
},
110-
body: JSON.stringify({
111-
type: 'upload',
112-
data: finalAnalytics,
113-
})
84+
reportUploadTelemetry({
85+
...uploadAnalytics,
86+
uploadFinished: Date.now(),
87+
uploadId,
11488
});
115-
11689
setIsPreparing(true);
11790
};
11891

92+
const handleUploadError: MuxUploaderProps['onUploadError'] = ({ detail }) => {
93+
setIsUploading(false);
94+
reportUploadTelemetry({
95+
...uploadAnalytics,
96+
uploadId,
97+
uploadFinished: Date.now(),
98+
uploadErrored: true,
99+
message: detail.message,
100+
});
101+
};
102+
103+
119104
const [isDynamicChunkSizeSet, setIsDynamicChunkSizeSet] = useState(false);
120105
useEffect(() => {
121106
const isDynamic: string = Cookies.get('dynamicChunkSize') || '';
@@ -165,6 +150,7 @@ const Index: React.FC<Props> = () => {
165150
onChunkAttempt={handleChunkAttempt}
166151
onChunkSuccess={handleChunkSuccess}
167152
onSuccess={handleSuccess}
153+
onUploadError={handleUploadError}
168154
dynamicChunkSize={isDynamicChunkSizeSet}
169155
endpoint={createUpload}
170156
style={{ fontSize: isUploading ? '4vw': '26px' }}

0 commit comments

Comments
 (0)