ext operaciones Panel
Conectar

Hogar/Documentos/Métricas personalizadas

Contrato de métricas personalizadas

Versión del contrato 2.0.0 · carga útil esquema_versión 2.0

Las métricas personalizadas permiten que el propio servicio de su extensión impulse los números importantes para ello (conversiones, ingresos, estado del backend, embudos) en el mismo panel que ya rastrea las instalaciones y el estado de la tienda web Chrome. el contrato es Basado en metadatos y de doble superficie: cada métrica declara dónde y cómo. aparece tanto en el tablero como en el estado Telegram, por lo que el panel permanece un renderizador genérico sin código específico del producto.

↓ Descargar OpenAPI 3.1 (YAML) /métricas-personalizadas-openapi.yaml · info.versión 2.0.0

1. Cómo funciona (doble superficie)

Su servicio expone un punto final de métricas. Ext Ops Panel es el cliente: tira ese punto final (nunca al revés) y representa el respuesta. La respuesta impulsa dos superficies a la vez:

El panel fusiona sus métricas con las métricas base propias (instala/desinstala/reinstala/comentarios/Chrome Web Store/salud), que viven en el reservado base pestaña y línea Telegram.

2. El punto final y la autenticación.

El panel llama a su terminal con GET y espera la v2 carga útil como respuesta 200. Dos modos de extracción comparten la misma forma:

La autenticación es una de ninguno, portador o encabezado_clave_api. Los secretos se almacenan cifrados en reposo en el backend del panel y nunca se entregan. a la extensión del tablero. Si falla un tirón, el panel se degrada con gracia (última instantánea u oculta) sin romper las métricas base.

3. Estructura de carga útil

La carga útil de nivel superior lleva el diseño (pestañas, secciones, Telegram líneas) y la matriz de métricas.

CampoTipoNotas
schema_versioncadenaRequerido. Debe ser "2.0".
generated_atcadena (fecha-hora)Cuándo se compuso la carga útil (frescura/detección de inactividad).
tabsPestaña[]Pestañas del tablero. Ver sección 4.
sectionsSección[]Grupos de métricas dentro de una pestaña (tab, id, title, order).
telegramTelegramMetaPlantilla header + lines[]. Ver sección 7.
metricsMétrico[]Las métricas mismas. Ver secciones 5 y 6.

4. Pestañas e íconos de pestañas

Una pestaña es { id, title, order, icon? }. el reservado base La pestaña es propia del panel. (icon="layout-dashboard"); tu servicio suma el resto. cuando muchos Las pestañas están abiertas, la pestaña activa muestra el icono + título y las demás colapsan en la solo ícono (el título permanece en la información sobre herramientas y en la etiqueta aria).

El valor icon es una de dos cosas:

El panel envía un subconjunto seleccionado de 37 nombres de Lucide (mantenidos reducidos para el paquete MV3):

5. Métrica: valor + dos bloques de ubicación

Una métrica lleva un valor escrito más dos bloques independientes: dashboard (dónde y cómo en la extensión) y telegram (dónde y cómo en el mensaje). Se puede omitir o oculto a través de show:false, por lo que una métrica puede residir solo en una superficie.

CampoNotas
idIdentificación de métrica estable, única en la carga útil.
kindTipo de datos (apartado 5.1). Selecciona qué campos de valor se aplican.
labelEtiqueta humana canónica.
value y campos tipoLos campos de carga útil dependen de kind (sección 5.1).
severityUno de ok, info, warn, crit (mapas a color/emoji).
shareableBooleano opcional, predeterminado true. Cuando false la métrica es solo del propietario: en un proyecto compartido de solo lectura, se elimina del lado del servidor y nunca llega a una vista pública/de observador (uso para métricas financieras). Gobierna el acceso, no la ubicación.
dashboard{ show, tab, section, order, name, render, options } (sección 5.2).
telegram{ show, line, pos, format, sep, when } (apartados 6 y 8).

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

Los tipos son un conjunto abierto: el renderizador ignora un tipo desconocido (compatible con versiones posteriores).

amableCampos de carga útilUso de ejemplo
numbervalue (+ opcional delta, unit)instalación/retroalimentación cuenta
deltavalue, delta (representa 1200 (+72))total (+hoy)
percentvalue (0 a 100)tasa de éxito del motor
durationseconds o minutesp50/p95/avg, frescura
bytesbytes o kbtamaño de salida (~522 KB)
ratingvalue, count5.0★ (1)
moneyvalue, currency, opcional deltaMRR, gastar
status__CODEBLOQUE_63__ + __CODEBLOQUE_64__semáforo de salud
seriespoints:[{date,count}], multiopcional series:[{name,points}]instalaciones diarias, usuarios activos
intradayseries:[{name,intraday:[{minute,value}]}], opcional step_min (predeterminado 15), tzhoy por cubos de 15 minutos
hour_histogram{ weekdays:[...], start, end, tz }conversiones por hora
funnelsteps:[{key,label,value}]precios para pagar
breakdownitems:[{label,value,unit?,sub?/money?}]submarinos por plano, por motor, por superficie
listitems:[{text,count?,severity?}]errores recientes
textvalue (cadena)texto libre

5.2. Render (cómo mostrar en el tablero)

dashboard.render elige el objeto visual (normalmente coincide con kind, pero puede diferir, p.e. mostrar un percent como badge). también un conjunto abierto.

prestarMirarOpciones (dashboard.options)
kpiTarjeta: nombre + valor grande + deltatone
badgePíldora de estado/pictograma por gravedad
chartGráfico de líneas (mes/vida útil, promedio móvil de 7, desplazamiento)series, defaultMode
intradayHoy por cubos (96 por UTC día): barras apiladas o líneas suavizadas, eje de tiempo HH:MM, lectura al pasar el cursor sobre las seriesmode (bars | lines, predeterminado lines)
hour_histogramBarras horarias, agrupadas entre semana/fin de semana/por día de la semanaseries
funnelPasos con conversión entre ellos.
breakdownBarras categóricas horizontales con valor + participación del totalitems
tableTabla (por ejemplo, comentarios)columns
textPárrafo / en línea
statusEstado del semáforo por gravedad
listLista de elementos con recuento/gravedad opcional

intraday frente a chart. El chart el eje es a diario (points[].date = YYYY-MM-DD) y su La vista mensual se divide en los últimos 30 puntos, por lo que los 96 segmentos de hoy no caben en ella. intraday es el gráfico Hoy propio expuesto como tipo de contrato: el misma convención donde minute cuenta los minutos desde el inicio del día UTC (0, 15,…, 1425), pero las series y datos están declarados por la fuente. Enviar solo cubetas no vacías, el panel densifica el resto.

Un depósito vacío es null, no 0. para un promedio (por ejemplo, tiempo medio de conversión) un cero sería una mentira, por lo que la línea se rompe en lugar de caer al suelo. Falta un depósito y value: null son equivalente: la línea se rompe, no se dibuja ninguna barra y la lectura al pasar el mouse muestra un guión.

6. El panel es dueño de la paleta.

Se asignan colores de gráficos y series. por el panel de la marca tokens, no por la fuente. options.series[] solo lleva identidad ({key,label,order}); un campo color en la carga útil es asesoramiento y ignorado. Las claves semánticas se asignan a tokens fijos (paid para acentuar, free para silenciar neutral, failed/error al peligro, ready/success hasta el éxito); otras llaves toman el paleta de marcas categóricas posicionalmente. El contraste se mantiene al menos en 4,5:1 en ambos temas. Esto protege la marca de maleficios externos arbitrarios.

7. Plantillas Telegram

telegram.header es el encabezado del mensaje; telegram.lines[] son líneas lógicas ({ id, order, prefix, when }). El compositor recoge cada métrica con un telegram.line dado, filtra por when, ordena por pos, representa cada uno a través de su plantilla format y une ellos con el sep de cada métrica. Se imprime la línea prefix primero. Todo es texto plano.

Marcador de posiciónProducción
{value}Por tipo (número 1,200; porcentaje 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 gravedad: 🟢 ok, 🟡 advertir, 🔴 crítico, ⚪ inactivo
{trend} / (±5pp vs 7d)

8. Condiciones de visibilidad (cuándo)

when controla si un campo de métrica (o una línea completa Telegram) muestra. Valores:

cuandoMuestra el campo
alwaysSiempre (predeterminado).
nonzeroSólo cuando el valor no es 0/vacío.
severity>=warnSólo cuando la severidad es advertencia o crítico.
changedSolo cuando cambió desde la instantánea anterior.

Los valores when desconocidos se comportan como always (compatible con versiones posteriores).

9. Ejemplo 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"
      }
    }
  ]
}
Solo se admite la versión 2 nativa. Su servicio devuelve métricas más un diseño listo según este contrato; no hay conectores de formato heredado. tipos y los tipos de renderizado provienen de los conjuntos declarados anteriormente; los desconocidos son ignorados por lo que una fuente más nueva nunca rompe un panel más antiguo.

10. El contrato legible por máquina

La descripción formal e importable de este punto final es el archivo OpenAPI 3.1. Lleva la misma versión de contrato (2.0.0) y es el único canónico artefacto de máquina, compartido entre idiomas.

↓ Descargar OpenAPI 3.1 (YAML) /métricas-personalizadas-openapi.yaml