Skip to main content

Fast MySQL driver build in Cython (Sync and Async).

Project description

Fast MySQL driver build in Cython (Sync and Async).

Created to be used in a project, this package is published to github for ease of management and installation across different modules.

Installation

Install from PyPi

pip install sqlcycli

Install from github

pip install git+https://github.com/AresJef/SQLCyCli.git

For Linux systems, if you encounter the following error when installing the SQLCyCli dependency mysqlclient:

Exception: Can not find valid pkg-config name.
Specify MYSQLCLIENT_CFLAGS and MYSQLCLIENT_LDFLAGS env vars manually

Try the following to fix dependency issue (source: Stack Overflow):

sudo apt-get install pkg-config python3-dev default-libmysqlclient-dev build-essential

Requirements

  • Python 3.10 or higher.
  • MySQL 5.5 or higher.

Features

  • Written in Cython for optimal performance (especially for SELECT/INSERT query).
  • All classes and methods are well documented and static typed.
  • Supports both Sync and Async connection to the server.
  • API Compatiable with PyMySQL and aiomysql.
  • Support conversion (escape) for most of the native python types, and objects from libaray numpy and pandas. Does NOT support custom conversion (escape).

Benchmark

The following result comes from benchmark:

  • Device: MacbookPro M1Pro(2E8P) 32GB
  • Python: 3.12.4
  • MySQL: 8.3.0
  • mysqlclient: 2.2.4
  • PyMySQL: 1.1.1
  • aiomysql: 0.2.0
  • asyncmy: 0.2.9
# Unit: second | Lower is better
name        type    rows    insert-per-row  insert-bulk select-per-row  select-all
mysqlclient sync    50000   1.730551        0.417242    1.738128        0.119030
SQLCyCli    sync    50000   2.342858        0.291653    2.491601        0.063667
PyMySQL     sync    50000   2.759374        0.424672    4.538553        0.328897
SQLCyCli    async   50000   3.619818        0.292900    4.608713        0.143482
aiomysql    async   50000   3.762054        0.404407    5.547093        0.331927
asyncmy     async   50000   4.026993        0.416270    5.996335        0.324749
# Unit: second | Lower is better
name        type    rows    update-per-row  update-all  delete-per-row  delete-all
mysqlclient sync    50000   1.823490        0.349495    1.585233        0.108128
SQLCyCli    sync    50000   2.478617        0.357437    2.240017        0.111638
PyMySQL     sync    50000   2.845172        0.358968    2.533066        0.111986
SQLCyCli    async   50000   3.651250        0.363093    3.625302        0.110497
aiomysql    async   50000   3.880559        0.358837    3.671028        0.105743
asyncmy     async   50000   3.999616        0.361256    3.801010        0.106062

Usage

Use connect() to create one connection (Sync or Async) to the server.

import asyncio
import sqlcycli

HOST = "localhost"
PORT = 3306
USER = "root"
PSWD = "password"

# Synchronous Connection
def test_sync_connection() -> None:
    with sqlcycli.connect(HOST, PORT, USER, PSWD) as conn:
        with conn.cursor() as cur:
            cur.execute("SELECT 1")
            res = cur.fetchone()
            assert res == (1,)
    # Connection closed
    assert conn.closed()

# Asynchronous Connection
async def test_async_connection() -> None:
    async with sqlcycli.connect(HOST, PORT, USER, PSWD) as conn:
        async with conn.cursor() as cur:
            await cur.execute("SELECT 1")
            res = await cur.fetchone()
            assert res == (1,)
    # Connection closed
    assert conn.closed()

if __name__ == "__main__":
    test_sync_connection()
    asyncio.run(test_async_connection())

Use create_pool() to create a Pool for managing and maintaining Async connections to the server.

import asyncio
import sqlcycli

HOST = "localhost"
PORT = 3306
USER = "root"
PSWD = "password"

# Pool (Context Manager: Connected)
async def test_pool_context_connected() -> None:
    async with sqlcycli.create_pool(HOST, PORT, USER, PSWD, min_size=1) as pool:
        # Pool is connected: 1 free connection (min_size=1)
        assert not pool.closed() and pool.free == 1
        async with pool.acquire() as conn:
            async with conn.cursor() as cur:
                await cur.execute("SELECT 1")
                res = await cur.fetchone()
                assert res == (1,)
    # Pool closed
    assert pool.closed() and pool.total == 0

# Pool (Context Manager: Disconnected)
async def test_pool_context_disconnected() -> None:
    with sqlcycli.create_pool(HOST, PORT, USER, PSWD, min_size=1) as pool:
        # Pool is not connected: 0 free connection (min_size=1)
        assert pool.closed() and pool.free == 0
        # Connect automatically
        async with pool.acquire() as conn:
            async with conn.cursor() as cur:
                await cur.execute("SELECT 1")
                res = await cur.fetchone()
                assert res == (1,)
        # 1 free connection
        assert pool.free == 1
    # Pool closed
    assert pool.closed() and pool.total == 0

# Pool (Create Directly: Connected)
async def test_pool_direct_connected() -> None:
    pool = await sqlcycli.create_pool(HOST, PORT, USER, PSWD, min_size=1)
    # Pool is connected: 1 free connection (min_size=1)
    assert not pool.closed() and pool.free == 1
    async with pool.acquire() as conn:
        async with conn.cursor() as cur:
            await cur.execute("SELECT 1")
            res = await cur.fetchone()
            assert res == (1,)
    # Close pool manually
    await pool.close()
    assert pool.closed() and pool.total == 0

if __name__ == "__main__":
    asyncio.run(test_pool_context_connected())
    asyncio.run(test_pool_context_disconnected())
    asyncio.run(test_pool_direct_connected())

Acknowledgements

SQLCyCli is build on top of the following open-source repositories:

SQLCyCli is based on the following open-source repositories:

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

sqlcycli-1.0.3.tar.gz (2.6 MB view details)

Uploaded Source

Built Distributions

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

sqlcycli-1.0.3-cp312-cp312-win_arm64.whl (3.7 MB view details)

Uploaded CPython 3.12Windows ARM64

sqlcycli-1.0.3-cp312-cp312-win_amd64.whl (3.9 MB view details)

Uploaded CPython 3.12Windows x86-64

sqlcycli-1.0.3-cp312-cp312-musllinux_1_1_x86_64.whl (11.4 MB view details)

Uploaded CPython 3.12musllinux: musl 1.1+ x86-64

sqlcycli-1.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

sqlcycli-1.0.3-cp312-cp312-macosx_11_0_arm64.whl (4.0 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

sqlcycli-1.0.3-cp312-cp312-macosx_10_9_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.12macOS 10.9+ x86-64

sqlcycli-1.0.3-cp312-cp312-macosx_10_9_universal2.whl (5.5 MB view details)

Uploaded CPython 3.12macOS 10.9+ universal2 (ARM64, x86-64)

sqlcycli-1.0.3-cp311-cp311-win_arm64.whl (3.7 MB view details)

Uploaded CPython 3.11Windows ARM64

sqlcycli-1.0.3-cp311-cp311-win_amd64.whl (3.9 MB view details)

Uploaded CPython 3.11Windows x86-64

sqlcycli-1.0.3-cp311-cp311-musllinux_1_1_x86_64.whl (11.6 MB view details)

Uploaded CPython 3.11musllinux: musl 1.1+ x86-64

sqlcycli-1.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

sqlcycli-1.0.3-cp311-cp311-macosx_11_0_arm64.whl (4.0 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

sqlcycli-1.0.3-cp311-cp311-macosx_10_9_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

sqlcycli-1.0.3-cp311-cp311-macosx_10_9_universal2.whl (5.5 MB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)

sqlcycli-1.0.3-cp310-cp310-win_arm64.whl (3.7 MB view details)

Uploaded CPython 3.10Windows ARM64

sqlcycli-1.0.3-cp310-cp310-win_amd64.whl (3.9 MB view details)

Uploaded CPython 3.10Windows x86-64

sqlcycli-1.0.3-cp310-cp310-musllinux_1_1_x86_64.whl (10.8 MB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ x86-64

sqlcycli-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (10.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

sqlcycli-1.0.3-cp310-cp310-macosx_11_0_arm64.whl (4.0 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

sqlcycli-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

sqlcycli-1.0.3-cp310-cp310-macosx_10_9_universal2.whl (5.5 MB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)

File details

Details for the file sqlcycli-1.0.3.tar.gz.

File metadata

  • Download URL: sqlcycli-1.0.3.tar.gz
  • Upload date:
  • Size: 2.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for sqlcycli-1.0.3.tar.gz
Algorithm Hash digest
SHA256 412d36ed94054773d09b72c565b7e3c2b3764cabdd67d52649c14fe8f6fe10d1
MD5 b40d7f6b25af9ac1d8930556f0337f61
BLAKE2b-256 1efc9cb28416c04dae19950ae3fbc26d110ba190c28e685c7105c80ec01d5d93

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp312-cp312-win_arm64.whl.

File metadata

  • Download URL: sqlcycli-1.0.3-cp312-cp312-win_arm64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.12, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for sqlcycli-1.0.3-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 e6a8095bcad7737415f7803e0904f75f6f6b2004bfd096c23fa7f4ad4816861f
MD5 68f4b7115249a9ffae04c7ecc55545ee
BLAKE2b-256 ab1e3506a79fc0c4f0020ed7af77d318fac82b8569e73f56390d55d82cf3bf29

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: sqlcycli-1.0.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 3.9 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for sqlcycli-1.0.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 621c41fa12fc57e2f6b4a30a0b4819b31ae1fef2294a078d446d58fbd9e5766f
MD5 b6fda20cd83b534605beb47765834dad
BLAKE2b-256 1bc8e758ec3eeb5c1d52f3eb2f454bd3ec6094899d5db414c7b1b76c0c66e024

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp312-cp312-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp312-cp312-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 91e67f916cc5ab9c2533a82302e6e86ea51bc8d3e3e3bd64e5ed0f0006693999
MD5 53421766d9eee779714a5aa03963cdb7
BLAKE2b-256 228b58d9dde9ea54f56563558aae7bc2e0651eca402a915365880b09d824bb8f

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 705e296021f77bbb170b59c1d4565342ecfd940975fad82e1179c47a00dde740
MD5 e59fd53cef6d1d08b1ae17b9093d3d07
BLAKE2b-256 3a8821dc6d423d5379854ea0c1a880a56246845adb94f81ee360f03818d0598c

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a718a3acebec6f6adb0f893ab5f811e948c41804f6cf6b74604047fd1f4490f1
MD5 78e25392fa31d922e127f6c22c0a90e3
BLAKE2b-256 54f3e460d62693cb00615fef976467840f56545b5dd13589e9a6d9ba8b880709

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2d610ee0bef7b97f094ec724286c3e046e7fd593535608a99f130b4820ba443f
MD5 eb1195f4baf81af12bfcd010b8a2f148
BLAKE2b-256 d403c2e3788759b90d59a975211c0b7e3c67e7c877fd54bd504dde66bdfe44e5

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp312-cp312-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp312-cp312-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 b4175e223ebdddf6a5378849c94c4b56dce7828238a6ff4fb1ccbf7e36e25a30
MD5 0bb1742c86273c2a57534266eac7dab6
BLAKE2b-256 8033d9dc1d0e82ea12713298e73d0a24613bca86b3683df7b15eba3ed52d5770

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp311-cp311-win_arm64.whl.

File metadata

  • Download URL: sqlcycli-1.0.3-cp311-cp311-win_arm64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.11, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for sqlcycli-1.0.3-cp311-cp311-win_arm64.whl
Algorithm Hash digest
SHA256 61cf70cf0eade2b73f17f75d04dc009ad32d3759dda9075314601e8aeaf11eb5
MD5 7fb8777e0ed1f450532d481c844939b1
BLAKE2b-256 b815e6ff50fcea38b1303c02512195097d71f08aa3b38be54d77c3b5b843a978

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: sqlcycli-1.0.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 3.9 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for sqlcycli-1.0.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 24ac843e2765713971bc65fb931f02e6c2abca32e83951a023fa12d46243e610
MD5 a4f6d53708b8439dc407238f2b31a93c
BLAKE2b-256 300783d01a4d945adc65bfb3d9d0e6b329dffd96515563dd41a4a0fc549ddd4c

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp311-cp311-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 0d73c297301183439e87218fbd12e11fae87484e09b2c21691ed6c146614c419
MD5 7a344fec2642ef8909c6ac958a787cb9
BLAKE2b-256 c427366753b68fe866532f265bfcdc54357173b1bc760a477ee873bc2408615e

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ec4e705143a36c5044e8febb27d3cfc59ac7eb72e3f4d8279e5a3b57b1f504f3
MD5 34e4e17a1f86e86e3577bfa1f28558c8
BLAKE2b-256 9bb59f3e89fe6676f2c28cd3a6f66835979954c385d785e2eb2a12f3583ca53e

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ac066296a2f18951242e27ae0edcd5ecb448b6303f242e86e4b29928a60f89a0
MD5 402e6d43adf95fdeb476a4e67adfae30
BLAKE2b-256 a0303e261c1dc9bbfa6d20ad9fb43bc00322bde2b9855739e0237cd0c76efe85

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ad85d898ec3706ce5fc37f46206491186120b763f8ccbd84f2016fe382a83d9a
MD5 4d1bd1cf049f365633692f1ea40a816d
BLAKE2b-256 3ccdce3441c7ec66aef29883dad20027aa627533391ecd0d54d83fed477bdfca

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 a9a798fc0fbd72206a08e444836aace3fab5cca70b352dea0565b30610b9b0c0
MD5 42af9177d1730f95f9f04bb07722d6e5
BLAKE2b-256 5f62187a7cc61845a730e8813b8b8e7eeb544ef6c2136c2bcaa17641e5967f62

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp310-cp310-win_arm64.whl.

File metadata

  • Download URL: sqlcycli-1.0.3-cp310-cp310-win_arm64.whl
  • Upload date:
  • Size: 3.7 MB
  • Tags: CPython 3.10, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for sqlcycli-1.0.3-cp310-cp310-win_arm64.whl
Algorithm Hash digest
SHA256 90c3ef15730d2684fc1c0914a250e4ed0c9e06dcfcff4a5d727fc947e3457f77
MD5 0f5b235c023940f5019174debed000ab
BLAKE2b-256 77edd605c42272520052fff3b87b07614997bf6eeb71badb186d5d9b60f7f200

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: sqlcycli-1.0.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 3.9 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for sqlcycli-1.0.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1e6652bf10f539c8c058431f56d8afcd457b6afdc2a5dd710fe8463134368ad8
MD5 dfcc55c147a54a09ba90b707977fecc7
BLAKE2b-256 01d520b89e850e1c88a5fc62bae53a62f34b6416226546cafda6a956ee47c0ec

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 37f875ff841763a9a7f64c3ff3bbf3ea855cd65563ca247c31720517444b185b
MD5 1e2c07c38c9cfd79c1cfde25385044c5
BLAKE2b-256 bed29d774cb6665597d5820ebfdee18d9d2e569b39976d9f09d249dce09e37be

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 eae008ceed26cb9f82de3b4c417dee9fe39146f118a032d537d976faa3ba972d
MD5 af4d7bab45e2ea60822b5445d114d81f
BLAKE2b-256 1792c11b74a5b5af43137c5515f19be9177810c983f3fc375d864ec716693fdb

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 569cc91d7d2eb91bec2df9e6816d736ec8695228327229b4a4cc2efd607a9e42
MD5 175e65592fbd7803fe759526411d4fbd
BLAKE2b-256 3ecdddd9a9d777112ca7c5fc62479f948a682cab433f704eda57a1194d1959ce

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ef1471d71d572d7643f06b699837a2412255e62b8fdee08301dd63a217a32513
MD5 b8be2104b0977da55598eccafe64093f
BLAKE2b-256 146a48fd9fd7f1fea58c8327a9290645706bbf55017ce3056abc502596553c34

See more details on using hashes here.

File details

Details for the file sqlcycli-1.0.3-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for sqlcycli-1.0.3-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 00f04067a4a04aaeab884badcad26f55b5fe84bdeb395abec9dee0dbba0f57ce
MD5 f7f05bb9cd0b6c5aa6aad1a13508811a
BLAKE2b-256 fc826c005eeced6b13410119e9d895b82fcd165730d0033ef14442e9b5544dd8

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