Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,35 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

---

## v26.10.06 (2026-10-14)

### Fixed

- Honor standard OpenTelemetry service identity for newly created trace and
metric providers ([#151](https://github.com/fireflyframework/fireflyframework-pyfly/issues/151)).
An explicit nonempty `pyfly.observability.tracing.service-name`, including
`PYFLY_OBSERVABILITY_TRACING_SERVICE_NAME`, retains priority; otherwise use
`OTEL_SERVICE_NAME`, then `service.name` from `OTEL_RESOURCE_ATTRIBUTES`,
then `pyfly.app.name`, then `pyfly-app`.
- Preserve other SDK resource attributes and use SDK parsing for resource
environment values, including URL encoding. Remove the implicit framework
service-name default that previously masked standard environment identity.

### Documentation

- Explain identity precedence and deliberate overrides in the observability
guide and both book editions; examples leave the service name unset so a
platform-injected `OTEL_SERVICE_NAME` is respected.
- Synchronize package, installer, site, and book download examples with
`v26.10.06` (normalized package version `26.10.6`).

### Compatibility

- Existing global and user-defined providers keep their resources. Identity is
configured at provider creation; restart the process to apply changes to
process-global providers. This release does not redeploy running workloads
or rewrite historical telemetry.

## v26.10.05 (2026-10-14)

### Changed
Expand Down
19 changes: 11 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<a href="https://github.com/fireflyframework"><img src="https://img.shields.io/badge/Firefly_Framework-official-ff6600?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0id2hpdGUiIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyeiIvPjwvc3ZnPg==" alt="Firefly Framework"></a>
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.12%2B-blue?logo=python&logoColor=white" alt="Python 3.12+"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-green" alt="License: Apache 2.0"></a>
<a href="CHANGELOG.md"><img src="https://img.shields.io/badge/version-26.10.05-brightgreen" alt="Version: 26.10.05"></a>
<a href="CHANGELOG.md"><img src="https://img.shields.io/badge/version-26.10.06-brightgreen" alt="Version: 26.10.06"></a>
<a href="https://mypy-lang.org/"><img src="https://img.shields.io/badge/type--checked-mypy%20strict-blue?logo=python&logoColor=white" alt="Type Checked: mypy strict"></a>
<a href="https://docs.astral.sh/ruff/"><img src="https://img.shields.io/badge/code%20style-ruff-purple?logo=ruff&logoColor=white" alt="Code Style: Ruff"></a>
<a href="#philosophy"><img src="https://img.shields.io/badge/async-first-brightgreen" alt="Async First"></a>
Expand Down Expand Up @@ -61,7 +61,7 @@

It covers the whole stack: dependency injection, configuration & profiles, the web layer, the Spring-Data `Repository` (derived queries, pagination, specifications, projections), DDD aggregates & `Money`, CQRS, domain events & event sourcing, messaging, HTTP clients, sagas, caching & resilience, security, observability, testing, scheduling, and going to production. Spring developers get a **Spring parity** callout at every turn.

**📥 Download the books shipped with v26.10.05:** **[English PDF](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.05/pyfly-by-example.pdf)** · **[English EPUB](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.05/pyfly-by-example.epub)** · **[Spanish PDF](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.05/pyfly-by-example-es.pdf)** · **[Spanish EPUB](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.05/pyfly-by-example-es.epub)**. For a specific version, use its [tagged release](https://github.com/fireflyframework/fireflyframework-pyfly/releases), or build from source with `bash book/build/run.sh --out-dir book/release-output`. Run the companion sample with `cd samples/lumen && uv run --extra dev pytest` and `uv run pyfly run --server uvicorn`.
**📥 Download the books shipped with v26.10.06:** **[English PDF](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.06/pyfly-by-example.pdf)** · **[English EPUB](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.06/pyfly-by-example.epub)** · **[Spanish PDF](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.06/pyfly-by-example-es.pdf)** · **[Spanish EPUB](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.06/pyfly-by-example-es.epub)**. For a specific version, use its [tagged release](https://github.com/fireflyframework/fireflyframework-pyfly/releases), or build from source with `bash book/build/run.sh --out-dir book/release-output`. Run the companion sample with `cd samples/lumen && uv run --extra dev pytest` and `uv run pyfly run --server uvicorn`.

---

Expand Down Expand Up @@ -850,21 +850,23 @@ See **[`samples/lumen/`](samples/lumen/README.md)** for an end-to-end DDD micros

> **Note:** PyFly is distributed exclusively via [GitHub Releases](https://github.com/fireflyframework/fireflyframework-pyfly/releases). It is **not** published to PyPI.

**Upgrading to v26.10.05:** see the [dependency update notes](docs/dependency-updates.md),
including the temporary upstream source requirement and required pip upgrade
step for the optional PII extra.
**Upgrading to v26.10.06:** see [OpenTelemetry service identity](docs/modules/observability.md#service-identity-and-resource-attributes)
for standard environment-variable support in traces and metrics. The
[dependency update notes](docs/dependency-updates.md) still apply, including the
temporary upstream source requirement and required pip upgrade step for the
optional PII extra.

### Install from GitHub Release (Recommended)

```bash
# Install the latest release (uv)
uv add "pyfly @ https://github.com/fireflyframework/fireflyframework-pyfly/releases/latest/download/pyfly-26.10.5-py3-none-any.whl"
uv add "pyfly @ https://github.com/fireflyframework/fireflyframework-pyfly/releases/latest/download/pyfly-26.10.6-py3-none-any.whl"

# Install with specific extras
uv add "pyfly[web,data-relational,cache] @ https://github.com/fireflyframework/fireflyframework-pyfly/releases/latest/download/pyfly-26.10.5-py3-none-any.whl"
uv add "pyfly[web,data-relational,cache] @ https://github.com/fireflyframework/fireflyframework-pyfly/releases/latest/download/pyfly-26.10.6-py3-none-any.whl"

# Or with pip
pip install "pyfly @ https://github.com/fireflyframework/fireflyframework-pyfly/releases/latest/download/pyfly-26.10.5-py3-none-any.whl"
pip install "pyfly @ https://github.com/fireflyframework/fireflyframework-pyfly/releases/latest/download/pyfly-26.10.6-py3-none-any.whl"
```

### One-Line Install (CLI + Framework)
Expand Down Expand Up @@ -1194,6 +1196,7 @@ The git tag and human-readable display use the leading-zero form (`v26.05.01`);

The full release history lives in **[CHANGELOG.md](CHANGELOG.md)** ([Keep a Changelog](https://keepachangelog.com/) format). Recent highlights:

- **`v26.10.06`** (2026-10-14) — OpenTelemetry service identity for newly created trace and metric providers honors standard resource environment variables while preserving explicit PyFly overrides.
- **`v26.10.05`** (2026-10-14) — refreshed dependencies and pinned Python setup workflows, with synchronized release metadata and English/Spanish book downloads.
- **`v26.10.04`** (2026-10-14) — revised public OAuth references and rebuilt English/Spanish PDF/EPUB books, with synchronized package and installer metadata.
- **`v26.10.03`** (2026-10-14) — authorization-code/PKCE redemption through the native HTTP endpoint, with form-encoded OAuth Basic credentials across acquisition and introspection.
Expand Down
6 changes: 3 additions & 3 deletions book/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ wallet offer route, shared targeting fixture, runtime gates and operator workflo

| Edition | PDF | EPUB |
|---|---|---|
| English | [PDF](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.05/pyfly-by-example.pdf) | [EPUB](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.05/pyfly-by-example.epub) |
| Spanish | [PDF](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.05/pyfly-by-example-es.pdf) | [EPUB](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.05/pyfly-by-example-es.epub) |
| English | [PDF](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.06/pyfly-by-example.pdf) | [EPUB](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.06/pyfly-by-example.epub) |
| Spanish | [PDF](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.06/pyfly-by-example-es.pdf) | [EPUB](https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.06/pyfly-by-example-es.epub) |

These books are rebuilt from the `v26.10.05` software tag. The independently
These books are rebuilt from the `v26.10.06` software tag. The independently
published [2026-10-14 edition](https://github.com/fireflyframework/fireflyframework-pyfly/releases/tag/books-26.10.14)
retains its original assets. For other editions, open the
[tagged releases](https://github.com/fireflyframework/fireflyframework-pyfly/releases)
Expand Down
33 changes: 30 additions & 3 deletions book/manuscript-es/15-observability.md
Original file line number Diff line number Diff line change
Expand Up @@ -192,11 +192,11 @@ Esa pasada de redacción se ejecuta para *cada* logger del proceso, incluidos lo
El motor de expresiones regulares viene con cada instalación. El motor NER respaldado por Presidio —que además atrapa nombres y direcciones en texto libre— está disponible mediante el extra `[pii]` y se activa automáticamente cuando se instala:

```bash
uv add "pyfly[observability,pii] @ https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.05/pyfly-26.10.5-py3-none-any.whl"
uv add "pyfly[observability,pii] @ https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.06/pyfly-26.10.6-py3-none-any.whl"
uv run python -m spacy download en_core_web_sm
```

En v26.10.05, el extra PII requiere Git y acceso a GitHub: fija una corrección
En v26.10.06, el extra PII requiere Git y acceso a GitHub: fija una corrección
oficial del código fuente de Presidio para poder instalar cryptography 50.
Ese código conserva el mismo número de versión que el paquete anterior de PyPI.
Las instalaciones existentes con pip deben reinstalar explícitamente el
Expand Down Expand Up @@ -687,12 +687,39 @@ pyfly:
observability:
tracing:
enabled: true
service-name: "${pyfly.app.name}"
exporter: otlp
otlp:
endpoint: "http://localhost:4318"
```

Deja `tracing.service-name` sin definir para respetar la identidad que inyecta
la plataforma. Al crear proveedores de trazas y métricas, PyFly resuelve
`service.name` primero desde un `pyfly.observability.tracing.service-name` no
vacío (incluido `PYFLY_OBSERVABILITY_TRACING_SERVICE_NAME`), después desde
`OTEL_SERVICE_NAME`, después desde `service.name` en
`OTEL_RESOURCE_ATTRIBUTES`, después desde `pyfly.app.name` y, por último,
desde `pyfly-app`.

```bash
export OTEL_SERVICE_NAME=lumen-api
export OTEL_RESOURCE_ATTRIBUTES='service.namespace=lumen,release.note=blue%2Cgreen'
```

El SDK decodifica los valores de los atributos (`blue%2Cgreen` pasa a ser
`blue,green`) y PyFly conserva los demás atributos del recurso. Para sustituir
deliberadamente la identidad del despliegue, define
`tracing.service-name: lumen-custom` dentro de `pyfly.observability`, o usa
`PYFLY_OBSERVABILITY_TRACING_SERVICE_NAME`. Definir explícitamente
`service-name: "${pyfly.app.name}"` también tiene prioridad sobre el entorno
OpenTelemetry; no hace falta para usar el nombre de la aplicación como respaldo.

La identidad se configura al crear el proveedor. Reinicia el proceso para
cambiar los recursos globales; los proveedores globales existentes y los
personalizados se reutilizan sin cambiar sus nombres. Esta versión no
redespliega aplicaciones en ejecución ni reescribe la telemetría histórica.
Consulta la [guía de identidad del servicio](https://fireflyframework.github.io/fireflyframework-pyfly/docs/modules/observability/#service-identity-and-resource-attributes)
para conocer el contrato completo de propiedad de los proveedores.

**Ejecútalo — observa spans sin un colector.** Levantar Jaeger o Tempo es
excesivo mientras estás aprendiendo. Configura en su lugar el **exportador de
consola**, que imprime cada span por stdout. Lumen viene con
Expand Down
30 changes: 27 additions & 3 deletions book/manuscript/15-observability.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,11 +188,11 @@ That redaction pass runs for *every* logger in the process, including ones insid
The regex engine ships with every install. The Presidio-backed NER engine — which also catches free-text names and addresses — is available via the `[pii]` extra and activates automatically when installed:

```bash
uv add "pyfly[observability,pii] @ https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.05/pyfly-26.10.5-py3-none-any.whl"
uv add "pyfly[observability,pii] @ https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.06/pyfly-26.10.6-py3-none-any.whl"
uv run python -m spacy download en_core_web_sm
```

For v26.10.05, the optional PII extra requires Git and GitHub access: it pins
For v26.10.06, the optional PII extra requires Git and GitHub access: it pins
an official Presidio source fix so cryptography 50 can be installed. The source
still reports the same Presidio version as its older PyPI package. Existing pip
installations must explicitly reinstall the pinned anonymizer before upgrading;
Expand Down Expand Up @@ -743,12 +743,36 @@ pyfly:
observability:
tracing:
enabled: true
service-name: "${pyfly.app.name}"
exporter: otlp
otlp:
endpoint: "http://localhost:4318"
```

Leave `tracing.service-name` unset to honor an identity injected by the platform.
For newly created trace and metric providers, PyFly resolves `service.name` from
a nonempty `pyfly.observability.tracing.service-name` (including
`PYFLY_OBSERVABILITY_TRACING_SERVICE_NAME`) first, then `OTEL_SERVICE_NAME`,
then `service.name` in `OTEL_RESOURCE_ATTRIBUTES`, then `pyfly.app.name`, and
finally `pyfly-app`.

```bash
export OTEL_SERVICE_NAME=lumen-api
export OTEL_RESOURCE_ATTRIBUTES='service.namespace=lumen,release.note=blue%2Cgreen'
```

The SDK decodes resource attribute values (`blue%2Cgreen` becomes `blue,green`)
and PyFly preserves the other resource attributes. To override deployment
identity deliberately, set `tracing.service-name: lumen-custom` under
`pyfly.observability`, or use `PYFLY_OBSERVABILITY_TRACING_SERVICE_NAME`.
An explicit `service-name: "${pyfly.app.name}"` also overrides the standard
OpenTelemetry environment; it is not needed for the app-name fallback.

Identity is configured at provider creation. Restart the process to change
process-global resources; existing globals and custom providers are reused
without renaming. This release does not redeploy running applications or rewrite
historical telemetry. See the [service identity guide](https://fireflyframework.github.io/fireflyframework-pyfly/docs/modules/observability/#service-identity-and-resource-attributes)
for the full provider ownership contract.

**Run it — see spans without a collector.** Standing up Jaeger or Tempo is
overkill while you are learning. Set the **console exporter** instead, which
prints each span to stdout. Lumen ships with `tracing.enabled: false`; flip it on
Expand Down
2 changes: 1 addition & 1 deletion docs/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -776,7 +776,7 @@ Missing optional tools are shown with a `-` dash indicator (dimmed), while missi
Verifies that PyFly itself is importable and displays the installed version:

```
✓ pyfly v26.10.05
✓ pyfly v26.10.06
```

### Summary
Expand Down
4 changes: 2 additions & 2 deletions docs/dependency-updates.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ a release that supports cryptography 50 and that release is qualified.

For an existing pip installation, first reinstall the named anonymizer from the
exact source reference. Pip can otherwise retain the old index package because
both sources report version `2.2.364`, even with `--upgrade`. Then upgrade PyFly:
both sources report version `2.2.364`, even with `--upgrade`. Then upgrade PyFly to v26.10.06, which retains this source requirement:

```bash
python -m pip install --upgrade --force-reinstall "presidio-anonymizer @ git+https://github.com/data-privacy-stack/presidio.git@5e2fcea990aa3b99660d2aea9121d0ba74a8940b#subdirectory=presidio-anonymizer"
python -m pip install --upgrade "pyfly[pii,security] @ https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.05/pyfly-26.10.5-py3-none-any.whl"
python -m pip install --upgrade "pyfly[pii,security] @ https://github.com/fireflyframework/fireflyframework-pyfly/releases/download/v26.10.06/pyfly-26.10.6-py3-none-any.whl"
python -m pip check
python -m spacy download en_core_web_sm
```
Expand Down
2 changes: 1 addition & 1 deletion docs/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -480,7 +480,7 @@ ______ ___.__._/ ____\ | ___.__.
| __// ____| |__| |____/ ____|
|__| \/ \/

PyFly v26.10.05 | Python 3.12.0
PyFly v26.10.06 | Python 3.12.0

2026-01-15T10:30:00Z [info] starting_application app=my-service version=0.1.0
2026-01-15T10:30:00Z [info] no_active_profiles message=No active profiles set, falling back to default
Expand Down
4 changes: 2 additions & 2 deletions docs/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ Each extra pulls in the third-party libraries needed for a specific framework mo
| `cli` | click, rich, jinja2, questionary | CLI tools (pyfly new, run, info, doctor, db) |
| `full` | Bundled application extras (excludes `pii`, `testing`, `testcontainers`, and `argon2`) | Broad framework installation; add optional PII/testing/password backends explicitly |

The optional `pii` extra in v26.10.05 requires Git and GitHub access for the
The optional `pii` extra in v26.10.06 requires Git and GitHub access for the
immutable upstream anonymizer fix. See the [dependency update notes](dependency-updates.md#presidio-and-cryptography)
before upgrading an existing PII installation.

Expand Down Expand Up @@ -517,7 +517,7 @@ PyFly Doctor
✓ mypy — Type checker

PyFly packages:
✓ pyfly v26.10.05
✓ pyfly v26.10.06

All checks passed!
```
Expand Down
6 changes: 4 additions & 2 deletions docs/modules/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -1315,7 +1315,10 @@ read-only deployment. A separate management listener additionally requires
|---|---|---|
| `pyfly.observability.metrics.enabled` | `true` | Enable metrics collection. |
| `pyfly.observability.tracing.enabled` | `true` | Enable distributed tracing. |
| `pyfly.observability.tracing.service-name` | `"${pyfly.app.name}"` | OpenTelemetry service name (defaults to app name). |
| `pyfly.observability.tracing.service-name` | unset | Explicit nonempty override for newly created trace and metric resources; otherwise `OTEL_SERVICE_NAME`, resource environment `service.name`, app name, then `pyfly-app`. |

See [service identity and resource attributes](observability.md#service-identity-and-resource-attributes)
for standard environment variables, preserved attributes, and provider restart behavior.

### Full YAML Reference

Expand Down Expand Up @@ -1441,7 +1444,6 @@ pyfly:
enabled: true
tracing:
enabled: true
service-name: "${pyfly.app.name}"
transactional:
enabled: false
saga:
Expand Down
4 changes: 2 additions & 2 deletions docs/modules/core.md
Original file line number Diff line number Diff line change
Expand Up @@ -599,7 +599,7 @@ class BannerMode(enum.Enum):
| Mode | Behavior |
|---|---|
| `TEXT` | Full ASCII art banner (default) with a framework version line. |
| `MINIMAL` | Single line: `:: PyFly :: (v26.10.05)` |
| `MINIMAL` | Single line: `:: PyFly :: (v26.10.06)` |
| `OFF` | No banner output at all. |

### BannerPrinter Class
Expand Down Expand Up @@ -640,7 +640,7 @@ ______ ___.__._/ ____\ | ___.__.
| __// ____| |__| |____/ ____|
|__| \/ \/

:: PyFly Framework :: (v26.10.05)
:: PyFly Framework :: (v26.10.06)
```

### Custom Banner Files
Expand Down
Loading
Loading