Painel de insights e API

A API OpenTok Insights é uma API GraphQL. Você pode usar a API do Insights e o Painel do Insights para obter informações sobre seus projetos e sessões do OpenTok.

O Painel de Insights

Observação: Clique aqui aqui para obter informações sobre retenção de dados e latência.

O widget do Painel de Insights fornece dados no nível do projeto. Você pode acessá-lo fazendo login na sua Account da Video API da Vonage e selecionando um projeto do OpenTok. Ele contém três guias: Uso, Qualidade e Erros, além de filtros para intervalo de datas, localização e endpoints.

A aba “Utilização” mostra os diferentes tipos de atas geradas pelo projeto. Você pode ver um mapa indicando onde as atas foram geradas e aplicar vários filtros simultaneamente, conforme desejar.

A aba “Qualidade” exibe um histograma da taxa de bits e da latência dos vídeos transmitidos no projeto.

A guia “Erros” apresenta a taxa de erros das conexões, dos editores e dos assinantes.

Os dados de cada aba são filtrados de acordo com as seleções feitas na parte superior.

API do Insights, URL base e autenticação

A API do Insights é uma API GraphQL que permite que você explore os metadados das suas sessões nos níveis de projeto e sessão. O GraphQL é uma alternativa à abordagem REST tradicional para acessar dados via HTTP. Ele foi desenvolvido pelo Facebook em 2012 e tornou-se de código aberto em 2015. Confira Guia de introdução ao GraphQL para saber mais.

A URL base da API é:

https://insights.opentok.com/graphql

Todas as solicitações são feitas como POSTs HTTP e autenticadas por meio de X-OPENTOK-AUTH.

Explorando o esquema da API com o GraphiQL

Acessando https://insights.opentok.com/ Ao usar seu navegador, você é direcionado para a instância do Insights do GraphiQL, uma ferramenta que permite explorar o esquema da API GraphQL. Como a ferramenta pode fazer solicitações à API, é necessário estar conectado para utilizá-la.

Existem cinco painéis nesta ferramenta:

  • No canto superior direito da ferramenta, você verá um Documentos botão. Ao clicar nele, é exibido um painel com a documentação do esquema. Cada campo e tipo de objeto na documentação contém uma descrição. Navegue por ela para explorar o esquema.

  • No lado esquerdo da página está o painel “Consulta”. Nesse painel, você pode criar consultas para serem executadas na API. Alternar entre o painel “Documentação” e o painel “Consulta” permite que você crie a consulta exata de que precisa para obter apenas as informações necessárias. Como você está conectado, a autenticação para realizar consultas já está resolvida para você.

  • Abaixo do painel “Consulta” está o painel “Variáveis da consulta”. Embora não seja obrigatório, você pode usá-lo para especificar variáveis para sua consulta. Por exemplo, você pode definir as seguintes variáveis neste painel:

    {
      "PROJECT_ID": 100,
      "START_TIME": "2019-01-01T08:00:00.000Z"
    }
    

    Em seguida, no painel “Consulta”, faça referência a quaisquer variáveis declaradas:

    query ($PROJECT_ID: Int!, $START_TIME: Date!) {
      project(projectId: $PROJECT_ID) {
        projectData(
          start: $START_TIME,
          interval: AUTO,
          sdkType: [JS, IOS, ANDROID],
          groupBy: [SDK_TYPE]
        ) {
          resources {
            sdkType
            intervalStart
            intervalEnd
            usage {
              streamedPublishedMinutes
              streamedSubscribedMinutes
            }
          }
        }
      }
    }
    
  • À direita do painel “Consulta” está o painel “Resposta”. Ao clicar no botão “Executar” na ferramenta, a consulta exibida no painel “Consulta” será executada, e o painel “Resposta” exibirá os resultados. Essa é a mesma resposta que você obteria se fizesse a consulta programaticamente.

  • Por fim, clique no História botão acima do painel de consulta para visualizar o histórico de suas consultas recentes. Ao clicar em um dos elementos exibidos, o painel de consulta e o painel de variáveis de consulta são preenchidos com esses dados.

Observação: Para obter os resultados desejados, certifique-se de incluir groupBy na sua consulta.

Obtenção de dados do projeto

Notas:

  • Clique aqui aqui para obter informações sobre retenção de dados e latência.
  • Atualmente, o Insights não oferece suporte a várias chaves de API na mesma consulta. Faça uma consulta separada no Insights para cada projeto, a fim de obter informações sobre vários projetos/chaves de API. Para obter programaticamente chaves de API e segredos no nível do projeto para um Account, consulte nossa documentação em obter informações sobre projetos. Com esse método, os usuários com um chave e segredo da API no nível da Account pode obter o objeto de detalhes do projeto para um único projeto ou para todos os projetos da Account.

O projectData O campo do objeto do projeto retorna o ProjectData objeto, que fornece dados agregados de relatórios no nível do projeto.

Você deve incluir um start data da consulta. Esse valor pode ser uma string no formato ISO-8601 (como, por exemplo, "2019-10-15T23:43:34.023Z") ou um valor do tipo Int que represente um carimbo de data/hora da época. Números inteiros com até 10 dígitos representam segundos da época. Números inteiros com mais de 10 dígitos representam milissegundos da época.

O ProjectData O objeto inclui um resources propriedade, que é uma matriz de Metric objetos. Você tem a opção de filtrar e agrupar os dados por tipo de SDK, versão do SDK, país, região, navegador ou versão do navegador. Além disso, você tem a opção de alterar o Interval em que você deseja segmentar os dados (seja DAILY, WEEKLY, ou MONTHLY). Observe que se você definir o Interval, você verá apenas os intervalos de tempo para os quais há dados. Atualmente, todos os dados desse objeto são atualizados todas as noites; portanto, você não verá alterações em tempo real nos dados.

Observação: A filtragem por região, SDK e navegador não está disponível para participantes e atas de arquivamento.

O Metric O objeto inclui informações sobre o país, a região (estado dos EUA, se aplicável), o tipo e a versão do SDK do OpenTok, bem como o navegador e a versão do navegador (se aplicável) para os resultados. O Metric O objeto também inclui as seguintes propriedades:

  • usage — Informações sobre as atas publicadas em streaming, as atas assinadas em streaming, o uso do arquivo, o uso da transmissão, o uso do SIP, e o uso separado por níveis de editor

  • quality — Informações sobre a qualidade do vídeo

  • errors — As taxas de falha na conexão com sessões, na publicação e na assinatura

A consulta a seguir solicita resultados do ProjectData que incluam minutos transmitidos publicados e minutos transmitidos assinados para clientes que utilizam os SDKs do OpenTok para JavaScript, Android e iOS:

{
  project(projectId: 12345678) {
    projectData(
      start: "2019-05-01T07:00:00.000Z",
      interval: MONTHLY,
      sdkType: [JS, ANDROID, IOS],
      groupBy: SDK_TYPE
    ) {
      resources {
        intervalStart,
        intervalEnd,
        usage {
          streamedPublishedMinutes,
          streamedSubscribedMinutes
        }
      }
    }
  }
}

Observe que, ao definir o start Se definir o parâmetro como 0, você consultará os resultados a partir dos registros mais antigos disponíveis.

Importante — problema conhecido: Os dados relativos ao nome e à versão do navegador estão nulos ou vazios em alguns resultados diários anteriores a 14 de setembro de 2023. Os valores estão incluídos a partir de 14 de setembro de 2023.

Obtenção de dados de sessão (análises avançadas)

Observação: Clique aqui aqui para obter informações sobre retenção de dados e latência.

Importante: As consultas de dados de sessão estão disponíveis para Clientes do Advanced Insights apenas.

O sessionData campo do project O objeto retorna o SessionData objeto. Esse objeto inclui dois campos: sessions e sessionSummaries.

Informações detalhadas sobre a sessão

O sessions field retorna um Sessions objeto. Passe os IDs de sessão como o sessionIds argumento (um array de strings correspondentes). O Sessions objeto inclui um resources propriedade, que é uma matriz de Session objetos. O Session O objeto possui as seguintes propriedades:

  • mediaMode — O modo de mídia para a sessão. Trata-se de "routed" para sessões encaminhadas pelo OpenTok Media Router ou "relayed" para streaming direto ponto a ponto.

  • publisherMinutes — O número total de minutos transmitidos por todos os editores na sessão. Observe que incluir esse campo retardará a exibição dos resultados da consulta.

  • subscriberMinutes — O número total de minutos transmitidos para todos os assinantes na sessão. Observe que incluir esse campo retardará a exibição dos resultados da consulta.

  • participantMinutes — O número total de minutos, dividido por níveis de editor, em todas as reuniões da sessão.

  • meetings — Uma variedade de Meeting objetos. Uma sessão do OpenTok pode ter várias reuniões. Quando o primeiro cliente se conecta à sessão, a primeira reunião é iniciada. A reunião termina quando não há nenhuma conexão na sessão por pelo menos 10 minutos. Quando um cliente se conecta novamente, uma nova reunião é iniciada. Cada objeto Meeting inclui as seguintes propriedades:

    • subscriberMinutes — O número total de minutos dos participantes na reunião.

    • publisherMinutes — O número total de minutos dos editores na reunião.

    • participantMinutes — O número total de minutos, dividido por níveis de editores, na reunião.

    • connections — Uma matriz de objetos Connection que define cada cliente conectado à sessão (durante a reunião). As propriedades do objeto Connection incluem informações sobre o Client SDK do cliente OpenTok utilizado, o navegador utilizado (para clientes web), informações sobre emissores e assinantes, e muito mais.

    • publishers — Uma matriz de objetos Publisher. As propriedades do objeto Publisher incluem informações sobre o fluxo do editor, os assinantes do fluxo, estatísticas do fluxo e muito mais. (As estatísticas do fluxo estão incluídas no complemento Advanced Insights. Consulte Obtendo estatísticas de transmissão.)

    • subscribers — Matriz de objetos `Subscriber`, que fornecem detalhes sobre cada assinante. As propriedades do objeto `Subscriber` incluem informações sobre o fluxo dos assinantes, estatísticas do fluxo e muito mais. (As estatísticas do fluxo estão incluídas no complemento Advanced Insights. Consulte Obtendo estatísticas de transmissão.)

    • createdAt e destroyedAt — Horários de início e término da reunião.

    Observação: Se todos os usuários forem desconectados de uma reunião e uma nova conexão com a sessão for estabelecida dentro do prazo de 10 minutos, será criada uma nova reunião com o mesmo ID de reunião da primeira. No entanto, se a nova conexão for estabelecida após 10 minutos, a nova reunião receberá um ID de reunião exclusivo.

Exemplo de consulta aos detalhes de uma sessão

A consulta a seguir solicita alguns detalhes do editor sobre duas sessões do OpenTok:

{
	project(projectId: 12345678) {
	  sessionData {
			sessions(sessionIds: [
				"1_MX4xMDB-fjE1Mzg4NzA0MjExNDd-VjRuSWhpn4",
				"2_MX4xMDB-fjE1Mzg4NzA0OTQzOTN-RFFxeXfcn4"
			]) {
				resources {
					sessionId
					meetings {
						totalCount
						resources {
							createdAt
							publisherMinutes
							destroyedAt
							publishers {
								resources {
									createdAt
									destroyedAt
									connectionId
									stream {
									  streamId
									}
								}
							}
						}
					}
				}
			}
		}
	}	
}

Obtendo estatísticas de transmissão

Observação: As estatísticas de transmissão estão disponíveis para Clientes do Advanced Insights apenas.

O resources A propriedade do objeto MeetingPublishers é uma matriz de objetos Publisher. E o objeto Publisher inclui o objeto PublisherStreamStatsCollection. Esse objeto é uma coleção de recursos, e sua resources A propriedade é uma matriz de objetos PublisherStats. Cada objeto PublisherStats inclui estatísticas da transmissão do emissor, coletadas periodicamente (a cada 30 segundos) durante o período em que o emissor está transmitindo. Essas estatísticas incluem dados sobre a latência de áudio e vídeo, a taxa de bits de áudio e vídeo, a taxa de perda de pacotes de áudio e vídeo, a resolução do vídeo, os codecs de áudio e vídeo, e se a transmissão incluía áudio e vídeo no momento do instantâneo das estatísticas de transmissão.

A consulta a seguir solicita as estatísticas periódicas de taxa de bits de áudio e vídeo para os editores em uma sessão do OpenTok:

{
  project(projectId: 12345678) {
    sessionData {
      sessions(sessionIds: [
        "1_MX4xMDB-fjE1Mzg4NzA0MjExNDd-VjRuSWhpn4",
      ]) {
        resources {
          sessionId
          meetings {
            resources {
              createdAt
              publishers {
                resources {
                  createdAt
                  connectionId
                  stream {
                    streamId
                  }
                  streamStatsCollection {
                    resources {
                      createdAt
                      audioBitrateKbps
                      videoBitrateKbps
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Da mesma forma, o resources A propriedade do objeto MeetingSubscribers é uma matriz de objetos Subscriber, e cada um deles inclui uma coleção de recursos chamada SubscriberStreamStatsCollection, que contém estatísticas de transmissão semelhantes para um assinante.

Informações resumidas da sessão

Observação: O resumo da sessão está disponível para Clientes do Advanced Insights apenas.

O sessionSummaries field é uma matriz de SessionSummary objetos (um para cada sessão que corresponda à consulta). O objeto SessionSummary inclui um resources propriedade, que é uma matriz de MeetingSummary itens (um para cada reunião da sessão). O MeetingSummary O objeto inclui informações sobre o número total e simultâneo de transmissões, conexões e participantes na reunião.

Tanto o SessionSummary objeto e MeetingSummary os objetos incluem publisherMinutes, subscriberMinutes, e participantMinutes propriedades. Elas informam o número total de minutos transmitidos para todos os emissores e assinantes na sessão ou reunião. Incluindo participantMinutes relatórios e atas separados por níveis de editores na sessão ou reunião. Observe que a inclusão de publisherMinutes, subscriberMinutes, ou participantMinutes em uma consulta retardará a exibição dos resultados.

A consulta a seguir solicita uma parte SessionSummary resultados:

{
    project(projectId: 12345678) {
   	 sessionData {
   		 sessionSummaries (
   			 start: "2019-05-01T07:00:00.000Z",
   		 ) {
   			 resources {
   				 sessionId
   				 meetings {
   					 resources {
   						 maxConcurrentStreams
   						 maxConcurrentStreams
   						 maxConcurrentSubscribers
   						 totalStreams
   						 totalConnections
   					 }
   				}
   			}
   		}
   	}
   }
}

Métricas de qualidade do SIP

A consulta a seguir fornece apenas as estatísticas mínimas de qualidade do SIP:

project(projectId: 12345678) {
    sessionData {
      sessions(sessionIds: [
        "1_MX4xMDB-fjE1Mzg4NzA0MjExNDd-VjRuSWhpn4"
       ]) {
        resources {
          meetings {
            resources {
              connections {
                resources {
                  sipCalls(first: 1) {
                    resources {
                      sipCallStatsCollection {
                        totalCount
                        resources {
                          audioCodec
                          audioLatencyMs
                          videoCodec
                          videoLatencyMs
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }

Esta consulta fornece informações básicas sobre o SIP, sem estatísticas:

project(projectId: 12345678) {
    sessionData {
      sessions(sessionIds: [
        "1_MX4xMDB-fjE1Mzg4NzA0MjExNDd-VjRuSWhpn4"
       ]) {
        resources {
          meetings {
            resources {
              connections {
                resources {
                  sipCalls(first: 10) {
                    resources {
                      sipCallId
                      connectionId
                      conferenceId
                      createdAt
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }

Para obter as estatísticas completas de qualidade do SIP, utilize a seguinte consulta:

 {
 project(projectId: 12345678) {
     sessionData {
       sessions(sessionIds: [
        "1_MX4xMDB-fjE1Mzg4NzA0MjExNDd-VjRuSWhpn4"
       ]) {
         resources {
           meetings {
             resources {
               connections {
                 resources {
                   sipCalls(first: 1) {
                     resources {
                       sipCallId
                       connectionId
                       conferenceId
                       createdAt
                       sipCallStatsCollection {
                         totalCount
                         resources {
                           audioCodec
                           audioLatencyMs
                           audioSentBitrateKbps
                           audioSentPacketLoss
                           videoCodec
                           videoLatencyMs
                           videoSentBitrateKbps
                           videoSentPacketLoss
                         }
                       }
                     }
                   }
                 }
               }
             }
           }
         }
       }
     }
   }

Objetos de resposta

Os objetos de resposta seguem o esquema do GraphQL e estão no formato JSON, mas incluem apenas os campos que você especificar em suas solicitações. O curl O exemplo acima resultará em um objeto de resposta semelhante ao seguinte:

{  
  "data":{  
    "project":{  
      "projectData":{  
        "resources":[  
          {  
            "usage":{  
              "streamedSubscribedMinutes":3189
            }
          }
        ]
      }
    }
  }
}

A maneira mais fácil de ter uma prévia do que você pode esperar é adicionando diferentes filtros, grupos e campos ao Insights do GraphiQL Explorer, e observar a resposta.

Como usar a paginação em consultas

Tanto o projectData() e sessionData() As APIs aceitam opções de paginação para todos os métodos que retornam listas (matrizes). Todos esses métodos implementam um ResourceCollection interface que contém as seguintes propriedades opcionais:

  • first (opcional) — O número de entradas a serem retornadas por página. O limite é de 10 para Reuniões e de 1.000 para todas as outras coleções de recursos. O número padrão de entradas retornadas é de 10 para Reuniões e de 50 para todas as outras coleções de recursos.

  • endCursor (opcional) — O cursor de string usado para especificar a página atual (deslocamento). Obtenha o valor desse cursor a partir do pageInfo propriedade para cada lista retornada. Se você não especificar uma endCursor valor, uma consulta retornará a primeira página de resultados correspondente (o início da lista).

O pageInfo O objeto (retornado para cada lista) inclui as seguintes propriedades:

  • hasNextPage — Propriedade booleana que indica se há mais páginas disponíveis.

  • endCursor — A string a ser passada para obter a próxima página.

Por exemplo, a consulta a seguir retorna informações de paginação juntamente com os primeiros 10 resultados correspondentes ProjectData recursos:

{
  project(projectId: 12345678) {
    projectData(
      start: "2024-05-01T07:00:00.000Z",
      first: 10,
      interval: MONTHLY,
      
    ) {
      pageInfo {
        hasNextPage
        endCursor
      }
      resources {
        usage {
          streamedPublishedMinutes
        }
      }
    }
  }
}

A resposta inclui informações de paginação:

{
  "data": {
    "project": {
      "projectData": {
        "pageInfo": {
          "hasNextPage": true,
          "endCursor": "aW5zaWdodHMtcmVzb3VyY2U6MTA=="
        },
        "resources": [
          {
            "usage": {
              "streamedPublishedMinutes": 56554.83333333332
            }
          },
					...

Use o endCursor valor desta resposta ("aW5zaWdodHMtcmVzb3VyY2U6MTA==") como o endCursor dados de entrada utilizados na consulta para obter a próxima página de registros correspondentes:

{
  project(projectId: 12345678) {
    projectData(
      start: 0,
      first: 10,
      interval: MONTHLY,
      endCursor: "aW5zaWdodHMtcmVzb3VyY2U6MTA=="
      
    ) {
      pageInfo {
        hasNextPage
        endCursor
      }
      resources {
        usage {
          streamedPublishedMinutes,
          streamedSubscribedMinutes
        }
      }
    }
  }
}

Retenção de dados e latência

Insights / Painel de Insights

Retenção de dados:

  • Agregação diária: 90 dias

  • Agregação mensal: 12 meses

Notas:

  • Os dados de agregação diária são calculados com base no período das 00h00 às 23h59 (PST/PDT).
  • O período de retenção dos dados agregados diariamente para a API do Insights e o Painel do Insights foi atualizado para 90 dias (antes eram 60 dias) a partir de 12 de agosto de 2021. Os dados agregados diariamente relativos às sessões de vídeo após essa data ficarão disponíveis por 90 dias.

Latência esperada: 36 a 48 horas

Advanced Insights retention period

Análises Avançadas

Retenção de dados: 21 dias

Observação: O período de retenção é baseado na data e hora de criação de uma reunião dentro da sessão.

Latência esperada: 5 minutos

Advanced Insights retention period

Observação: Uma sessão pode conter várias reuniões. Uma nova reunião é agendada quando a sessão fica inativa por 10 minutos. Consulte nossa documentação sobre Sessões x Reuniões para mais informações.

Códigos de erro

Os erros são incluídos na resposta, em um errors matriz, como a seguinte:

"errors": [
  {
    "message": "You must provide a valid project ID.",
    "locations": [
      {
        "line": 2,
        "column": 3
      }
    ],
    "path": [
      "project"
    ],
    "errorCode": 1008
  }
]

A tabela a seguir lista os códigos de erro e suas descrições. Consulte o message propriedade do erro para obter mais detalhes.

Código de erro Descrição do erro
1000 Chave de API inválida fornecida.
1001 Não foi fornecida nenhuma autenticação válida.
1002 Intervalo de datas inválido.
1003 Parâmetro inválido. É permitido apenas um intervalo de datas.
1004 Parâmetros inválidos.
1005 Parâmetro inválido.
1006 Parâmetro inválido. O valor deve ser um número inteiro.
1007 Parâmetro inválido para especificar o número da versão do SDK do OpenTok. O formato exigido é 0.0.0.
1008 É necessário fornecer um ID de projeto válido.
1009 Parâmetro inválido.
1010 Foi passado um parâmetro inválido. O parâmetro aceita apenas um valor.
1011 Token inválido.
1012 Erro interno do servidor.
1013 Falta um parâmetro obrigatório.
1014 A consulta especificada requer o Análises Avançadas complemento.
1015 O ID do projeto especificado não foi encontrado.
1016 A sessão expirou.
1017 A sessão especificada não foi encontrada.
1018 É necessário fornecer pelo menos um ID de sessão na matriz de entrada.
1019 O token não corresponde à chave da API.
1020 Não foi possível validar o token.
1021 Você não está autorizado a visualizar os dados deste projeto.
1022 Erro de digitação. Veja os detalhes no message string.

Enviando solicitações POST para a API GraphQL da OpenTok

Todas as solicitações GraphQL do OpenTok são enviadas para https://insights.opentok.com/graphql.

Defina o content-type para application/json.

Todas as solicitações exigem autenticação por meio de um X-OPENTOK-AUTH cabeçalho. Defina este cabeçalho como um token JWT com project como o ist e o ID do projeto OpenTok como o iss. Assine o token com o segredo do projeto OpenTok. Veja Autenticação.

O corpo da solicitação POST conterá um objeto JSON com uma chave e um valor. A chave será query, e o valor será a string GraphQL no formato JSON (como esta, por exemplo) que você criar usando a ferramenta GraphiQL).

O seguinte curl O comando realiza uma consulta GraphQL para obter os minutos transmitidos dos canais assinados:

YOUR_OT_PROJECT_API_KEY=12345678 # Enter your project API key YOUR_OT_JWT=ValidJwtToken # Enter a valid JWT token corresponding # to your project API key OT_START_DATE=$(($(date +%s)-864000)) # generates epoch time from 10 days ago # GraphQL query to obtain streamed subscribed minutes from the start date GRAPHQL_QUERY='{project (projectId:'${YOUR_OT_PROJECT_API_KEY}') { projectData( start:\"'$OT_START_DATE'\" ) { resources { usage { streamedSubscribedMinutes } } } } }' curl -X POST \ -H "Content-Type: application/json" \ -H "X-OPENTOK-AUTH:$YOUR_OT_JWT" \ -d '{"query":"$GRAPHQL_QUERY"}' \ 'https://insights.opentok.com/graphql'

Substitua os valores para o YOUR_OT_JWT e YOUR_OT_PROJECT_API_KEY variáveis. Para obtê-las, consulte o Autenticação da API REST documentação e faça login na sua Account da Video API da Vonage.

O exemplo acima resultará em um objeto de resposta semelhante ao seguinte:

{  
  "data":{  
    "project":{  
      "projectData":{  
        "resources":[  
          {  
            "usage":{  
              "streamedSubscribedMinutes":3189
            }
          }
        ]
      }
    }
  }
}

Cálculo dos minutos dos participantes

Qual é o método mais preciso para calcular as horas dos participantes em um determinado período, no contexto do faturamento?

Para saber o número exato de minutos gerados em um intervalo de tempo, use os Dados do Projeto. Ao utilizar resumos de sessões para especificar um intervalo de tempo na consulta, os resultados incluem todas as sessões criadas dentro desse intervalo de tempo. Se uma sessão for reutilizada, os resultados incluirão todas as sessões que contenham pelo menos uma reunião criada dentro do intervalo de tempo especificado, exibindo o número total de minutos de toda a sessão e não apenas desse intervalo.

Ou seja, ao utilizar uma consulta de resumo de sessão, no caso de reutilização de uma sessão durante o intervalo especificado, os minutos não se referem apenas a esse período específico, mas a toda a sessão, o que pode incluir resultados que estejam fora do intervalo de tempo.

Ao utilizar a consulta de dados do projeto, os resultados incluem dados diários das 00h00 PST às 00h00 PST do dia seguinte. É importante levar em conta que a consulta deve começar às 00h00 PST; caso contrário, ela sempre retornará um dia a mais de dados do que o esperado.

Por exemplo, considere estas duas consultas de dados do projeto:

projectData(
  start: "2023-12-30T08:00:00.00Z",
  end: "2023-12-31T08:00.00.00Z"
  interval: AUTO
)
projectData(
  start: "2023-12-30T08:00:00.00Z",
  end: "2023-12-31T03:00.00.00Z"
  interval: AUTO
)

Para essas duas consultas, os resultados incluem apenas 1 dia de dados nos resultados.

Nesse caso, o ajuste do fuso horário efetivamente desloca “2023-12-30T08:00:00.00Z” para o início do dia 30 de dezembro no horário PST (meia-noite PST). Como a hora de término no fuso horário PST é a meia-noite do dia 31, os resultados incluem apenas um dia.

Mas considere esta consulta aos dados do projeto:

projectData(
  start: "2023-30-30T07:00:00.00Z",
  end: "2023-01-31T08:00.00.00Z"
  interval: AUTO
)

A consulta retornará dados dos dias 30 e 31 de dezembro de 2023.

O carimbo de data e hora “2023-12-30T07:00:00.00Z” está no formato (UTC); no fuso horário PST, isso nos dará “2023-12-29T11:00:00.00PST”, o que corresponde ao dia 29 de dezembro. Devido à diferença de fuso horário em relação ao PST, quando a solicitação inclui dados de “2023-12-30T07:00:00.00Z” (UTC), ela abrange efetivamente o período de 30 a 31 de dezembro, incluindo, portanto, ambos os dias no resultado.

Portanto, os resultados incluirão dados referentes aos dias 30 e 31 de dezembro de 2023.

{
  project(projectId: XXXX) {
    projectData(
      start: "2022-11-28T15:57:07.529Z"
      interval: AUTO
    ) {
      resources {
        intervalStart
        intervalEnd
        sdkType
        usage {
          participantMinutes {
            from1To2Publishers
            from3To6Publishers
            from7To8Publishers
            from1To4Publishers
            from5To8Publishers
            from1To8Publishers
            from1To10Publishers
            from9To10Publishers
            from11To35Publishers
            from11To20Publishers
            from11To35Publishers
            from36PlusPublishers
            from21To35Publishers
            from36To40Publishers
            from41PlusPublishers
            from1To25Publishers
            from3To25Publishers
            from26To35Publishers
          }
          streamedPublishedMinutes
        }
      }
    }
  }
}

Por esses motivos, é melhor utilizar o nível da reunião para obter um resultado mais preciso:

{
  project(projectId: 47521921) {
    sessionData {
      sessionSummaries(start: "2019-05-01T07:00:00.000Z") {
        resources {
          sessionId
          meetings {
            resources {
              maxConcurrentStreams
              maxConcurrentStreams
              maxConcurrentSubscribers
              totalStreams
              totalConnections
              participantMinutes {
                from1To2Publishers
                from3To6Publishers
                from7To8Publishers
                from1To4Publishers
                from5To8Publishers
                from1To8Publishers
                from1To10Publishers
                from9To10Publishers
                from11To35Publishers
                from11To20Publishers
                from11To35Publishers
                from36PlusPublishers
                from21To35Publishers
                from36To40Publishers
                from41PlusPublishers
                from1To25Publishers
                from3To25Publishers
                from26To35Publishers
              }
            }
          }
        }
      }
    }
  }
}

Outras dúvidas

É possível pesquisar um ID de sessão sem incluir um ID de projeto na consulta:

{
  project(sessionIds: "2_MX4xMDB-fjE3MTMyMTMwNDQ1NDV-Z29CLzhyejNha1N2M2RaV255Sno1RTZNfn5-") {
    sessionData {
      sessions {
        resources {
          mediaMode
          sessionId
          meetings {
            totalCount
            pageInfo {
              hasNextPage
              endCursor
            }
            resources {
              meetingId
              createdAt
              destroyedAt
            }
          }
        }
      }
    }
  }
}

Você pode usar o not operador para projectData:

{
  project(projectId: 12345678) {
    projectData(
      start: "2024-04-10T11:37:06.147Z"
      interval: AUTO
      not: {
        sdkType:ANDROID
      }
    ) {
      resources {
        intervalStart
        intervalEnd
        sdkType
        sdkVersion
        browser
        usage {
          streamedPublishedMinutes
          streamedSubscribedMinutes
        }
      }
    }
  }
}

Você pode filtrar as conexões por localização e navegador:

{
  project(sessionIds: "2_MX4xMDB-fjE3MTMyMTMwNDQ1NDV-Z29CLzhyejNha1N2M2RaV255Sno1RTZNfn5-") {
    sessionData {
      sessions {
        resources {
          meetings {
            resources {
              connections(country: "US") {
                totalCount
              }
            }
          }
        }
      } 
    }
  }
}

Você pode definir um audioCodec filtro (para PCMU, VP8, OPUS, TELEPHONE, ou OTHER), ou definir um videoCodec filtro (para VP8, H264, VP9, RTX, ou OTHER):

{
  project(sessionIds: "2_MX4xMDB-fjE3MTMyMTMwNDQ1NDV-Z29CLzhyejNha1N2M2RaV255Sno1RTZNfn5-") {
    sessionData {
      sessions {
        resources {
          sessionId
          meetings {
            resources {
              meetingId
              createdAt
              publishers {
                resources {
                  createdAt
                  connectionId
                  stream {
                    streamId
                  }
                  streamStatsCollection(filters: { videoCodec: VP8} ) {
                    resources {
                      createdAt
                      audioBitrateKbps
                      videoBitrateKbps
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Você pode definir um mediaMode filtrar por ROUTED ou RELAYED:

{
  project(sessionIds: "2_MX4xMDB-fjE3MTMyMTMwNDQ1NDV-Z29CLzhyejNha1N2M2RaV255Sno1RTZNfn5-") {
    sessionData {
      sessionSummaries (
        start: "2024-02-25T20:02:32.345Z"
        filters: { mediaMode: ROUTED } ) {
        resources {
          sessionId
          mediaMode
          meetings  {
            totalCount
            pageInfo {
              hasNextPage
              endCursor
            }
            resources {
              meetingId
              createdAt
              destroyedAt
            }
          }
        }
      }
    }
  }
}

Aplicativo de exemplo e mais consultas de exemplo

O exemplo-de-painel-de-insights O projeto no GitHub é um aplicativo Node que utiliza a API OpenTok Insights para exibir graficamente informações sobre projetos do OpenTok. Ele também inclui várias consultas de exemplo em GraphQL.