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.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (109.3 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

chdb-2.0.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (136.2 MB view details)

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

chdb-2.0.4-cp312-cp312-macosx_11_0_arm64.whl (75.2 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

chdb-2.0.4-cp312-cp312-macosx_10_15_x86_64.whl (93.9 MB view details)

Uploaded CPython 3.12 macOS 10.15+ x86-64

chdb-2.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (109.3 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

chdb-2.0.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (136.2 MB view details)

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

chdb-2.0.4-cp311-cp311-macosx_11_0_arm64.whl (75.2 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

chdb-2.0.4-cp311-cp311-macosx_10_15_x86_64.whl (93.9 MB view details)

Uploaded CPython 3.11 macOS 10.15+ x86-64

chdb-2.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (109.3 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

chdb-2.0.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (136.2 MB view details)

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

chdb-2.0.4-cp310-cp310-macosx_11_0_arm64.whl (75.2 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

chdb-2.0.4-cp310-cp310-macosx_10_15_x86_64.whl (93.9 MB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

chdb-2.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (109.3 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

chdb-2.0.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (136.2 MB view details)

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

chdb-2.0.4-cp39-cp39-macosx_11_0_arm64.whl (75.2 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

chdb-2.0.4-cp39-cp39-macosx_10_15_x86_64.whl (93.9 MB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

chdb-2.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (109.3 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

chdb-2.0.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (136.2 MB view details)

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

chdb-2.0.4-cp38-cp38-macosx_10_15_x86_64.whl (93.9 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

File details

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

File metadata

File hashes

Hashes for chdb-2.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 510ea9804426046cf3dbc6aab53bc6e6f5196f96ca5f01d2955b380bb7f4742e
MD5 580253eeb77dfb5fa14f165409e7da4e
BLAKE2b-256 8bff3233b2fa0482113ad289a18e6e53c35ef353a990cdaca057e0e83c35de26

See more details on using hashes here.

File details

Details for the file chdb-2.0.4-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.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3e8bc83b257fac054c7a3a2e08daf0d59a0c689d1b8cb36883371cbe45d87d6f
MD5 7ff2cb64b22d4ebc27098b275b73f686
BLAKE2b-256 fdffc6198f5c30c35bab501ef7f2c062a86c45ff4f65c0439ad2292df2d3f3e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for chdb-2.0.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 06fa514f02a196c0c4abb87b597a95280005c7ce5dfc2d9bb0c9c1fab135f8b9
MD5 9150cbffa5d4d9bc1b53f34291530aca
BLAKE2b-256 1ebc9b47d8c5c4a5ff489bc1661ec45175bb68c2881e52e26b408d1ec48a94e7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for chdb-2.0.4-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 d290c6e940d464a5dd742cc6298a74df919e2206d19dafbc0745e4dad9c8c673
MD5 69c86922df7ba7baf7113c587b7ce90d
BLAKE2b-256 1ef392fbe1d4db7c632fd07eecacaf3e6e0992f2f42fb4f9b873ac6d7e0ea6ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for chdb-2.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 095ade0ffdae853ba43b6961de873ae07ceba9d5afe3cfd59e2c0351bb14c805
MD5 d004a5f734c04e67e4b50ba8392891dd
BLAKE2b-256 a2ae72bea78bae3ac4b3dd441852e012e94c85b8b88b7a1933f6c5adb237ea69

See more details on using hashes here.

File details

Details for the file chdb-2.0.4-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.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f2881e588ec1bb0086188119b2f2eb4a1d01e71b9546969d25b90538afd5d7f3
MD5 654cae515695901728082c5607914e2a
BLAKE2b-256 85a582d92878605444a29fa96a48905c28a2c570a262659e42938fd93b29cfd0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for chdb-2.0.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6b8c9072741c4edfc09e9f0bddfd957174f740d474a99b0f5a892c2d78684b5f
MD5 87d66297e19d78ed1975271824961c21
BLAKE2b-256 b97d43827608dfda0be36bc6377ebcb7b8eb3c48a1fc08b6e30669893205516f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for chdb-2.0.4-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 a9449bc4cf70069ce13e03a5d9ac6cb8c3d31309fe945f3d6a71d10a6439b218
MD5 17b1385530d5d98cfa0dd49602893877
BLAKE2b-256 840327062551798983f8c3255eb9bb822eb6d54a000bfa09eb45a17b6b2782c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for chdb-2.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4c4767e8c2f66393eb407a76b854554e9bee6eedc18f3f57d2c0e6b407860b0d
MD5 fc9449d48c5ae4dfd03c0303056b725e
BLAKE2b-256 3044b74592239d489f05f12ea68c5f04489441071a3b0519a0131bf3d04ed661

See more details on using hashes here.

File details

Details for the file chdb-2.0.4-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.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 32743a1f0c40c544ef636db37ff70925a1176e621667d2c7b1aa6bb16aea0672
MD5 3d66cd88410de63a92d248fbf7ca70c1
BLAKE2b-256 f146b1bd9bbe591ad5ab9621ede166ce94ac1dc039f98e8d15d68bb3d96f1b8b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for chdb-2.0.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c683e995606580ae63366246f44108a1ff56fb1f6b1bd24505470fd729fdcf42
MD5 02a16d171b74c7f4d682d83db67505a7
BLAKE2b-256 0adb0a2c7d012fbbe83f77dc6b64b05b35e18663a7b2791ce2495f7523bddd9e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for chdb-2.0.4-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 bc52beaa2ada672e4d39cb61743c7cdc87a16ec42fe3e4a603afcd24bf85205c
MD5 b994f9363372b1316c1eea856aaff50d
BLAKE2b-256 6e2c8ccb155dd2a71812e1797b5f54657e265b42a58fa0ef4763601db15d6fa0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for chdb-2.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 217b96bfd7d3ce5c79f5d99ea6b6e5456d69574af7ff626260ea58f1e906f573
MD5 57431ac5a8a97d679fc9a38a34ff3e0d
BLAKE2b-256 ace41c5ed4e042293e048e4072d346dcd956305f77db78e4d9c19577b08c6ab7

See more details on using hashes here.

File details

Details for the file chdb-2.0.4-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.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ee45649d7c23a2527a7cdee231b4b977db206005c4727bdb9a64d3e429ddaaaa
MD5 8d19d3b836d35af61dc490ed409d74aa
BLAKE2b-256 feb88b9f6879be77abc33ae4d6c5fa9f82ff499a40a75f5bb12e66803bbbb294

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for chdb-2.0.4-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0c3ae22a51d0ead07eed80381f5b2e382a119fc37ddd603eeb7d1e38daa92fcb
MD5 0b2373e6871296a33090b3cd13d9583d
BLAKE2b-256 1cb36f5672bb44de8b621b7d555336e9add6861879bb41103bd65e5e5afe5f52

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for chdb-2.0.4-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 027445cecc2ce5b3bc543192dc38660536602248ea26efa8e9f4eb50a9fa76b5
MD5 be82bde7f0153fb5398cf32f325b1344
BLAKE2b-256 956cb8f815159b55909a4df42ca7f1e5ff572de5b770e3d0aa68998494243910

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for chdb-2.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b06b3f09d3725877240a01320178e993f2d6a9ea86c024cc56c545fa65a04095
MD5 82f527d3d7bfc07ec2ce47bf51cd0724
BLAKE2b-256 ccc58fac721dfe3a22a238ab15f8f4367f92aa471f25d1f7c5803cd614f63182

See more details on using hashes here.

File details

Details for the file chdb-2.0.4-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.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6532ebad0c947da1cb2b7d769a6e8eba12df541dd4bc955638ae7dd68daffba5
MD5 aead6ff4c5d26dce0e9b5f20966d8d4f
BLAKE2b-256 281fe44ac61680d8a6bd54ef56157db3a8936fa6e3f739fa87d3ebbafbd12d89

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for chdb-2.0.4-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 57b408ddcde1038cfbfceac25bb66450e48ec35f05b7bd502838fbcc455f6b93
MD5 fb08b6693159e5f7f6baf38290c6e809
BLAKE2b-256 953c115b68dfcb2df64d6ba0a294168f92fdf45f3ac8e49a674704f36b46bda4

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