Se você planeja criar uma plataforma de conteúdo gerado pelo usuário (UGC) com o Amazon Interactive Video Service (Amazon IVS), provavelmente desejará integrar algum tipo de painel para monitorar a integridade das transmissões ao vivo do usuário. Como sempre, a fornece uma excelente visão geral do monitoramento da integridade do fluxo. documentação Nesta postagem, iremos um pouco mais longe e mostraremos alguns exemplos de como recuperar sessões de stream e recuperar métricas de saúde para uma transmissão ao vivo do Amazon CloudWatch. Como um bônus adicional, também veremos como gerar alguns gráficos úteis que podem ser adicionados ao seu painel UGC para monitoramento de integridade em tempo real. As métricas de integridade do fluxo do Amazon IVS são armazenadas no Amazon CloudWatch. Para recuperar essas métricas com o AWS SDK para JavaScript v3, podemos usar os do método do cliente Amazon CloudWatch ( ). documentos GetMetricDataCommand @aws-sdk/client-cloudwatch Esse método espera que algumas propriedades filtrem as métricas para um período de tempo específico e um canal Amazon IVS, como veremos a seguir. esta postagem se concentrará na recuperação de métricas de integridade do stream com o Amazon CloudWatch SDK, mas as métricas vitais de integridade do stream também podem ser observadas por meio do Amazon EventBridge para que você possa tomar qualquer ação necessária quando um stream se tornar insalubre ou os limites do serviço forem violados. Consulte a para obter mais informações. Observação: documentação Recuperando Amazon IVS Stream Sessions Como precisamos de um e para recuperar as métricas de integridade, faz sentido recuperar uma lista de sessões de streaming recentes por meio do cliente Amazon IVS ( ). Para fazer isso, podemos usar ( ) e passar o do canal que nos interessa. StartTime EndTime @aws-sdk/client-ivs ListStreamSessionsCommand docs 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) A resposta de retornará um objeto. A chave nesse objeto contém uma matriz de sessões de fluxo, classificadas pela sessão mais recente. As sessões ativas são indicadas pela ausência de um . 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]" } ] } Recuperando uma Sessão de Stream Único Neste ponto, poderíamos usar esses carimbos de data/hora para recuperar nossas métricas de fluxo. Porém, pode ser útil obter um pouco mais de detalhes, como a configuração de ingestão de áudio e vídeo. Para recuperar essas informações, podemos usar ( ). Este método espera o e um que já obtivemos no resultado acima. GetStreamSessionCommand docs 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) ); O método retorna informações sobre a sessão (neste caso, uma transmissão ao vivo ativa). Observe que contém alguns itens úteis, como codec, taxa de bits, taxa de quadros, etc. O objeto contém todos os eventos que foram acionados para esse fluxo específico. 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" } ] } } Visualização das métricas de integridade do fluxo por meio do Console AWS Se estiver planejando integrar dados de métrica de integridade de fluxo em seu aplicativo, você usará um dos SDKs da AWS. Mas, se você está apenas procurando visualizar dados de métricas de integridade com menos frequência, pode visualizá-los por meio do Console AWS. Para visualizar as métricas de integridade relacionadas ao Amazon IVS, selecione e, em seguida, por meio do console do Amazon CloudWatch. Todas as métricas IVS Podemos procurar dados de métricas escolhendo uma dimensão. Por exemplo, para visualizar métricas por canal, selecione e escolha o período de tempo desejado, o canal e a métrica. Por canal Recuperando métricas de integridade do fluxo por meio do SDK Estamos prontos para usar o SDK do Amazon CloudWatch para extrair dados de métricas de integridade de um canal com base nos horários de início e término do stream. espera um objeto ( ). GetMetricDataCommand GetMetricDataCommandInput docs Conforme mencionado acima, este objeto possui as propriedades e , bem como uma propriedade que deve conter um array de consultas dependendo das métricas de integridade que desejamos recuperar. Há quatro propriedades relacionadas à integridade do canal do Amazon IVS nas quais estamos interessados aqui: , , e . Construiremos uma matriz para cada métrica, usando como o e filtrando em um canal específico capturando a parte do ARN do canal seguindo . StartTime EndTime MetricDataQueries IngestAudioBitrate IngestVideoBitrate IngestFramerate KeyframeInterval AWS/IVS Namespace / 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') ); O resultado da chamada será semelhante à seguinte saída: 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": [] } É importante observar que as métricas do Amazon CloudWatch são acumuladas ao longo do tempo, portanto, a resolução granular diminui com o tempo. Métricas de 1 segundo estão disponíveis por 3 horas. Métricas de 60 segundos estão disponíveis por 15 dias. Métricas de 5 minutos estão disponíveis por 63 dias. Métricas de 1 hora estão disponíveis por 455 dias (15 meses). Se fôssemos executar a mesma consulta com um intervalo de tempo maior (dependendo da disponibilidade dos dados conforme mencionado acima), podemos filtrar e agrupar os dados com base em uma única métrica e usar esse resultado para renderizar um bom gráfico dos valores . 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)); Isso produz uma matriz de objetos que se parece com o seguinte: [ { "timestamp": "2023-01-20T14:47:05.000Z", "bitrate": 3497.9884859657454 } ] Podemos usar esses dados filtrados para criar algumas visualizações interessantes para nossos painéis UGC. Alguns exemplos rápidos: Taxa de bits do vídeo de ingestão Taxa de bits de áudio de ingestão Taxa de quadros de ingestão: Intervalo do quadro-chave: Geração de imagens de gráficos com o Amazon CloudWatch SDK Outra opção super bacana é gerar os gráficos diretamente pelo Amazon CloudWatch SDK. Verifique a para obter detalhes. Aqui está um exemplo de geração de um gráfico para a métrica por meio do Amazon CloudWatch SDK. documentação 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') ); A chamada para retorna um objeto JSON semelhante ao seguinte: GetMetricWidgetImageCommand { '$metadata': { httpStatusCode: 200, requestId: '[redacted]', extendedRequestId: undefined, cfId: undefined, attempts: 1, totalRetryDelay: 0 }, MetricWidgetImage: Uint8Array(36660) [ 137, 80, 78, ... 36560 more items ] } Podemos converter o em uma string base64: Uint8Array const buffer = Buffer.from(metricImage.MetricWidgetImage); console.log(buffer.toString('base64')); Que retorna uma string base64: iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPA... Isso pode ser usado para renderizar uma imagem: Podemos até combinar várias métricas em uma única imagem passando métricas adicionais para . GetMetricWidgetImageCommand Resumo Nesta postagem, vimos como recuperar métricas de integridade para uma transmissão ao vivo do Amazon IVS e renderizá-las como gráficos. Fique atento para uma postagem futura em que nos aprofundaremos em algumas das outras métricas disponíveis via Amazon CloudWatch relacionadas a visualizadores de transmissão ao vivo.