Skip to main content

A state management system for Python 3.x that unifies your applications business logic, data persistence, and caching into a single, efficient layer.

Project description

Dbzero logo

A state management system for Python 3.x that unifies your application's business logic, data persistence, and caching into a single, efficient layer.

License: LGPL 2.1

"If we had infinite memory in our laptop, we'd have no need for clumsy databases. Instead, we could just use our objects whenever we liked."

— Harry Percival and Bob Gregory, Architecture Patterns with Python

Overview

dbzero lets you code as if you have infinite memory. Inspired by a thought experiment from Architecture Patterns with Python by Harry Percival and Bob Gregory, dbzero handles the complexities of data management in the background while you work with simple Python objects.

dbzero implements the DISTIC memory model:

  • Durable - Data persists across application restarts
  • Infinite - Work with data as if memory constraints don't exist (e.g. create lists, dicts or sets with billions of elements)
  • Shared - Multiple processes can access and share the same data
  • Transactional - Transaction support for data integrity
  • Isolated - Reads performed against a consistent point-in-time snapshot
  • Composable - Plug in multiple prefixes (memory partitions) on demand and access other apps’ data by simply attaching their prefix.

With dbzero, you don’t need separate pieces like a database, ORM, or cache layer. Your app becomes easier to build and it runs faster, because there are no roundtrips to a database, memory is used better, and you can shape your data to fit your problem.

Key Platform Features

dbzero provides the reliability of a traditional database system with modern capabilities and extra features on top.

  • Persistence: Application objects (classes and common structures like list, dict, set, etc.) are automatically persisted (e.g. to a local or network-attached file)
  • Efficient caching: Only the data actually accessed is retrieved and cached. For example, if a list has 1 million elements but only 10 are accessed, only those 10 are loaded.
  • Constrained memory usage: You can define memory limits for the process to control RAM consumption.
  • Serializable consistency: Data changes can be read immediately, maintaining a consistent view.
  • Transactions: Make atomic, exception-safe changes using the with dbzero.atomic(): context manager.
  • Snapshots & Time Travel: Query data as it existed at a specific point in the past. This enables tracking of data changes and simplify auditing.
  • Tags: Tag objects and use tags to filter or retrieve data.
  • Indexing: Define lightweight, imperative indexes that can be dynamically created and updated.
  • Data composability: Combine data from different apps, processes, or servers and access it through a unified interface - i.e. your application’s objects, methods and functions.
  • UUID support: All objects are automatically assigned a universally unique identifier, allowing to always reference them directly.
  • Custom data models - Unlike traditional databases, dbzero allows you to define custom data structures to match your domain's needs.

Requirements

  • Python: 3.9+
  • Operating Systems: Linux, macOS, Windows
  • Storage: Local filesystem or network-attached storage
  • Memory: Varies by workload; active working set should fit in RAM for best performance

Quick Start

Installation

pip install dbzero

Simple Example

The guiding philosophy behind dbzero is invisibility—it stays out of your way as much as possible. In most cases, unless you're using advanced features, you won’t even notice it’s there. No schema definitions, no explicit save calls, no ORM configuration. You just write regular Python code, as you always have. See the complete working example below:

import dbzero as db0

@db0.memo(singleton=True)
class GreeterAppRoot:
    def __init__(self, greeting, persons):
        self.greeting = greeting
        self.persons = persons
        self.counter = 0

    def greet(self):
        print(f"{self.greeting}{''.join(f', {person}' for person in self.persons)}!")
        self.counter += 1

if __name__ == "__main__":
    # Initialize dbzero
    db0.init("./app-data", prefix="main")
    # Initialize the application's root object
    root = GreeterAppRoot("Hello", ["Michael", "Jennifer"])
    root.greet() # Output: Hello, Michael, Jennifer!
    print(f"Greeted {root.counter} times.")

The application state is persisted automatically; the same data will be available the next time the app starts. All objects are automatically managed by dbzero and there's no need for explicit conversions, fetching, or saving — dbzero handles persistence transparently for the entire object graph.

Core Concepts

Memo Classes

Transform any Python class into a persistent, automatically managed object by applying the @db0.memo decorator:

import dbzero as db0

@db0.memo
class Person:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

# Instantiation works just like regular Python
person = Person("Alice", 30)

# Attributes can be changed dynamically
person.age += 1
person.address = "123 Main St"  # Add new attributes on the fly

Collections

dbzero provides persistent versions of Python's built-in collections:

from datetime import date

person = Person("John", 25)

# Assign persistent collections to memo object
person.appointment_dates = {date(2026, 1, 12), date(2026, 1, 13), date(2026, 1, 14)}

person.skills = ["Python", "C++", "Docker"]

person.contact_info = {
    "email": "john@example.com",
    "phone": "+1-555-0100",
    "linkedin": "linkedin.com/in/john"
}

# Use them as usual
date(2026, 1, 13) in person.appointment_dates # True

person.skills.append("Kubernetes") 
print(person.skills) # Output: ['Python', 'C++', 'Docker', 'Kubernetes']

person.contact_info["github"] = "github.com/john"
person.contact_info["email"] # "john@example.com"

All standard operations are supported, and changes are automatically persisted.

Queries and Tags

Find objects using tag-based queries and flexible logic operators:

# Create and tag objects
person = Person("Susan", 31)
db0.tags(person).add("employee", "manager")

person = Person("Michael", 29)
db0.tags(person).add("employee", "developer")

# Find every Person by type
result = db0.find(Person)

# Combine type and tags (AND logic) to find employees
employees = db0.find(Person, "employee")

# OR logic using a list to find managers and developers
staff = db0.find(["manager", "developer"])

# NOT logic using db0.no() to find employees wich aren't managers
non_managers = db0.find("employee", db0.no("manager"))

Snapshots and Time Travel

Create isolated views of your data at any point in time:

person = Person("John", 25)
person.balance = 1500
# Keep the current state 
state = db0.get_state_num()
# Commit changes explicitely to advance the state immediately
db0.commit()

# Change the balance
person.balance -= 300
db0.commit()

print(f"{person.name} balance: {person.balance}") # John balance: 1200
# Open snapshot view with past state number
with db0.snapshot(state) as snap:
    past_person = db0.fetch(db0.uuid(person))
    print(f"{past_person.name} balance: {past_person.balance}") # John balance: 1500

Prefixes (Data Partitioning)

Organize data into independent, isolated partitions:

@db0.memo(singleton=True, prefix="/my-org/my-app/settings")
class AppSettings:
    def __init__(self, theme: str):
        self.theme = theme

@db0.memo(prefix="/my-org/my-app/data")
class Note:
    def __init__(self, content: str):
        self.content = content

settings = AppSettings(theme="dark") # Data goes to "settings.db0"
note = Note("Hello dbzero!")         # Data goes to "data.db0"

Indexes

Index your data for fast range queries and sorting:

from datetime import datetime

@db0.memo()
class Event:
    def __init__(self, event_id: int, occured: datetime):
        self.event_id = event_id
        self.occured = occured

events = [
    Event(100, datetime(2026, 1, 28)),
    Event(101, datetime(2026, 1, 30)),
    Event(102, datetime(2026, 1, 29)),
    Event(103, datetime(2026, 2, 1)),
]

# Create an index
event_index = db0.index()
# Populate with objects
for event in events:
    event_index.add(event.occured, event)

# Query events from January 2026
query = event_index.select(datetime(2026, 1, 1), datetime(2026, 1, 31))
# Sort ascending by date of occurance
query_sorted = event_index.sort(query)
print([event.event_id for event in query_sorted]) # Output: [100, 102, 101]

Scalability

dbzero provides tools to build scalable applications:

  • Data Partitioning - Split data across independent partitions (prefixes) to distribute workload
  • Distributed Transactions - Coordinate transactions across multiple partitions for data consistency
  • Multi-Process Support - Multiple processes can work with shared or separate data simultaneously, enabling horizontal scaling

These features give you the flexibility to design distributed architectures that fit your needs.

Use Cases

Our experience has proven that dbzero fits many real-life use cases, which include:

  • Web Applications - Unified state management for backend services
  • Data Processing Pipelines - Efficient and simple data preparation
  • Event-Driven Systems - Capturing data changes and time travel for auditing
  • AI Applications - Simplified state management for AI agents and workflows
  • Something Else? - Built something cool with dbzero? We'd love to see what you're working on—share it on our Discord server!

Why dbzero?

The short answer is illustrated by diagram below:

Traditional Stack

Application Code
    ↓
ORM Layer
    ↓
Caching Layer
    ↓
Database Layer
    ↓
Storage

With dbzero

Application Code + dbzero
    ↓
Storage

By eliminating intermediate layers, dbzero reduces complexity, improves performance, and accelerates development—all while providing the reliability and features you expect from a regular database system.

Documentation

Check our docs to learn more: docs.dbzero.io

There you can find:

  • Guides
  • Tutorials
  • Performance tips
  • API Reference

License

This project is licensed under the GNU Lesser General Public License v2.1 (LGPL 2.1). See LICENSE for the full text.

  • This library can be linked with proprietary software.
  • Modifications to the library itself must be released under LGPL 2.1.
  • Redistributions must preserve copyright and license notices and provide source.

For attribution details, see NOTICE.

Support

Feedback

We'd love to hear how you're using dbzero and what features you'd like to see! Your input helps us make dbzero better for everyone.

The best way to share your thoughts is through our Discord server: Join us on Discord

Commercial Support

Need help building large-scale solutions with dbzero?

We offer:

  • Tools for data export and manipulation
  • Tools for hosting rich UI applications on top of your existing dbzero codebase
  • System integrations
  • Expert consulting and architectural reviews
  • Performance tuning

Contact us at: info@dbzero.io


Start coding as if you have infinite memory. Let dbzero handle the rest.

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

dbzero-0.2.2.tar.gz (15.8 MB view details)

Uploaded Source

Built Distributions

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

dbzero-0.2.2-cp314-cp314-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

dbzero-0.2.2-cp313-cp313-win_amd64.whl (23.1 MB view details)

Uploaded CPython 3.13Windows x86-64

dbzero-0.2.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

dbzero-0.2.2-cp313-cp313-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

dbzero-0.2.2-cp312-cp312-win_amd64.whl (23.1 MB view details)

Uploaded CPython 3.12Windows x86-64

dbzero-0.2.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

dbzero-0.2.2-cp312-cp312-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

dbzero-0.2.2-cp311-cp311-win_amd64.whl (23.1 MB view details)

Uploaded CPython 3.11Windows x86-64

dbzero-0.2.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

dbzero-0.2.2-cp311-cp311-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

dbzero-0.2.2-cp310-cp310-win_amd64.whl (23.1 MB view details)

Uploaded CPython 3.10Windows x86-64

dbzero-0.2.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

dbzero-0.2.2-cp310-cp310-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

dbzero-0.2.2-cp39-cp39-win_amd64.whl (23.1 MB view details)

Uploaded CPython 3.9Windows x86-64

dbzero-0.2.2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

dbzero-0.2.2-cp39-cp39-macosx_15_0_arm64.whl (6.5 MB view details)

Uploaded CPython 3.9macOS 15.0+ ARM64

File details

Details for the file dbzero-0.2.2.tar.gz.

File metadata

  • Download URL: dbzero-0.2.2.tar.gz
  • Upload date:
  • Size: 15.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for dbzero-0.2.2.tar.gz
Algorithm Hash digest
SHA256 b9be46bd324a43dd0596e3aa671cae1bcfc0c2975727dc70089ab1dbb4834d06
MD5 dcef82b964ffa33c416d105168d5ccfa
BLAKE2b-256 873e1e9d4949571b2a566e5c6c6d7ea817eef9aced36ac708c86f858240bf080

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for dbzero-0.2.2-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 39ba394a52550ec094e3d0835094f07391121631aecea53f5b13b305c61de72a
MD5 da7abdc86a1ca92f297511b2b860d4c9
BLAKE2b-256 75b2e6ef4f47566dbd7c463ead2552efaeda5bf185100d50f8948297e37c2c88

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: dbzero-0.2.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 23.1 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for dbzero-0.2.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 37be40ce30c49449d3eea2cd88922e35607940426aeaf959a6e511a9c2986cb4
MD5 635810ac7f3b6651d99634a4b522a8a3
BLAKE2b-256 6b4154d16a2310bc697d6e2b806e3770ca23be429b1629f366d301005d3b8807

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dbzero-0.2.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4bb39fabe1cd6f546eb34e36cb619e8c6eaee2736c937517ffb15e1ed3f5204f
MD5 767b62ee92bd32d70cf32765d270feb6
BLAKE2b-256 78daa11e06ecc05a2ff776e33400d742f1dee02d864768cf72b688826dcfc368

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for dbzero-0.2.2-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 3d528f3457febd17ff5b84f87de0cb12bbe430cc7fd3fe621cbb7d955f19e1e0
MD5 d65d2ef8f73fd40d2360ab351850f2d3
BLAKE2b-256 66472bb9f712d3877e455f33d735e0ecf79e7f34a82fbeb627132e1d00f1754d

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: dbzero-0.2.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 23.1 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for dbzero-0.2.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 0d2d729e8f4a4dedccc0a2cd476dba88f8aacd27ba9e74682b24e55bf2730c57
MD5 a09843f6c10153aed82a98ece35e9edc
BLAKE2b-256 a960f087d3555ef8d0789fe481e81bf033a22371ce8d53633f81fbd457a68054

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dbzero-0.2.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 641b3b345c3c056e04e733b9b9ad96618a66252e522be419d4aceba74d7887ff
MD5 f5123fb282db3349c6771cd0422b065f
BLAKE2b-256 df03a76daa69c9d4a8a642a9969fc65049ff8494c527a348db0a588e9b496b80

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for dbzero-0.2.2-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 ad7f29dedbdcd79709a36975485cd2179ca0b0cdae26741f71214ace52d60603
MD5 cbd2007b5f36be60af27208bd3a3fc0e
BLAKE2b-256 3504e653961574e30bfda74bdb2cb3479e9096cb40d113b7d629f577de9dcd1c

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: dbzero-0.2.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 23.1 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for dbzero-0.2.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 046026a0f3de35d025f602225e077185752de04b93d150a6c36671c9539347e4
MD5 9b69665a7227d88846cba0558e86da57
BLAKE2b-256 5e8a7e656c2898599f3004f0af36d881e155afc1e1792dc5047ddfb89a0c3660

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dbzero-0.2.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c54247b12db4ad2ca9b1731e45cdc15f85c7d2faae7d501edd85b50ebcc78d0f
MD5 dc3792eafeae926cd47b91f992d8eafa
BLAKE2b-256 b73e0f399cc432ba3a9fdf38d7997855404d0876f454661369342170b6c433c6

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for dbzero-0.2.2-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 373bcf1b912bc2b97f2e5f38019ba0048bfff5942d8646498ab4f6d6384f3139
MD5 71bb5057d995fe9eec6c2364ebb78a2c
BLAKE2b-256 26138eb8222a2e45dfb642cbef99d733ffa8c164df4618a9b2caa2cc57430b46

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: dbzero-0.2.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 23.1 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for dbzero-0.2.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 4aeb62cccb7ddae8dad00d86272e0ad7bbd6eaa43db03b08569220ac2fc04ceb
MD5 1fd142cce9f8700151e5aa5c1c9395cc
BLAKE2b-256 57f1528bf4bcd5c29fdd961f968dfb4c3d4b7779e8df9d3dbbcaed79688a5464

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dbzero-0.2.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b9544850c2d6e8d4aeed0cc681b4387fc9458450191ff93cd6017a089d57d6af
MD5 83578c74b3d52d6e748ab8291d100482
BLAKE2b-256 bd0a85bdfe284042520b4e259d05eecbe56f29a64f8579a5f16d38487f6bce07

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for dbzero-0.2.2-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 dd688201a2229e31771a1ae3a1b74ebd69fb22afb288efdc3b600f6229306e07
MD5 5b29fc7dc62cebde5ef9cc64b246b509
BLAKE2b-256 817da6ba63bb466197609ad9e81e6d7e32f8cac069788531273dfba06c42091e

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: dbzero-0.2.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 23.1 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for dbzero-0.2.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 fb792424beb296d417ba4f8d60e2f5a361cee44ea9ed9be0f280017c462b2222
MD5 c1617315d7e044c05d112a5e0ba9edc2
BLAKE2b-256 45e9a6d8f00b3a5d5c59018aacc262852d43b65f99d8482ce16d393113e9090f

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for dbzero-0.2.2-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5c55514be4975604775f496a0e6c08a73bdce7c90e43a2400c282fd232ce5355
MD5 ce2213a744269fba3e0e2da73edbe47f
BLAKE2b-256 001cefb5301e25ce6d4277a5b083b54ca61c27f606da52527fda1da51c9971c1

See more details on using hashes here.

File details

Details for the file dbzero-0.2.2-cp39-cp39-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for dbzero-0.2.2-cp39-cp39-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 eae257c9f6998ba7d7d4208afb6e38cab80e7c9cab2c898dacec6a9438f571c4
MD5 9f7f81eb55939e951e077d47bfc7b67c
BLAKE2b-256 c2781bc2fe1c439821979cb231ae371bf01b883a4be6082c516d4999f2b16d86

See more details on using hashes here.

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