Skip to main content

Python interface to JAGS for Bayesian analysis via MCMC

Project description

PyJAGS: The Python Interface to JAGS

CI PyPI Python License codecov

PyJAGS provides a Python interface to JAGS (Just Another Gibbs Sampler), a mature engine for Bayesian analysis via Markov Chain Monte Carlo (MCMC) simulation.

Why PyJAGS?

No compilation step. JAGS interprets models at runtime. Change your model code and re-run immediately, with no C++ compiler toolchain required. Stan models can take 30-60+ seconds to compile; JAGS models are ready in milliseconds.

Handles models that gradient-based samplers cannot. JAGS works with non-differentiable likelihoods, discrete parameters, mixture models, and change-point models that challenge HMC/NUTS. No divergence diagnostics to fight.

Incremental sampling is built in. JAGS retains chain state between sample() calls, so extending a run is a single line of code. No other Python Bayesian package makes this as natural.

Familiar model syntax. JAGS uses the BUGS language, the lingua franca of Bayesian modeling in the R ecosystem (WinBUGS, OpenBUGS, nimble). R users migrating to Python can use their existing models unchanged.

Lightweight. PyJAGS depends on numpy, arviz, and h5py. Compare with PyMC (pytensor + scipy + ...), TFP (tensorflow), or NumPyro (JAX + jaxlib). Install with pip install pyjags and pre-built wheels for Linux and macOS.

Features

PyJAGS adds the following features on top of JAGS:

  • Multicore support for parallel simulation of multiple Markov chains
  • Built-in ArviZ integration via pyjags.from_pyjags() for diagnostics and visualization
  • Reproducible sampling via a single seed parameter
  • Generator-based sampling with iter_sample() for live convergence monitoring
  • Standalone model syntax validation with check_model()
  • Incremental sampling with automatic convergence detection (ESS and R-hat criteria)
  • Saving and restoring MCMC sample chains to/from HDF5 files
  • Merging samples along iterations or across chains for resumed sampling
  • PEP 561 py.typed marker for IDE and type checker support

License: GPLv2

Compatibility

Component Supported Versions
Python 3.12+
NumPy 1.x and 2.x
ArviZ 1.0+
macOS Intel and Apple Silicon (M1/M2/M3/M4)
Linux Debian/Ubuntu (tested), other distributions (untested)

Note: Python 3.10 and 3.11 were supported in earlier releases but are no longer supported because ArviZ 1.0 — a core dependency — requires Python 3.12+.

Installation

Prerequisites

A working JAGS installation, a C++ compiler, and CMake are required. PyJAGS uses CMake with pkg-config to locate the JAGS headers and libraries at build time.

macOS

1. Install JAGS via Homebrew

Apple Silicon (M1/M2/M3/M4):

Homebrew installs to /opt/homebrew on Apple Silicon Macs:

# Install Homebrew if needed (https://brew.sh)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Follow Homebrew's instructions to add it to your PATH, then:
brew install jags

Make sure pkg-config can find the JAGS installation by adding this to your shell profile (~/.zprofile or ~/.zshrc):

export PKG_CONFIG_PATH="/opt/homebrew/lib/pkgconfig:$PKG_CONFIG_PATH"

Intel Mac:

Homebrew installs to /usr/local on Intel Macs and pkg-config typically finds JAGS automatically:

brew install jags

2. Set up Python and install PyJAGS

We recommend using uv to manage Python installations and virtual environments:

# Install uv if needed
curl -LsSf https://astral.sh/uv/install.sh | sh

# Install Python 3.12 and create a virtual environment
uv python install 3.12
uv venv --python 3.12 .venv
source .venv/bin/activate

# Install PyJAGS
uv pip install pyjags

To install from source (for development):

source .venv/bin/activate

git clone https://github.com/michaelnowotny/pyjags.git
cd pyjags

uv pip install -e .

Linux

Install JAGS using your distribution's package manager:

# Debian/Ubuntu
sudo apt-get install jags pkg-config

# Fedora/RHEL (untested — package names may differ)
sudo dnf install jags jags-devel pkgconf

Then install PyJAGS:

pip install pyjags

Or from source:

git clone https://github.com/michaelnowotny/pyjags.git
cd pyjags

pip install -e .

Windows

PyJAGS is not natively supported on Windows. Windows users should use WSL2 (Windows Subsystem for Linux) with an Ubuntu distribution, then follow the Linux installation instructions above.

Notebooks

The notebooks/ directory contains Jupyter notebooks demonstrating PyJAGS features:

Notebook Description
Getting Started Beginner-friendly introduction to Bayesian inference with PyJAGS
New in v2.3.0 Showcase of all v2.3.0 features: iter_sample(), seed=, check_model(), and more
Trading Cost Estimation Bayesian estimation of bid-ask spreads using Hasbrouck's model (with and without a market factor)
Logistic Regression Bayesian logistic regression with MCMC diagnostics
Eight Schools Classic hierarchical model with prior/posterior analysis, warmup splitting, and LOO
Advanced Functionality Parallel chains, HDF5 persistence, chain merging, and incremental sampling until convergence

If you have a native installation (macOS or Linux with JAGS and .venv set up as described above), you can run Jupyter Lab directly without Docker:

./scripts/jagslab lab

On first run, this installs notebook dependencies (JupyterLab, seaborn, scikit-learn) into your .venv and registers a "Python 3.12 (pyjags)" Jupyter kernel that points to the correct Python environment. The notebooks are pre-configured to use this kernel.

ArviZ Integration

PyJAGS includes a built-in converter for ArviZ 1.0+. Use pyjags.from_pyjags() to convert sample dictionaries returned by Model.sample() into ArviZ DataTree objects for diagnostics and visualization:

import pyjags
import arviz as az

model = pyjags.Model(code=model_code, data=data, chains=4)
model.sample(1000, vars=[])                     # burn-in
samples = model.sample(5000, vars=['mu', 'sigma'])

idata = pyjags.from_pyjags(samples)             # -> xarray.DataTree
az.summary(idata)
az.plot_trace(idata)

The converter also supports prior samples, log-likelihood extraction, and warmup splitting. See the Eight Schools notebook for a complete example.

Development Environment (jagslab)

PyJAGS also includes a Docker-based development environment managed by the jagslab CLI script. This provides a reproducible setup with JAGS, Python 3.12, and Jupyter Lab without requiring a local JAGS installation.

Quick Start (Docker)

# 1. Copy the environment configuration
cp .env.example .env          # Edit .env to customize (e.g., Jupyter port)

# 2. Build the Docker image
./scripts/jagslab build

# 3. Run the test suite
./scripts/jagslab test

# 4. Start Jupyter Lab
./scripts/jagslab start       # Opens at http://localhost:8888

jagslab Commands

Command Description
start Start Jupyter Lab via Docker (auto-starts container and installs pyjags)
lab Start Jupyter Lab natively from .venv (no Docker required)
stop Stop the Docker container
test [args] Run the test suite
install Install/reinstall pyjags (recompiles C++ extension)
shell Open a bash shell in the container
python [args] Start Python REPL or run a script in the container
build Build the Docker image
rebuild Rebuild image from scratch (no Docker cache)
status Show container status
logs Tail container logs
clean Remove build artifacts
version Show pyjags, JAGS, Python, and numpy versions

Running Tests

./scripts/jagslab test                                           # All tests
./scripts/jagslab test test.test_model                           # One module
./scripts/jagslab test test.test_model.TestModel.test_samples_shape  # Single test

Pre-commit Hooks

PyJAGS uses pre-commit to run ruff linting and formatting checks before each commit, preventing CI failures:

pip install pre-commit
pre-commit install

After installation, ruff will automatically check and fix files in src/ and test/ on every git commit. To run manually against all files:

pre-commit run --all-files

Working with the C++ Extension

PyJAGS includes a C++ extension (src/pyjags/console.cc) that wraps the JAGS library using pybind11. When editing Python files under src/pyjags/, changes take effect immediately thanks to the editable install. However, after editing src/pyjags/console.cc, you must recompile:

./scripts/jagslab install

Configuration

The .env file (created from .env.example) controls environment settings:

  • JAGSLAB_PORT — Host port for Jupyter Lab (default: 8888)

If .env does not exist when you run a jagslab command, it is automatically created from .env.example.

Troubleshooting

macOS: symbol not found '_JAGS_NA' or missing JAGS symbols at runtime

This usually means the compiled extension was not linked against libjags. Verify that pkg-config finds your JAGS installation:

pkg-config --libs --cflags jags

If this fails or points to the wrong location, set PKG_CONFIG_PATH as described in the installation instructions above, then reinstall PyJAGS.

macOS: found architecture 'x86_64', required architecture 'arm64'

This occurs on Apple Silicon Macs when JAGS was installed via an Intel (Rosetta) Homebrew at /usr/local but Python is running natively as ARM64. The fix is to install JAGS using the native ARM Homebrew at /opt/homebrew:

# Check which Homebrew you are using
which brew
# /opt/homebrew/bin/brew  -> ARM (correct for Apple Silicon)
# /usr/local/bin/brew     -> Intel/Rosetta (will cause architecture mismatch)

# If needed, install ARM Homebrew and then:
/opt/homebrew/bin/brew install jags

Make sure PKG_CONFIG_PATH points to the ARM Homebrew pkgconfig directory (/opt/homebrew/lib/pkgconfig) so that the build picks up the correct library.

CMake errors during build

PyJAGS uses CMake (via scikit-build-core) to find and link against JAGS. If the build fails with CMake errors, ensure CMake is installed:

# macOS
brew install cmake

# Debian/Ubuntu
sudo apt-get install cmake

# pip
pip install cmake

Useful Links

Acknowledgements

  • JAGS was created by Martyn Plummer
  • PyJAGS was originally created by Tomasz Miasko
  • As of May 2020, PyJAGS is developed by Michael Nowotny
  • Max Schulist (PR #1) proposed migrating to scikit-build-core, pyproject.toml, and pytest, ideas that inspired the packaging modernization in version 2.1
  • Scout Jarman (PR #2) independently proposed CI/CD workflows, CMake builds, and JAGS install scripts, reinforcing the direction of the modernization effort

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

pyjags-2.3.0.tar.gz (54.3 kB view details)

Uploaded Source

Built Distributions

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

pyjags-2.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (5.8 MB view details)

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

pyjags-2.3.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (5.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

pyjags-2.3.0-cp314-cp314-macosx_15_0_x86_64.whl (167.0 kB view details)

Uploaded CPython 3.14macOS 15.0+ x86-64

pyjags-2.3.0-cp314-cp314-macosx_15_0_arm64.whl (342.3 kB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

pyjags-2.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (5.8 MB view details)

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

pyjags-2.3.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (5.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

pyjags-2.3.0-cp313-cp313-macosx_15_0_x86_64.whl (166.8 kB view details)

Uploaded CPython 3.13macOS 15.0+ x86-64

pyjags-2.3.0-cp313-cp313-macosx_15_0_arm64.whl (341.9 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

pyjags-2.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (5.8 MB view details)

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

pyjags-2.3.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (5.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

pyjags-2.3.0-cp312-cp312-macosx_15_0_x86_64.whl (166.8 kB view details)

Uploaded CPython 3.12macOS 15.0+ x86-64

pyjags-2.3.0-cp312-cp312-macosx_15_0_arm64.whl (341.8 kB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

File details

Details for the file pyjags-2.3.0.tar.gz.

File metadata

  • Download URL: pyjags-2.3.0.tar.gz
  • Upload date:
  • Size: 54.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pyjags-2.3.0.tar.gz
Algorithm Hash digest
SHA256 a89d87161a15c3221ce66a9af340675d29c0b4e157c6381cf1102b5e766883bf
MD5 e2f51e37a5f5024e3eec1ada48e51509
BLAKE2b-256 c728980b6fa6fe48074ff903d8301de1654f8f6c26964140bc80451204d8119e

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyjags-2.3.0.tar.gz:

Publisher: release.yml on michaelnowotny/pyjags

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

File details

Details for the file pyjags-2.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyjags-2.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f47e71e5f3d86a4bf0190b0c44eb9bb510fa39308f30ca75929af01e756dcd2b
MD5 71cc1992ad236eb7db9a51c37a3a1a5e
BLAKE2b-256 d5e7fee7dde737885b1e85796fa9a92a740c661f9868973c8517a409cd8385b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyjags-2.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on michaelnowotny/pyjags

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

File details

Details for the file pyjags-2.3.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pyjags-2.3.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 24fcc390b0577a2c7bc62faea492085200777e8b492dbb141c3df4852644b086
MD5 3c1a875ee0508ab5f11763fff2e9eaa8
BLAKE2b-256 c612e23f20c133c3ad1595fd75fd3dde0db6830d7a761dfd1686520e24f25f18

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyjags-2.3.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yml on michaelnowotny/pyjags

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

File details

Details for the file pyjags-2.3.0-cp314-cp314-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for pyjags-2.3.0-cp314-cp314-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 bbd3c10c8f7e140cb986a946221b89409f020ed7263a58a3e5bc70c47d9ef38e
MD5 4dbca94bc67bd81488ed55855b9b60e2
BLAKE2b-256 7148e5b8e0ea57ca4f955ac0c1673f483ddb269eb01f3986a1efb260db46d5cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyjags-2.3.0-cp314-cp314-macosx_15_0_x86_64.whl:

Publisher: release.yml on michaelnowotny/pyjags

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

File details

Details for the file pyjags-2.3.0-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for pyjags-2.3.0-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 f43da4ba7ef4440912ce8f2daeff5cbb4bd5dac28f2a2a9a4b98a5cc9e525f0f
MD5 acc1f1044710bdfffbdb892a2ac9a1f6
BLAKE2b-256 0c1d3a0ba53a8f593cd3e7aec7358555afb7efe423113139dca9847c0455fcbf

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyjags-2.3.0-cp314-cp314-macosx_15_0_arm64.whl:

Publisher: release.yml on michaelnowotny/pyjags

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

File details

Details for the file pyjags-2.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyjags-2.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b2e1e3049588fbe4f52f179ded8ba69529feb03e9e3a117fa34a58ed52002055
MD5 98d649296d4dbe9247b90860e3300368
BLAKE2b-256 e64a35c7f077a64dba7f60a443cda5a1c2b383512e17e927a9d7c506bdbe93c5

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyjags-2.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on michaelnowotny/pyjags

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

File details

Details for the file pyjags-2.3.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pyjags-2.3.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4a0d32266745b2ac7bbe288ba25b0ae183b2c65ca73e7211ec90d35c056b3fbc
MD5 cc09935f1e37a1a25dbeb843a700a055
BLAKE2b-256 06b1269242ad65a9de53f5b5617a5beb69e91b1d0b2820d606c27cd4115e5507

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyjags-2.3.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yml on michaelnowotny/pyjags

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

File details

Details for the file pyjags-2.3.0-cp313-cp313-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for pyjags-2.3.0-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 96c27ac8f7518cc9d9e60ec6fb70b32eea2ad7dea601e6576b9dc26180b88500
MD5 0145c1b8ed47874643fb73f8e0e6faf7
BLAKE2b-256 9156484d6be5bf1d5a87897c0ac42fd52fc183099b212c37c001cb41bda2b1e8

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyjags-2.3.0-cp313-cp313-macosx_15_0_x86_64.whl:

Publisher: release.yml on michaelnowotny/pyjags

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

File details

Details for the file pyjags-2.3.0-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for pyjags-2.3.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c6715850935ab1f11e3cc666a6c3f328f1bc9889e36799951bc5fbcdef16ecce
MD5 1c9ce5041e1705c0aade714f2260e265
BLAKE2b-256 ca999c5c131c4228bc2539683c7043a23b94aacd6991794d1875ad1e200785df

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyjags-2.3.0-cp313-cp313-macosx_15_0_arm64.whl:

Publisher: release.yml on michaelnowotny/pyjags

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

File details

Details for the file pyjags-2.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyjags-2.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 364c388cad3226098831508e6f8fa2f92ed7c9809114afa8443bdbb062ec004b
MD5 647dda0e65b521897dae4de597478b04
BLAKE2b-256 c881a3739911492352b41f3d2856c8fd954f66ce99dbae986d8bb14c10a99349

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyjags-2.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on michaelnowotny/pyjags

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

File details

Details for the file pyjags-2.3.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pyjags-2.3.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 490d6e3b82859d7e2c8e12d9fe143b52d48ad706c7c78fa84902c84950a33583
MD5 6cb4446f0962d1052e5a4048a3438e9f
BLAKE2b-256 aa041adc505d2584db764e753a6d934b2bccf99ff80541886f6bf428b2d0c8e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyjags-2.3.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yml on michaelnowotny/pyjags

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

File details

Details for the file pyjags-2.3.0-cp312-cp312-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for pyjags-2.3.0-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 f5f501f27e9a54268490385fb26d343edec18c89c9222ef12a1ebc2fd5858357
MD5 efab656da1f0b40b3b181fb44b0b36fb
BLAKE2b-256 543b52c8d4cffcfc03f4b40ac1ae8854a7bb0a9336dbe7827f2febbb1cb55690

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyjags-2.3.0-cp312-cp312-macosx_15_0_x86_64.whl:

Publisher: release.yml on michaelnowotny/pyjags

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

File details

Details for the file pyjags-2.3.0-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for pyjags-2.3.0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 886cc98640c14d576c6396275e9d2898a153d347a5eb7ddfc8843d0fe0414c4d
MD5 f27f6efb7579838b2590d18365a02f0a
BLAKE2b-256 f41ed2d583b06ebeac883eae85795f777c1fe8f2c560ac6ac03aab6d53274154

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyjags-2.3.0-cp312-cp312-macosx_15_0_arm64.whl:

Publisher: release.yml on michaelnowotny/pyjags

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