Skip to main content

normalizer-tr

CI

Turkish text normalization for speech, with a Rust core and a typed Python API. Convert numbers, money, dates, measurements and other supported notation into spoken Turkish while preserving ordinary prose. Runs offline, without a speech model or service. Decimal and money arithmetic is exact.

saat 09:30'da 5 kg malzeme ve %12,5'lik fark
→ saat dokuz otuzda beş kilogram malzeme ve yüzde on iki virgül beşlik fark

Python

python -m pip install normalizer-tr
from normalizer_tr import Normalizer

normalizer = Normalizer()
result = normalizer.normalize("25 TL; 5 kg")
assert result.normalized_text == "yirmi beş Türk lirası; beş kilogram"
assert result.complete

Wheels support CPython 3.11 to 3.14 on Windows and Linux x64, and macOS x64 and arm64. Compatible wheels need no Rust compiler. Platform requirements and source builds.

Rust

Requires Rust 1.94 or newer. Add to Cargo.toml:

[dependencies]
normalizer-tr = "0.6"
use normalizer_tr::{NormalizeError, NormalizeOptions, Normalizer};

fn main() -> Result<(), NormalizeError> {
    let normalizer = Normalizer::new()?;
    let result = normalizer.normalize("25 TL; 5 kg", &NormalizeOptions::default())?;
    assert_eq!(result.normalized_text(), "yirmi beş Türk lirası; beş kilogram");
    assert!(result.complete());
    Ok(())
}

Reuse a Normalizer across calls. It is cloneable and Send + Sync. Enable the optional serde feature to serialize results.

Choose how to handle ambiguity

Policy Behavior
preserve (default) Keep unresolved spans as written. Return complete=false and issues.
reject Return an error if any span is unresolved.
fallback Render unresolved notation and symbols. Return handled assumptions in fallbacks.
result = normalizer.normalize("1.234; AB12", ambiguity_policy="fallback")
assert result.normalized_text == "bin iki yüz otuz dört; a be bir iki"
assert result.complete and not result.issues
assert result.fallback_used

In Rust, set NormalizeOptions.ambiguity_policy to AmbiguityPolicy::Fallback or AmbiguityPolicy::Reject.

Fallback prefers clear formats, then literal readings and named symbols, then spoken Unicode codes. It does not correct invalid facts or certify identifiers. Check fallbacks when those assumptions matter. Invalid input or hints, cancellation and resource limits remain errors in every policy.

Hints provide explicit intent. All hint and diagnostic ranges are original UTF-8 byte offsets, not character positions.

Documentation

Guide Contents
Rust API Types, methods and examples
Python API Hints, errors, cancellation and building
Normalization reference Supported formats and boundaries
Fallback Reading strategies and diagnostics
Contributing Setup, architecture and verification

This is a pre 1.0 library with bounded coverage, not a universal pronunciation engine. See performance for measurements and changelog for release status and migration notes.

The guides track repository behavior: expanded initialism coverage and foreign-name speech aliases are included in 0.5.0. Review the changelog's migration notes before upgrading, especially exhaustive Rust enum matches and strict serialized allowlists.

0.6.0: approved names support plural and possessive suffixes followed by a case suffix, such as iPhone'umdan -> ayfonumdan. Review coverage and migration notes, including changed Instagram and WhatsApp readings, before upgrading.

License

Apache-2.0, with third party notices.

Thanks to @canberk7 for his contribution to fallback support.

Metadata

Release files for normalizer-tr 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for normalizer-tr 0.6.0
File Size Uploaded
normalizer_tr-0.6.0.tar.gz 436.8 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for normalizer-tr 0.6.0
File
normalizer_tr-0.6.0-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
normalizer_tr-0.6.0-cp314-cp314-manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ x86-64 Details
normalizer_tr-0.6.0-cp314-cp314-macosx_12_0_x86_64.whl CPython 3.14 CPython 3.14 macOS 12.0+ x86-64 Details
normalizer_tr-0.6.0-cp314-cp314-macosx_12_0_arm64.whl CPython 3.14 CPython 3.14 macOS 12.0+ ARM64 Details
normalizer_tr-0.6.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
normalizer_tr-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64 Details
normalizer_tr-0.6.0-cp313-cp313-macosx_12_0_x86_64.whl CPython 3.13 CPython 3.13 macOS 12.0+ x86-64 Details
normalizer_tr-0.6.0-cp313-cp313-macosx_12_0_arm64.whl CPython 3.13 CPython 3.13 macOS 12.0+ ARM64 Details
normalizer_tr-0.6.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
normalizer_tr-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64 Details
normalizer_tr-0.6.0-cp312-cp312-macosx_12_0_x86_64.whl CPython 3.12 CPython 3.12 macOS 12.0+ x86-64 Details
normalizer_tr-0.6.0-cp312-cp312-macosx_12_0_arm64.whl CPython 3.12 CPython 3.12 macOS 12.0+ ARM64 Details
normalizer_tr-0.6.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
normalizer_tr-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64 Details
normalizer_tr-0.6.0-cp311-cp311-macosx_12_0_x86_64.whl CPython 3.11 CPython 3.11 macOS 12.0+ x86-64 Details
normalizer_tr-0.6.0-cp311-cp311-macosx_12_0_arm64.whl CPython 3.11 CPython 3.11 macOS 12.0+ ARM64 Details

Total release size: 21.6 MB

Release files / normalizer_tr-0.6.0.tar.gz

Download URL normalizer_tr-0.6.0.tar.gz
Size 436.8 kB
Tags Source
SHA-256 checksum
How to use checksums
2cb209580798bdac9be4f82ca0fa13a776bc10d1053b38e800fb8e5eed09424d
BLAKE2b-256 checksum
How to use checksums
0761815aa188f145c4a0da7a6926af4d3056828106f7bcb2f653e8f311f54966
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp314-cp314-win_amd64.whl

Download URL normalizer_tr-0.6.0-cp314-cp314-win_amd64.whl
Size 1.2 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
3e2cb2f0eae9aa978a39d29a3147ee494b831693f11c356888cf4f7588feff70
BLAKE2b-256 checksum
How to use checksums
e16ce16ee8d62f08f965706f1dc37b047a1cd525acd4b514eee1659db224dade
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp314-cp314-manylinux_2_28_x86_64.whl

Download URL normalizer_tr-0.6.0-cp314-cp314-manylinux_2_28_x86_64.whl
Size 1.5 MB
Tags CPython 3.14 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
e2f3b93f30bcca0120dc4b08fbf1502196dce6f7fa75122697f3275d20193c27
BLAKE2b-256 checksum
How to use checksums
c30186311dd53b956d5c07babb4d3ef966b9af53831a4950c028cbf01fec2995
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp314-cp314-macosx_12_0_x86_64.whl

Download URL normalizer_tr-0.6.0-cp314-cp314-macosx_12_0_x86_64.whl
Size 1.3 MB
Tags CPython 3.14 macOS 12.0+ x86-64
SHA-256 checksum
How to use checksums
1480d4dba4c948bd07122e089751a9a6e893460e0425d86de3d1db540bd42b87
BLAKE2b-256 checksum
How to use checksums
dd34d37e56dc7161504d09ee199b9248e34a45af395ce8522e2cffda497e0367
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp314-cp314-macosx_12_0_arm64.whl

Download URL normalizer_tr-0.6.0-cp314-cp314-macosx_12_0_arm64.whl
Size 1.3 MB
Tags CPython 3.14 macOS 12.0+ ARM64
SHA-256 checksum
How to use checksums
a192ea7d7a5cc9341f812422b60eaf522be0b8352532b05540cd1d9affc4053f
BLAKE2b-256 checksum
How to use checksums
fbc499ad5dcc55917775d4147b725de17b6330b9a4c51ea56c25ae7d4009030e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp313-cp313-win_amd64.whl

Download URL normalizer_tr-0.6.0-cp313-cp313-win_amd64.whl
Size 1.2 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
edc6e2305a4dcb824169db88a0db34b4cca041f245f20fce7433acc9d938fd40
BLAKE2b-256 checksum
How to use checksums
c9f3f67b91ea7e5ba8e2f3cf8a6801f90dbc0191c107f7e9bb44c5f34d45f0c5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl

Download URL normalizer_tr-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl
Size 1.4 MB
Tags CPython 3.13 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
a54509f2e379f2e3e232080df372cf3a334296cf7b61432a5900d534abdcf050
BLAKE2b-256 checksum
How to use checksums
892483aa1fe1aa8e600b876bc53b3e0e87afd8eded18a3609b36ad82801910cd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp313-cp313-macosx_12_0_x86_64.whl

Download URL normalizer_tr-0.6.0-cp313-cp313-macosx_12_0_x86_64.whl
Size 1.3 MB
Tags CPython 3.13 macOS 12.0+ x86-64
SHA-256 checksum
How to use checksums
85c1ce18fa4b5321ea4ebc2f16b3d222a848272d9d5d03c376b1e5785aeed974
BLAKE2b-256 checksum
How to use checksums
9cfaa531d038055eb29dae3dba2184aa74c213a04b36eb2bd82ca9c906fd7bf3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp313-cp313-macosx_12_0_arm64.whl

Download URL normalizer_tr-0.6.0-cp313-cp313-macosx_12_0_arm64.whl
Size 1.3 MB
Tags CPython 3.13 macOS 12.0+ ARM64
SHA-256 checksum
How to use checksums
932b5f57faac1f26151a497a78f676c880e4ba640a2332871fef95d037c14594
BLAKE2b-256 checksum
How to use checksums
3e257005dfd5eec43352c5e5636213ea7f74ff8539a6739e976cfad06b51c7b8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp312-cp312-win_amd64.whl

Download URL normalizer_tr-0.6.0-cp312-cp312-win_amd64.whl
Size 1.2 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
cd9f7c52928969c2c472d2759d8eb2c42b8a4392855dc487bc195e6e09a61d4b
BLAKE2b-256 checksum
How to use checksums
b497013f5cfa0ab5b600e53677bdc1db0cdd077f1bfe2de0c5dd5effd643cd6e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl

Download URL normalizer_tr-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl
Size 1.4 MB
Tags CPython 3.12 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
d245508e71dd37422685f60002ac2123dcdba586ec3491b5eb8366e02c9eb108
BLAKE2b-256 checksum
How to use checksums
73d89b71e73cb86e497ca02af4cd3514c960a6354edb64f7b6fd850c85ebd269
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp312-cp312-macosx_12_0_x86_64.whl

Download URL normalizer_tr-0.6.0-cp312-cp312-macosx_12_0_x86_64.whl
Size 1.3 MB
Tags CPython 3.12 macOS 12.0+ x86-64
SHA-256 checksum
How to use checksums
790a2868e14d73ed96a556400ef77321484da2c51144cabb77a563e4b50f3604
BLAKE2b-256 checksum
How to use checksums
fc12ee6d91ed2a645bd94368693268024dceb28acace9eeb0dd2400f3d66b54a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp312-cp312-macosx_12_0_arm64.whl

Download URL normalizer_tr-0.6.0-cp312-cp312-macosx_12_0_arm64.whl
Size 1.3 MB
Tags CPython 3.12 macOS 12.0+ ARM64
SHA-256 checksum
How to use checksums
28388cca1fc8739c6213f08dc056237f0569b9ac6098aa7a9d7544877a9479b1
BLAKE2b-256 checksum
How to use checksums
4463ae6d54de55a6fef7fbe7e49d634ef22ab2455ef75833f1ecf64341e364e8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp311-cp311-win_amd64.whl

Download URL normalizer_tr-0.6.0-cp311-cp311-win_amd64.whl
Size 1.2 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
0f142596a72129dfd97dd92a03cac972ad1023f9d6b91041598acf092406c056
BLAKE2b-256 checksum
How to use checksums
d28104991162f06b79be59eea15edf4bb344405f688bbf6683f29fc1dee6032d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl

Download URL normalizer_tr-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl
Size 1.5 MB
Tags CPython 3.11 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
ce5eb2babe1fbe055d5d43c25822b30b69b4128d59e7fdd0e84f7f4314e48538
BLAKE2b-256 checksum
How to use checksums
f138ce9f57b43a23cbf919d69ec7d4151caa3f2137a73ea6ed642312f4145f3a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp311-cp311-macosx_12_0_x86_64.whl

Download URL normalizer_tr-0.6.0-cp311-cp311-macosx_12_0_x86_64.whl
Size 1.3 MB
Tags CPython 3.11 macOS 12.0+ x86-64
SHA-256 checksum
How to use checksums
0a602cfd4ab98bf3df05df5b616b221d8a56a3e3e0b74a8ce0d9d5546e719cde
BLAKE2b-256 checksum
How to use checksums
577a464f7e824c22dfd1a1583f80eaf054187acc2336ca8170143e1b83960e7d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / normalizer_tr-0.6.0-cp311-cp311-macosx_12_0_arm64.whl

Download URL normalizer_tr-0.6.0-cp311-cp311-macosx_12_0_arm64.whl
Size 1.3 MB
Tags CPython 3.11 macOS 12.0+ ARM64
SHA-256 checksum
How to use checksums
b1dbd671255c8f1ec3aca966c3294064f974f2c71cdbfb49dc8ec23bde3dea82
BLAKE2b-256 checksum
How to use checksums
a6bc277fa947a939be69a7a41449049de94f03b0df64bf24158b6eb8fc43342f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release history Release notifications | RSS feed

0.8.0

17 release files

0.7.0

17 release files

This release

0.6.0 This release

17 release 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