paint-brush
Cách truy xuất số liệu sức khỏe cho luồng trực tiếp Amazon IVS và hiển thị chúng dưới dạng biểu đồtừ tác giả@amazonivs
357 lượt đọc
357 lượt đọc

Cách truy xuất số liệu sức khỏe cho luồng trực tiếp Amazon IVS và hiển thị chúng dưới dạng biểu đồ

từ tác giả Amazon Interactive Video Service (IVS) 11m2023/03/29
Read on Terminal Reader

dài quá đọc không nổi

Nếu bạn đang xây dựng nền tảng nội dung do người dùng tạo 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. Trong bài đăng này, chúng tôi sẽ trình bày một số ví dụ về cách truy xuất phiên phát trực tiếp và truy xuất chỉ số tình trạng cho luồng trực tiếp từ Amazon CloudWatch. 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 tình trạng theo thời gian thực.
featured image - Cách truy xuất số liệu sức khỏe cho luồng trực tiếp Amazon IVS và hiển thị chúng dưới dạng biểu đồ
Amazon Interactive Video Service (IVS)  HackerNoon profile picture
0-item
1-item

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.

Truy xuất phiên truyền phát Amazon IVS

Vì chúng tôi cần StartTimeEndTime để 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]" } ] }

Truy xuất một phiên luồng đơn

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 ARNstreamId 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" } ] } }

Xem chỉ số tình trạng luồng qua Bảng điều khiển AWS

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.

Truy xuất số liệu về tình trạng luồng qua SDK

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 StartTimeEndTime , 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 , IngestFramerateKeyframeInterval . 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.


  • Số liệu 1 giây có sẵn trong 3 giờ.
  • Số liệu 60 giây có sẵn trong 15 ngày.
  • Số liệu 5 phút có sẵn trong 63 ngày.
  • Số liệu 1 giờ có sẵn trong 455 ngày (15 tháng).


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:

Nhập tốc độ bit của video

Nhập tốc độ bit âm thanh

Nhập tốc độ khung hình:

Khoảng thời gian khung hình chính:

Tạo hình ảnh biểu đồ với Amazon CloudWatch SDK

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 .

Bản tóm tắt

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.