jarvis-ai-framework 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +416 -0
- package/LICENSE +21 -0
- package/README.md +190 -0
- package/agents/AGENTS.md +234 -0
- package/agents/README.md +309 -0
- package/agents/engineering/data/eng.data-engineer.agent.md +309 -0
- package/agents/engineering/eng.agent.md +303 -0
- package/agents/engineering/eng.bug-hunter.md +386 -0
- package/agents/engineering/eng.cybersecurity.agent.md +503 -0
- package/agents/engineering/eng.dev-code-reviewer.md +148 -0
- package/agents/engineering/eng.docs-writer.md +152 -0
- package/agents/engineering/eng.frontend.agent.md +117 -0
- package/agents/engineering/eng.rpa.agent.md +215 -0
- package/agents/engineering/eng.tech-analyst.agent.md +102 -0
- package/agents/engineering/eng.ux-designer.agent.md +193 -0
- package/agents/engineering/qa/eng.qa.cypress-specialist.md +109 -0
- package/agents/engineering/qa/eng.qa.quality-champion-task-agent.md +85 -0
- package/agents/engineering/qa/eng.qa.quality-strategist.md +111 -0
- package/agents/engineering/qa/eng.qa.test-architect.md +400 -0
- package/agents/engineering/qa/eng.qa.test-planner.md +477 -0
- package/agents/engineering/qa/eng.qa.testing-engineer.md +339 -0
- package/agents/product/prod.pm-checker.md +52 -0
- package/bin/commands/docs-publish.js +184 -0
- package/bin/commands/docs-sync.js +139 -0
- package/bin/commands/info.js +87 -0
- package/bin/commands/init.js +237 -0
- package/bin/commands/install-rtk.js +90 -0
- package/bin/commands/list.js +48 -0
- package/bin/commands/qa-signoff.js +112 -0
- package/bin/commands/whoami.js +43 -0
- package/bin/jarvis.js +159 -0
- package/bin/lib/auth/session.js +56 -0
- package/bin/lib/config/constants.js +123 -0
- package/bin/lib/config/ide-config.js +233 -0
- package/bin/lib/core/scanner.js +124 -0
- package/bin/lib/core/sync-engine.js +551 -0
- package/bin/lib/docs/fetch-file.sh +41 -0
- package/bin/lib/docs/publish-file.sh +284 -0
- package/bin/lib/docs/validate-frontmatter.js +157 -0
- package/bin/lib/env-loader.js +198 -0
- package/bin/lib/tasks/comment.js +131 -0
- package/bin/lib/utils/git-parser.js +145 -0
- package/bin/lib/utils/logger.js +104 -0
- package/bin/lib/utils/npmrc-parser.js +106 -0
- package/bin/lib/utils/paths.js +55 -0
- package/bin/lib/utils/ui.js +59 -0
- package/bin/lib/vcs/api.js +312 -0
- package/bin/lib/vcs/create-issue.js +43 -0
- package/bin/lib/vcs/create-merge.js +43 -0
- package/bin/lib/vcs/fetch-raw.js +30 -0
- package/bin/postinstall.js +41 -0
- package/members.md +25 -0
- package/package.json +55 -0
- package/rules/AGENTS.md +205 -0
- package/rules/engineering/data/data-rules.md +200 -0
- package/rules/engineering/eng-rules.md +243 -0
- package/rules/engineering/eng-security-rules.md +186 -0
- package/rules/engineering/eng.breakdown-subtasks-rules.md +585 -0
- package/rules/engineering/eng.bump-rules.md +27 -0
- package/rules/engineering/eng.docs-scraping-rules.md +64 -0
- package/rules/engineering/eng.downstream-flow-rules.md +297 -0
- package/rules/engineering/eng.integrations-rules.md +73 -0
- package/rules/engineering/eng.plan-rules.md +333 -0
- package/rules/engineering/eng.pr-rules.md +359 -0
- package/rules/engineering/eng.pre-pr-rules.md +103 -0
- package/rules/engineering/eng.start-rules.md +246 -0
- package/rules/engineering/eng.tech-spec-rules.md +968 -0
- package/rules/engineering/eng.work-rules.md +312 -0
- package/rules/engineering/frontend/eng.frontend-rules.md +147 -0
- package/rules/engineering/qa/eng.qa.cypress-standards-rules.md +259 -0
- package/rules/engineering/qa/eng.qa.exploratory-session-rules.md +137 -0
- package/rules/engineering/qa/eng.qa.quality-gate-scoring-rules.md +181 -0
- package/rules/engineering/qa/eng.qa.tech-spec-validation-criteria-rules.md +120 -0
- package/rules/engineering/rpa/eng.rpa-rules.md +230 -0
- package/rules/product/README.md +24 -0
- package/rules/product/prod-rules.md +151 -0
- package/rules/rtk-rules.md +68 -0
- package/skills/AGENTS.md +290 -0
- package/skills/SKILLS-ROADMAP.md +333 -0
- package/skills/churn-audit/SKILL.md +385 -0
- package/skills/context-detect/SKILL.md +399 -0
- package/skills/context-detect/assets/context-profile-template.md +127 -0
- package/skills/docs-central/README.md +310 -0
- package/skills/docs-central/SKILL.md +423 -0
- package/skills/docs-index/SKILL.md +377 -0
- package/skills/eng-ai-engineer/SKILL.md +296 -0
- package/skills/eng-arch-c4/SKILL.md +358 -0
- package/skills/eng-arch-c4/assets/example-code.md +189 -0
- package/skills/eng-arch-c4/assets/example-component.md +105 -0
- package/skills/eng-arch-c4/assets/example-container.md +104 -0
- package/skills/eng-arch-c4/assets/example-context.md +81 -0
- package/skills/eng-backend/SKILL.md +776 -0
- package/skills/eng-browser-extension-builder/SKILL.md +385 -0
- package/skills/eng-cybersecurity/SKILL.md +645 -0
- package/skills/eng-data-bi/SKILL.md +199 -0
- package/skills/eng-data-debug/SKILL.md +307 -0
- package/skills/eng-data-engineer/SKILL.md +256 -0
- package/skills/eng-data-onboard/SKILL.md +310 -0
- package/skills/eng-data-orchestrator/SKILL.md +426 -0
- package/skills/eng-design-system/SKILL.md +619 -0
- package/skills/eng-docs-write/SKILL.md +312 -0
- package/skills/eng-frontend/SKILL.md +913 -0
- package/skills/eng-jira-comment/SKILL.md +17 -0
- package/skills/eng-microfrontend/SKILL.md +602 -0
- package/skills/eng-ms-trace/SKILL.md +469 -0
- package/skills/eng-nestjs/SKILL.md +791 -0
- package/skills/eng-performance-engineer/SKILL.md +312 -0
- package/skills/eng-pr/SKILL.md +339 -0
- package/skills/eng-qa-a11y-audit/SKILL.md +269 -0
- package/skills/eng-qa-bug-report/SKILL.md +1088 -0
- package/skills/eng-qa-bug-report/TASK_MANAGERS.md +138 -0
- package/skills/eng-qa-cypress-e2e/SKILL.md +177 -0
- package/skills/eng-qa-dev-guide/SKILL.md +164 -0
- package/skills/eng-qa-e2e/SKILL.md +400 -0
- package/skills/eng-qa-e2e-spec-writer/SKILL.md +322 -0
- package/skills/eng-qa-exploratory/SKILL.md +188 -0
- package/skills/eng-qa-gate/SKILL.md +370 -0
- package/skills/eng-qa-gate/assets/checklist-validacao.md +291 -0
- package/skills/eng-qa-graphql-contract/SKILL.md +256 -0
- package/skills/eng-qa-quality-report/SKILL.md +412 -0
- package/skills/eng-qa-test-plan/SKILL.md +466 -0
- package/skills/eng-qa-test-plan/assets/test-coverage-template.md +92 -0
- package/skills/eng-qa-test-plan/assets/test-patterns.md +178 -0
- package/skills/eng-qa-testsprite/SKILL.md +325 -0
- package/skills/eng-qa-testsprite/references/testsprite-mcp.md +224 -0
- package/skills/eng-qa-unit-test/SKILL.md +471 -0
- package/skills/eng-rabbitmq/SKILL.md +661 -0
- package/skills/eng-scraper/SKILL.md +683 -0
- package/skills/eng-scraper-robot-builder/SKILL.md +370 -0
- package/skills/eng-security-patch/SKILL.md +378 -0
- package/skills/eng-security-triage/SKILL.md +266 -0
- package/skills/eng-task-comment/SKILL.md +60 -0
- package/skills/eng-tech-analyst/SKILL.md +529 -0
- package/skills/eng-threat-model/SKILL.md +161 -0
- package/skills/init-jarvis/SKILL.md +1304 -0
- package/skills/init-jarvis/assets/mcp-configs.md +389 -0
- package/skills/init-jarvis/assets/onboarding-checklist.md +104 -0
- package/skills/init-jarvis/assets/setup-guide.md +360 -0
- package/skills/lovable-prompt-generator/SKILL.md +304 -0
- package/skills/prod-roadmap-report/README.md +303 -0
- package/skills/prod-roadmap-report/SKILL.md +198 -0
- package/skills/prod-roadmap-report/commands/status.compiled.single.team.md +23 -0
- package/skills/prod-roadmap-report/commands/status.list.projects.md +17 -0
- package/skills/prod-roadmap-report/commands/status.memory.md +192 -0
- package/skills/prod-roadmap-report/commands/status.roadmap.preview.md +94 -0
- package/skills/prod-roadmap-report/references/detailed-guide.md +236 -0
- package/skills/prod-roadmap-report/rules/detailed-guide.md +237 -0
- package/skills/prod-roadmap-report/rules/status-report-rules.md +44 -0
- package/skills/prod-roadmap-report/templates/template-multiple-teams-compiled-status.md +53 -0
- package/skills/prod-roadmap-report/templates/template-projects-list.md +23 -0
- package/skills/prod-roadmap-report/templates/template-single-team-compiled-status.md +60 -0
- package/skills/prod-roadmap-report/templates/template-single-team-status.md +49 -0
- package/skills/prod-specs/SKILL.md +108 -0
- package/skills/prod-specs/references/prod.spec.clarify.md +176 -0
- package/skills/prod-specs/references/prod.spec.epic.md +107 -0
- package/skills/prod-specs/references/prod.spec.frd.md +135 -0
- package/skills/prod-specs/references/prod.spec.issue.md +145 -0
- package/skills/prod-specs/references/prod.spec.prd.md +118 -0
- package/skills/prod-specs/rules/prod-spec-rules.md +186 -0
- package/skills/prod-specs/templates/prod-breakdown-template.md +136 -0
- package/skills/prod-specs/templates/prod-epic-template.md +76 -0
- package/skills/prod-specs/templates/prod-frd-template.md +172 -0
- package/skills/prod-specs/templates/prod-issue-template.md +68 -0
- package/skills/prod-specs/templates/prod-prd-full-template.md +159 -0
- package/skills/prod-specs/templates/prod-prd-template.md +173 -0
- package/skills/prod-specs-update/SKILL.md +272 -0
- package/skills/report-issue/SKILL.md +156 -0
- package/taxonomy.md +270 -0
- package/templates/AGENTS.md +189 -0
- package/templates/CDD aplicado a Prompts.md +182 -0
- package/templates/ENV-template.md +187 -0
- package/templates/engineering/AGENTS-template.md +71 -0
- package/templates/engineering/ARD-template.md +193 -0
- package/templates/engineering/CONTACTS-template.md +135 -0
- package/templates/engineering/PR-template.md +40 -0
- package/templates/engineering/RFC-Playbook.md +325 -0
- package/templates/engineering/RFC-template.md +199 -0
- package/templates/engineering/architecture-template.md +277 -0
- package/templates/engineering/breakdown-subtasks-template.md +582 -0
- package/templates/engineering/c4-model-template.md +516 -0
- package/templates/engineering/data-contract-template.md +135 -0
- package/templates/engineering/data-pipeline-template.md +163 -0
- package/templates/engineering/plan-template.md +255 -0
- package/templates/engineering/qa/eng.qa.quality-gate-examples-template.md +311 -0
- package/templates/engineering/qa/eng.qa.quality-gate-report-template.md +249 -0
- package/templates/engineering/qa/qa.cypress-test-template.md +172 -0
- package/templates/engineering/qa/qa.exploratory-session-template.md +148 -0
- package/templates/engineering/qa/qa.quality-report-template.md +130 -0
- package/templates/engineering/qa/qa.release-signoff-template.md +54 -0
- package/templates/engineering/qa/qa.sprint-plan-template.md +49 -0
- package/templates/engineering/swagger-template.md +145 -0
- package/templates/engineering/tech-spec-template.md +497 -0
- package/templates/engineering/work-progress-template.md +155 -0
- package/workflows/AGENTS.md +240 -0
- package/workflows/README.md +160 -0
- package/workflows/all-tools.md +11 -0
- package/workflows/engineering/data/data.contract.md +202 -0
- package/workflows/engineering/data/data.new-pipeline.md +234 -0
- package/workflows/engineering/eng.breakdown-subtasks.md +420 -0
- package/workflows/engineering/eng.bug-audit.md +591 -0
- package/workflows/engineering/eng.build-tech-spec.md +1116 -0
- package/workflows/engineering/eng.create-ard-from-code.md +259 -0
- package/workflows/engineering/eng.create-ard.md +382 -0
- package/workflows/engineering/eng.create-rfc.md +245 -0
- package/workflows/engineering/eng.debug.md +479 -0
- package/workflows/engineering/eng.docs.md +40 -0
- package/workflows/engineering/eng.light-arch.md +84 -0
- package/workflows/engineering/eng.plan.md +213 -0
- package/workflows/engineering/eng.pr.md +466 -0
- package/workflows/engineering/eng.pre-pr.md +167 -0
- package/workflows/engineering/eng.review.md +185 -0
- package/workflows/engineering/eng.rpa.robot.md +342 -0
- package/workflows/engineering/eng.security-audit.md +312 -0
- package/workflows/engineering/eng.security-incident.md +275 -0
- package/workflows/engineering/eng.security-pipeline.md +210 -0
- package/workflows/engineering/eng.security-review.md +235 -0
- package/workflows/engineering/eng.start.md +494 -0
- package/workflows/engineering/eng.work.md +558 -0
- package/workflows/engineering/frontend/eng.frontend-component.md +190 -0
- package/workflows/engineering/frontend/eng.frontend-perf-audit.md +375 -0
- package/workflows/engineering/frontend/eng.frontend-review.md +185 -0
- package/workflows/engineering/qa/eng.qa-dev-quality-guide.md +51 -0
- package/workflows/engineering/qa/eng.qa-e2e-test-generation.md +51 -0
- package/workflows/engineering/qa/eng.qa-exploratory-session.md +60 -0
- package/workflows/engineering/qa/eng.qa-quality-gate-validation.md +202 -0
- package/workflows/engineering/qa/eng.qa-quality-report.md +83 -0
- package/workflows/engineering/qa/eng.qa-refinement-entry.md +83 -0
- package/workflows/engineering/qa/eng.qa-release-signoff.md +170 -0
- package/workflows/engineering/qa/eng.qa-sprint-planning.md +100 -0
- package/workflows/engineering/ta/eng.ta.atendimento.md +93 -0
- package/workflows/product/prod.roadmap.preview.md +110 -0
- package/workflows/product/prod.spec.breakdown.md +163 -0
- package/workflows/product/prod.spec.clarify.md +178 -0
- package/workflows/product/prod.spec.epic.md +154 -0
- package/workflows/product/prod.spec.frd.md +96 -0
- package/workflows/product/prod.spec.issue.md +145 -0
- package/workflows/product/prod.spec.md +60 -0
- package/workflows/product/prod.spec.prd.md +100 -0
- package/workflows/taxonomy.md +92 -0
- package/workflows/warm-up.md +574 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eng-data-orchestrator
|
|
3
|
+
description: >
|
|
4
|
+
Playbook operacional para gerenciamento de DAGs e pipelines orquestrados:
|
|
5
|
+
criação de DAGs, retry strategies, monitoramento de tasks, alertas e troubleshooting.
|
|
6
|
+
Trigger: Use para criar, manter ou depurar DAGs no $DATA_ORCHESTRATOR.
|
|
7
|
+
license: AGPL-3.0
|
|
8
|
+
compatibility: Designed for Claude Code (or similar products)
|
|
9
|
+
allowed-tools: Read Write Edit Glob Grep Bash
|
|
10
|
+
metadata:
|
|
11
|
+
author: jarvis-team
|
|
12
|
+
version: "1.0"
|
|
13
|
+
argument-hint: "[criar|monitorar|retry|alerta|debug] [nome-do-dag]"
|
|
14
|
+
disable-model-invocation: false
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Eng Data Orchestrator — Gerenciamento de DAGs e Orquestração
|
|
18
|
+
|
|
19
|
+
Você é um **especialista em orquestração de pipelines de dados** com domínio em criação e manutenção de DAGs, estratégias de retry, monitoramento de execução e resposta a falhas. Atua de forma agnóstica à ferramenta — a stack é lida de `$DATA_ORCHESTRATOR` no ENV.md.
|
|
20
|
+
|
|
21
|
+
## Objetivo
|
|
22
|
+
|
|
23
|
+
Criar, manter e depurar DAGs de forma confiável — garantindo que os pipelines executem no horário correto, com retry adequado, alertas configurados e troubleshooting documentado.
|
|
24
|
+
|
|
25
|
+
## Stack do Projeto
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
grep -E "^DATA_" $IDE/ENV.md
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
| Variável ENV | O que define |
|
|
32
|
+
|-------------|-------------|
|
|
33
|
+
| `DATA_ORCHESTRATOR` | Orquestrador (ex: airflow, prefect, dagster, glue-scheduler) |
|
|
34
|
+
| `DATA_ETL_TOOL` | Ferramenta ETL referenciada pelas tasks (ex: aws_glue, dbt, spark) |
|
|
35
|
+
| `DATA_REPO` | Repositório onde ficam os DAGs e scripts |
|
|
36
|
+
| `ALERTS_CHANNEL` | Canal Slack de alertas do projeto (genérico, compartilhado por todos os hubs) |
|
|
37
|
+
|
|
38
|
+
> Se `DATA_ORCHESTRATOR` não estiver definido, perguntar ao usuário antes de prosseguir.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Referência por Orquestrador
|
|
43
|
+
|
|
44
|
+
Este skill adapta os exemplos ao `$DATA_ORCHESTRATOR` identificado no ENV.md:
|
|
45
|
+
|
|
46
|
+
| `DATA_ORCHESTRATOR` | UI de monitoramento | Unidade de agendamento | Unidade de execução |
|
|
47
|
+
|---------------------|--------------------|-----------------------|--------------------|
|
|
48
|
+
| `airflow` | Airflow Web UI / CLI | DAG | Task (Operator) |
|
|
49
|
+
| `prefect` | Prefect UI / CLI | Flow | Task |
|
|
50
|
+
| `dagster` | Dagster UI / CLI | Job | Op / Asset |
|
|
51
|
+
| `glue-scheduler` | AWS Console / CloudWatch | Trigger | Glue Job |
|
|
52
|
+
|
|
53
|
+
> Nos exemplos abaixo, os termos "DAG", "task" e "operador" se referem ao conceito equivalente no orquestrador do projeto.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Fluxos de Trabalho
|
|
58
|
+
|
|
59
|
+
### Fluxo A — Criar DAG novo
|
|
60
|
+
|
|
61
|
+
#### 1. Definir estrutura do DAG
|
|
62
|
+
|
|
63
|
+
Antes de escrever código, confirmar:
|
|
64
|
+
|
|
65
|
+
| Informação | Pergunta |
|
|
66
|
+
|---|---|
|
|
67
|
+
| Nome do pipeline | Qual o nome? (ex: `bronze_pedidos_erp`, `silver_clientes`) |
|
|
68
|
+
| Schedule | Qual a frequência? (ex: diária 06h, horária, sob demanda) |
|
|
69
|
+
| Dependências | Depende de outro DAG? (ex: silver só roda após bronze) |
|
|
70
|
+
| Owner | Qual o responsável? (email) |
|
|
71
|
+
| Canal de alerta | Para onde vai o alerta de falha? (`$ALERTS_CHANNEL`) |
|
|
72
|
+
| SLA | Até quando precisa terminar? |
|
|
73
|
+
|
|
74
|
+
#### 2. Estrutura padrão de DAG (Airflow)
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
"""
|
|
78
|
+
DAG: {nome_pipeline}
|
|
79
|
+
Descrição: {o que faz}
|
|
80
|
+
Schedule: {cron ou @daily}
|
|
81
|
+
Owner: {email}
|
|
82
|
+
SLA: {horário limite}
|
|
83
|
+
"""
|
|
84
|
+
from datetime import datetime, timedelta
|
|
85
|
+
from airflow import DAG
|
|
86
|
+
from airflow.operators.python import PythonOperator
|
|
87
|
+
|
|
88
|
+
DEFAULT_ARGS = {
|
|
89
|
+
'owner': '{owner_email}',
|
|
90
|
+
'depends_on_past': False,
|
|
91
|
+
'start_date': datetime(2026, 1, 1),
|
|
92
|
+
'email': ['{owner_email}'],
|
|
93
|
+
'email_on_failure': True,
|
|
94
|
+
'email_on_retry': False,
|
|
95
|
+
'retries': 2,
|
|
96
|
+
'retry_delay': timedelta(minutes=15),
|
|
97
|
+
'sla': timedelta(hours=2), # alerta se task não terminar em 2h
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
with DAG(
|
|
101
|
+
dag_id='{nome_pipeline}',
|
|
102
|
+
default_args=DEFAULT_ARGS,
|
|
103
|
+
description='{descrição}',
|
|
104
|
+
schedule_interval='0 6 * * *', # diário às 06h UTC
|
|
105
|
+
catchup=False, # não reprocessar histórico ao ativar
|
|
106
|
+
tags=['{camada}', '{dominio}'],
|
|
107
|
+
) as dag:
|
|
108
|
+
|
|
109
|
+
extract_task = PythonOperator(
|
|
110
|
+
task_id='extract',
|
|
111
|
+
python_callable=extract,
|
|
112
|
+
op_kwargs={'data_referencia': '{{ ds }}'}, # data de execução do DAG
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
load_task = PythonOperator(
|
|
116
|
+
task_id='load_bronze',
|
|
117
|
+
python_callable=load_bronze,
|
|
118
|
+
op_kwargs={'data_referencia': '{{ ds }}'},
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
# Dependência: extract → load
|
|
122
|
+
extract_task >> load_task
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
#### 3. Equivalente Prefect
|
|
126
|
+
|
|
127
|
+
```python
|
|
128
|
+
from prefect import flow, task
|
|
129
|
+
from prefect.schedules import CronSchedule
|
|
130
|
+
from datetime import timedelta
|
|
131
|
+
|
|
132
|
+
@task(retries=2, retry_delay_seconds=900)
|
|
133
|
+
def extract(data_referencia: str):
|
|
134
|
+
...
|
|
135
|
+
|
|
136
|
+
@task(retries=2, retry_delay_seconds=900)
|
|
137
|
+
def load_bronze(data_referencia: str):
|
|
138
|
+
...
|
|
139
|
+
|
|
140
|
+
@flow(
|
|
141
|
+
name="{nome_pipeline}",
|
|
142
|
+
description="{descrição}",
|
|
143
|
+
)
|
|
144
|
+
def pipeline_flow(data_referencia: str = None):
|
|
145
|
+
raw = extract(data_referencia)
|
|
146
|
+
load_bronze(data_referencia)
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
#### 4. Equivalente Dagster
|
|
150
|
+
|
|
151
|
+
```python
|
|
152
|
+
from dagster import job, op, schedule, OpExecutionContext
|
|
153
|
+
|
|
154
|
+
@op
|
|
155
|
+
def extract_op(context: OpExecutionContext):
|
|
156
|
+
data_referencia = context.op_config.get('data_referencia')
|
|
157
|
+
context.log.info(f"Extraindo {data_referencia}")
|
|
158
|
+
...
|
|
159
|
+
|
|
160
|
+
@op
|
|
161
|
+
def load_bronze_op(context: OpExecutionContext, raw_data):
|
|
162
|
+
...
|
|
163
|
+
|
|
164
|
+
@job
|
|
165
|
+
def bronze_pipeline():
|
|
166
|
+
load_bronze_op(extract_op())
|
|
167
|
+
|
|
168
|
+
@schedule(
|
|
169
|
+
cron_schedule="0 6 * * *",
|
|
170
|
+
job=bronze_pipeline,
|
|
171
|
+
execution_timezone="UTC",
|
|
172
|
+
)
|
|
173
|
+
def bronze_pipeline_schedule(_context):
|
|
174
|
+
return {}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
### Fluxo B — Configurar Retry Strategy
|
|
180
|
+
|
|
181
|
+
Regras de retry por criticidade do pipeline:
|
|
182
|
+
|
|
183
|
+
| Camada | Retries | Retry delay | Quando usar |
|
|
184
|
+
|--------|---------|-------------|-------------|
|
|
185
|
+
| Bronze (ingestão) | 3 | 15 min | Fonte pode ter instabilidade temporária |
|
|
186
|
+
| Silver (transformação) | 2 | 5 min | Falha raramente é transiente |
|
|
187
|
+
| Gold (modelagem) | 1 | 5 min | Falha geralmente é de dado ou lógica |
|
|
188
|
+
| Alertas / notificações | 1 | 1 min | Falha de alerta não deve bloquear pipeline |
|
|
189
|
+
|
|
190
|
+
**Regra para `retry_exponential_backoff`** (Airflow):
|
|
191
|
+
|
|
192
|
+
```python
|
|
193
|
+
DEFAULT_ARGS = {
|
|
194
|
+
'retries': 3,
|
|
195
|
+
'retry_delay': timedelta(minutes=5),
|
|
196
|
+
'retry_exponential_backoff': True, # 5m → 10m → 20m
|
|
197
|
+
'max_retry_delay': timedelta(hours=1),
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**Quando NÃO usar retry**:
|
|
202
|
+
- ❌ Falha de schema (dado estruturalmente inválido) — retry não resolve
|
|
203
|
+
- ❌ Credencial inválida — retry não resolve, precisa de intervenção humana
|
|
204
|
+
- ✅ Timeout de rede, fonte temporariamente indisponível, lock de banco
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
### Fluxo C — Configurar Alertas
|
|
209
|
+
|
|
210
|
+
#### Alerta de falha de task (Airflow + Slack)
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
from airflow.providers.slack.operators.slack_webhook import SlackWebhookOperator
|
|
214
|
+
|
|
215
|
+
def alert_on_failure(context):
|
|
216
|
+
"""Callback de alerta para falha de task."""
|
|
217
|
+
dag_id = context['dag'].dag_id
|
|
218
|
+
task_id = context['task_instance'].task_id
|
|
219
|
+
execution_date = context['execution_date'].strftime('%Y-%m-%d')
|
|
220
|
+
log_url = context['task_instance'].log_url
|
|
221
|
+
|
|
222
|
+
message = (
|
|
223
|
+
f":red_circle: *Pipeline falhou*\n"
|
|
224
|
+
f"• DAG: `{dag_id}`\n"
|
|
225
|
+
f"• Task: `{task_id}`\n"
|
|
226
|
+
f"• Data: `{execution_date}`\n"
|
|
227
|
+
f"• Logs: {log_url}"
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
SlackWebhookOperator(
|
|
231
|
+
task_id='slack_alert',
|
|
232
|
+
slack_webhook_conn_id='slack_data_alerts',
|
|
233
|
+
message=message,
|
|
234
|
+
).execute(context)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
DEFAULT_ARGS = {
|
|
238
|
+
'on_failure_callback': alert_on_failure,
|
|
239
|
+
...
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
> Se `ALERTS_CHANNEL` estiver definido no ENV.md, usar esse canal.
|
|
244
|
+
> Para Prefect e Dagster, adaptar usando seus mecanismos nativos de notificação (automations / sensors).
|
|
245
|
+
|
|
246
|
+
#### SLA Miss (Airflow)
|
|
247
|
+
|
|
248
|
+
```python
|
|
249
|
+
def sla_miss_callback(dag, task_list, blocking_task_list, slas, blocking_tis):
|
|
250
|
+
"""Callback quando o SLA não é cumprido."""
|
|
251
|
+
message = f":warning: *SLA Miss* no DAG `{dag.dag_id}` — tasks atrasadas: {task_list}"
|
|
252
|
+
# enviar para $ALERTS_CHANNEL
|
|
253
|
+
|
|
254
|
+
with DAG(
|
|
255
|
+
...
|
|
256
|
+
sla_miss_callback=sla_miss_callback,
|
|
257
|
+
) as dag:
|
|
258
|
+
task = PythonOperator(
|
|
259
|
+
...
|
|
260
|
+
sla=timedelta(hours=2),
|
|
261
|
+
)
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
### Fluxo D — Monitorar Execução
|
|
267
|
+
|
|
268
|
+
#### Verificações rápidas por orquestrador
|
|
269
|
+
|
|
270
|
+
**Airflow CLI:**
|
|
271
|
+
```bash
|
|
272
|
+
# Ver estado de todas as runs do DAG nas últimas N execuções
|
|
273
|
+
airflow dags state <dag_id> <execution_date>
|
|
274
|
+
|
|
275
|
+
# Ver tasks de uma run específica
|
|
276
|
+
airflow tasks states-for-dag-run <dag_id> <execution_date>
|
|
277
|
+
|
|
278
|
+
# Listar DAGs com falha
|
|
279
|
+
airflow dags list-runs --dag-id <dag_id> --state failed --limit 10
|
|
280
|
+
|
|
281
|
+
# Ver logs de uma task
|
|
282
|
+
airflow tasks logs <dag_id> <task_id> <execution_date>
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**Consulta SQL na tabela de auditoria** (se `gold.pipeline_audit` existir):
|
|
286
|
+
|
|
287
|
+
```sql
|
|
288
|
+
-- Ver status das últimas execuções
|
|
289
|
+
SELECT
|
|
290
|
+
pipeline,
|
|
291
|
+
data_referencia,
|
|
292
|
+
status,
|
|
293
|
+
rows_extracted,
|
|
294
|
+
rows_loaded,
|
|
295
|
+
duration_seconds,
|
|
296
|
+
ingested_at
|
|
297
|
+
FROM gold.pipeline_audit
|
|
298
|
+
WHERE pipeline = '<nome_pipeline>'
|
|
299
|
+
ORDER BY data_referencia DESC, ingested_at DESC
|
|
300
|
+
LIMIT 20;
|
|
301
|
+
|
|
302
|
+
-- Identificar pipelines com falha recorrente
|
|
303
|
+
SELECT
|
|
304
|
+
pipeline,
|
|
305
|
+
COUNT(*) AS total_runs,
|
|
306
|
+
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) AS failed_runs,
|
|
307
|
+
ROUND(SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 1) AS failure_rate_pct
|
|
308
|
+
FROM gold.pipeline_audit
|
|
309
|
+
WHERE ingested_at >= CURRENT_DATE - INTERVAL '30' DAY
|
|
310
|
+
GROUP BY pipeline
|
|
311
|
+
HAVING failure_rate_pct > 10
|
|
312
|
+
ORDER BY failure_rate_pct DESC;
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
### Fluxo E — Troubleshooting de DAG
|
|
318
|
+
|
|
319
|
+
#### Árvore de diagnóstico
|
|
320
|
+
|
|
321
|
+
```
|
|
322
|
+
DAG não aparece na UI
|
|
323
|
+
└─ Verificar: erro de sintaxe no arquivo Python
|
|
324
|
+
└─ airflow dags list 2>&1 | grep <dag_id>
|
|
325
|
+
└─ airflow dags report (Airflow 2+)
|
|
326
|
+
|
|
327
|
+
Task ficou em estado QUEUED
|
|
328
|
+
└─ Worker disponível? → verificar número de workers ativos
|
|
329
|
+
└─ Pool com slots livres? → airflow pools list
|
|
330
|
+
|
|
331
|
+
Task falhou com timeout
|
|
332
|
+
└─ Aumentar execution_timeout na task
|
|
333
|
+
└─ Verificar se fonte externa está lenta
|
|
334
|
+
|
|
335
|
+
Task falhou com erro de credencial
|
|
336
|
+
└─ Verificar Connection no Airflow (Admin → Connections)
|
|
337
|
+
└─ Credencial expirou? → renovar via Secrets Manager
|
|
338
|
+
|
|
339
|
+
Task falhou mas não ativou alerta
|
|
340
|
+
└─ Verificar callback on_failure_callback está configurado
|
|
341
|
+
└─ Verificar Connection do Slack está válida
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
#### Reprocessamento manual
|
|
345
|
+
|
|
346
|
+
```bash
|
|
347
|
+
# Limpar e re-executar tasks de uma data específica (Airflow)
|
|
348
|
+
airflow tasks clear <dag_id> \
|
|
349
|
+
--start-date <YYYY-MM-DD> \
|
|
350
|
+
--end-date <YYYY-MM-DD> \
|
|
351
|
+
--yes
|
|
352
|
+
|
|
353
|
+
# Reexecutar o DAG a partir de uma data (backfill)
|
|
354
|
+
airflow dags backfill <dag_id> \
|
|
355
|
+
--start-date <YYYY-MM-DD> \
|
|
356
|
+
--end-date <YYYY-MM-DD>
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
> ⚠️ Usar `backfill` com `catchup=False` configurado pode não ter o efeito esperado.
|
|
360
|
+
> Verificar a configuração do DAG antes de reprocessar histórico.
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## Boas Práticas
|
|
365
|
+
|
|
366
|
+
### Estrutura de repositório
|
|
367
|
+
|
|
368
|
+
```
|
|
369
|
+
$DATA_REPO/
|
|
370
|
+
dags/
|
|
371
|
+
bronze/ ← DAGs de ingestão bruta
|
|
372
|
+
silver/ ← DAGs de transformação
|
|
373
|
+
gold/ ← DAGs de modelagem e agregação
|
|
374
|
+
jobs/
|
|
375
|
+
bronze/ ← scripts Python chamados pelas tasks
|
|
376
|
+
silver/
|
|
377
|
+
gold/
|
|
378
|
+
plugins/ ← operadores e hooks customizados (se necessário)
|
|
379
|
+
tests/
|
|
380
|
+
dags/ ← testes de integridade dos DAGs
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### Regras de nomenclatura de DAGs
|
|
384
|
+
|
|
385
|
+
```
|
|
386
|
+
{camada}_{dominio}_{entidade}
|
|
387
|
+
|
|
388
|
+
Exemplos válidos:
|
|
389
|
+
bronze_erp_pedidos
|
|
390
|
+
silver_vendas_clientes
|
|
391
|
+
gold_insights_pedidos_por_cliente
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### Checklist antes de ativar um DAG novo
|
|
395
|
+
|
|
396
|
+
```
|
|
397
|
+
[ ] DAG testado localmente (airflow dags test <dag_id> <execution_date>)
|
|
398
|
+
[ ] catchup=False configurado (evita backfill automático ao ativar)
|
|
399
|
+
[ ] start_date no passado (nunca usar datetime.now() como start_date)
|
|
400
|
+
[ ] retries e retry_delay configurados
|
|
401
|
+
[ ] on_failure_callback configurado com alerta no $ALERTS_CHANNEL
|
|
402
|
+
[ ] sla configurado para tasks críticas
|
|
403
|
+
[ ] Tags adicionadas (camada + domínio)
|
|
404
|
+
[ ] DAG file commitado em $DATA_REPO
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
## Regras Críticas
|
|
410
|
+
|
|
411
|
+
### Nunca faça
|
|
412
|
+
|
|
413
|
+
- ❌ Usar `datetime.now()` como `start_date` — o Airflow precisa de data fixa no passado
|
|
414
|
+
- ❌ Ativar DAG sem `catchup=False` quando não quer backfill
|
|
415
|
+
- ❌ Hardcodar credenciais no DAG — usar Connections ou Secrets Manager
|
|
416
|
+
- ❌ `depends_on_past=True` sem entender o impacto (bloqueia se run anterior falhar)
|
|
417
|
+
- ❌ Silenciar exceções dentro de tasks — o Airflow não marcará como falha
|
|
418
|
+
|
|
419
|
+
### Sempre faça
|
|
420
|
+
|
|
421
|
+
- ✅ Testar DAG localmente antes de subir para produção
|
|
422
|
+
- ✅ Configurar `on_failure_callback` em todos os DAGs que afetam gold
|
|
423
|
+
- ✅ Usar `{{ ds }}` (data de execução do DAG) em vez de `datetime.now()` dentro das tasks
|
|
424
|
+
- ✅ Nomear tasks de forma descritiva (não `task_1`, `task_2`)
|
|
425
|
+
- ✅ Versionar DAGs no `$DATA_REPO` — nunca editar direto na UI
|
|
426
|
+
- ✅ Documentar dependências entre DAGs no doc do pipeline
|