Skip to main content

chDB is an in-process SQL OLAP Engine powered by ClickHouse

Project description

Build X86 PyPI Downloads Discord Twitter

chDB

chDB is an in-process SQL OLAP Engine powered by ClickHouse [^1] For more details: The birth of chDB

Features

  • In-process SQL OLAP Engine, powered by ClickHouse
  • No need to install ClickHouse
  • Minimized data copy from C++ to Python with python memoryview
  • Input&Output support Parquet, CSV, JSON, Arrow, ORC and 60+more formats, samples
  • Support Python DB API 2.0, example

Arch

Get Started

Get started with chdb using our Installation and Usage Examples


Installation

Currently, chDB supports Python 3.8+ on macOS and Linux (x86_64 and ARM64).

pip install chdb

Usage

Run in command line

python3 -m chdb SQL [OutputFormat]

python3 -m chdb "SELECT 1,'abc'" Pretty

Data Input

The following methods are available to access on-disk and in-memory data formats:

🗂️ Query On File

(Parquet, CSV, JSON, Arrow, ORC and 60+)

You can execute SQL and return desired format data.

import chdb
res = chdb.query('select version()', 'Pretty'); print(res)

Work with Parquet or CSV

# See more data type format in tests/format_output.py
res = chdb.query('select * from file("data.parquet", Parquet)', 'JSON'); print(res)
res = chdb.query('select * from file("data.csv", CSV)', 'CSV');  print(res)
print(f"SQL read {res.rows_read()} rows, {res.bytes_read()} bytes, elapsed {res.elapsed()} seconds")

Pandas dataframe output

# See more in https://clickhouse.com/docs/en/interfaces/formats
chdb.query('select * from file("data.parquet", Parquet)', 'Dataframe')

🗂️ Query On Table

(Pandas DataFrame, Parquet file/bytes, Arrow bytes)

Query On Pandas DataFrame

import chdb.dataframe as cdf
import pandas as pd
# Join 2 DataFrames
df1 = pd.DataFrame({'a': [1, 2, 3], 'b': ["one", "two", "three"]})
df2 = pd.DataFrame({'c': [1, 2, 3], 'd': ["①", "②", "③"]})
ret_tbl = cdf.query(sql="select * from __tbl1__ t1 join __tbl2__ t2 on t1.a = t2.c",
                  tbl1=df1, tbl2=df2)
print(ret_tbl)
# Query on the DataFrame Table
print(ret_tbl.query('select b, sum(a) from __table__ group by b'))

🗂️ Query with Stateful Session

from chdb import session as chs

## Create DB, Table, View in temp session, auto cleanup when session is deleted.
sess = chs.Session()
sess.query("CREATE DATABASE IF NOT EXISTS db_xxx ENGINE = Atomic")
sess.query("CREATE TABLE IF NOT EXISTS db_xxx.log_table_xxx (x String, y Int) ENGINE = Log;")
sess.query("INSERT INTO db_xxx.log_table_xxx VALUES ('a', 1), ('b', 3), ('c', 2), ('d', 5);")
sess.query(
    "CREATE VIEW db_xxx.view_xxx AS SELECT * FROM db_xxx.log_table_xxx LIMIT 4;"
)
print("Select from view:\n")
print(sess.query("SELECT * FROM db_xxx.view_xxx", "Pretty"))

see also: test_stateful.py.

🗂️ Query with Python DB-API 2.0

import chdb.dbapi as dbapi
print("chdb driver version: {0}".format(dbapi.get_client_info()))

conn1 = dbapi.connect()
cur1 = conn1.cursor()
cur1.execute('select version()')
print("description: ", cur1.description)
print("data: ", cur1.fetchone())
cur1.close()
conn1.close()

🗂️ Query with UDF (User Defined Functions)

from chdb.udf import chdb_udf
from chdb import query

@chdb_udf()
def sum_udf(lhs, rhs):
    return int(lhs) + int(rhs)

print(query("select sum_udf(12,22)"))

Some notes on chDB Python UDF(User Defined Function) decorator.

  1. The function should be stateless. So, only UDFs are supported, not UDAFs(User Defined Aggregation Function).
  2. Default return type is String. If you want to change the return type, you can pass in the return type as an argument. The return type should be one of the following: https://clickhouse.com/docs/en/sql-reference/data-types
  3. The function should take in arguments of type String. As the input is TabSeparated, all arguments are strings.
  4. The function will be called for each line of input. Something like this:
    def sum_udf(lhs, rhs):
        return int(lhs) + int(rhs)
    
    for line in sys.stdin:
        args = line.strip().split('\t')
        lhs = args[0]
        rhs = args[1]
        print(sum_udf(lhs, rhs))
        sys.stdout.flush()
    
  5. The function should be pure python function. You SHOULD import all python modules used IN THE FUNCTION.
    def func_use_json(arg):
        import json
        ...
    
  6. Python interpertor used is the same as the one used to run the script. Get from sys.executable

see also: test_udf.py.

🗂️ Python Table Engine

Query on Pandas DataFrame

import chdb
import pandas as pd
df = pd.DataFrame(
    {
        "a": [1, 2, 3, 4, 5, 6],
        "b": ["tom", "jerry", "auxten", "tom", "jerry", "auxten"],
    }
)

chdb.query("SELECT b, sum(a) FROM Python(df) GROUP BY b ORDER BY b").show()

Query on Arrow Table

import chdb
import pyarrow as pa
arrow_table = pa.table(
    {
        "a": [1, 2, 3, 4, 5, 6],
        "b": ["tom", "jerry", "auxten", "tom", "jerry", "auxten"],
    }
)

chdb.query(
    "SELECT b, sum(a) FROM Python(arrow_table) GROUP BY b ORDER BY b", "debug"
).show()

Query on chdb.PyReader class instance

  1. You must inherit from chdb.PyReader class and implement the read method.
  2. The read method should:
    1. return a list of lists, the first demension is the column, the second dimension is the row, the columns order should be the same as the first arg col_names of read.
    2. return an empty list when there is no more data to read.
    3. be stateful, the cursor should be updated in the read method.
  3. An optional get_schema method can be implemented to return the schema of the table. The prototype is def get_schema(self) -> List[Tuple[str, str]]:, the return value is a list of tuples, each tuple contains the column name and the column type. The column type should be one of the following: https://clickhouse.com/docs/en/sql-reference/data-types
import chdb

class myReader(chdb.PyReader):
    def __init__(self, data):
        self.data = data
        self.cursor = 0
        super().__init__(data)

    def read(self, col_names, count):
        print("Python func read", col_names, count, self.cursor)
        if self.cursor >= len(self.data["a"]):
            return []
        block = [self.data[col] for col in col_names]
        self.cursor += len(block[0])
        return block

reader = myReader(
    {
        "a": [1, 2, 3, 4, 5, 6],
        "b": ["tom", "jerry", "auxten", "tom", "jerry", "auxten"],
    }
)

chdb.query(
    "SELECT b, sum(a) FROM Python(reader) GROUP BY b ORDER BY b"
).show()

see also: test_query_py.py.

Limitations

  1. Column types supported: pandas.Series, pyarrow.array, chdb.PyReader
  2. Data types supported: Int, UInt, Float, String, Date, DateTime, Decimal
  3. Python Object type will be converted to String
  4. Pandas DataFrame performance is all of the best, Arrow Table is better than PyReader

For more examples, see examples and tests.


Demos and Examples

Benchmark

Documentation

Events

Contributing

Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are greatly appreciated. There are something you can help:

  • Help test and report bugs
  • Help improve documentation
  • Help improve code quality and performance

Bindings

We welcome bindings for other languages, please refer to bindings for more details.

License

Apache 2.0, see LICENSE for more information.

Acknowledgments

chDB is mainly based on ClickHouse [^1] for trade mark and other reasons, I named it chDB.

Contact


[^1]: ClickHouse® is a trademark of ClickHouse Inc. All trademarks, service marks, and logos mentioned or depicted are the property of their respective owners. The use of any third-party trademarks, brand names, product names, and company names does not imply endorsement, affiliation, or association with the respective owners.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

chdb-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (108.0 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

chdb-2.0.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (134.8 MB view details)

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

chdb-2.0.3-cp312-cp312-macosx_11_0_arm64.whl (73.6 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

chdb-2.0.3-cp312-cp312-macosx_10_15_x86_64.whl (92.1 MB view details)

Uploaded CPython 3.12 macOS 10.15+ x86-64

chdb-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (108.0 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

chdb-2.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (134.8 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

chdb-2.0.3-cp311-cp311-macosx_11_0_arm64.whl (73.6 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

chdb-2.0.3-cp311-cp311-macosx_10_15_x86_64.whl (92.1 MB view details)

Uploaded CPython 3.11 macOS 10.15+ x86-64

chdb-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (108.0 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

chdb-2.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (134.8 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

chdb-2.0.3-cp310-cp310-macosx_11_0_arm64.whl (73.6 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

chdb-2.0.3-cp310-cp310-macosx_10_15_x86_64.whl (92.1 MB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

chdb-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (108.0 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

chdb-2.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (134.8 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

chdb-2.0.3-cp39-cp39-macosx_11_0_arm64.whl (73.6 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

chdb-2.0.3-cp39-cp39-macosx_10_15_x86_64.whl (92.1 MB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

chdb-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (108.0 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

chdb-2.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (134.8 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

chdb-2.0.3-cp38-cp38-macosx_10_15_x86_64.whl (92.1 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

File details

Details for the file chdb-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3f0949717e792ba3b02afcb6824a90d7c3f72ec2149c1b4cc2dc1fc6464c5e66
MD5 4ed9f5fcc6fce0f4488ebe502401c7ca
BLAKE2b-256 9ede168e4850cbc3afa312938458732a4591cb5fd7c846ee3f4d260b80a3c85e

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6dcfd3b010d2a65ff0ca983b596a07d636fb4daf3cbd7c195612331aa1eb8fb4
MD5 42c4b5f175d0fc1f03fc49e0028e3652
BLAKE2b-256 e173b1b1934d5bf70f8979e0dcc0d9ee70aaa710d2d9e620663beca68c15171a

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8b41833f933038354ea3b2465717217b94260ec616711cbab1ac9a364febb5fa
MD5 23e117082f14311afdc645b33474005d
BLAKE2b-256 aca6f6e2b5300b45f222aae0a6b7eecb7af719b678d37975370149eb3ed88978

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp312-cp312-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 42deaae7d4429a51511eb8cca0cd9066927d15ad3332a79e6cb12f36b0a53420
MD5 1fef7386c35983239a2082c6b56c74ea
BLAKE2b-256 2f167d01685c69677cd9ebea997db1b973d22db6b621a2b2d28af3e218395a3f

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6d8f50bac7924d5607aece137b375bc6bf48c18f4c52d7298c8a3dc0fbe9af9a
MD5 5bdab34ec6d26e87f65500154a003f38
BLAKE2b-256 020ba63585b187787f990ba1b1dad67ebfa6b2183278ac99d9cd46725531135e

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1afa8c0582614a83b348117947e29b7637aa479f59ba6c7bc636c2e23d789424
MD5 327a9e19bc2ef662b55b6df31677c3cd
BLAKE2b-256 9e46984735ce3cc2b900d6c149532c410d35fba78f9d59a563b1d7cbfb4bea14

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e47546b7755f9fa3ac5edcb4e48fe3b48016330ba792411fbb67348bfcade20c
MD5 9045a8e5b4350a66dfc824019b3ff6e3
BLAKE2b-256 c1d91c8e7d3993b2106de5566b05d7154dadacbaef84396f80d96cd896a6f0a6

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp311-cp311-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 33e0baacac8f35338a7d9555978d20185ee79f50e5f37f7fb28496aa1fe657ea
MD5 ba44fcf368a8b726b43a7f445ec12208
BLAKE2b-256 c42913fb5a2bf65d476fe4a6836a6e6920582724ecb566e3c79dab3c6768b087

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c24f143ca7b6f571c47c0a5fd1509c7609e427436e141083936d54fcfb251eb5
MD5 f2830761f0619e99fec8b6d8fa568472
BLAKE2b-256 98e61c5ae5e841e284d4846172919baf07849fe6dbd91d6fd264b7e06dbd8c15

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e4c5b6ff545e41ac940f7882bd3fa004b6d0edf74bff35e132edd524b04a0c4b
MD5 56096df4f6c555bf1d83a7a0fda45245
BLAKE2b-256 e16aee2b2d1918fb9fa7f140fd517d7cf50530a9c26ff805c1b2b196e09c84da

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b89427dba0ba95d1f06979fe3a16a5e1b4689889d2870f4772cc6d5d0cc938c3
MD5 566bf57d58e8a5bff151a9a27d0e778d
BLAKE2b-256 370074f20d9ef666f117d54b38e0050656caac5dd846c25396dc47aa3d400e30

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 9476d6b3ef432b069306e8827c04e1d604f43b96c498c14132eedfd6b7ab1870
MD5 007826f5e8f7636df53cd1ee86c1bafc
BLAKE2b-256 86edecddac9ff2eb17b707bc43905fd27dcbc0a0c6d42ac5a4ef33d41fe8786c

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 81976f07c16efee41a4d4c444e8bef53caf55cd1359df9043dea06e7964cefd7
MD5 a90d61f52e4f037d669778614fbe4e76
BLAKE2b-256 a86757d3a0f63ef4f78e5064ee6d49cc9854dbea2ff5b7dd74131c696cc0989a

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 04ee4d6e042d91d9a7dfd834cdae862dd66c8f80561b1fa9bc8ada33c61d0047
MD5 ac6d251b188eb7a93a86d0929d0c3820
BLAKE2b-256 e2f4a0bfdc15777628c81acdf4111b9f3e2b7f59500a31b5c5f89cfb134ffcec

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8c854f4d97e8e0eb346452732abecd579336e5dc186c2f823917928a6456a811
MD5 8636f9a766654e604b88d38070d25c82
BLAKE2b-256 230a31f9768bd141eee5d5987305366b823de52573bd2cc7bbb1e3e7692b72e6

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 07a4f99bec85703a5f21b2059e96f9a505c8bed9bcc038aa89e66f0df16039df
MD5 7be54ad1c5fa00c3ffb36dd069d49ec4
BLAKE2b-256 d53ba10da7b1d089e3318f6be742a5d3da6d0a3abad5c42c7f1b37da87ef3a8c

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d9ac3e681ec4cecd63a3d6c8239c7660895b267d2bf97e326546c7d196b8746a
MD5 3284a06388ec0391fff4ba2d36ed273a
BLAKE2b-256 3f6a28447cb83a08e50a1375bda3cbf0f844ad9aa75c6fc5763ecbefbe07a3ca

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fc9ba7cdd97992549a2cdcd15a2e5bd29371430608f6f3afdebf4d7348e26008
MD5 221d769370254820e3370f0c41a311aa
BLAKE2b-256 3551a84e0b18926dfbd02e08c9097b72355efe4ba1d5e4f1f0299f3bffb81c50

See more details on using hashes here.

File details

Details for the file chdb-2.0.3-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for chdb-2.0.3-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 74d06fabb8d1426da323beeb9f7401df2bd0df16ba65465a85330c448cbe54ee
MD5 733a170204acbf964136f73427a41208
BLAKE2b-256 d7b4a67cb2e5e85adecca761343a99b8758b06d74776cb6bffe43e861a7360c3

See more details on using hashes here.

Supported by

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