Files
pagodera/docs/PRISMA_QUERY_LOGS.md
Evandro Fonseca Junior 7f42def478 feat(market): add Minha Intenções tab with panel, hook, and badge
- Introduced "Minhas Intenções" tab visible only to logged-in users.
- Integrated MyPurchaseIntentionsPanel and useMyPurchaseIntentions hook.
- Added tab badge showing count of pending intentions.
- Extended session API to include user’s main character for downstream features.
2025-11-07 17:25:51 -03:00

291 lines
7.4 KiB
Markdown

# 📊 Prisma Query Logs - Explicação Completa
## 🔍 O que são os logs `prisma:query`?
Os logs `prisma:query` são **queries SQL que o Prisma executa automaticamente** no banco de dados PostgreSQL. Eles aparecem no console durante o desenvolvimento para ajudar você a:
1. **Debugar** - Ver exatamente quais queries estão sendo executadas
2. **Otimizar** - Identificar queries lentas ou desnecessárias
3. **Entender** - Compreender o que o Prisma está fazendo "por baixo dos panos"
---
## ⚙️ Configuração Atual
No arquivo `lib/prisma/app.ts`, o Prisma está configurado assim:
```typescript
export const prisma = new PrismaClient({
log:
process.env.NODE_ENV === "development"
? ["query", "error", "warn"] // ← Loga queries em desenvolvimento
: ["error"], // ← Apenas erros em produção
});
```
**Isso significa:**
- ✅ **Em desenvolvimento**: Mostra todas as queries SQL
- ✅ **Em produção**: Apenas mostra erros (não mostra queries)
---
## 📝 Análise dos Logs do Seu Terminal
### 1. **INSERT de Telemetria** (Linhas 24-26, 58-59, 93-94)
```sql
INSERT INTO "public"."telemetry_events"
("event_type","ad_id","user_id","session_id","metadata","timestamp")
VALUES ($1,$2,$3,$4,$5,$6)
RETURNING ...
```
**O que é:**
- Registra eventos de telemetria (cliques, visualizações, etc.)
- Executado quando o usuário interage com a página
**Por que aparece:**
- O sistema de telemetria está ativo e registrando eventos
---
### 2. **SELECT de Listings** (Linhas 35-36, 79-80)
```sql
SELECT COUNT(*) AS "_count$_all"
FROM (SELECT "public"."listings"."listing_id"
FROM "public"."listings"
WHERE "public"."listings"."listing_status" = $1
OFFSET $2) AS "sub"
```
**O que é:**
- Conta quantos anúncios ativos existem
- Usado para paginação
**E depois:**
```sql
SELECT "public"."listings"."listing_id",
"public"."listings"."seller_id",
"public"."listings"."item_id",
-- ... todos os campos ...
FROM "public"."listings"
WHERE "public"."listings"."listing_status" = $1
ORDER BY "public"."listings"."created_at" DESC
LIMIT $2 OFFSET $3
```
**O que é:**
- Busca os anúncios ativos com paginação
- Ordena por data de criação (mais recentes primeiro)
- Limita a 20 resultados por página
**Por que aparece:**
- A página do marketplace (`/en/market`) está carregando
- Está buscando anúncios para exibir
---
### 3. **SELECT de Characters** (Linhas 37, 81)
```sql
SELECT "public"."user_characters"."character_id",
"public"."user_characters"."user_id",
"public"."user_characters"."character_name",
"public"."user_characters"."server_name",
"public"."user_characters"."is_main",
"public"."user_characters"."verified",
"public"."user_characters"."created_at"
FROM "public"."user_characters"
WHERE ("public"."user_characters"."user_id" = $1
AND "public"."user_characters"."server_name" = $2
AND "public"."user_characters"."is_main" = $3)
LIMIT $4 OFFSET $5
```
**O que é:**
- Busca o personagem principal do vendedor
- Usado para exibir o nome do personagem nos cards de anúncio
**Por que aparece:**
- Para cada anúncio, busca o nome do personagem do vendedor
- Isso acontece porque implementamos a busca de `seller_character_name`
---
### 4. **SELECT de Servers** (Linha 66)
```sql
SELECT "public"."servers"."server_id",
"public"."servers"."server_name",
-- ... outros campos ...
FROM "public"."servers"
WHERE "public"."servers"."is_active" = $1
ORDER BY "public"."servers"."server_name" ASC
OFFSET $2
```
**O que é:**
- Busca todos os servidores ativos
- Usado para popular o filtro de servidores no marketplace
**Por que aparece:**
- O componente de filtros está carregando a lista de servidores
---
### 5. **BEGIN / COMMIT** (Linhas 23, 27, 57, 60, 92, 95)
```sql
BEGIN
-- ... queries ...
COMMIT
```
**O que é:**
- **Transações** do banco de dados
- Garante que múltiplas operações sejam executadas atomicamente
- Se uma falhar, todas são revertidas (ROLLBACK)
**Por que aparece:**
- Operações que precisam de atomicidade (ex: inserir múltiplos eventos de telemetria em batch)
---
## 🎯 Por que isso é útil?
### ✅ Benefícios:
1. **Debugging:**
- Ver exatamente quais queries estão sendo executadas
- Identificar queries N+1 (muitas queries desnecessárias)
- Verificar se os índices estão sendo usados
2. **Performance:**
- Identificar queries lentas
- Ver quantas queries estão sendo executadas
- Otimizar queries que são executadas repetidamente
3. **Entendimento:**
- Aprender como o Prisma traduz suas operações para SQL
- Ver como os relacionamentos são resolvidos
---
## ⚙️ Como Controlar os Logs
### Opção 1: Desabilitar completamente (não recomendado em dev)
```typescript
// lib/prisma/app.ts
export const prisma = new PrismaClient({
log: ["error"], // Apenas erros
});
```
### Opção 2: Apenas erros e warnings
```typescript
export const prisma = new PrismaClient({
log: ["error", "warn"],
});
```
### Opção 3: Logs mais detalhados (com informações de tempo)
```typescript
export const prisma = new PrismaClient({
log: [
{ level: "query", emit: "event" },
{ level: "error", emit: "stdout" },
{ level: "warn", emit: "stdout" },
],
});
```
### Opção 4: Manter como está (recomendado)
```typescript
// Atual (já está assim)
export const prisma = new PrismaClient({
log:
process.env.NODE_ENV === "development"
? ["query", "error", "warn"] // ← Bom para desenvolvimento
: ["error"], // ← Otimizado para produção
});
```
**✅ Recomendação:** Manter como está! Os logs são úteis em desenvolvimento e não aparecem em produção.
---
## 🔍 Análise de Performance dos Seus Logs
### Queries que aparecem frequentemente:
1. **SELECT listings** (2 queries):
- Uma para contar total
- Uma para buscar os itens
- **Status:** ✅ Normal (paginação requer ambas)
2. **SELECT user_characters** (1 por anúncio):
- Busca o personagem do vendedor
- **Status:** ⚠️ Potencial otimização
- **Sugestão:** Já está otimizado com `Map` para evitar queries duplicadas
3. **INSERT telemetry_events** (em batch):
- Múltiplos eventos inseridos em uma transação
- **Status:** ✅ Otimizado (usa transação)
---
## 📊 Níveis de Log do Prisma
O Prisma suporta diferentes níveis de log:
```typescript
log: [
"query", // Todas as queries SQL
"info", // Informações gerais
"warn", // Avisos
"error", // Erros
]
```
**Ou com eventos:**
```typescript
log: [
{ level: "query", emit: "event" }, // Evento customizado
{ level: "error", emit: "stdout" }, // Console padrão
]
```
---
## 🎯 Conclusão
**Os logs `prisma:query` são:**
- ✅ **Normais** - Esperados em desenvolvimento
- ✅ **Úteis** - Ajudam a debugar e otimizar
- ✅ **Automáticos** - Não afetam performance
- ✅ **Desabilitados em produção** - Não aparecem em produção
**Você deve:**
- ✅ **Manter** os logs em desenvolvimento
- ✅ **Usar** para identificar problemas de performance
- ✅ **Ignorar** se não estiver debuggando (são apenas informativos)
---
## 🔗 Referências
- [Prisma Logging Documentation](https://www.prisma.io/docs/concepts/components/prisma-client/working-with-prismaclient/logging)
- [Prisma Query Performance](https://www.prisma.io/docs/guides/performance-and-optimization/query-optimization-performance)