Skip to main content

Dta Utils 🧰 🛠️

Agilize a integração entre serviços DTA

O que são Serviços DTA?

Uma coleção de serviços para facilitar e acelerar o desenvolvimento e monitoramento de Aplicações, com foco em aplicativos de IA generativa.

Introdução

Esse pacote possui módulos extras que auxiliam o desenvolvimento de integrações com os serviços do DTA.

Extra "Cloud Tasks"

Abstração para criação de HTTP tasks no Google Cloud Tasks, centralizando a comunicação e evitando acoplamento direto à lib google-cloud-tasks nas aplicações consumidoras.

Instalação

pip install "totvs-dta-utils[cloud_tasks]"

Ou utilizando poetry:

poetry add "totvs-dta-utils[cloud_tasks]"

Utilização genérica

from dta_utils_python.cloud_tasks import CloudTasksClient, CloudTasksConfig, HttpTaskRequest

client = CloudTasksClient(
    CloudTasksConfig(
        project_id="my-project",
        location_id="us-central1",
        queue_id="my-queue",
    )
)

task_name = client.create_http_task(
    HttpTaskRequest(
        url="https://my-service/internal/some-job",
        payload={"key": "value"},
        task_name="my-deterministic-task",  # opcional — garante idempotência
    )
)

Retenção por tenant

from dta_utils_python.cloud_tasks import CloudTasksClient, CloudTasksConfig
from dta_utils_python.cloud_tasks.retention import create_retention_task_for_tenant

client = CloudTasksClient(
    CloudTasksConfig(
        project_id="my-project",
        location_id="us-central1",
        queue_id="retention-queue",
    )
)

# Idempotente: chamar duas vezes no mesmo dia/tenant não gera erro
task_name = create_retention_task_for_tenant(
    client=client,
    worker_url="https://my-service/internal/retention/process-tenant",
    tenant_schema="tenant-a",
    retention_days=180,
    batch_size=500,
)

O nome da task gerado segue o padrão retention-{YYYYMMDD}-{tenant_schema}, com caracteres especiais sanitizados.

Autenticação OIDC

Para endpoints protegidos, o Cloud Tasks pode gerar e anexar um OIDC token automaticamente na entrega da task. Basta informar o service account e, opcionalmente, o audience (padrão: a própria URL da task):

from dta_utils_python.cloud_tasks import CloudTasksClient, CloudTasksConfig, HttpTaskRequest, OidcConfig

client = CloudTasksClient(
    CloudTasksConfig(
        project_id="my-project",
        location_id="us-central1",
        queue_id="my-queue",
    )
)

task_name = client.create_http_task(
    HttpTaskRequest(
        url="https://my-service/internal/some-job",
        payload={"key": "value"},
        oidc_token=OidcConfig(
            service_account_email="my-sa@my-project.iam.gserviceaccount.com",
            # audience="https://my-service/internal/some-job",  # opcional
        ),
    )
)

Emulator local

Configure via variável de ambiente:

CLOUD_TASKS_EMULATOR_HOST=localhost:8123

Ou via configuração:

CloudTasksConfig(
    project_id="local-project",
    location_id="us-central1",
    queue_id="my-queue",
    emulator_host="localhost:8123",
)

Extra "Secrets"

Instalação

Instale o módulo secrets com:

pip install "totvs-dta-utils[secrets]"

Ou utilizando poetry:

poetry add "totvs-dta-utils[secrets]"

Configuração inicial:

Adicione as seguintes variaveis no .env do seu projeto:

DTA_ENVIRONMENT="development"
DTA_INTEGRATION_URL="{DTA_INTEGRATION_URL}"

NOTE: Para ambiente em cloud, onde terá acesso irrestrito aos secrets, o valor do DTA_ENVIRONMENTdeve ser production.

Utilização

from dta_utils_python import DtaSecrets

auth = DTA_JWT  # CLIENT AUTHORIZATION

secrets = DtaSecrets(authorization=auth,
                     project="dta-empodera")

all_secrets = secrets.all()  # Get the latest version of all secrets
my_secret = secrets.get("MY_SECRET")  # Get the latest version of a secret
my_secret_v2 = secrets.get("MY_SECRET", version=2)  # Get a specific version of a secret

Observação: Para ambiente em nuvem na rede DTA, nenhuma autenticação é necessária.

Observação 2: Ainda em ambientes de nuvem, usando Cloud Run, lembrar de habilitar TODAS as chamadas de saída do serviço DEVEM passar pela VPC. Selecione Route all traffic to the VPC na configuração de Rede do serviço Cloud Run

Demais configurações:

DtaSecrets(
    authorization=auth,
    project="dta-empodera",
    raise_exception: bool = True,  # Default "False" - Levanta exceção em caso de erro ao obter a secret
    autoload: bool = False,  # Default "True" - Pré-carrega todas as secrets do projeto na inicialização da classe e as mantém em cache de memória
)

Tipos de retorno:

  • .get("SECRET_2"): Retorna o valor da secret ou None caso a secret não exista.
any: "321654"
  • .all(): Retorna um dicionário (hashmap) contendo a última versão de todas as secrets
dict: {
    "SECRET_1": "123456",
    "SECRET_2": "321654",
    "SECRET_3": "My secret",
}

Extra "Auth" (Identity/JWT)

Desenvolvimento local (Identity)

Para viabilizar autorização via Identity em ambiente local (sem Redis/RAC), configure:

DTA_ENVIRONMENT="development"  # ou "local"
DTA_TENANT_NAME="dta-alisson"
DTA_TOTVS_TENANT_ID="1a2b3c-4d5e6f"
DTA_ROLE_USER="TENANT_ADMIN"
# Opcional: sobrescreve o endpoint JWKS usado para validar o JWT Identity
# DTA_IDENTITY_JWKS_BASE_URL="https://api-fluig.totvs.app/accounts/api/v1/jwks"

Com isso, get_identity_user_from_cache(...) passa a:

  • Validar o JWT Identity via JWKS (RS256)
  • Ignorar Redis (cache) para o token
  • Resolver dta_roles a partir de DTA_*

Extra "Healthcheck"

Componente reutilizável de health check para aplicações FastAPI. Expõe endpoints padronizados de liveness e readiness.

Instalação

pip install "totvs-dta-utils[healthcheck]"

Endpoints

Endpoint Método Descrição
/health/live GET Liveness — processo está rodando
/health/ready GET Readiness — dependências externas OK

Utilização

from fastapi import FastAPI
from dta_utils_python.healthcheck import create_health_router, DtaHealthCheck

app = FastAPI()

async def check_database() -> bool:
    # await db.execute("SELECT 1")
    return True

def check_redis() -> bool:
    # redis_client.ping()
    return True

app.include_router(
    create_health_router(
        readiness_checks=[
            DtaHealthCheck(name="database", check=check_database),
            DtaHealthCheck(name="redis", check=check_redis),
        ]
    )
)

Respostas

GET /health/live — sempre 200:

{"status": "ok"}

GET /health/ready — 200 se todos os checks passarem, 503 caso contrário:

{
  "status": "ok",
  "checks": {
    "database": "ok",
    "redis": "ok"
  }
}

Configurações opcionais

create_health_router(
    readiness_checks=[...],
    prefix="/api/health",   # default: "/health"
    live_path="/ping",      # default: "/live"
    ready_path="/status",   # default: "/ready"
)
DtaHealthCheck(
    name="database",
    check=check_database,
    timeout=5.0,  # segundos; default: 2.0
)

Checks sync e async são suportados. Exceções e timeouts são tratados como falha sem vazar detalhes na resposta.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

totvs_dta_utils-1.6.2.tar.gz (41.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

totvs_dta_utils-1.6.2-py3-none-any.whl (55.0 kB view details)

Uploaded Python 3

File details

Details for the file totvs_dta_utils-1.6.2.tar.gz.

File metadata

  • Download URL: totvs_dta_utils-1.6.2.tar.gz
  • Upload date:
  • Size: 41.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for totvs_dta_utils-1.6.2.tar.gz
Algorithm Hash digest
SHA256 0afe02080857e06119aaf1d482e956dc5350b43297c9cae0e22a6d7935aabc7a
MD5 cc532b6cc51387ee7173ea2099176fa6
BLAKE2b-256 9937d5fb9b466845de2c0a2f52012cf6f25fa58e06871b79fc5eea99bc351361

See more details on using hashes here.

File details

Details for the file totvs_dta_utils-1.6.2-py3-none-any.whl.

File metadata

File hashes

Hashes for totvs_dta_utils-1.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 d8a096249e2ef67927e27ac45bd1f70de98af83e1ea495a56bed14b6d5dab327
MD5 4ed62fec64ab4245b7b7163d84cebb60
BLAKE2b-256 96b1335a9eae12ec6fd6b70e1775f33c2142d164f3fde03c71af7227ee6b765e

See more details on using hashes here.

Release history Release notifications | RSS feed

1.6.3

2 files

This release

1.6.2 This release

2 files

1.6.1

2 files

1.6.0

2 files

1.5.1

2 files

1.5.0

2 files

1.4.30

2 files

1.4.28

1 file

1.4.27

1 file

1.4.26

1 file

1.4.25

1 file

1.4.24

1 file

1.4.23

1 file

1.4.22

1 file

1.4.21

1 file

1.4.20

1 file

1.4.19

1 file

1.4.18

1 file

1.4.17

1 file

1.4.16

1 file

1.4.15

1 file

1.4.14

1 file

1.4.13

1 file

1.4.12

1 file

1.4.11

1 file

1.4.10

1 file

1.4.9

1 file

1.4.8

1 file

1.4.7

1 file

1.4.5

1 file

1.4.4

1 file

1.4.3

1 file

1.4.2

1 file

1.4.1

1 file

1.4.0

1 file

1.3.5

1 file

1.3.4

1 file

1.3.3

1 file

1.3.2

1 file

1.3.1

1 file

1.3.0

1 file

1.2.0

1 file

1.1.4

1 file

1.1.3

1 file

1.1.2

1 file

1.1.1

1 file

1.1.0

1 file

1.0.13

1 file

1.0.12

1 file

1.0.11

1 file

1.0.0

1 file

0.1.6

1 file

0.1.5

1 file

0.1.4

1 file

0.1.3

1 file

0.1.2

1 file

0.1.1

1 file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page