|
| 1 | +[comment]: # (@label Telemetria) |
| 2 | +[comment]: # (@link guides/telemetry) |
| 3 | + |
| 4 | +## Telemetria do PO UI |
| 5 | + |
| 6 | +O PO UI oferece um serviço de telemetria **opt-in** que permite coletar dados anônimos sobre o uso dos componentes da biblioteca. Esses dados ajudam a equipe de desenvolvimento a entender quais componentes são mais utilizados, priorizar melhorias e corrigir problemas. |
| 7 | + |
| 8 | +### O que é coletado |
| 9 | + |
| 10 | +Os eventos de telemetria contêm apenas as seguintes informações: |
| 11 | + |
| 12 | +| Campo | Descrição | |
| 13 | +|---|---| |
| 14 | +| `componentName` | Nome do componente utilizado (ex: `po-button`, `po-table`) | |
| 15 | +| `libraryVersion` | Versão da biblioteca `@po-ui/ng-components` | |
| 16 | +| `angularVersion` | Versão do Angular utilizada na aplicação | |
| 17 | +| `timestamp` | Data e hora do evento em formato ISO 8601 | |
| 18 | +| `sessionId` | Identificador aleatório da sessão do navegador | |
| 19 | + |
| 20 | +> **Nenhum dado pessoal, de negócio ou sensível é coletado.** Não são rastreados dados de formulário, interações do usuário ou informações de identificação pessoal. |
| 21 | +
|
| 22 | +### Como habilitar |
| 23 | + |
| 24 | +A telemetria está **desabilitada por padrão**. Para habilitá-la, utilize o `PoTelemetryModule.forRoot()` na configuração do seu módulo ou aplicação: |
| 25 | + |
| 26 | +**Abordagem com NgModule:** |
| 27 | + |
| 28 | +```typescript |
| 29 | +import { PoTelemetryModule } from '@po-ui/ng-components'; |
| 30 | + |
| 31 | +@NgModule({ |
| 32 | + imports: [ |
| 33 | + PoModule, |
| 34 | + PoTelemetryModule.forRoot({ |
| 35 | + enabled: true, |
| 36 | + endpointUrl: 'https://my-telemetry-api.example.com/events', |
| 37 | + showConsentDialog: true |
| 38 | + }) |
| 39 | + ] |
| 40 | +}) |
| 41 | +export class AppModule {} |
| 42 | +``` |
| 43 | + |
| 44 | +**Abordagem Standalone:** |
| 45 | + |
| 46 | +```typescript |
| 47 | +import { importProvidersFrom } from '@angular/core'; |
| 48 | +import { PoTelemetryModule } from '@po-ui/ng-components'; |
| 49 | + |
| 50 | +bootstrapApplication(AppComponent, { |
| 51 | + providers: [ |
| 52 | + importProvidersFrom(PoTelemetryModule.forRoot({ |
| 53 | + enabled: true, |
| 54 | + endpointUrl: 'https://my-telemetry-api.example.com/events', |
| 55 | + showConsentDialog: true |
| 56 | + })) |
| 57 | + ] |
| 58 | +}); |
| 59 | +``` |
| 60 | + |
| 61 | +### Configurações disponíveis |
| 62 | + |
| 63 | +| Propriedade | Tipo | Padrão | Descrição | |
| 64 | +|---|---|---|---| |
| 65 | +| `enabled` | `boolean` | `false` | Habilita ou desabilita a coleta de telemetria | |
| 66 | +| `endpointUrl` | `string` | — | URL do endpoint que receberá os eventos | |
| 67 | +| `consentStorageKey` | `string` | `po-telemetry-consent` | Chave no `localStorage` para armazenar o consentimento | |
| 68 | +| `batchIntervalMs` | `number` | `30000` | Intervalo em milissegundos para envio em batch | |
| 69 | +| `showConsentDialog` | `boolean` | `true` | Exibe diálogo de consentimento na primeira vez | |
| 70 | +| `consentDialogLiterals` | `object` | — | Literais customizadas para o diálogo de consentimento | |
| 71 | + |
| 72 | +### Como o consentimento funciona |
| 73 | + |
| 74 | +O serviço de telemetria implementa um mecanismo de consentimento em duas camadas: |
| 75 | + |
| 76 | +1. **Configuração do desenvolvedor**: A telemetria só é ativada quando `enabled: true` é definido na configuração. |
| 77 | +2. **Consentimento do usuário final**: Mesmo com a telemetria habilitada, os dados só são coletados após o consentimento explícito do usuário. |
| 78 | + |
| 79 | +O fluxo de consentimento funciona da seguinte forma: |
| 80 | + |
| 81 | +- Ao inicializar, o serviço verifica o `localStorage` pela chave configurada (`po-telemetry-consent` por padrão). |
| 82 | +- Se não houver valor armazenado e `showConsentDialog` estiver habilitado, um diálogo de confirmação é exibido ao usuário utilizando o `PoDialogService`. |
| 83 | +- Se o usuário **aceitar**, o valor `granted` é salvo no `localStorage` e a coleta de dados é iniciada. |
| 84 | +- Se o usuário **recusar**, o valor `denied` é salvo e nenhum dado é coletado. |
| 85 | + |
| 86 | +### Controle programático |
| 87 | + |
| 88 | +O `PoTelemetryService` expõe métodos para controle programático do consentimento: |
| 89 | + |
| 90 | +```typescript |
| 91 | +import { PoTelemetryService } from '@po-ui/ng-components'; |
| 92 | + |
| 93 | +@Component({ ... }) |
| 94 | +export class SettingsComponent { |
| 95 | + constructor(private telemetryService: PoTelemetryService) {} |
| 96 | + |
| 97 | + enableTelemetry() { |
| 98 | + this.telemetryService.grantConsent(); |
| 99 | + } |
| 100 | + |
| 101 | + disableTelemetry() { |
| 102 | + this.telemetryService.revokeConsent(); |
| 103 | + } |
| 104 | +} |
| 105 | +``` |
| 106 | + |
| 107 | +### Como desabilitar |
| 108 | + |
| 109 | +Para desabilitar completamente a telemetria, basta: |
| 110 | + |
| 111 | +- **Não importar** o `PoTelemetryModule.forRoot()` na aplicação, ou |
| 112 | +- Definir `enabled: false` na configuração |
| 113 | + |
| 114 | +Para revogar o consentimento de um usuário que já havia consentido: |
| 115 | + |
| 116 | +```typescript |
| 117 | +this.telemetryService.revokeConsent(); |
| 118 | +``` |
| 119 | + |
| 120 | +### Customização do diálogo de consentimento |
| 121 | + |
| 122 | +As literais do diálogo de consentimento podem ser customizadas: |
| 123 | + |
| 124 | +```typescript |
| 125 | +PoTelemetryModule.forRoot({ |
| 126 | + enabled: true, |
| 127 | + endpointUrl: 'https://my-telemetry-api.example.com/events', |
| 128 | + consentDialogLiterals: { |
| 129 | + title: 'Coleta de dados de uso', |
| 130 | + message: 'Gostaríamos de coletar dados anônimos sobre o uso dos componentes para melhorar a experiência. Nenhum dado pessoal é coletado. Deseja permitir?', |
| 131 | + confirm: 'Sim, permitir', |
| 132 | + cancel: 'Não, obrigado' |
| 133 | + } |
| 134 | +}) |
| 135 | +``` |
| 136 | + |
| 137 | +### Política de privacidade recomendada |
| 138 | + |
| 139 | +Se a sua aplicação utiliza a telemetria do PO UI, é recomendado incluir na sua política de privacidade uma seção informando: |
| 140 | + |
| 141 | +- Que dados anônimos de uso de componentes de interface são coletados |
| 142 | +- Que nenhum dado pessoal ou de negócio é transmitido |
| 143 | +- Que o usuário pode revogar o consentimento a qualquer momento |
| 144 | +- O endpoint para o qual os dados são enviados |
| 145 | + |
| 146 | +### Formato do payload |
| 147 | + |
| 148 | +Os eventos são enviados em batch via `POST` para o endpoint configurado. O corpo da requisição é um array de objetos: |
| 149 | + |
| 150 | +```json |
| 151 | +[ |
| 152 | + { |
| 153 | + "componentName": "po-table", |
| 154 | + "libraryVersion": "21.4.0", |
| 155 | + "angularVersion": "21.0.3", |
| 156 | + "timestamp": "2026-03-05T12:00:00.000Z", |
| 157 | + "sessionId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" |
| 158 | + } |
| 159 | +] |
| 160 | +``` |
| 161 | + |
| 162 | +Em caso de falha no envio, os eventos são mantidos em buffer e reenviados na próxima tentativa. |
0 commit comments