यदि आप Amazon Interactive Video Service (Amazon IVS) के साथ उपयोगकर्ता-जनित सामग्री (UGC) प्लेटफ़ॉर्म बनाने की योजना बना रहे हैं, तो आप अपने उपयोगकर्ता की लाइव स्ट्रीम के स्वास्थ्य की निगरानी के लिए किसी प्रकार के डैशबोर्ड को एकीकृत करना चाहेंगे। हमेशा की तरह, प्रलेखन धारा स्वास्थ्य की निगरानी का एक बड़ा अवलोकन प्रदान करता है।
इस पोस्ट में हम थोड़ा और आगे बढ़ेंगे और कुछ उदाहरण दिखाएंगे कि कैसे स्ट्रीम सेशन को पुनः प्राप्त करें, और Amazon CloudWatch से लाइव स्ट्रीम के लिए हेल्थ मेट्रिक्स को पुनः प्राप्त करें। एक अतिरिक्त बोनस के रूप में, हम कुछ उपयोगी चार्ट बनाने पर भी ध्यान देंगे जिन्हें रीयलटाइम स्वास्थ्य निगरानी के लिए आपके यूजीसी डैशबोर्ड में जोड़ा जा सकता है।
Amazon IVS स्ट्रीम हेल्थ मेट्रिक्स Amazon CloudWatch में संग्रहीत हैं। JavaScript v3 के लिए AWS SDK के साथ इन मेट्रिक्स को पुनः प्राप्त करने के लिए, हम Amazon CloudWatch क्लाइंट ( @aws-sdk/client-cloudwatch
) से GetMetricDataCommand
विधि डॉक्स का उपयोग कर सकते हैं।
यह विधि उम्मीद करती है कि कुछ गुण मेट्रिक्स को एक विशिष्ट समय अवधि और अमेज़ॅन आईवीएस चैनल में फ़िल्टर करेंगे जैसा कि हम नीचे देखेंगे।
नोट: यह पोस्ट Amazon CloudWatch SDK के साथ स्ट्रीम हेल्थ मेट्रिक्स को पुनः प्राप्त करने पर ध्यान केंद्रित करेगी, लेकिन महत्वपूर्ण स्ट्रीम हेल्थ मेट्रिक्स को Amazon EventBridge के माध्यम से भी देखा जा सकता है ताकि जब कोई स्ट्रीम अस्वस्थ हो जाए या सेवा सीमा का उल्लंघन हो जाए तो आप कोई भी आवश्यक कार्रवाई कर सकें। अधिक जानकारी के लिए दस्तावेज़ देखें।
चूँकि हमें हेल्थ मेट्रिक्स को पुनः प्राप्त करने के लिए StartTime
और EndTime
की आवश्यकता होती है, यह अमेज़ॅन आईवीएस क्लाइंट ( @aws-sdk/client-ivs
) के माध्यम से हाल के स्ट्रीम सत्रों की सूची को पुनः प्राप्त करने के लिए समझ में आता है। ऐसा करने के लिए, हम ListStreamSessionsCommand
( डॉक्स ) का उपयोग कर सकते हैं और उस चैनल के लिए ARN
पास कर सकते हैं जिसमें हम रुचि रखते हैं।
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)
ListStreamSessionsCommand
की प्रतिक्रिया एक वस्तु लौटाती है। उस ऑब्जेक्ट में streamSessions
कुंजी में सबसे हालिया सत्र द्वारा क्रमबद्ध स्ट्रीम सत्रों की एक सरणी होती है। 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]" } ] }
इस बिंदु पर, हम अपने स्ट्रीम मेट्रिक्स को पुनः प्राप्त करने के लिए इन टाइमस्टैम्प का उपयोग कर सकते हैं। लेकिन, ऑडियो और वीडियो अंतर्ग्रहण कॉन्फ़िगरेशन जैसे कुछ और विवरण प्राप्त करना उपयोगी हो सकता है। इस जानकारी को पुनः प्राप्त करने के लिए, हम GetStreamSessionCommand
( डॉक्स ) का उपयोग कर सकते हैं। यह विधि ARN
और एक streamId
की अपेक्षा करती है जिसे हमने उपरोक्त परिणाम में पहले ही प्राप्त कर लिया है।
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) );
GetStreamSessionCommand
विधि सत्र के बारे में जानकारी लौटाती है (इस मामले में, एक सक्रिय लाइव स्ट्रीम)। ध्यान दें कि ingestConfiguration
कोडेक, बिटरेट, फ़्रैमरेट, आदि जैसे कुछ उपयोगी आइटम शामिल हैं। truncatedEvents
ऑब्जेक्ट में वे सभी ईवेंट शामिल हैं जो इस विशेष स्ट्रीम के लिए ट्रिगर किए गए हैं।
{ "$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" } ] } }
यदि आप स्ट्रीम स्वास्थ्य मीट्रिक डेटा को अपने एप्लिकेशन में एकीकृत करने की योजना बना रहे हैं, तो आप AWS SDK में से किसी एक का उपयोग कर रहे होंगे। लेकिन, यदि आप स्वास्थ्य मीट्रिक डेटा को कम बार-बार देखना चाहते हैं, तो आप उन्हें AWS कंसोल के माध्यम से देख सकते हैं। Amazon IVS से संबंधित स्वास्थ्य मेट्रिक्स देखने के लिए, सभी मेट्रिक्स का चयन करें, फिर Amazon CloudWatch कंसोल के माध्यम से IVS चुनें।
हम आयाम चुनकर मीट्रिक डेटा ब्राउज़ कर सकते हैं।
उदाहरण के लिए, चैनल द्वारा मीट्रिक देखने के लिए, चैनल द्वारा चुनें, और वांछित समय अवधि, चैनल और मीट्रिक चुनें।
हम स्ट्रीम के प्रारंभ और समाप्ति समय के आधार पर किसी चैनल के स्वास्थ्य मीट्रिक डेटा को वापस लेने के लिए Amazon CloudWatch SDK का उपयोग करने के लिए तैयार हैं। GetMetricDataCommand
एक GetMetricDataCommandInput
ऑब्जेक्ट ( डॉक्स ) की अपेक्षा करता है।
जैसा कि ऊपर उल्लेख किया गया है, इस ऑब्जेक्ट में StartTime
और EndTime
गुण हैं, साथ ही एक MetricDataQueries
संपत्ति है जिसमें स्वास्थ्य मेट्रिक्स के आधार पर प्रश्नों की एक सरणी होनी चाहिए जिसे हम पुनर्प्राप्त करना चाहते हैं। Amazon IVS चैनल हेल्थ से संबंधित चार गुण हैं जिनमें हम रुचि रखते हैं: IngestAudioBitrate
, IngestVideoBitrate
, IngestFramerate
, और KeyframeInterval
। हम AWS/IVS
Namespace
के रूप में उपयोग करके और /
के बाद चैनल ARN के हिस्से को पकड़कर एक विशिष्ट चैनल पर फ़िल्टर करके प्रत्येक मीट्रिक के लिए एक सरणी का निर्माण करेंगे।
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') );
GetMetricDataCommand
कॉल करने का परिणाम निम्न आउटपुट जैसा दिखाई देगा:
{ "$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": [] }
यह ध्यान रखना महत्वपूर्ण है कि Amazon CloudWatch मेट्रिक्स समय के साथ लुढ़क जाते हैं, इसलिए समय के साथ दानेदार रिज़ॉल्यूशन कम हो जाता है।
यदि हम एक ही क्वेरी को एक बड़ी समय सीमा के साथ चलाते थे (जैसा कि ऊपर बताए गए डेटा की उपलब्धता के आधार पर), हम डेटा को एक ही मीट्रिक के आधार पर फ़िल्टर और समूहित कर सकते हैं और उस परिणाम का उपयोग मूल्यों के एक अच्छे चार्ट को प्रस्तुत करने के लिए कर सकते हैं। .
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));
यह ऑब्जेक्ट्स की एक सरणी उत्पन्न करता है जो निम्न जैसा दिखता है:
[ { "timestamp": "2023-01-20T14:47:05.000Z", "bitrate": 3497.9884859657454 } ]
हम अपने यूजीसी डैशबोर्ड्स के लिए कुछ अच्छे विज़ुअलाइज़ेशन बनाने के लिए इस फ़िल्टर किए गए डेटा का उपयोग कर सकते हैं। कुछ त्वरित उदाहरण:
Amazon CloudWatch SDK के माध्यम से चार्ट को सीधे जनरेट करना एक और सुपर कूल विकल्प है। विवरण के लिए दस्तावेज़ देखें। यहां Amazon CloudWatch SDK के ज़रिए IngestFramerate
मेट्रिक के लिए चार्ट जनरेट करने का एक उदाहरण दिया गया है.
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') );
GetMetricWidgetImageCommand
को कॉल एक JSON ऑब्जेक्ट देता है जो निम्न जैसा दिखता है:
{ '$metadata': { httpStatusCode: 200, requestId: '[redacted]', extendedRequestId: undefined, cfId: undefined, attempts: 1, totalRetryDelay: 0 }, MetricWidgetImage: Uint8Array(36660) [ 137, 80, 78, ... 36560 more items ] }
हम Uint8Array
को बेस 64 स्ट्रिंग में बदल सकते हैं:
const buffer = Buffer.from(metricImage.MetricWidgetImage); console.log(buffer.toString('base64'));
जो एक बेस 64 स्ट्रिंग लौटाता है:
iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPA...
इसका उपयोग छवि प्रस्तुत करने के लिए किया जा सकता है:
हम GetMetricWidgetImageCommand
में अतिरिक्त मीट्रिक पास करके एक छवि में कई मीट्रिक जोड़ सकते हैं।
इस पोस्ट में, हमने देखा कि Amazon IVS लाइव स्ट्रीम के लिए हेल्थ मेट्रिक्स कैसे प्राप्त करें और उन्हें चार्ट के रूप में प्रस्तुत करें। भविष्य की पोस्ट के लिए बने रहें जहां हम लाइव स्ट्रीम दर्शकों से संबंधित Amazon CloudWatch के माध्यम से उपलब्ध कुछ अन्य मेट्रिक्स में खुदाई करेंगे।