Analíticas de uso
Control Center puede enviar eventos de uso seudónimos a una instancia de Umami. Las analíticas de uso están desactivadas hasta que el operador del servidor las activa. El ajuste pertenece al servidor y se aplica a todos los clientes conectados a él: la aplicación de escritorio, la aplicación web, el teléfono y el propio servidor.
Las analíticas de uso son independientes de Compartir informes de fallos, que es un ajuste por dispositivo para los diagnósticos de fallos y errores.
Quién decide
Sección titulada «Quién decide»| Interruptor | Dónde | Efecto |
|---|---|---|
| Compartir analíticas de uso | Incorporación (paso del sandbox) y Ajustes → Privacidad. Solo el operador del servidor puede cambiarlo; los demás miembros ven el valor actual en modo de solo lectura | Para todo el servidor. Se guarda como telemetry.usage_analytics en los ajustes del servidor. Desactivado salvo que se establezca en true |
| Tipo de compilación | Automático | Las compilaciones debug y profile no envían nada. En su lugar, escriben cada evento en el log de depuración |
CC_ANALYTICS_DEBUG=1 |
Entorno de cc_server o su .env |
Permite que las compilaciones debug y profile del servidor, y de todos los clientes conectados a él, envíen de verdad, para hacer pruebas. El interruptor anterior tiene que seguir activado |
DO_NOT_TRACK=1 |
Entorno de cc_server |
Detiene los informes propios del servidor, diga lo que diga el interruptor. Los clientes siguen haciendo caso al interruptor |
| Servidor de demostración | Automático | El servidor de demostración público no envía nada por su cuenta. Los visitantes no pueden cambiar el interruptor |
Los clientes leen el ajuste del servidor (telemetry.config y después en directo mediante telemetry.watch). Hasta que llega la respuesta, los eventos esperan en un pequeño búfer en memoria. Si la respuesta es no, el búfer se descarta. Al desactivar el interruptor se descarta todo lo que siga en cola y se deja de enviar al instante, en todos los clientes.
Qué no se envía nunca
Sección titulada «Qué no se envía nunca»- El contenido de mensajes, tickets, revisiones o reuniones, títulos, prompts, comandos de shell y consultas de búsqueda
- Nombres, inicios de sesión, direcciones de correo electrónico, avatares y nombres visibles
- Rutas de archivo, nombres de repositorio, nombres de rama, nombres de host y URL (un repositorio solo se envía como
repo_idseudónimo, y un enlace de reunión, solo como su proveedor) - Identificadores sin procesar de cualquier tipo
Cada evento pasa por una política de propiedades antes de salir del proceso. El texto, las rutas, las URL, las direcciones de correo electrónico, los ID sin seudonimizar y las cadenas bajo claves como email, *_name, path, title, prompt, content o token se descartan en lugar de enviarse. Una cadena solo se envía si es un token corto de un vocabulario cerrado, como un valor de enumeración, una versión, una configuración regional o un ID de modelo.
ID seudónimos
Sección titulada «ID seudónimos»Los ID se envían, pero solo como seudónimos. Cada ID de espacio de trabajo, espacio, conversación, agente, ejecución, usuario y dispositivo se sustituye por un HMAC-SHA256 con la sal secreta propia de la instalación (telemetry.pseudonym_salt), truncado a 20 caracteres hexadecimales. El mismo espacio de trabajo informa siempre del mismo valor, de modo que los eventos se pueden relacionar y contar, pero el ID sin procesar nunca sale de la instalación. La sal se crea en el primer arranque del servidor y nunca se envía al proveedor de analíticas. Borrar el directorio de datos del servidor crea una sal y un ID de instalación nuevos, lo que desvincula todo lo registrado antes.
Propiedades de cada evento
Sección titulada «Propiedades de cada evento»| Propiedad | Ejemplo | Significado |
|---|---|---|
app_type |
desktop |
desktop, web, remote (el teléfono) o server. También se usa como nombre de host en Umami |
app_version |
0.0.11 |
Versión publicada |
app_build |
4baf980 |
Commit de git abreviado de la compilación |
platform |
macos |
macos, windows, linux, web o el sistema operativo del teléfono (ios, android) |
locale |
fr_FR |
Idioma de la interfaz |
server_mode |
local |
local (escritorio con su propio servidor) o remote |
server_version |
0.0.11 |
Versión del servidor conectado, si se conoce |
is_demo |
false |
Si el cliente está conectado a la demostración pública |
install_id |
seudónimo | La instalación del servidor |
user_id |
seudónimo | El usuario que ha iniciado sesión, en cuanto se conoce |
device_id |
seudónimo | El dispositivo vinculado, en cuanto se conoce. También es el ID distintivo en Umami |
launch_id |
seudónimo | Un arranque de la aplicación, para ordenar los eventos de una sesión |
event_seq |
12 |
Posición del evento dentro del arranque |
Umami recibe además la dirección IP de la solicitud, de la que deduce el país y la región sin guardar la dirección, así como el User-Agent y el tamaño de pantalla.
Vistas de pantalla
Sección titulada «Vistas de pantalla»Cada navegación registra una vista de página cuya URL es la plantilla de ruta, como /workspaces/:workspaceId/spaces/:spaceId, nunca la dirección concreta. El nombre de la pantalla son los segmentos literales de la plantilla, así que en ese ejemplo es workspaces_spaces. Los parámetros de ruta que terminan en Id se adjuntan como propiedades *_id seudónimas, y los numéricos (como un número de PR), como números. Todos los demás parámetros se descartan.
Eventos de cliente
Sección titulada «Eventos de cliente»Los registran la aplicación de escritorio, la aplicación web y el teléfono para las acciones que hace una persona.
| Evento | Propiedades | Se registra cuando |
|---|---|---|
app_opened |
startup_ms |
La aplicación terminó de arrancar y se conectó |
app_backgrounded |
foreground_s |
La ventana o la pestaña se ocultó |
app_foregrounded |
background_s |
Volvió a mostrarse |
server_connected |
reconnect |
La conexión volvió tras una caída |
server_disconnected |
La conexión se cayó | |
server_switched |
El usuario cambió a otro servidor | |
device_paired |
El teléfono confirmó una vinculación | |
onboarding_step_viewed |
step, step_index |
Se mostró un paso de la incorporación |
onboarding_completed |
duration_s, step_count, workspace_id |
Terminó la incorporación |
workspace_switched |
workspace_id, previous_workspace_id |
El usuario abrió otro espacio de trabajo |
message_sent |
workspace_id, space_id, conversation_id, delivery (send, steer, queued), char_count, attachment_count, agent_mention_count, other_mention_count, slash_command |
Se envió un mensaje desde un editor de mensajes |
slash_command_run |
command, workspace_id, space_id |
Se ejecutó un comando de barra del lado del cliente. Los comandos integrados informan de su nombre, las skills informan skill y los comandos del repositorio, custom |
approval_decided |
decision, remembered, surface, action_classes, action_class_count, severity, workspace_id, space_id, conversation_id |
Se respondió a una solicitud de aprobación de un agente |
command_palette_opened |
Se abrió la paleta de comandos | |
command_executed |
source (palette, keybinding), command |
Se ejecutó un comando. Los comandos de un PR, miembro o conversación concretos solo informan de su tipo (pr, member, conversation) |
review_submitted |
verdict, comment_count, workspace_id |
Se envió una revisión de pull request |
search_performed |
scope (space_messages, repo_content), result_count, query_length, workspace_id, space_id |
Se hizo una búsqueda. La consulta en sí nunca se registra |
meeting_recording_started |
workspace_id, meeting_id |
Empezó la grabación de una reunión |
meeting_recording_stopped |
duration_s, workspace_id, meeting_id |
Se detuvo |
setting_changed |
setting (appearance.theme, appearance.locale), value |
Cambió el tema o el idioma |
soundscape_started |
mood, source (user, focus) |
Empezó el paisaje sonoro, desde los controles o con el modo de enfoque |
soundscape_stopped |
mood, source, listened_s |
Se detuvo |
soundscape_mood_changed |
from_mood, to_mood, playing |
El usuario eligió otro ambiente |
focus_mode_started |
planned_minutes, has_goal, block_notifications |
Empezó el modo de enfoque |
focus_mode_ended |
elapsed_s, planned_minutes, completed |
Terminó el modo de enfoque, antes de tiempo o al agotarse su tiempo |
dictation_started |
Empezó el dictado en el editor de mensajes | |
dictation_ended |
outcome (completed, cancelled, failed), duration_s, transcript_chars, error_kind |
Terminó el dictado. Solo se registra la longitud de la transcripción |
pipeline_run_requested |
workspace_id, template_id, trigger, dry_run, started |
La aplicación pidió al servidor que ejecutara un pipeline |
pipeline_run_retried |
workspace_id, pipeline_run_id |
Se reintentó una ejecución fallida |
pipeline_run_cancel_requested |
workspace_id, pipeline_run_id |
Se canceló una ejecución desde la aplicación |
pipeline_step_killed |
workspace_id, step_run_id |
Se forzó la detención de un paso en curso |
calendar_connect_finished |
outcome (connected, denied, expired, failed, cancelled), builtin_client, duration_s |
Terminó un intento de inicio de sesión en un calendario |
calendar_disconnected |
workspace_id |
Se desconectó una cuenta de calendario |
calendar_rsvp_sent |
calendar_event_id, response, previous_response, workspace_id |
Se respondió a una invitación |
calendar_event_recorded |
workspace_id, calendar_event_id |
Se inició una grabación desde un evento del calendario |
calendar_meeting_joined |
provider (meet, zoom, teams, webex, other), workspace_id, calendar_event_id |
Se abrió un enlace de reunión (teléfono). Del enlace solo se deduce el proveedor |
notification_action |
action (read, unread, dismiss, mark_all_read, clear_all), workspace_id |
Se usó el centro de notificaciones |
agent_created |
workspace_id, agent_id, adapter, model |
Se creó un agente desde el registro |
tab_opened |
kind (chat, terminal, browser, rig, codeServer, file, …) |
Se abrió una pestaña nueva del editor en un espacio |
skill_action |
action (install, update, uninstall, source_added, source_removed), skill_id, blocked |
Cambiaron las skills del espacio de trabajo |
orchestration_decided |
decision (approved, cancelled), workspace_id, orchestration_id |
Se respondió a una propuesta de orquestación |
plan_decided |
decision (approved, rejected), plan_id, workspace_id, partial, node_count |
Se aprobó o rechazó un plan (teléfono) |
goal_started |
kind (goal, loop), workspace_id, space_id, conversation_id, agent_id, budget_cents, accepted |
Se inició un objetivo o bucle supervisado (teléfono) |
conversation_created |
workspace_id, space_id, conversation_id, source (new, fork) |
Se creó o bifurcó una conversación |
conversation_rewound |
conversation_id |
Se continuó una conversación desde un mensaje anterior |
space_archived |
workspace_id, space_id |
Se archivó un espacio |
Eventos del servidor
Sección titulada «Eventos del servidor»Los registra cc_server para hechos que ningún cliente ve exactamente una vez. La ejecución de un agente cuenta una sola vez, por muchos clientes que la estén siguiendo.
| Evento | Propiedades | Se registra cuando |
|---|---|---|
server_started |
workspace_count, startup_ms |
El servidor terminó de arrancar |
workspace_created |
workspace_id |
Se creó un espacio de trabajo |
space_created |
workspace_id, space_id |
Se creó un espacio |
repo_added |
workspace_id, repo_id |
Se vinculó un repositorio |
ticket_created |
workspace_id, ticket_id |
Una persona o un agente creó un ticket |
agent_run_completed |
agent_id, workspace_id, conversation_id, run_id, status, error_family, role, adapter, model, effort, task_family, subagent, pipeline, resumed_native_session, duration_ms, time_to_first_token_ms, input_tokens, output_tokens, thought_tokens, cache_read_tokens, cache_write_tokens, output_rejections, cost_usd |
Terminó la ejecución de un agente |
agent_awaiting_input |
kind (approval, question, credential), workspace_id, agent_id, conversation_id |
Un agente se detuvo a esperar a una persona |
agent_action_blocked |
workspace_id, agent_id, space_id, source |
La política de acciones rechazó una acción de un agente |
pipeline_run_finished |
outcome (completed, failed, cancelled), workspace_id, pipeline_run_id, template_id, trigger, duration_ms, active_ms, attempt_count, template_version, cost_cents, tokens, dry_run, sub_pipeline |
Terminó la ejecución de un pipeline. trigger es manual, el tipo de evento que la inició o, en un disparador con nombre, solo su tipo (webhook) |
pull_request_published |
workspace_id, pr_id |
Se publicó una pull request desde un espacio |
pull_request_merged |
workspace_id, pr_id, agent_id |
Se fusionó una pull request abierta por un agente |
meeting_recorded |
workspace_id, meeting_id, transcript_chars |
Se guardó la grabación de una reunión |
space_deleted |
workspace_id, space_id |
Se eliminó un espacio |
ticket_status_changed |
workspace_id, ticket_id, from_status, to_status |
Un ticket cambió de estado |
ticket_assigned |
workspace_id, ticket_id, assignee_type, agent_id, team_id |
Se asignó un ticket |
ticket_reassigned |
workspace_id, ticket_id, from_agent_id, to_agent_id |
Un ticket pasó a otro agente |
ticket_work_finished |
ticket_id, outcome (completed, failed, cancelled) |
Terminó el trabajo delegado en un ticket |
workspace_member_changed |
workspace_id, member_user_id, change (added, removed, role_changed), role |
Cambiaron los miembros de un espacio de trabajo |
rig_closed |
workspace_id, rig_id, reason, reaped, agent_id |
Se cerró un rig, o se recogió por inactividad |
skill_updated |
workspace_id, skill_id, origin, scan_verdict |
Se instaló, actualizó o cambió en disco una skill del espacio de trabajo |
calendar_auth_expired |
workspace_id |
Una conexión de calendario necesita volver a iniciar sesión |
calendar_meeting_starting_soon |
workspace_id, calendar_event_id, has_meeting_link, lead_s |
Un evento del calendario está a punto de empezar |
budget_threshold_crossed |
scope_type, scope_id, spent_cents, budget_cents, hard_stop |
El gasto superó un umbral del presupuesto |
pull_request_review_requested |
workspace_id, repo_id |
Se solicitó una revisión en un PR seguido |
pull_request_review_decision_changed |
workspace_id, repo_id, decision, reviewers_remaining |
Cambió la decisión de revisión de un PR seguido |
external_pull_request_merged |
workspace_id, repo_id |
Se fusionó en un repositorio vinculado un PR que no abrió ningún agente |
Entrega
Sección titulada «Entrega»Los eventos se envían de uno en uno a <host>/api/send desde una cola en memoria de hasta 200 eventos. Un error de red, un tiempo de espera agotado, un 429 o un 5xx conservan el evento y lo reintentan con espera exponencial, desde 1 segundo hasta 5 minutos. Cualquier otro 4xx lo descarta. No se escribe nada en disco, así que los eventos que sigan en cola al cerrar la aplicación se pierden. La cola se vacía cuando la aplicación pasa a segundo plano y cuando el servidor se apaga.
Apuntar una compilación a otra instancia
Sección titulada «Apuntar una compilación a otra instancia»El destino se fija al compilar:
--dart-define=CC_ANALYTICS_HOST=https://analytics.example.com/--dart-define=CC_ANALYTICS_WEBSITE_ID=<website uuid>El adaptador del proveedor está en packages/cc_analytics. Para admitir otro servicio de analíticas hay que añadir ahí un adaptador. El plan de seguimiento y las reglas de privacidad no cambian.