Skip to main content

A fast, Rust-powered Excel xlsx library for Python with openpyxl-compatible API

Project description

rustypyxl

Quality Gate Status Maintainability Rating Security Rating Known Vulnerabilities

A Rust-powered Excel (XLSX) library for Python with an openpyxl-compatible API.

Installation

pip install rustypyxl

Usage

import rustypyxl

# Create or load a workbook
wb = rustypyxl.Workbook()
ws = wb.create_sheet('Sheet1')          # or: wb = rustypyxl.load_workbook('input.xlsx'); ws = wb.active

# openpyxl-style cell access
ws['A1'] = 'Hello'
ws['A2'] = 42.5
ws['A3'] = '=SUM(A1:A2)'
ws.cell(row=4, column=1).value = 'world'
print(ws['A1'].value)                   # -> "Hello"

# Append rows, merge, freeze, rename
ws.append(['Name', 'Age', 'Score'])
ws.merge_cells('A1:C1')
ws.freeze_panes = 'A2'
ws.title = 'Data'

# Iterate
for row in ws.iter_rows(values_only=True):
    print(row)

wb.save('output.xlsx')

Bulk API (fastest for large grids)

When writing or reading many rows at once, the workbook-level bulk methods avoid per-cell Python overhead:

wb.write_rows('Data', [
    ['Name', 'Age', 'Score'],
    ['Alice', 30, 95.5],
    ['Bob', 25, 87.3],
])
data = wb.read_rows('Data', min_row=1, max_row=100)

Features

  • openpyxl-compatible API: Familiar patterns (ws['A1'], ws.cell(), ws.append(), iter_rows()) for easy migration
  • Read and write support: Full round-trip capability
  • Cell values: Strings, numbers, booleans, dates, formulas
  • Formatting: Fonts (incl. underline styles), alignment, fills, borders, number formats
  • Workbook features: Hyperlinks, comments, named ranges, merged cells, freeze panes
  • Sheet protection: Cell locking and worksheet protection

Not yet supported through the Python API: inserting/deleting rows and columns, charts, and images.

  • Parquet import/export: Direct Parquet ↔ Excel conversion (bypasses Python FFI)
  • S3 support: Works with boto3 via bytes I/O
  • Bytes I/O: Load from bytes or file-like objects, save to bytes
  • Configurable compression: Trade off speed vs file size

Parquet Import

Import large Parquet files directly into Excel worksheets. Data flows from Parquet → Rust → Excel without crossing the Python FFI boundary, making it very fast for large datasets.

import rustypyxl

wb = rustypyxl.Workbook()
wb.create_sheet("Data")

# Import parquet file into sheet
result = wb.insert_from_parquet(
    sheet_name="Data",
    path="large_dataset.parquet",
    start_row=1,
    start_col=1,
    include_headers=True,
    column_renames={"old_name": "new_name"},  # optional
    columns=["col1", "col2", "col3"],  # optional: select specific columns
)

print(f"Imported {result['rows_imported']} rows")
print(f"Data range: {result['range']}")

wb.save("output.xlsx")

Performance: ~4 seconds for 1M rows × 20 columns on M1 MacBook Pro.

Parquet Export

Export worksheet data to Parquet format with automatic type inference:

import rustypyxl

wb = rustypyxl.load_workbook("data.xlsx")

# Export entire sheet
result = wb.export_to_parquet(
    sheet_name="Sheet1",
    path="output.parquet",
    has_headers=True,              # first row contains headers
    compression="snappy",          # snappy, zstd, gzip, lz4, none
    column_renames={"old": "new"}, # optional: rename columns
    column_types={"date_col": "datetime"},  # optional: force column types
)

print(f"Exported {result['rows_exported']} rows")
print(f"File size: {result['file_size']} bytes")

# Export specific range
result = wb.export_range_to_parquet(
    sheet_name="Sheet1",
    path="subset.parquet",
    min_row=1, min_col=1,
    max_row=1000, max_col=5,
)

Supported column type hints: string, float64, int64, boolean, date, datetime, auto.

Loading from Bytes or File-like Objects

Load workbooks from in-memory bytes or file-like objects:

import rustypyxl
import io

# From bytes
with open("file.xlsx", "rb") as f:
    data = f.read()
wb = rustypyxl.load_workbook(data)

# From file-like object (e.g., BytesIO, HTTP response)
wb = rustypyxl.load_workbook(io.BytesIO(data))

# Save to bytes (for HTTP responses, S3, etc.)
output_bytes = wb.save_to_bytes()

S3 Support

Use save_to_bytes() and load_workbook(bytes) with boto3 for S3 integration:

import boto3
import rustypyxl

s3 = boto3.client("s3")

# Load from S3
response = s3.get_object(Bucket="my-bucket", Key="path/to/file.xlsx")
wb = rustypyxl.load_workbook(response["Body"].read())

# Save to S3
data = wb.save_to_bytes()
s3.put_object(Bucket="my-bucket", Key="path/to/output.xlsx", Body=data)

This works with any S3-compatible service and uses boto3's credential handling (IAM roles, environment variables, etc.).

Streaming Writes (Low Memory)

For very large files, use WriteOnlyWorkbook which streams rows directly to disk:

import rustypyxl

wb = rustypyxl.WriteOnlyWorkbook("large_output.xlsx")
wb.create_sheet("Data")

for i in range(1_000_000):
    wb.append_row([f"Row {i}", i, i * 1.5, i % 2 == 0])

wb.close()  # Must call close() to finalize the file

This uses minimal memory regardless of file size, similar to openpyxl's write_only=True mode.

Benchmarks

Micro benchmarks on M1 MacBook Pro. Your results may vary depending on data characteristics and hardware.

Write Performance (1M rows × 20 columns)

Library Time
rustypyxl ~10s
openpyxl ~200s

Read Performance

Dataset rustypyxl calamine openpyxl
10k × 20 (numeric) 0.08s 0.10s 0.51s
10k × 20 (strings) 0.10s 0.12s 1.23s
100k × 20 (numeric) 0.97s 1.03s 4.74s
100k × 20 (mixed) 1.20s 1.28s 12.1s

calamine is a Rust Excel reader with Python bindings via python-calamine (read-only).

Memory Usage (Read)

Dataset rustypyxl calamine openpyxl
10k × 20 29 MB 9 MB 11 MB
50k × 20 58 MB 48 MB 53 MB
100k × 20 95 MB 95 MB 106 MB

Memory Usage (Write)

Dataset rustypyxl WriteOnlyWorkbook openpyxl (write_only)
10k × 20 10 MB ~0 MB 0.4 MB
50k × 20 50 MB ~0 MB 0.4 MB
100k × 20 99 MB ~0 MB 0.4 MB

WriteOnlyWorkbook streams rows directly to disk like openpyxl's write_only mode.

Building from Source

# Install Rust and maturin
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
pip install maturin

# Build
maturin develop --release

License

MIT

Project details


Download files

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

Source Distribution

rustypyxl-0.4.0.tar.gz (121.6 kB view details)

Uploaded Source

Built Distributions

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

rustypyxl-0.4.0-cp314-cp314-win_amd64.whl (3.7 MB view details)

Uploaded CPython 3.14Windows x86-64

rustypyxl-0.4.0-cp314-cp314-manylinux_2_34_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ x86-64

rustypyxl-0.4.0-cp314-cp314-macosx_11_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

rustypyxl-0.4.0-cp313-cp313-win_amd64.whl (3.7 MB view details)

Uploaded CPython 3.13Windows x86-64

rustypyxl-0.4.0-cp313-cp313-manylinux_2_34_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

rustypyxl-0.4.0-cp313-cp313-macosx_11_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

rustypyxl-0.4.0-cp312-cp312-win_amd64.whl (3.7 MB view details)

Uploaded CPython 3.12Windows x86-64

rustypyxl-0.4.0-cp312-cp312-manylinux_2_34_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

rustypyxl-0.4.0-cp312-cp312-macosx_11_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rustypyxl-0.4.0-cp311-cp311-win_amd64.whl (3.7 MB view details)

Uploaded CPython 3.11Windows x86-64

rustypyxl-0.4.0-cp311-cp311-manylinux_2_34_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

rustypyxl-0.4.0-cp311-cp311-macosx_11_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

rustypyxl-0.4.0-cp310-cp310-win_amd64.whl (3.7 MB view details)

Uploaded CPython 3.10Windows x86-64

rustypyxl-0.4.0-cp310-cp310-manylinux_2_34_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

rustypyxl-0.4.0-cp310-cp310-macosx_11_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file rustypyxl-0.4.0.tar.gz.

File metadata

  • Download URL: rustypyxl-0.4.0.tar.gz
  • Upload date:
  • Size: 121.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rustypyxl-0.4.0.tar.gz
Algorithm Hash digest
SHA256 edc6e633b5464aa267f3227659aff9d23796390f395d175e7ee8df5916d35e48
MD5 d0c0b312583fac23196bdb54ea762d53
BLAKE2b-256 11864d3799250034a778b10d4b8c92883361ce01c886f176b0535cd3f1da28b0

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0.tar.gz:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: rustypyxl-0.4.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rustypyxl-0.4.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 23bc0fa8fbb927e54bea3098c7ec3a96dba97ac7e62d7980753e222309ac25d7
MD5 ceb75adbba29223a252c55433e3ef8d7
BLAKE2b-256 bc82a3588b6950ca2a5c6f1c230cad654ba53776b888f44a6f5a3ece1f5d0df9

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp314-cp314-win_amd64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp314-cp314-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for rustypyxl-0.4.0-cp314-cp314-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 ce41701a9d17996cbf958dab5cb368c8ff1cf3db1be52e62d6e83f70c6b5c4bd
MD5 f9e8d72abac6f540e717d837ff74e6cf
BLAKE2b-256 8f966432c2a63d9ebdccf5580cb4a7e025075ccc26a19d0b462d034e99706bc5

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp314-cp314-manylinux_2_34_x86_64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustypyxl-0.4.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 15329907ea7a0651cadd49044c00643923c1fb1bb7664855d0812ea536d4cf40
MD5 590f54a11e307be083b1996a508dfbbe
BLAKE2b-256 e65479d55e56fbad9a49951ef1c59911ecfddf15bdf22cfd3f09ccee6376ab41

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: rustypyxl-0.4.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rustypyxl-0.4.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 3131f19b2669fed32b5efa99d3149ffa12545e41cb2ef28a38d175faf72e5ff4
MD5 30f78d0e5450341edc340235b7764fc5
BLAKE2b-256 40890c9432bd6c8b1787fdb6772fc6f038da6e17c347b80696d291796080e82d

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for rustypyxl-0.4.0-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 419f202140d93960150cbb47064b3ffa14fed5600a5b3f531dcfa3cc3e0162a5
MD5 9c57e5660e81f4ee3ba77cd764638d0b
BLAKE2b-256 d587c21da13c632591eabd26c7d70ef533b68eb21b6fe25c0ba970af13861fbf

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp313-cp313-manylinux_2_34_x86_64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustypyxl-0.4.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2f9f6601ac083a5df376169d67b438a79d6d2c720c9319551af738e1beffdd11
MD5 6b33dafa6f6d83fb008cfa6b61ad0c36
BLAKE2b-256 55dd667ad2540ebdc6cc487ad38f3936a86f1908a562193925b852f85afd4782

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: rustypyxl-0.4.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rustypyxl-0.4.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 76f7bf032c6e19bbad2b496cc25e1aa430adf8a5b30b1486c7cdb251f9c9f9a9
MD5 9b88aa5d9a57665b35e91d3384ddff22
BLAKE2b-256 263694e0f204c23ffb03db6cbc08b5f824b7f1410059a8cad83edce770219906

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for rustypyxl-0.4.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 309205340db045154981e927f3f40d80a7e383913042745097d02438e49eff1a
MD5 4437dcb11a143b5325a730b7665238da
BLAKE2b-256 2472825ad1ca7d45d80cfda7ee54fb758ff9739332618bc39af12310a7f0fc82

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp312-cp312-manylinux_2_34_x86_64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustypyxl-0.4.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1f861530d7aaf00bdef3b3dea001ac69071867ea15e4605ef99bb92d92ab430b
MD5 08265e17194a6881284d7fc1099e77a7
BLAKE2b-256 aab8efe09b327c373af6604dfa6c912ae31ebb3707fd223c1bdc606f2686b40e

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: rustypyxl-0.4.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rustypyxl-0.4.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e9dffedba9f329b8b5728408b10e0165d838a25df472aba95869d534a718a19e
MD5 3532e807b85eebb243b5f84d385fca55
BLAKE2b-256 41ec63f1ac0c61068d146daa0945f723d1d44746f0a570f792bc54ccf2eaf0d0

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp311-cp311-win_amd64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for rustypyxl-0.4.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 2daeb4ce6308b15bd78a07f7981c69ebe0968006bf77a9c3d68a51cd4318ad52
MD5 a48152bb4eb2045f96629f2ba5148b83
BLAKE2b-256 b6f7e8cbe204075cfcc6db5d3bf7289123e31e57cfc511659b653081702ebc5c

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp311-cp311-manylinux_2_34_x86_64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustypyxl-0.4.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e2ea56059f5433aef9de6e8b1f0d21055707bf8c274194b691ec0655dd7972c3
MD5 6d0fd591695876a24f4b151aa1a50842
BLAKE2b-256 f7b17efd2dcfe2f035de49e001c255a1e8abe36f76ed9ca6a1e50166326b68fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: rustypyxl-0.4.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rustypyxl-0.4.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 6cfd797c1640f17f69b492cb480838faa4827fea73ec43a0d61bb5a199b16054
MD5 c35e066bb9a42b7b00ff5d5c60dbd7c5
BLAKE2b-256 7587c5457d69053edfa6eaa2563333f95e588ef8d041ca4bb0168f53be1ef2e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp310-cp310-win_amd64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for rustypyxl-0.4.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 a81f0df4d561ee4dfdac0bb60bf146aef9826c19a109952f7e425a34d05c0f23
MD5 5f3b67ddabb7ba0da6092528d26d3692
BLAKE2b-256 15edfd35ffc32c1c895064d8aae7de9251ae25770cb306315b7aedbebdaf6633

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp310-cp310-manylinux_2_34_x86_64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

File details

Details for the file rustypyxl-0.4.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rustypyxl-0.4.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 119b3cee466ecb5a9a61c6611de0d0b08299ee95b36f955c41387f604e871d28
MD5 ed6415aabd4e6454a6dcf17849439a5f
BLAKE2b-256 7bab507e2b6bf58f570c55d6596c9b86a10cd7ef602a193beb4ec3999e8c4fd7

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustypyxl-0.4.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: publish.yml on freeeve/rustypyxl

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

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page