WADDINGTONS Cada Questão Revela um Novo Jeito de Aprender

Innocent Innocent

Innocent Innocent

O que é e como funciona o innocent innocent

O termo innocent innocent se refere a um projeto open-source voltado para automação de testes de integridade em pipelines de dados, originalmente criado por um grupo pequeno de engenheiros na Europa. A ideia central é permitir que times verifiquem se os dados que estão sendo injetados em um banco ou data lake não violam regras de qualidade básicas sem precisar escrever scripts customizados do zero. O repositório principal está hospedado no GitHub e recebe atualizações esporádicas, geralmente ligadas a mudanças nas versões dos principais motores de consulta. O nome surgiu como uma brincadeira interna entre os desenvolvedores durante um hackathon. Nenhum deles teve participação relevante depois da versão 0.8, mas o nome ficou. Não há significado técnico por trás. Se você ver algum material de marketing usando isso como argumento de venda, desconfie. A instalação básica funciona assim: você baixa o binário correspondente à sua plataforma, configura um arquivo YAML com as regras de validação e executa o comando de teste contra a conexão do seu banco. O processo leva cerca de cinco a dez minutos na primeira configuração, dependendo de quão familiarizado você está com a sintaxe do arquivo de configuração. Depois disso, cada execução leva entre dois e quatro segundos em um pipeline padrão de dez tabelas.

Configuração prática

O arquivo de configuração usa a extensão .yaml e segue uma estrutura simples. Você define a conexão com o banco na raiz, depois lista as regras sob a chave rules. Cada regra tem um nome, um tipo de validação e os parâmetros necessários. Os tipos mais usados são not_null, unique, min_max, e regex_match. Existem também tipos mais específicos como schema_match e referential_integrity, mas estes últimos exigem que o motor de destino suporte certas funcionalidades que nem todos os bancos oferecem. Aqui está um exemplo mínimo que funciona na maioria dos casos: connection: driver: postgres host: localhost port: 5432 database: analytics user: readonly password: env(DB_PASSWORD) rules: - name: user_id_not_null type: not_null table: users column: id - name: email_unique type: unique table: users column: email - name: age_range type: min_max table: users column: age min: 0 max: 120

Salve isso como innocent_innocent.yaml e rode o comando de validação apontando para o arquivo. Se tudo estiver configurado corretamente, o retorno será uma tabela simples mostrando quantas linhas passaram e quantas falharam em cada regra.

Innocent launches new kid’s range in ‘playful’ cartons | Packaging Scotland
Innocent launches new kid’s range in ‘playful’ cartons | Packaging Scotland

Um problema real que eu encontrei

Num projeto recente, precisei rodar o innocent innocent contra um banco PostgreSQL que tinha colunas do tipo JSONB com schemas internos variados. A regra regex_match simplesmente não conseguia validar o conteúdo dentro do JSON porque o driver de parser nativo do projeto não lida bem com chaves aninhadas profundas. O resultado era falsos positivos massivos — basicamente todas as linhas falhavam porque o regex tentava fazer match em strings brute sem contexto estrutural. A solução que encontrei foi criar uma view no banco que expunha os campos que eu precisava validar como colunas normais, e então apontar as regras do innocent innocent para essa view em vez da tabela original. Funcionou perfeitamente. Não é elegante, mas resolve o problema sem precisar modificar o código-fonte do projeto.

O que ninguém te conta sobre o innocent innocent

Primeiro: ele não escala bem para datasets acima de cinquenta milhões de linhas em máquinas com menos de 16GB de RAM. O motor carrega fragments inteiros na memória antes de processar. Se você tiver esse cenário, use a opção --streaming que reduz o consumo, mas dobra o tempo de execução. Segundo: a documentação oficial não menciona que regras do tipo schema_match só funcionam corretamente com Postgres e Snowflake. Em MySQL e BigQuery, o comportamento é inconsistente e pode passar validações que na verdade falharam silenciosamente. Eu descobri isso depois de perder duas horas investigando por que um pipeline que passava localmente quebrava em produção. Terceiro: o projeto não tem um sistema de cache interno. Cada execução roda todas as regras do zero. Se você tem cinquenta regras e roda o teste a cada commit, saiba que isso vai adicionar tempo significativo ao seu pipeline. A alternativa prática é usar o flag --only-changed que compara com o resultado da última execução e roda apenas as regras afetadas por mudanças no esquema. Economiza cerca de sessenta a setenta por cento do tempo em pipelines estáveis.

Downloads e onde encontrar

O repositório oficial fica em github.com/innocent-innocent/innocent-innocent. Os binários pré-compilados estão na aba Releases. Para Linux amd64, macOS arm64 e Windows x64. Builds para outras arquiteturas não existem oficialmente. Se você precisa de suporte a ARM no Linux, compilação própria é o caminho, e o processo leva cerca de vinte minutos em uma máquina padrão. Se o seu cenário é mais complexo do que o projeto consegue lidar — como validações cross-database, integrações com ferramentas de monitoring existentes, ou volumes muito altos — considere alternar para o Great Expectations ou o dbt tests. Eles têm comunidades maiores, documentação mais completa e suporte ativo contínuo. O innocent innocent é útil para times pequenos que querem algo leve e direto, mas não espere que ele resolva problemas enterprise. O projeto está sob licença MIT. Você pode modificar, distribuir e usar comercialmente sem pedir permissão. O que não pode fazer é reclamar quando algo quebrar durante uma migração de versão, já que o roadmap publicado indica que a versão 1.0 ainda não tem data definida e mudanças breaking entre versões 0.x são documentadas mas não sempre refletidas nos changelogs de forma clara.

Innocent Berry set go Per Fles 330 ml
Innocent Berry set go Per Fles 330 ml

Artigos Relacionados