Ir al contenido

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 celular y el propio servidor.

Las analíticas de uso son independientes de Compartir informes de fallas, que es un ajuste por dispositivo para los diagnósticos de fallas y errores.

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 vivo 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.

  • 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_id seudó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.

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 inicio del servidor y nunca se envía al proveedor de analíticas. Eliminar el directorio de datos del servidor crea una sal y un ID de instalación nuevos, lo que desvincula todo lo registrado antes.

Propiedad Ejemplo Significado
app_type desktop desktop, web, remote (el celular) 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 celular (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 inició 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 inicio de la aplicación, para ordenar los eventos de una sesión
event_seq 12 Posición del evento dentro del inicio

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.

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.

Los registran la aplicación de escritorio, la aplicación web y el celular para las acciones que hace una persona.

Evento Propiedades Se registra cuando
app_opened startup_ms La aplicación terminó de iniciar 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ó después de una caída
server_disconnected La conexión se cayó
server_switched El usuario cambió a otro servidor
device_paired El celular 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 (celular). Del enlace solo se deduce el proveedor
notification_action action (read, unread, dismiss, mark_all_read, clear_all), workspace_id Se utilizó 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 (celular)
goal_started kind (goal, loop), workspace_id, space_id, conversation_id, agent_id, budget_cents, accepted Se inició un objetivo o bucle supervisado (celular)
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

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 iniciar
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 recolectó 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

Los eventos se envían uno por 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.

El destino se define al compilar:

Ventana de terminal
--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 agregar ahí un adaptador. El plan de seguimiento y las reglas de privacidad no cambian.