5.12.0 — 2026-10-14¶
← 5.12.1 | 5.11.0 → | ↑ 5.x series
Added¶
Configs - OpenTelemetry¶
OTEL.INSTRUMENTATION_SKIP_DEP_CHECK- Libraries that are instrumented even when the installed version is newer than the range the instrumentor declares (default["sqlalchemy"]).opentelemetry-instrumentation-sqlalchemystill declaressqlalchemy<2.1.0, while ArchiPy requires SQLAlchemy 2.1, so SQLAlchemy produced no spans before.- ArchiPy logs one warning naming the mismatch when it applies the bypass
- Set the option to
[]to turn the bypass off, and remove a key once its instrumentor supports the version
Configs - Temporal¶
TEMPORAL.METRICS_PULL_PORT- Port of the Temporal SDK/metricsscrape endpoint (default8201). WithOTEL.METRICS_EXPORTER=pullthe SDK serves its own endpoint onOTEL.METRICS_PULL_HOSTand this port. The port must differ fromOTEL.METRICS_PULL_PORT.
Adapters - Email¶
email.sendspan -EmailAdapter.send_emailrecords a client span withserver.address,server.port,network.protocol.name,email.tls_mode,email.recipient_countandemail.attachment_count. Credentials, addresses, subject and body never reach a span. No OpenTelemetry instrumentor exists forsmtplib.
Changed¶
Adapters - MinIO¶
- Folders in non-recursive
list_objects- A non-recursive listing now also returns one entry per "folder" directly below the prefix (object_nameends with/,sizeis0). Every entry carriesis_prefix.- Callers that expect only objects should skip entries where
is_prefixis true
- Callers that expect only objects should skip entries where
Adapters - Temporal¶
- Pushgateway exporter - The Temporal SDK cannot push to a Pushgateway. With
OTEL.METRICS_EXPORTER=pushgatewayits metrics still go over OTLP toOTEL.OTLP_ENDPOINT, and a warning says so.
Helpers - Utils¶
- Instrumentor version conflicts are visible - An instrumentor that refuses an installed library version was logged at debug level, so the service ran without spans and without a message. It is now a warning that names the library and says no spans will be emitted. A library that is not installed at all is still skipped at debug level.
Fixed¶
Adapters - SQLAlchemy¶
- Sync engines are traced - The session manager bound
create_engineat import time, before OpenTelemetry replaced it, so sync engines never emitted query spans. It is now looked up when the engine is created.
Adapters - Kafka¶
- Producers and consumers are traced -
ProducerandConsumerwere bound at import time and bypassed the OpenTelemetry instrumentor. They are now looked up when the client is created, which also covers the async adapters.
Adapters - Redis¶
- Search with OpenTelemetry enabled -
opentelemetry-instrumentation-redisreads theFT.SEARCHreply as a list, but RESP3, the default, returns a dict, so it raisedKeyErrorinside the caller's search. The instrumentor helper is now guarded so an unreadable reply never reaches the application.
Adapters - Keycloak¶
- Denied UMA permissions - When every requested permission is denied, Keycloak answers 403
not_authorized.check_permissions_batchraisedInternalErrorfor it, sofastapi_authanswered 500. It now returns an empty set and the request is rejected withPERMISSION_DENIED.
Adapters - Temporal¶
- Tracing interceptor -
TracingInterceptorused the first global tracer provider, so spans were lost after OpenTelemetry was re-initialized. It now uses the tracer ArchiPy currently owns.
Tests¶
- Real containers for telemetry - New OpenTelemetry Collector and Pushgateway test containers replace in-memory
exporters, stub gateways and mocked Temporal clients in
otel.feature. - Adapter spans - Spans are verified through the collector for Redis (sync and async), Kafka (sync and async), MinIO, ScyllaDB (sync and async), Postgres, MySQL, SQLite and StarRocks (sync and async), Keycloak, Elasticsearch, Vault, Email and Temporal, plus Temporal worker and client metrics.
- No mocks for Keycloak and gRPC - The Keycloak utils, gRPC rate limit and
app_utilsscenarios run against the real Keycloak container, real gRPC servers and the Redis container. - MinIO - New scenarios cover
stat_object, listing by prefix, presigned PUT uploads, error mapping and caches. - HTTP clients - Test code uses
httpx2instead ofrequestsandurllib.
Chore¶
- Instrumentor compatibility check -
make check-instrumentor-compatand a weekly workflow resolve each instrumentor'sinstrumentsextra together with ArchiPy's own bound withuv. The workflow fails once upstream supports the required version, the signal to drop the bypass.