# Ativar a captura de erros em produção

URL: /guias/erros-em-producao

Gere o DSN, envie source maps no CI e veja o primeiro erro agrupado na lista.

Ao fim, os erros da app em produção chegam ao Mira agrupados, com a stack no código original.

## Pré-requisitos [#pré-requisitos]

- A app já integrada, como em [Preparar uma app para QA](/guias/preparar-app).
- Um ambiente `production` no projeto, com a origem da app em produção cadastrada. Veja [Ambientes e origens](/administrar/ambientes).
- Acesso ao CI da app e ao gerenciador de segredos dele.
- O **nível de código** do projeto em **Só mapeamento** (padrão) ou **Completo**. Com **Sem código**, o envio de maps é recusado.

Em produção o widget não existe. Só a captura de erros roda.

## Passos [#passos]

<Steps>
<Step>

### Gerar a chave de ingestão [#gerar-a-chave-de-ingestão]

**Quem faz:** admin.

Em **Configurações do projeto**, **Erros**, escolha o ambiente `production` no seletor, dê um nome à chave (`web`) e clique em **Gerar chave**. Copie o DSN.

<Figure src="/images/integrate-ingest-key.png" alt="Chave de ingestão gerada com o DSN e o botão de copiar" caption="A chave gerada e o botão que copia o DSN." />

Resultado: a tabela mostra a chave com o DSN. Ela vale só para esse ambiente e só escreve ocorrências. Antes de armazenar dados de usuário, confira o **nível de dados** do ambiente em [Níveis de dados](/erros/niveis-de-dados). O padrão é **Mínimo**.

</Step>
<Step>

### Criar a credencial dos source maps [#criar-a-credencial-dos-source-maps]

**Quem faz:** admin.

Em **Administração do Mira**, **Serviços de API**, crie um serviço com o projeto da app e ative só **Permitir envio de source maps**. Em **Chaves**, use **Emitir chave** e salve o `mira_svc_...` no gerenciador de segredos do CI.

Resultado: o segredo aparece uma vez. Se perder, emita outro. Veja [Tokens](/desenvolvedores/tokens#chave-de-serviço).

</Step>
<Step>

### Configurar o bridge para produção [#configurar-o-bridge-para-produção]

**Quem faz:** dev.

Use o `bootstrap.ts` da aba **Produção** de [Integrar uma app](/desenvolvedores/integrar#ativar-o-widget), com `VITE_MIRA_DSN`, `VITE_VERSION`, `VITE_BUILD_SHA` e `VITE_BUILD_TIME` no `.env.production`. Libere o host do Mira em `connect-src`, se a app tem CSP.

Resultado: a `release` do build tem a forma `1.4.0+abc1234`.

</Step>
<Step>

### Enviar os source maps no build [#enviar-os-source-maps-no-build]

**Quem faz:** dev.

Instale o `@mira/sourcemaps`, adicione `miraSourceMaps()` ao `vite.config.ts` com a mesma `release` e o mesmo `buildTime`, e defina `MIRA_URL`, `MIRA_PROJECT_ID` e `MIRA_SOURCEMAPS_TOKEN` no passo de build do CI. Rode `pnpm exec mira-sourcemaps check dist` antes de publicar. O código está em [Integrar uma app](/desenvolvedores/integrar#b-enviar-source-maps-no-ci).

Resultado: o log do build mostra o envio dos maps e o `dist` fica sem arquivos `.map`.

</Step>
<Step>

### Publicar e provocar um erro [#publicar-e-provocar-um-erro]

**Quem faz:** dev.

Publique o build só depois do envio. Abra a app em produção e dispare uma falha conhecida, como um `throw` numa ação de teste.

Resultado: o navegador envia a ocorrência ao Mira.

</Step>
<Step>

### Ver o erro no dashboard [#ver-o-erro-no-dashboard]

**Quem faz:** admin ou dev.

Abra **Erros** no projeto e filtre pelo ambiente `production`.

Resultado: um erro novo aparece na lista, com a contagem de ocorrências e de usuários afetados.

<Figure src="/images/integrate-error-in-list.png" alt="Lista de erros com um erro novo da app de teste" caption="O erro enviado pela app, agrupado na lista." />

</Step>
</Steps>

## Conferir que deu certo [#conferir-que-deu-certo]

Abra o erro. A stack deve mostrar arquivo, linha e função do código-fonte, com a posição no bundle embaixo, e o contexto deve trazer a `release` do build. Clique em **Criar report** para transformar o erro num report **Bug** na triagem. Veja o que cada bloco mostra em [Detalhe do erro](/erros/detalhe).

## Problemas comuns [#problemas-comuns]

| Sintoma | Causa provável |
| --- | --- |
| Nenhum erro chega | A origem da app não está cadastrada no ambiente, o DSN é de outro ambiente ou o CSP bloqueia o host do Mira. Um DSN malformado gera aviso com o prefixo `[Mira]` no console |
| A stack chega minificada | Os maps não foram enviados para essa `release`, ou a `release` do build difere da do `mira.init()` |
| O mesmo erro aparece duas vezes, um minificado | Ocorrências chegaram antes dos maps. Publique só depois do envio |
| O build do CI falha no envio | Confira `MIRA_URL` com `https`, `MIRA_PROJECT_ID` e o token. Sem token, o plugin só remove os maps |
| Um erro resolvido não reabre | O `buildTime` não foi enviado. Sem ele, a regressão fica desativada |

## Próximos passos [#próximos-passos]

- [Status do erro](/erros/status), para resolver, ignorar e acompanhar regressões.
- [Webhooks](/integracoes/webhooks), para receber `error.created` e `error.spike` fora do dashboard.
