Lib for integration with DTA services
Project description
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 serproduction.
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 VPCna 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 ouNonecaso 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_rolesa partir deDTA_*
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file totvs_dta_utils-1.5.1.tar.gz.
File metadata
- Download URL: totvs_dta_utils-1.5.1.tar.gz
- Upload date:
- Size: 39.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd18157b9e1f61a075c9f8bd8d62846c588b647913b1f9d5f6aa56db826e0c29
|
|
| MD5 |
373842589cc64b7896f298b8687f297f
|
|
| BLAKE2b-256 |
024cdb1900dd7ae09b401d0f775fbd9a5f118594d0bac9131ebe3a760049ea5b
|
File details
Details for the file totvs_dta_utils-1.5.1-py3-none-any.whl.
File metadata
- Download URL: totvs_dta_utils-1.5.1-py3-none-any.whl
- Upload date:
- Size: 52.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e5ad7cbf5e1745b8cf42e8939277fb7cf13ca2ea7ac909fd8b497ee88a1bc87
|
|
| MD5 |
e375f76764cb463ac8a979b3b452b8b5
|
|
| BLAKE2b-256 |
8355b4d54752864ebc080ffcc8902011e8b38b0dbac0d0cae5935d9fc8d41a8e
|