Skip to main content

urio

Async file I/O for Python that is actually asynchronous.

On Linux, urio submits reads and writes through io_uring and resolves completions on the event loop, with no thread parked per operation. On Windows it can do the same through overlapped I/O and an I/O completion port (opt-in, see below). Everywhere else — macOS, older kernels, sandboxes that block the syscalls — it falls back to a thread pool behind the same API, so one code path works on every platform.

The API follows aiofiles, which pioneered ergonomic async file access for asyncio by running the blocking syscalls in a thread pool — the only portable option at the time, and still the right fallback. urio keeps that familiar interface (which in turn mirrors the builtin open()), so switching is mostly changing the import.

What you get

  • Real async reads and writes: io_uring on Linux, IOCP on Windows.
  • The familiar file API: read, readline, readlines, write, writelines, seek, tell, truncate, flush, async iteration, text and binary modes.
  • An async pathlib: urio.Path with async stat, mkdir, unlink, rename, symlink_to, read_text/write_text/read_bytes/write_bytes, iterdir, glob, walk, and the full set of pure-path helpers.
  • A thread-pool fallback wherever native async I/O is unavailable, same API.
  • Runs GIL-free on free-threaded CPython (3.14t and later).

Requirements

  • Python 3.12+, any OS.
  • Linux 5.6+ for the io_uring backend.
  • Windows 10/11 for the IOCP backend (opt-in via URIO_WINDOWS_IOCP=1; Windows otherwise uses the thread backend).

Anything else — macOS, older kernels, locked-down sandboxes — runs the thread backend automatically.

Installation

pip install urio

Prebuilt abi3 wheels (one per platform covers every CPython ≥ 3.12):

Platform Arch Backend
Linux (manylinux + musllinux) x86_64, aarch64, armv7 io_uring
Windows x64, x86 thread pool by default, IOCP opt-in
macOS x86_64, arm64 thread pool

Building from source needs a Rust toolchain and maturin; the crate compiles on every OS:

pip install -e ".[dev]"
maturin develop

Usage

import asyncio
import urio


async def main():
    # Files — binary and text modes, just like the builtin open().
    async with urio.open('greeting.txt', 'w') as f:
        await f.write('hello\nworld\n')

    async with urio.open('greeting.txt') as f:
        async for line in f:
            print(line.rstrip())

    # Async pathlib.
    p = urio.Path('greeting.txt')
    print(await p.exists())
    print((await p.stat()).st_size)
    print(await p.read_text())


asyncio.run(main())

Async pathlib

urio.Path is an async pathlib.Path. Pure-path operations (/ joining, name, suffix, parent, with_suffix, …) are ordinary synchronous properties; everything that touches the filesystem is async and goes through the active backend:

base = urio.Path('/tmp/project')
await base.mkdir(parents=True, exist_ok=True)

cfg = base / 'config.toml'
await cfg.write_text('name = "urio"\n')
print(await cfg.read_text())
print(await cfg.exists(), await cfg.is_file(), (await cfg.stat()).st_size)

async for child in base.iterdir():
    print(child.name)

On Linux, stat/mkdir/unlink/rename/symlink_to and the read/write helpers are genuine io_uring submissions; directory listing and metadata tweaks use the thread pool.

Choosing a backend

urio picks the fastest available backend at runtime. You can force one:

urio.set_backend('auto')  # default
urio.set_backend('thread')  # force the thread pool
urio.set_backend('uring')  # require io_uring (raises if unavailable)
urio.set_backend('iocp')  # require IOCP (Windows, needs URIO_WINDOWS_IOCP=1)

or via the environment: URIO_BACKEND=thread python app.py. On Windows, setting URIO_WINDOWS_IOCP=1 is enough on its own — auto-detection then selects IOCP.

How it works

On Linux, a single ring is created per event loop. Its io_uring instance is registered with an eventfd, and that fd is handed to loop.add_reader, so the loop wakes whenever completions are ready. Each submission maps a user_data id to an asyncio.Future; on wake-up the driver drains the eventfd, reaps every completion, and resolves the matching futures. Everything runs on the loop thread — no executor, no extra threads.

On Windows with IOCP enabled, files are opened for overlapped I/O and associated with the completion port that asyncio's ProactorEventLoop already owns, so completions are again reaped on the loop thread. Same shape, native Windows machinery.

Whatever the kernel touches is kept alive until the completion is reaped: reads land in a buffer the kernel fills directly, and writes submit against the caller's immutable Python bytes object (held by reference), so neither direction copies. This also side-steps the hardest io_uring footgun: the kernel using a buffer that Python has freed or moved.

Benchmarks

benchmarks/bench_vs_aiofiles.py runs the full cartesian product of {buffered write, write+fsync, read} × {binary, text} × {2000×4 KB, 500×64 KB, 100×1 MB, 20×8 MB}, plus a streaming read of a 128 MB file. It tries hard to be fair: the cache is warmed for every contender, each contender writes to its own files (so nobody inherits another's writeback pressure), and it reports the median of N runs with the [min–max] range. The Linux charts below are medians on CPython 3.14.6, measured on a 4-core Intel i5-6500, 32 GB RAM, ext4 on a SATA HDD (the Windows numbers are from a separate 8-core box; full specs in the benchmarks doc). Treat them as indicative and run it on your hardware. Each bar is one operation × mode × size; colour is the file size, and a bar past the 1.0× line means urio beat aiofiles.

Linux, io_uring. Buffered writes win across sizes: submission batching for small files (one io_uring_enter per loop tick instead of one syscall per op), zero-copy submission for large ones. Reads win small/medium and hold up at large sizes too — reads are zero-copy (the kernel fills the returned bytes directly) and big reads fan out to io-wq workers so their copies run on multiple cores. Durable (fsync) writes converge on disk bandwidth and stay competitive:

Linux io_uring speedup vs aiofiles

Windows, IOCP. Real async I/O via overlapped I/O and a completion port, reaped on the event-loop thread, with zero-copy writes and reads. Buffered writes are at parity to winning, durable writes win, large text wins outright (1.3–1.9×). Binary reads still lose: a warm ReadFile completes synchronously, so the kernel copies inline on the loop thread. The full test suite and a concurrency/cancellation stress test pass on Windows CPython 3.14, both GIL and free-threaded builds:

Windows IOCP speedup vs aiofiles

Free-threaded Python (no-GIL). The native module declares gil_used = false, and urio has the same thread-pool mode aiofiles does — so on no-GIL builds you lose nothing: use the thread backend for warm reads (parity with aiofiles), and io_uring/IOCP for writes, fsync, and latency, where the batching wins persist. The chart isolates the native backends' warm-read edge as the now-unshackled thread pools catch up: on Linux the small-read edge narrows but stays a win at every size, while on Windows the IOCP large-text-read wins drop below parity without the GIL:

Free-threading GIL vs no-GIL — io_uring and IOCP

Summary vs aiofiles (medians, CPython 3.14):

  • Linux writes win at small/medium sizes through submission batching (3.4–5.2×); large binary writes ride zero-copy submission (1.7× at 1 MB, parity at 8 MB). Large text writes still trail (0.6–0.7×), though offloading multi-megabyte encodes off the loop roughly halved the gap in 0.2.0.
  • Linux reads win small/medium (2.6–3.4×); with zero-copy reads plus the io-wq punt, large binary sits at 0.8× (1 MB) and 0.5× (8 MB) under the GIL — and flips to a 1.2× win at 8 MB without it — while large text reads win outright (1.7–2.0×). Warm streaming is a clear win — binary 6.3 GB/s vs aiofiles's 3.1 (2.0×).
  • Durable (fsync) writes converge on disk bandwidth and are competitive on both io_uring and IOCP. On ZFS every fsync forces a ZIL/txg commit, so large durable writes get ~24–71× slower — but aiofiles pays the same tax (speedup ~1.0×) and urio's batched fsync still wins on many small files. See the benchmarks doc.
  • Windows IOCP: writes parity to winning, durable writes win (1.1–1.7×), large text wins (1.3–1.9×); binary reads lose (the warm ReadFile copy runs inline on the loop thread).
  • The thread backend tracks aiofiles on both reads and writes, on every OS and in both GIL states — same strategy, used wherever io_uring or IOCP is unavailable or not selected.
  • Network filesystems (measured on loopback NFSv4 and SMB 3.1.1 mounts): the small-file fan-out read win survives — 2–4.5× vs aiofiles, warm and cold — because batching still hides per-file round-trips even though the kernel punts network-FS I/O to worker threads; large-file reads drop to parity (0.9–1.1×). A 9p mount was reported slower (~0.7×), so benchmark unusual transports before adopting.

Run it yourself: python benchmarks/bench_vs_aiofiles.py --markdown --json out.json (medians + raw samples). Methodology and full tables are in the benchmarks docs; raw sample data lives in benchmarks/data/.

Documentation

ARCHITECTURE.md is the code-reader's tour: the ring/eventfd bridge, the zero-copy rules, linked chains, and the backend stack. The full site is built with MkDocs Material:

pip install -e ".[docs]"
mkdocs serve

Scope & design notes

  • Metadata ops without an io_uring opcode use the thread pool. io_uring covers the hot path — read, write, fsync/fdatasync, openat, close, statx, mkdirat, unlinkat, renameat, symlinkat, linkat — while a few rarer operations (directory listing, chmod, readlink, realpath) have no opcode and run on the thread pool even under the io_uring backend, behind the same async API.
  • Text decoding is incremental. Reading a whole text file is one round-trip plus a single bulk decode, and sized read(n) fetches the whole request in one round-trip. Line-by-line iteration decodes incrementally (128 KB per refill), so it trails a C TextIOWrapper on pure line-streaming throughput; read binary and bulk-decode if that is your bottleneck. On free-threaded builds the codec runs in the executor so it parallelises across cores. Text streams are seekable in byte offsets, like io.TextIOWrapper.

License

MIT

Download files

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

Source Distribution

urio-0.2.0.tar.gz (179.1 kB view details)

Uploaded Source

Built Distributions

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

urio-0.2.0-cp314-cp314t-win_amd64.whl (180.3 kB view details)

Uploaded CPython 3.14tWindows x86-64

urio-0.2.0-cp314-cp314t-manylinux_2_28_x86_64.whl (281.8 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ x86-64

urio-0.2.0-cp314-cp314t-macosx_11_0_arm64.whl (214.9 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

urio-0.2.0-cp312-abi3-win_amd64.whl (179.9 kB view details)

Uploaded CPython 3.12+Windows x86-64

urio-0.2.0-cp312-abi3-win32.whl (172.7 kB view details)

Uploaded CPython 3.12+Windows x86

urio-0.2.0-cp312-abi3-musllinux_1_2_x86_64.whl (504.7 kB view details)

Uploaded CPython 3.12+musllinux: musl 1.2+ x86-64

urio-0.2.0-cp312-abi3-musllinux_1_2_aarch64.whl (468.4 kB view details)

Uploaded CPython 3.12+musllinux: musl 1.2+ ARM64

urio-0.2.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (293.5 kB view details)

Uploaded CPython 3.12+manylinux: glibc 2.17+ x86-64

urio-0.2.0-cp312-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (277.6 kB view details)

Uploaded CPython 3.12+manylinux: glibc 2.17+ ARMv7l

urio-0.2.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (270.6 kB view details)

Uploaded CPython 3.12+manylinux: glibc 2.17+ ARM64

urio-0.2.0-cp312-abi3-macosx_11_0_arm64.whl (213.8 kB view details)

Uploaded CPython 3.12+macOS 11.0+ ARM64

urio-0.2.0-cp312-abi3-macosx_10_12_x86_64.whl (221.3 kB view details)

Uploaded CPython 3.12+macOS 10.12+ x86-64

File details

Details for the file urio-0.2.0.tar.gz.

File metadata

  • Download URL: urio-0.2.0.tar.gz
  • Upload date:
  • Size: 179.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for urio-0.2.0.tar.gz
Algorithm Hash digest
SHA256 c0120aacc5add813dfa254a517b1970ae82f6db5b222a25b687a3269aa008ff3
MD5 98c5d6faaa999b0b2e5393c79f2c7eed
BLAKE2b-256 3f19f393e9af5297cd226fc6495d811e368d755e630e7232d051e534f1e56a7f

See more details on using hashes here.

Provenance

The following attestation bundles were made for urio-0.2.0.tar.gz:

Publisher: release.yml on meitham/urio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file urio-0.2.0-cp314-cp314t-win_amd64.whl.

File metadata

  • Download URL: urio-0.2.0-cp314-cp314t-win_amd64.whl
  • Upload date:
  • Size: 180.3 kB
  • Tags: CPython 3.14t, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for urio-0.2.0-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 b930f01af0906fcee039ce009c61628691aa36c9d14d890a2ac54f12ba946095
MD5 3f05975d2958f67375bed1d7871cf9cb
BLAKE2b-256 4dc40ae0de89a6aa55285bc20a83bb83afa2a514a9878e44dde4f7d3acacb874

See more details on using hashes here.

Provenance

The following attestation bundles were made for urio-0.2.0-cp314-cp314t-win_amd64.whl:

Publisher: release.yml on meitham/urio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file urio-0.2.0-cp314-cp314t-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for urio-0.2.0-cp314-cp314t-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 899ff118ce695acc4ea701fcd35c68c777fc381ef954ba9de0baa293665e67f3
MD5 50bc3f296fadea51ddaf208912b449bd
BLAKE2b-256 c7fec05cf2014523073148ff5e86729b141e4d1ce6fabc82f8d9fce408d27a67

See more details on using hashes here.

Provenance

The following attestation bundles were made for urio-0.2.0-cp314-cp314t-manylinux_2_28_x86_64.whl:

Publisher: release.yml on meitham/urio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file urio-0.2.0-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for urio-0.2.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bed2aacfdd11fe12ae5c7d51a37ad7bd652bea7aab19f0008d9b5a6d4df52355
MD5 b93b2f19ba0f1fbac06ed24bca94c0b4
BLAKE2b-256 56232fcf380f6c59c4e541fe6d6e039cff30d10a01cb16ee5bf7dff52bb9bce5

See more details on using hashes here.

Provenance

The following attestation bundles were made for urio-0.2.0-cp314-cp314t-macosx_11_0_arm64.whl:

Publisher: release.yml on meitham/urio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file urio-0.2.0-cp312-abi3-win_amd64.whl.

File metadata

  • Download URL: urio-0.2.0-cp312-abi3-win_amd64.whl
  • Upload date:
  • Size: 179.9 kB
  • Tags: CPython 3.12+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for urio-0.2.0-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 19902bad2b6e177f3d5caa207928f4bb2c473427189ffbeae2979eb3e0b87557
MD5 932939b9ae5fcef7746651d682bf058a
BLAKE2b-256 c6f89a7241854fe9162106ce434148b1818057165887cacbabc4ac3bc77d06f3

See more details on using hashes here.

Provenance

The following attestation bundles were made for urio-0.2.0-cp312-abi3-win_amd64.whl:

Publisher: release.yml on meitham/urio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file urio-0.2.0-cp312-abi3-win32.whl.

File metadata

  • Download URL: urio-0.2.0-cp312-abi3-win32.whl
  • Upload date:
  • Size: 172.7 kB
  • Tags: CPython 3.12+, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for urio-0.2.0-cp312-abi3-win32.whl
Algorithm Hash digest
SHA256 d24ca93a818e9d06afc2f56159eff9d854d42c9465d888ebc358801d854b1dac
MD5 03ab877382fba995a2a9d4fc7a07b7cf
BLAKE2b-256 8bd506ae6469b5625ae2e3da62acb37dd3478f99dcfdff1205e4ca7fe55bf64c

See more details on using hashes here.

Provenance

The following attestation bundles were made for urio-0.2.0-cp312-abi3-win32.whl:

Publisher: release.yml on meitham/urio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file urio-0.2.0-cp312-abi3-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: urio-0.2.0-cp312-abi3-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 504.7 kB
  • Tags: CPython 3.12+, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for urio-0.2.0-cp312-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 99d5fc1e0bbf777579a3a28220437e58cbf122140db99469d3ccb7af2d9011ef
MD5 38a10f11775efa188ef745b492940511
BLAKE2b-256 ce952fab8845aeabe47dc8a1750a29a6df55c24f9a61995267e8f4d471b81de1

See more details on using hashes here.

Provenance

The following attestation bundles were made for urio-0.2.0-cp312-abi3-musllinux_1_2_x86_64.whl:

Publisher: release.yml on meitham/urio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file urio-0.2.0-cp312-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for urio-0.2.0-cp312-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 c7c20d0c6bdcca5fceeb9f061532be0cdbc4995264056c68486f4a7356684e1d
MD5 45aaee832ad3a8069b121b792affd929
BLAKE2b-256 81ec81ec3f3f23d69569e5ded1e5d3af5cdaad858fc47825ea2af3031841b7a5

See more details on using hashes here.

Provenance

The following attestation bundles were made for urio-0.2.0-cp312-abi3-musllinux_1_2_aarch64.whl:

Publisher: release.yml on meitham/urio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file urio-0.2.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for urio-0.2.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 be09763186ced3e0d0061003c42029125691ece106f617fd271ae6a062fbf103
MD5 b8a972627991857a65118789db7bb456
BLAKE2b-256 21a99e40ca6072a582e10087a2c04da5f3ec56bde922b271be5405e5d9867efb

See more details on using hashes here.

Provenance

The following attestation bundles were made for urio-0.2.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on meitham/urio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file urio-0.2.0-cp312-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for urio-0.2.0-cp312-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 ff73f476583a7096c37a8755edbfb3d446827a7d1ceba4719abd7d8445dd0934
MD5 61db19f51f31e9fe16fe8d05c1ff75ec
BLAKE2b-256 c30867401ec40711965dbe02821a1355382231721267cc8bc8db4bf0abe8fc65

See more details on using hashes here.

Provenance

The following attestation bundles were made for urio-0.2.0-cp312-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl:

Publisher: release.yml on meitham/urio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file urio-0.2.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for urio-0.2.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b5a8c78dffe6fa167b00d4ad0e398e4343411188898d76e271e3914af92e893a
MD5 caa89151802c241718f188996980a065
BLAKE2b-256 4231fcd4dd2c1943474866c9fe88a994e3b8ef6a157954e043e29727f67e4ef0

See more details on using hashes here.

Provenance

The following attestation bundles were made for urio-0.2.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on meitham/urio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file urio-0.2.0-cp312-abi3-macosx_11_0_arm64.whl.

File metadata

  • Download URL: urio-0.2.0-cp312-abi3-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 213.8 kB
  • Tags: CPython 3.12+, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for urio-0.2.0-cp312-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c3889b7e2eb95474946e063a119ac449bbc38851a620a4c996f7a1a7ad47709f
MD5 5213404ab9699a4d8b5dbbedfcca31ec
BLAKE2b-256 d4f99e4d9b3cd024a25412abf205c97e2c22c6a187c304ecaf97212df1c2b639

See more details on using hashes here.

Provenance

The following attestation bundles were made for urio-0.2.0-cp312-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on meitham/urio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file urio-0.2.0-cp312-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for urio-0.2.0-cp312-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7c007f96e97ecbecfaa573a3909a742f78b482ba9e3537c1ee8560aff917e455
MD5 041e266e2c0f1bf1db64068758db016c
BLAKE2b-256 df8fcc8ca25184c8e1a8b440f3e89298ea255f130472dc94522e4e19f284d889

See more details on using hashes here.

Provenance

The following attestation bundles were made for urio-0.2.0-cp312-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on meitham/urio

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.2.0 This release

13 files

0.1.2

13 files

0.1.1

13 files

0.1.0

13 files

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