Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Importante
Este recurso está em Versão prévia privada. Para experimentá-lo, entre em contato com o representante do Azure Databricks.
Use essa referência para implementar um produtor de eventos ou escrever consultas sobre eventos de App Analytics. Ele define a versão 1 do esquema, sua codificação do OpenTelemetry Protocol (OTLP) e as etapas de processamento necessárias antes da agregação.
Para um exemplo de primeiro evento, veja Comece com App Analytics. Para o painel e seus dados adicionais de acesso ao app, veja O que é App Analytics?.
Esquema de eventos
Cada evento é um registro de log do OpenTelemetry armazenado na tabela do otel_logs app no Unity Catalog. Use o nome da tabela configurada, incluindo qualquer prefixo. A tabela também contém outros registros de log, então selecione eventos analíticos pela versão do esquema e tipo de evento.
Exemplos de payload
Selecione um tipo de evento para ver sua carga útil. Cada exemplo é um registro de log OTLP, colocado em resourceLogs[].scopeLogs[].logRecords[] quando exportado. O quickstart mostra esse envelope de pedido.
Os documentos e o carimbo de data abaixo são ilustrativos. Gerar um ID único para cada novo evento e usar seu tempo real de ocorrência. Os exemplos omitem o opcional session_id.
Action
Registre uma exportação de relatório completo. A propriedade opcional format descreve a exportação sem alterar o nome do evento.
{
"timeUnixNano": "1790164800000000000",
"eventName": "report_exported",
"attributes": [
{ "key": "databricks.app.analytics.schema.version", "value": { "intValue": "1" } },
{ "key": "databricks.app.analytics.event.id", "value": { "stringValue": "d6c34165-7f4a-467c-b671-50ae495bcb14" } },
{ "key": "databricks.app.analytics.event.type", "value": { "stringValue": "action" } },
{ "key": "databricks.app.analytics.event.name", "value": { "stringValue": "report_exported" } },
{ "key": "databricks.app.analytics.properties.format", "value": { "stringValue": "csv" } }
]
}
Exibição de página
Registre uma visita a /reports. O tipo e o nome do evento são ambos page_view.
{
"timeUnixNano": "1790164800000000000",
"eventName": "page_view",
"attributes": [
{ "key": "databricks.app.analytics.schema.version", "value": { "intValue": "1" } },
{ "key": "databricks.app.analytics.event.id", "value": { "stringValue": "caafc8e3-5f19-4f22-934b-09d1f8bf8e63" } },
{ "key": "databricks.app.analytics.event.type", "value": { "stringValue": "page_view" } },
{ "key": "databricks.app.analytics.event.name", "value": { "stringValue": "page_view" } },
{ "key": "databricks.app.analytics.page.path", "value": { "stringValue": "/reports" } }
]
}
Web Vital
Registre uma maior medição de tinta contenente (LCP) de 1.800 milissegundos. Esse valor tem uma good classificação.
{
"timeUnixNano": "1790164800000000000",
"eventName": "lcp",
"attributes": [
{ "key": "databricks.app.analytics.schema.version", "value": { "intValue": "1" } },
{ "key": "databricks.app.analytics.event.id", "value": { "stringValue": "a23eecb7-b6c1-47c8-92ab-e2856f6ac804" } },
{ "key": "databricks.app.analytics.event.type", "value": { "stringValue": "web_vital" } },
{ "key": "databricks.app.analytics.event.name", "value": { "stringValue": "lcp" } },
{ "key": "databricks.app.analytics.page.path", "value": { "stringValue": "/reports" } },
{ "key": "databricks.app.analytics.web_vital.value", "value": { "doubleValue": 1800 } },
{ "key": "databricks.app.analytics.web_vital.unit", "value": { "stringValue": "ms" } },
{ "key": "databricks.app.analytics.web_vital.delta", "value": { "doubleValue": 1800 } },
{
"key": "databricks.app.analytics.web_vital.sample_id",
"value": { "stringValue": "30990ea0-3ec1-4a93-98b9-7c9abfe0e2d8" }
},
{ "key": "databricks.app.analytics.web_vital.rating", "value": { "stringValue": "good" } }
]
}
Relatórios para a mesma medida compartilham um web_vital.sample_id. Cada novo relatório tem seu próprio event.id. Veja as regras Web Vital.
Campos comuns
Os seguintes campos lógicos se aplicam entre os tipos de evento. Seus nomes de atributos OTLP aparecem nos exemplos acima.
| Campo | Tipo | Requirement | Description |
|---|---|---|---|
schema_version |
INT |
Required | Versão de contrato principal. Use 1. |
event_id |
STRING |
Required | Identificador globalmente único e opaco. Mantenha-o ao tentar novamente um evento. |
event_type |
STRING |
Required |
action, page_view ou web_vital. |
event_name |
STRING |
Required | Um nome de baixa cardinalidade dentro do tipo de evento. |
occurred_at |
TIMESTAMP |
Required | Quando o evento ocorreu, não quando foi ingerido. |
session_id |
STRING |
Optional | Um identificador opaco para uma janela de atividade analítica. Não identifica uma pessoa. |
page_path |
STRING |
Optional | Um caminho de concreto para aplicativos, como /orders/42. |
properties |
Objeto | Optional | Propriedades escalares definidas pela aplicação. |
session_id é opcional no esquema de eventos. Métricas baseadas em sessões usam os registros que as fornecem. Não fabrique uma identidade nem use uma sequência vazia para representar uma sessão ausente.
As strings exigidas devem ser não vazias e não devem conter espaços em branco, credenciais ou dados pessoais. Quando um campo opcional está presente, ele deve estar em conformidade com suas regras de campo. Um atributo opcional ausente é lido como nulo no esquema lógico.
Tipos de evento
| Tipo de evento | Nome do evento | Campos adicionais |
|---|---|---|
action |
Um nome definido pela aplicação, como report_exported. |
Propriedades opcionais descrevem a ação. |
page_view |
page_view |
Uma opção page_path identifica a rota visitada. |
web_vital |
lcp, inp, cls, fcp ou ttfb |
Os campos Web Vital definidos nas regras Web Vital. |
Uma ação capturada descreve o que o produtor gravou. Por exemplo, um clique pode registrar a intenção sem provar que a operação foi bem-sucedida.
Codificação OTLP e campos de tabela
Atributos de Analytics usam o databricks.app.analytics. namespace. A tabela a seguir mapeia os campos lógicos para OTLP e a tabela de telemetria:
| Campo lógico | Fonte OTLP |
otel_logs Fonte |
|---|---|---|
occurred_at |
timeUnixNano |
time |
schema_version |
databricks.app.analytics.schema.version |
attributes:["databricks.app.analytics.schema.version"] |
event_id |
databricks.app.analytics.event.id |
attributes:["databricks.app.analytics.event.id"] |
event_type |
databricks.app.analytics.event.type |
attributes:["databricks.app.analytics.event.type"] |
event_name |
databricks.app.analytics.event.name |
attributes:["databricks.app.analytics.event.name"] |
session_id |
databricks.app.analytics.session.id |
attributes:["databricks.app.analytics.session.id"] |
page_path |
databricks.app.analytics.page.path |
attributes:["databricks.app.analytics.page.path"] |
properties.<key> |
databricks.app.analytics.properties.<key> |
A chave correspondente em attributes. |
web_vital_<field> |
databricks.app.analytics.web_vital.<field> |
A chave correspondente em attributes. |
Use as seguintes codificações JSON OTLP:
- Timestamps: Uma sequência decimal de nanosegundos Unix em
timeUnixNano. - Inteiros: Uma cadeia
intValuedecimal , como{ "intValue": "1" }. - Dobra: Um numérico
doubleValue, como{ "doubleValue": 1.25 }. - Cordas:
stringValue. - Booleanos:
boolValue.
Defina os registros eventName de log para o mesmo valor do atributo de analytics event_name . A instrumentação scope.name identifica o produtor, mas não é um seletor para registros analíticos.
A tabela de telemetria pode reter um wrapper de campo doubleValue único para valores numéricos, incluindo zero. Decode esse wrapper antes de validar os campos numéricos. Valide o tipo do valor original antes de lançá-lo, em vez de aceitar uma string numérica como número.
A coluna física date está disponível para poda de partições. Não faz parte do esquema lógico de eventos.
Restrições de campo
Sanitize campos antes da exportação. Validação e projeção em uma consulta não removem dados brutos já armazenados na tabela de telemetria.
Nomes e propriedades das ações
Os nomes das ações contêm de 1 a 128 caracteres. Elas começam com uma letra minúscula e usam letras minúsculas, dígitos, pontos e sublinhados. Pontos e sublinhados são segmentos alfanuméricos separados. A gramática é ^[a-z][a-z0-9]*([._][a-z0-9]+)*$.
Use nomes estáveis em vez de embedding IDs, endereços de e-mail ou texto inserido pelo usuário. Coloque detalhes variados nas propriedades. Por exemplo, use report_exported com uma format propriedade em vez de um nome de ação diferente para cada formato.
As chaves de propriedade seguem a mesma gramática. Não use namespaces reservados ou segmentos sensíveis, incluindo analytics, identity, telemetrysession, url, user, users, email, authorizationpasswdpasswordsecrettokenprivate_keyapi_keyhtmlcredentialdomipselectorselectorsusernamecookiestacktracetextstackinputou .referrer Essas restrições também se aplicam aos nomes das ações.
As propriedades podem conter cadeias escalares, números finitos e booleanos. Arrays, objetos aninhados, valores nulos, credenciais e dados pessoais não são permitidos.
| Limit | Valor |
|---|---|
| Propriedades por evento | 50 |
| Comprimento da chave de propriedade | 128 caracteres |
| Comprimento do valor da corda | 1\.024 caracteres |
Projeções de consulta omitem propriedades que não atendem a essas restrições. Os produtores continuam responsáveis pelo significado dos valores que enviam. Só checagens sintáticas não conseguem estabelecer que um valor é não pessoal.
Caminhos de página
A page_path começa com / e contém o caminho de aplicação do concreto. Remova strings e fragmentos de consulta, e limpe segmentos de caminho sensíveis. Não envie credenciais, dados pessoais ou texto digitado pelo usuário em um caminho.
Um caminho inválido é omitido da projeção da consulta. Uma visualização de página sem caminho permanece válida, mas não contribui para agregações em nível de rota.
Sessions
Uma sessão de análise pertence ao contexto de um navegador de nível superior. Quando um produtor fornece um ID de sessão, mantenha-o estável durante a navegação do lado do cliente e as recargas, e renove após 30 minutos sem um evento analítico gravado.
Os IDs de sessão devem ser opacos e não devem derivar de identidades de usuários, endereços de e-mail, endereços IP, IDs de requisição, IDs de trabalho ou tokens de acesso. Eventos backend preservam a sessão de origem quando uma está disponível. Eventos rejogados preservam seu tempo original de sessão e evento.
Uma sessão mede uma janela de atividade, não uma pessoa única. Métricas de visualização no produto podem usar dados separados de acesso ao app.
Web Vital
Eventos Essenciais na Web adicionam os seguintes campos. Codificar valor e delta como atributos OTLP doubleValue , e os campos restantes como stringValue atributos. Campos específicos do Web Vital devem estar ausentes nas ações e visualizações de página.
| Campo | Requirement | Description |
|---|---|---|
web_vital_value |
Required | Valor cumulativo finito e não negativo para a amostra. |
web_vital_unit |
Required |
ms ou score, determinado pela métrica. |
web_vital_delta |
Required | Mudança finita e não negativa desde o relatório anterior. |
web_vital_sample_id |
Required | Identificador globalmente único compartilhado pelos relatórios de uma amostra. |
web_vital_rating |
Required |
good, needs_improvement, ou poor, derivado dos limiares de valor e métrico. |
web_vital_navigation_type |
Optional |
navigate, reload, back_forward, back_forward_cache, prerender, ou restore. |
A tabela a seguir define as unidades e limiares:
| Métrica | Name | Unidade | Bom | Pobre |
|---|---|---|---|---|
lcp |
Maior Tinta Contenente (LCP) | ms |
≤ 2.500 | > 4,000 |
inp |
Interação com a próxima pintura (INP) | ms |
≤ 200 | > 500 |
cls |
CLS (Mudança de Layout Cumulativa) | score |
≤ 0,1 | > 0.25 |
fcp |
Primeira Tinta Contenta (FCP) | ms |
≤ 1.800 | > 3,000 |
ttfb |
Tempo para o Primeiro Byte (TTFB) | ms |
≤ 800 | > 1,800 |
LCP, INP e CLS são os Core Web Vitals. FCP e TTFB fornecem medições adicionais de desempenho. Um valor está good no limite de Bom ou abaixo, poor acima do limite de Pobre e needs_improvement entre eles. Uma unidade ou classificação incompatível torna o registro inválido.
Uma amostra pode gerar múltiplos relatórios. Web Vitals descrevem a navegação de documentos. Uma mudança de rota do lado do cliente pode gerar uma visualização de página sem gerar um novo exemplo Web Vital. Um servidor pode encaminhar uma medição do navegador, mas os tempos do servidor não substituem essa medição.
Ordem de validação
Registros de processo na seguinte ordem:
- Selecione versões de esquema suportadas e tipos de eventos. Para esse esquema, selecione versão
1eaction,page_view, ouweb_vital. - Decodifica os atributos tipados e requer valores válidos
event_id,event_name, eoccurred_at. - Valide campos, nomes, unidades, classificações e restrições de campo por tipo de evento. Exclua registros com campos exigidos inválidos e apenas dados opcionais permitidos por projetos.
- Detectar IDs de eventos conflitantes e deduplicar entregas idênticas.
- Selecione o intervalo de análise e quaisquer filtros de caminho ou evento.
- Para Web Vitals, reduza os relatos repetidos para um relato por amostra.
- Agregue os eventos ou amostras resultantes.
Mantenha a validação separada dos diagnósticos de ingestão. Encontrar uma linha em otel_logs não estabelece que ela está conforme o esquema de eventos.
Deduplicação e redução de amostras
Entregas idênticas de um evento contam como um evento. Se an event_id for reutilizado para conteúdo lógico diferente de eventos, exclua todos os registros desse conjunto de conflitos e reporte o conflito como um problema de qualidade dos dados. Não escolha uma entrega arbitrária do set.
Compare o conteúdo lógico normalizado, incluindo campos opcionais e propriedades. Use uma representação determinística das propriedades para que a ordenação de chaves não crie conflitos falsos. Metadados de transporte não fazem parte do conteúdo lógico do evento. As tentativas mantêm o carimbo de tempo original do evento.
Verifique a identidade entre as entregas retidas para cada ID de evento candidato antes de aplicar a faixa de tempo da análise. Filtrar as entregas brutas primeiro pode esconder conteúdo conflitante fora dessa faixa.
Após a deduplicação e seleção do intervalo de análise, mantenha o relatório mais recente por web_vital_sample_id. A ordem relata por occurred_at, rompendo laços com event_id, ambos descendentes. Calcule percentis após essa redução.
Definições de Métrica
Intervalos de tempo incluem start_time e excluem end_time. Os baldes de tempo utilizam o Tempo Universal Coordenado (UTC).
| Métrica | Definition |
|---|---|
| Exibições de página | Número de eventos deduplicados page_view . |
| Sessions | Número de valores distintos e não nulos session_id entre os eventos analíticos selecionados. |
| Ações rastreadas | Número de eventos deduplicados action . |
| Páginas por sessão | Visualizações de página divididas por sessões. Sem valor quando a contagem de sessões é zero. |
| Principais ações | Ações agrupadas por event_name. |
| Primeiras páginas | Visualizações de página agrupadas por page_path, excluindo caminhos ausentes. |
| Web Vital p75 | O percentil mais próximo está no 75º após a deduplicação de eventos e redução da amostra. |
| Web Tamanho da amostra vital | Número de amostras distintas após a redução. |
| Evento mais recente | O melhor occurred_at entre os eventos de análise selecionados. |
Para N amostras ordenadas, o posto mais próximo p75 usa o valor na posição ceil(0.75 × N), com indexação baseada em um. Trate menos de 30 amostras do Web Vital como evidência indicativa, e não conclusiva, de uma tendência.
Esse esquema não define a identidade do usuário, dispositivos, navegador ou dimensões geográficas. Superfícies de produto podem exibir métricas adicionais de outras fontes. Em particular, os visualizadores únicos do painel não são calculados contando sessões de análise.
Exemplo: calcular Web Vital p75 a partir de eventos validados
A consulta a seguir demonstra exclusão de colisão, deduplicação, redução amostral e cálculo exato do percentil. Ele consome um conjunto de dados normalizado, não a tabela bruta otel_logs .
Prepare a entrada
Crie uma visualização de entrada no seu próprio pipeline de processamento que aplique os passos 1 a 3 da ordem de validação. A visualização deve conter os seguintes dados:
- Uma linha por entrega que passa pela validação, antes da deduplicação ou filtragem por intervalo de tempo.
- Os campos lógicos tipados, incluindo
event_id,occurred_at,event_type,event_name,web_vital_value, eweb_vital_sample_id. - Uma cadeia não nula
logical_contentcontendo uma representação determinística de todos os campos e propriedades de eventos normalizados. Represente os campos opcionais ausentes de forma consistente e preserve o tempo original do evento.
Escope a entrada do app que você está analisando. Incluir entregas retidas de todos os tipos de eventos suportados para que a reutilização de um ID de evento entre os tipos seja detectada. A entrada deve cumprir todos os campos exigidos, tipos e intervalos numéricos, unidades, classificações e restrições de tipo de evento descritas acima.
Importante
Essa visão de entrada não é criada ativando a telemetria do aplicativo. É um pré-requisito fornecido pelo seu pipeline de processamento. Lançar alguns atributos brutos não substitui essa etapa de validação.
Agregar a entrada validada
Substitua <catalog>.<schema>.<validated-events-view> pela sua visão de entrada. Defina :start_time e :end_time como parâmetros de carimbo de data no editor SQL.
WITH event_id_quality AS (
SELECT event_id, COUNT(DISTINCT logical_content) AS content_count
FROM <catalog>.<schema>.<validated-events-view>
GROUP BY event_id
),
deduplicated AS (
SELECT events.*
FROM <catalog>.<schema>.<validated-events-view> AS events
JOIN event_id_quality AS quality USING (event_id)
WHERE quality.content_count = 1
QUALIFY ROW_NUMBER() OVER (
PARTITION BY event_id ORDER BY occurred_at
) = 1
),
samples AS (
SELECT *
FROM deduplicated
WHERE event_type = 'web_vital'
AND occurred_at >= :start_time
AND occurred_at < :end_time
QUALIFY ROW_NUMBER() OVER (
PARTITION BY web_vital_sample_id ORDER BY occurred_at DESC, event_id DESC
) = 1
)
SELECT
event_name,
COUNT(*) AS sample_size,
PERCENTILE_DISC(0.75) WITHIN GROUP (ORDER BY web_vital_value) AS p75
FROM samples
GROUP BY event_name
ORDER BY event_name;
PERCENTILE_DISC retorna o valor observado no posto solicitado em vez de uma aproximação. A consulta exclui IDs de eventos conflitantes antes de selecionar o intervalo de tempo. Rastreie IDs que content_count excedam um separadamente como erros de qualidade de dados.
Por exemplo, três amostras reduzidas de LCP com valores de 100, 200 e 300 milissegundos produzem sample_size = 3 e p75 = 300. Reentregas idênticas não aumentam essa contagem de amostras. Um ID de evento com conteúdo normalizado conflitante não contribui com nenhum registro.
Versioning
schema_version identifica a versão principal do contrato independentemente das versões do pacote do produtor.
Adicionar campos opcionais ou nomes de ações definidos pela aplicação é compatível com versões anteriores. Remover campos obrigatórios ou alterar seus tipos, significados, escopo de identificador ou semântica de sessão requer uma mudança significativa de versão. Mudanças na deduplicação, redução de amostras ou semântica de tipo evento também exigem uma nova versão principal.
Os consumidores ignoram versões e tipos de eventos não suportados em vez de interpretá-los como ações.