Externo Operações Painel
Conectar

Lar/Documentos/Métricas personalizadas

Contrato de métricas personalizadas

Versão do contrato 2.0.0 · payload schema_version 2.0

Métricas personalizadas permitem que o próprio serviço da sua extensão empurre quaisquer números importantes para isso (conversões, receita, integridade de back-end, funis) no mesmo painel que já rastreia instalações e a integridade da Chrome Web Store. O contrato é orientada por metadados e de superfície dupla: cada métrica declara onde e como aparece tanto no painel quanto no status Telegram, então o painel permanece um renderizador genérico sem código específico do produto.

↓ Baixar OpenAPI 3.1 (YAML) /custom-metrics-openapi.yaml · info.versão 2.0.0

1. Como funciona (superfície dupla)

Seu serviço expõe um ponto de extremidade de métricas. Ext Ops Panel é o cliente: é puxa esse ponto final (nunca o inverso) e renderiza o resposta. A resposta aciona duas superfícies ao mesmo tempo:

O painel mescla suas métricas com as métricas básicas primárias (instala/desinstala/reinstala/feedback/Chrome Web Store/saúde), que moram no reservado base guia e linha Telegram.

2. O endpoint e a autenticação

O painel chama seu endpoint com GET e espera a v2 carga útil como a resposta 200. Dois modos de puxar compartilham a mesma forma:

A autenticação é um dos nenhum, portador ou api_key_header. Os segredos são armazenados criptografados em repouso no back-end do painel e nunca são entregues para a extensão do painel. Se um pull falhar, o painel se degradará normalmente (último instantâneo ou oculto) sem quebrar as métricas básicas.

3. Estrutura de carga útil

A carga útil de nível superior carrega o layout (guias, seções, Telegram linhas) e a matriz de métricas.

CampoTipoNotas
schema_versioncordaObrigatório. Deve ser "2.0".
generated_atstring (data-hora)Quando a carga útil foi composta (detecção de atualização/inatividade).
tabsGuia[]Guias do painel. Consulte a seção 4.
sectionsSeção[]Grupos de métricas dentro de uma aba (tab, id, title, order).
telegramTelegramMetaModelo header + lines[]. Consulte a seção 7.
metricsMétrica[]As próprias métricas. Consulte as seções 5 e 6.

4. Guias e ícones de guias

Uma guia é { id, title, order, icon? }. O reservado base aba é do próprio painel (icon="layout-dashboard"); seu serviço adiciona o resto. Quando muitos as guias estão abertas, a guia ativa mostra o ícone + título e as outras são recolhidas para o apenas ícone (o título permanece na dica de ferramenta e no rótulo aria).

O valor icon é uma de duas coisas:

O painel envia um subconjunto selecionado de 37 nomes Lucide (mantidos enxutos para o pacote MV3):

5. Métrica: valor + dois blocos de posicionamento

Uma métrica carrega um valor digitado mais dois blocos independentes: dashboard (onde e como na extensão) e telegram (onde e como na mensagem). Pode ser omitido ou oculto por meio de show:false, portanto, uma métrica pode residir em apenas uma superfície.

CampoNotas
idID de métrica estável, exclusivo na carga útil.
kindTipo de dados (seção 5.1). Seleciona quais campos de valor se aplicam.
labelRótulo humano canônico.
value e campos de tipoOs campos de carga útil dependem de kind (seção 5.1).
severityUm de ok, info, warn, crit (mapeia para cores/emoji).
shareableBooleano opcional, padrão true. Quando false a métrica é somente do proprietário: em um projeto compartilhado somente leitura, ela é removida do lado do servidor e nunca atinge um observador/visão pública (use para métricas financeiras). Governa o acesso, não a colocação.
dashboard{ show, tab, section, order, name, render, options } (seção 5.2).
telegram{ show, line, pos, format, sep, when } (seções 6 e 8).

5.1. Tipos (tipo de dados + carga útil)

Os tipos são um conjunto aberto: um tipo desconhecido é ignorado pelo renderizador (compatível com versões futuras).

tipoCampos de carga útilExemplo de uso
numbervalue (+ opcional delta, unit)contagens de instalação/feedback
deltavalue, delta (renderiza 1200 (+72))total (+hoje)
percentvalue (0 a 100)taxa de sucesso do motor
durationseconds ou minutesp50/p95/média, frescor
bytesbytes ou kbtamanho de saída (~522 KB)
ratingvalue, count5,0★ (1)
moneyvalue, currency, opcional deltaMRR, gastar
statusstate + severitysemáforo de saúde
seriespoints:[{date,count}], multi series:[{name,points}] opcionalinstalações diárias, usuários ativos
intradayseries:[{name,intraday:[{minute,value}]}], opcional step_min (padrão 15), tzhoje em intervalos de 15 minutos
hour_histogram{ weekdays:[...], start, end, tz }conversões por hora
funnelsteps:[{key,label,value}]preços para finalizar a compra
breakdownitems:[{label,value,unit?,sub?/money?}]submarinos por plano, por motor, por superfície
listitems:[{text,count?,severity?}]erros recentes
textvalue (sequência)texto livre

5.2. Renderizar (como mostrar no painel)

dashboard.render escolhe o visual (geralmente corresponde a kind, mas pode diferir, por ex. mostre um percent como um badge). Também um conjunto aberto.

renderizarOlharOpções (dashboard.options)
kpiCartão: nome + valor grande + deltatone
badgePílula de status/pictograma por gravidade
chartGráfico de linhas (mês/duração, média contínua de 7, foco)series, defaultMode
intradayHoje por intervalos (96 por UTC dia): barras empilhadas ou linhas suavizadas, eixo de tempo HH:MM, leitura instantânea entre sériesmode (bars | lines, padrão lines)
hour_histogramBarras horárias, agrupadas Dias da semana / Fim de semana / Por dia da semanaseries
funnelEtapas com conversão entre eles
breakdownBarras categóricas horizontais com valor + parcela do totalitems
tableTabela (por exemplo, feedback)columns
textParágrafo/inline
statusEstado do semáforo por gravidade
listLista de itens com contagem/gravidade opcional

intraday versus chart. O chart eixo é diário (points[].date = YYYY-MM-DD) e seu A visualização mensal divide os últimos 30 pontos, portanto, os 96 intervalos de hoje não cabem nela. intraday é o gráfico Today primário exposto como um tipo de contrato: o mesma convenção onde minute conta minutos a partir do início do dia UTC (0, 15,…, 1425), mas as séries e os dados são declarados pela fonte. Enviar apenas baldes não vazios, o painel densifica o resto.

Um intervalo vazio é null, não 0. Por um média (por exemplo, tempo médio de conversão), um zero seria uma mentira, então a linha pausas em vez de cair no chão. Um intervalo ausente e value: null são equivalente: a linha quebra, nenhuma barra é desenhada e a leitura instantânea mostra um traço.

6. O painel é dono da paleta

As cores do gráfico e da série são atribuídas pelo painel da marca tokens, não pela fonte. options.series[] carrega apenas identidade ({key,label,order}); um campo color na carga útil é consultivo e ignorado. Mapa de chaves semânticas para tokens fixos (paid para acentuar, free para neutro silenciado, failed/error ao perigo, ready/success para sucesso); outras chaves levam o paleta de marca categórica posicionalmente. O contraste permanece pelo menos 4,5:1 em ambos temas. Isso protege a marca de hexadecimal externo arbitrário.

7. Modelos Telegram

telegram.header é o cabeçalho da mensagem; telegram.lines[] são linhas lógicas ({ id, order, prefix, when }). O compositor reúne todas as métricas com um determinado telegram.line, filtra por when, classifica por pos, renderiza cada um por meio de seu modelo format e une eles com sep de cada métrica. A linha prefix é impressa primeiro. Tudo é texto simples.

Espaço reservadoSaída
{value}Por tipo (número 1,200; porcentagem 99%)
{value:k}1.2k / 3.0M (compacto)
{delta:+}+72 / -3
{value:pct}99%
{seconds:dur}28s / 5m 47s
{minutes:age}45m / 2h 30m / never
{bytes:size}~522KB / 1.4MB
{value}★ ({count})5.0★ (1)
{sev}Emoji de gravidade: 🟢 ok, 🟡 avisar, 🔴 crítico, ⚪ inativo
{trend} / (±5pp vs 7d)

8. Condições de visibilidade (quando)

when controla se um campo de métrica (ou uma linha Telegram inteira) mostra. Valores:

quandoMostra o campo
alwaysSempre (padrão).
nonzeroSomente quando o valor não for 0/vazio.
severity>=warnSomente quando a gravidade é avisada ou crítica.
changedSomente quando mudou desde o instantâneo anterior.

Valores desconhecidos de when se comportam como always (compatível com versões futuras).

9. Exemplo de carga útil

{
  "schema_version": "2.0",
  "generated_at": "2026-07-02T23:17:30Z",
  "tabs": [
    { "id": "conv", "title": "Conversions", "order": 1, "icon": "trending-up" }
  ],
  "sections": [
    { "tab": "conv", "id": "by_hour", "title": "By hour", "order": 0 }
  ],
  "telegram": {
    "header": "{name} • {cws.users} • {cws.rating}★ ({cws.rating_count})",
    "lines": [
      { "id": "base", "order": 0 },
      { "id": "conv", "order": 1, "prefix": "{sev} Conv " }
    ]
  },
  "metrics": [
    {
      "id": "conv_today",
      "kind": "number",
      "label": "Conversions today",
      "value": 254,
      "severity": "ok",
      "shareable": true,
      "dashboard": {
        "show": true,
        "tab": "conv", "section": "by_hour", "order": 10,
        "name": "Today", "render": "kpi", "options": {}
      },
      "telegram": {
        "show": true,
        "line": "conv", "pos": 20,
        "format": "today {value}", "sep": " • ", "when": "always"
      }
    }
  ]
}
Somente v2 nativo é compatível. Seu serviço retorna métricas mais um layout pronto de acordo com este contrato; não há conectores de formato legado. Tipos e os tipos de renderização vêm dos conjuntos declarados acima; os desconhecidos são ignorados, então uma fonte mais recente nunca quebra uma construção de painel mais antiga.

10. O contrato legível por máquina

A descrição formal e importável deste endpoint é o arquivo OpenAPI 3.1. Ele carrega a mesma versão do contrato (2.0.0) e é o único canônico artefato de máquina, compartilhado entre idiomas.

↓ Baixar OpenAPI 3.1 (YAML) /custom-metrics-openapi.yaml