paint-brush
Como recuperar métricas de integridade para uma transmissão ao vivo do Amazon IVS e renderizá-las como gráficospor@amazonivs
375 leituras
375 leituras

Como recuperar métricas de integridade para uma transmissão ao vivo do Amazon IVS e renderizá-las como gráficos

Muito longo; Para ler

Se você estiver criando uma plataforma de conteúdo gerado pelo usuário 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. Nesta postagem, mostraremos alguns exemplos de como recuperar sessões de transmissão e recuperar métricas de integridade para uma transmissão ao vivo do Amazon CloudWatch. Também veremos como gerar alguns gráficos úteis que podem ser adicionados ao seu painel UGC para monitoramento de integridade em tempo real.
featured image - Como recuperar métricas de integridade para uma transmissão ao vivo do Amazon IVS e renderizá-las como gráficos
Amazon Interactive Video Service (IVS)  HackerNoon profile picture
0-item
1-item

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 documentação fornece uma excelente visão geral do monitoramento da integridade do fluxo.


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 documentos do método GetMetricDataCommand do cliente Amazon CloudWatch ( @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.


Observação: 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 documentação para obter mais informações.

Recuperando Amazon IVS Stream Sessions

Como precisamos de um StartTime e EndTime para recuperar as métricas de integridade, faz sentido recuperar uma lista de sessões de streaming recentes por meio do cliente Amazon IVS ( @aws-sdk/client-ivs ). Para fazer isso, podemos usar ListStreamSessionsCommand ( docs ) e passar o ARN do canal que nos interessa.

 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 ListStreamSessionsCommand retornará um objeto. A chave streamSessions 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 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 GetStreamSessionCommand ( docs ). Este método espera o ARN e um streamId que já obtivemos no resultado acima.

 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 GetStreamSessionCommand retorna informações sobre a sessão (neste caso, uma transmissão ao vivo ativa). Observe que ingestConfiguration contém alguns itens úteis, como codec, taxa de bits, taxa de quadros, etc. O objeto truncatedEvents contém todos os eventos que foram acionados para esse fluxo específico.

 { "$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 Todas as métricas e, em seguida, IVS por meio do console do Amazon CloudWatch.

Podemos procurar dados de métricas escolhendo uma dimensão.

Por exemplo, para visualizar métricas por canal, selecione Por canal e escolha o período de tempo desejado, o canal e a métrica.

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. GetMetricDataCommand espera um objeto GetMetricDataCommandInput ( docs ).


Conforme mencionado acima, este objeto possui as propriedades StartTime e EndTime , bem como uma propriedade MetricDataQueries 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: IngestAudioBitrate , IngestVideoBitrate , IngestFramerate e KeyframeInterval . Construiremos uma matriz para cada métrica, usando AWS/IVS como o Namespace e filtrando em um canal específico capturando a parte do ARN do canal seguindo / .

 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 GetMetricDataCommand será semelhante à seguinte saída:

 { "$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 documentação para obter detalhes. Aqui está um exemplo de geração de um gráfico para a métrica IngestFramerate por meio do 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') );


A chamada para GetMetricWidgetImageCommand retorna um objeto JSON semelhante ao seguinte:

 { '$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 Uint8Array em uma string base64:

 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.