Nếu bạn đang dự định xây dựng nền tảng nội dung do người dùng tạo (UGC) với Amazon Interactive Video Service (Amazon IVS), thì bạn có thể muốn tích hợp một số loại bảng điều khiển để theo dõi tình trạng luồng trực tiếp của người dùng. Như mọi khi, tài liệu này cung cấp một cái nhìn tổng quan tuyệt vời về việc theo dõi tình trạng luồng.
Trong bài đăng này, chúng tôi sẽ đi xa hơn một chút và trình bày một số ví dụ về cách truy xuất các phiên phát trực tiếp cũng như truy xuất các chỉ số tình trạng cho một luồng trực tiếp từ Amazon CloudWatch. Như một phần thưởng bổ sung, chúng tôi cũng sẽ xem xét việc tạo một số biểu đồ hữu ích có thể được thêm vào bảng điều khiển UGC của bạn để theo dõi sức khỏe theo thời gian thực.
Số liệu về tình trạng luồng Amazon IVS được lưu trữ trong Amazon CloudWatch. Để truy xuất các số liệu này bằng AWS SDK dành cho JavaScript v3, chúng ta có thể sử dụng tài liệu phương thức GetMetricDataCommand
từ ứng dụng khách Amazon CloudWatch ( @aws-sdk/client-cloudwatch
).
Phương pháp này yêu cầu một số thuộc tính lọc số liệu theo khoảng thời gian cụ thể và kênh Amazon IVS như chúng ta sẽ thấy bên dưới.
Lưu ý: Bài đăng này sẽ tập trung vào việc truy xuất các chỉ số về tình trạng của luồng bằng Amazon CloudWatch SDK, nhưng bạn cũng có thể quan sát các chỉ số về tình trạng của luồng quan trọng thông qua Amazon EventBridge để bạn có thể thực hiện bất kỳ hành động cần thiết nào khi một luồng trở nên không lành mạnh hoặc các giới hạn dịch vụ bị vi phạm. Tham khảo tài liệu để biết thêm thông tin.
Vì chúng tôi cần StartTime
và EndTime
để truy xuất các số liệu về sức khỏe, nên việc truy xuất danh sách các phiên phát trực tiếp gần đây thông qua ứng dụng khách Amazon IVS ( @aws-sdk/client-ivs
) là điều hợp lý. Để làm điều này, chúng tôi có thể sử dụng ListStreamSessionsCommand
( docs ) và chuyển ARN
cho kênh mà chúng tôi quan tâm.
import { IvsClient, ListStreamSessionsCommand } from "@aws-sdk/client-ivs"; const ivsClient = new IvsClient(); const listStreamSessionsInput = { channelArn: process.env.DEMO_CHANNEL_ARN, maxResults: 3, // default=100 }; const listStreamSessionsRequest = new ListStreamSessionsCommand(listStreamSessionsInput); const listStreamSessionsResponse = await ivsClient.send(listStreamSessionsRequest); console.log(listStreamSessionsResponse)
Phản hồi từ ListStreamSessionsCommand
sẽ trả về một đối tượng. Khóa streamSessions
trong đối tượng đó chứa một mảng các phiên truyền trực tiếp, được sắp xếp theo phiên gần đây nhất. Các phiên hoạt động được biểu thị bằng việc không có endTime
.
{ "$metadata": { "httpStatusCode": 200, "requestId": "[redacted]", "cfId": "[redacted]", "attempts": 1, "totalRetryDelay": 0 }, "nextToken": "AQI...[redacted]...A==", "streamSessions": [ { "endTime": undefined, "hasErrorEvent": false, "startTime": "2023-01-20T14:30:11.000Z", "streamId": "st-[redacted]" }, { "endTime": "2023-01-19T16:12:37.000Z", "hasErrorEvent": false, "startTime": "2023-01-19T16:12:29.000Z", "streamId": "st-[redacted]" }, { "endTime": "2023-01-19T16:12:25.000Z", "hasErrorEvent": false, "startTime": "2023-01-19T16:12:22.000Z", "streamId": "st-[redacted]" } ] }
Tại thời điểm này, chúng tôi có thể sử dụng các dấu thời gian này để truy xuất số liệu luồng của mình. Tuy nhiên, có thể hữu ích nếu lấy thêm một chút chi tiết, chẳng hạn như cấu hình nhập âm thanh và video. Để truy xuất thông tin này, chúng tôi có thể sử dụng GetStreamSessionCommand
( docs ). Phương pháp này yêu cầu ARN
và streamId
mà chúng tôi đã thu được trong kết quả trên.
import { IvsClient, GetStreamSessionCommand } from "@aws-sdk/client-ivs"; import util from "node:util"; const ivsClient = new IvsClient(); const getStreamSessionInput = { channelArn: process.env.DEMO_CHANNEL_ARN, streamId: 'st-[redacted]' }; const getStreamSessionRequest = new GetStreamSessionCommand(getStreamSessionInput); const getStreamSessionResponse = await ivsClient.send(getStreamSessionRequest); console.log( util.inspect(getStreamSessionResponse, false, null, true) );
Phương thức GetStreamSessionCommand
trả về thông tin về phiên (trong trường hợp này là luồng trực tiếp đang hoạt động). Lưu ý rằng ingestConfiguration
chứa một số mục hữu ích như codec, tốc độ bit, tốc độ khung hình, v.v. Đối tượng truncatedEvents
chứa tất cả các sự kiện đã được kích hoạt cho luồng cụ thể này.
{ "$metadata": { "httpStatusCode": 200, "requestId": "[redacted]", "cfId": "[redacted]", "attempts": 1, "totalRetryDelay": 0 }, "streamSession": { "channel": { "arn": "[redacted]", "authorized": false, "ingestEndpoint": "[redacted]", "latencyMode": "LOW", "name": "demo-channel", "playbackUrl": "[redacted]", "recordingConfigurationArn": "[redacted]", "type": "STANDARD" }, "ingestConfiguration": { "audio": { "channels": 2, "codec": "mp4a.40.2", "sampleRate": 48000, "targetBitrate": 128000 }, "video": { "avcLevel": "3.1", "avcProfile": "Baseline", "codec": "avc1.42C01F", "encoder": "", "targetBitrate": 8500000, "targetFramerate": 30, "videoHeight": 1080, "videoWidth": 1920 } }, "recordingConfiguration": { "arn": "[redacted]", "destinationConfiguration": { "s3": { "bucketName": "[redacted]" } }, "state": "ACTIVE" }, "startTime": "2023-01-20T14:30:11.000Z", "streamId": "st-[redacted]", "truncatedEvents": [ { "eventTime": "2023-01-20T14:30:19.000Z", "name": "Recording Start", "type": "IVS Recording State Change" }, { "eventTime": "2023-01-20T14:30:18.000Z", "name": "Stream Start", "type": "IVS Stream State Change" }, { "eventTime": "2023-01-20T14:30:11.000Z", "name": "Session Created", "type": "IVS Stream State Change" } ] } }
Nếu dự định tích hợp dữ liệu chỉ số tình trạng luồng vào ứng dụng của mình, thì bạn sẽ sử dụng một trong các SDK AWS. Tuy nhiên, nếu bạn chỉ muốn xem dữ liệu chỉ số sức khỏe trên cơ sở ít thường xuyên hơn, thì bạn có thể xem chúng qua Bảng điều khiển AWS. Để xem các chỉ số tình trạng liên quan đến Amazon IVS, hãy chọn Tất cả chỉ số , sau đó chọn IVS qua bảng điều khiển Amazon CloudWatch.
Chúng tôi có thể duyệt dữ liệu số liệu bằng cách chọn thứ nguyên.
Ví dụ: để xem số liệu theo kênh, hãy chọn Theo kênh và chọn khoảng thời gian mong muốn, kênh và số liệu.
Chúng tôi đã sẵn sàng sử dụng Amazon CloudWatch SDK để truy xuất dữ liệu chỉ số tình trạng cho một kênh dựa trên thời gian bắt đầu và kết thúc luồng. GetMetricDataCommand
mong đợi một đối tượng GetMetricDataCommandInput
( docs ).
Như đã đề cập ở trên, đối tượng này có các thuộc tính StartTime
và EndTime
, cũng như thuộc tính MetricDataQueries
sẽ chứa một mảng truy vấn tùy thuộc vào chỉ số sức khỏe mà chúng tôi muốn truy xuất. Có bốn thuộc tính liên quan đến tình trạng kênh Amazon IVS mà chúng tôi quan tâm ở đây: IngestAudioBitrate
, IngestVideoBitrate
, IngestFramerate
và KeyframeInterval
. Chúng tôi sẽ xây dựng một mảng cho từng chỉ số, sử dụng AWS/IVS
làm Namespace
và lọc trên một kênh cụ thể bằng cách lấy phần ARN của kênh theo sau /
.
import { CloudWatchClient, GetMetricDataCommand } from "@aws-sdk/client-cloudwatch"; const cloudWatchClient = new CloudWatchClient();
const getMetrics = async (arn, startTime, endTime) => { const streamHealthMetrics = [ "IngestAudioBitrate", "IngestVideoBitrate", "IngestFramerate", "KeyframeInterval" ]; const metricDataQueries = streamHealthMetrics.map((metric) => { return { Id: metric.toLowerCase(), MetricStat: { Metric: { MetricName: metric, Namespace: "AWS/IVS", Dimensions: [{ Name: "Channel", Value: arn.split("/")[1] }] }, Period: 5, Stat: "Average", } } }); const getMetricDataInput = { StartTime: startTime, EndTime: endTime, MetricDataQueries: metricDataQueries, MaxDatapoints: 100 }; const getMetricDataRequest = new GetMetricDataCommand(getMetricDataInput); const getMetricDataResponse = await cloudWatchClient.send(getMetricDataRequest); return getMetricDataResponse; }; // get metrics for a session const metrics = await getMetrics( process.env.DEMO_CHANNEL_ARN, new Date('2023-01-20T14:30:11.000Z'), new Date('2023-01-20T14:49:15.000Z') );
Kết quả của việc gọi GetMetricDataCommand
sẽ giống như đầu ra sau:
{ "$metadata": { "httpStatusCode": 200, "requestId": "[redacted]", "attempts": 1, "totalRetryDelay": 0 }, "MetricDataResults": [ { "Id": "ingestaudiobitrate", "Label": "IngestAudioBitrate", "Timestamps": [ "2023-01-20T14:49:10.000Z" ], "Values": [ 31049.333057821852 ], "StatusCode": "PartialData" }, { "Id": "ingestvideobitrate", "Label": "IngestVideoBitrate", "Timestamps": [ "2023-01-20T14:49:10.000Z" ], "Values": [ 3497988.4859657455 ], "StatusCode": "PartialData" }, { "Id": "ingestframerate", "Label": "IngestFramerate", "Timestamps": [ "2023-01-20T14:49:10.000Z" ], "Values": [ 29.143738984724312 ], "StatusCode": "PartialData" }, { "Id": "keyframeinterval", "Label": "KeyframeInterval", "Timestamps": [ "2023-01-20T14:49:10.000Z" ], "Values": [ 2.007629037 ], "StatusCode": "PartialData" } ], "NextToken": "[redacted]", "Messages": [] }
Điều quan trọng cần lưu ý là các chỉ số của Amazon CloudWatch được cộng dồn theo thời gian, do đó độ phân giải chi tiết giảm dần theo thời gian.
Nếu chúng tôi chạy cùng một truy vấn với phạm vi thời gian lớn hơn (tùy thuộc vào tính khả dụng của dữ liệu như đã đề cập ở trên), chúng tôi có thể lọc và nhóm dữ liệu dựa trên một số liệu duy nhất và sử dụng kết quả đó để hiển thị biểu đồ đẹp về các giá trị .
const videoBitrateMetrics = metrics .MetricDataResults .find((metric) => metric.Id === 'ingestvideobitrate'); const bitrateData = []; videoBitrateMetrics.Timestamps .sort((a, b) => new Date(a) > new Date(b) ? 1 : -1) .forEach((t, i) => { bitrateData.push({ timestamp: t, bitrate: videoBitrateMetrics.Values[i] / 1000, }) }); console.log(JSON.stringify(bitrateData));
Điều này tạo ra một mảng các đối tượng giống như sau:
[ { "timestamp": "2023-01-20T14:47:05.000Z", "bitrate": 3497.9884859657454 } ]
Chúng tôi có thể sử dụng dữ liệu đã lọc này để tạo một số hình ảnh trực quan đẹp mắt cho bảng điều khiển UGC của mình. Một số ví dụ nhanh:
Một tùy chọn siêu thú vị khác là tạo biểu đồ trực tiếp qua Amazon CloudWatch SDK. Kiểm tra tài liệu để biết chi tiết. Dưới đây là ví dụ về cách tạo biểu đồ cho chỉ số IngestFramerate
thông qua Amazon CloudWatch SDK.
const getMetricImage = async (arn, startDate, endDate) => { const cloudWatchClient = new CloudWatchClient(); const getMetricWidgetImageInput = { MetricWidget: JSON.stringify({ metrics: [ [ "AWS/IVS", "IngestFramerate", "Channel", arn.split("/")[1] ] ], start: startDate, end: endDate, period: 5 }) }; const getMetricWidgetImageRequest = new GetMetricWidgetImageCommand(getMetricWidgetImageInput); const getMetricWidgetImageResponse = await cloudWatchClient.send(getMetricWidgetImageRequest); return getMetricWidgetImageResponse; }; const metricImage = await getMetricImage( process.env.DEMO_CHANNEL_ARN, new Date('2023-01-20T14:30:11.000Z'), new Date('2023-01-20T14:49:15.000Z') );
Lệnh gọi GetMetricWidgetImageCommand
trả về một đối tượng JSON giống như sau:
{ '$metadata': { httpStatusCode: 200, requestId: '[redacted]', extendedRequestId: undefined, cfId: undefined, attempts: 1, totalRetryDelay: 0 }, MetricWidgetImage: Uint8Array(36660) [ 137, 80, 78, ... 36560 more items ] }
Chúng ta có thể chuyển đổi Uint8Array
thành chuỗi base64:
const buffer = Buffer.from(metricImage.MetricWidgetImage); console.log(buffer.toString('base64'));
Trả về chuỗi base64:
iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPA...
Điều đó có thể được sử dụng để hiển thị một hình ảnh:
Chúng tôi thậm chí có thể kết hợp nhiều số liệu trong một hình ảnh bằng cách chuyển các số liệu bổ sung tới GetMetricWidgetImageCommand
.
Trong bài đăng này, chúng tôi đã xem xét cách truy xuất số liệu tình trạng cho luồng trực tiếp Amazon IVS và hiển thị chúng dưới dạng biểu đồ. Hãy theo dõi bài đăng trong tương lai, nơi chúng tôi tìm hiểu một số chỉ số khác có sẵn qua Amazon CloudWatch liên quan đến người xem phát trực tiếp.