Skip to main content

MDPSolver

MDPSolver is a Python package for large Markov Decision Processes (MDPs) with infinite-horizons.

Features

  • Fast solver: Our C++-based solver is substantially faster than other CPU-based MDP packages available for Python. See details in the documentation.
  • Two optimality criteria: Discounted and Average reward.
  • Three optimization algorithms: Value iteration, Policy iteration, and Modified policy iteration.
  • Three value-update methods: Standard, Gauss–Seidel, and Successive over-relaxation.
  • Supports sparse matrices.
  • Employs parallel computing.

Installation

Prebuilt wheels are available for Linux, Windows, and macOS (14+) across Python 3.10–3.14. Install directly from PyPI with:

pip install mdpsolver

Quick start guide

The following shows how to get quickly started with mdpsolver.

Usage

Start by specifying the reward function and transition probabilities as lists. The following is an example of a simple MDP containing three states and two actions in each state.

#Import packages
import mdpsolver

#Rewards (3 states x 2 actions)
#e.g. choosing second action in first state gives reward=-1
rewards = [[5,-1],
           [1,-2],
           [50,0]]

#Transition probabilities (3 from_states x 2 actions x 3 to_states)
#e.g. choosing first action in third state gives a probability of 0.6 of staying in third state
tranMatWithZeros = [[[0.9,0.1,0.0],[0.1,0.9,0.0]],
                    [[0.4,0.5,0.1],[0.3,0.5,0.2]],
                    [[0.2,0.2,0.6],[0.5,0.5,0.0]]]

Now, create the model object and insert the problem parameters.

#Create model object
mdl = mdpsolver.model()

#Insert the problem parameters
mdl.mdp(discount=0.8,
        rewards=rewards,
        tranMatWithZeros=tranMatWithZeros)

We can now optimize the policy.

mdl.solve()

The optimized policy can be returned in a variety of ways. Here, we return the policy as a list and print directly in the terminal.

print(mdl.getPolicy())
#[1, 1, 0]

Sparse transition matrix?

mdpsolver has three alternative formats for large and highly sparse transition probability matrices.

(1) Elementwise representation (excluding elements containing zeros):

#[from_state,action,to_state,probability]
tranMatElementwise = [[0,0,0,0.9],
                      [0,0,1,0.1],
                      [0,1,0,0.1],
                      [0,1,1,0.9],
                      [1,0,0,0.4],
                      [1,0,1,0.5],
                      [1,0,2,0.1],
                      [1,1,0,0.3],
                      [1,1,1,0.5],
                      [1,1,2,0.2],
                      [2,0,0,0.2],
                      [2,0,1,0.2],
                      [2,0,2,0.6],
                      [2,1,0,0.5],
                      [2,1,1,0.5]]

mdl.mdp(discount=0.8,
        rewards=rewards,
        tranMatElementwise=tranMatElementwise)

(2) Probabilities and column (to_state) indices in separate lists:

tranMatProbs = [[[0.9,0.1],[0.1,0.9]],
                [[0.4,0.5,0.1],[0.3,0.5,0.2]],
                [[0.2,0.2,0.6],[0.5,0.5]]]

tranMatColumns = [[[0,1],[0,1]],
                [[0,1,2],[0,1,2]],
                [[0,1,2],[0,1]]]

mdl.mdp(discount=0.8,
        rewards=rewards,
        tranMatProbs=tranMatProbs,
        tranMatColumns=tranMatColumns)

(3) Load the elementwise representation from a file:

mdl.mdp(discount=0.8,
        rewards=rewards,
        tranMatFromFile="transitions.csv")

Documentation

The documentation can be found in the wiki for MDPSolver.

How to cite

DOI

Metadata

Release files for mdpsolver 0.10.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mdpsolver 0.10.1
File Size Uploaded
mdpsolver-0.10.1.tar.gz 226.2 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for mdpsolver 0.10.1
File
mdpsolver-0.10.1-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
mdpsolver-0.10.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details
mdpsolver-0.10.1-cp314-cp314-macosx_14_0_arm64.whl CPython 3.14 CPython 3.14 macOS 14.0+ ARM64 Details
mdpsolver-0.10.1-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
mdpsolver-0.10.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details
mdpsolver-0.10.1-cp313-cp313-macosx_14_0_arm64.whl CPython 3.13 CPython 3.13 macOS 14.0+ ARM64 Details
mdpsolver-0.10.1-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
mdpsolver-0.10.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details
mdpsolver-0.10.1-cp312-cp312-macosx_14_0_arm64.whl CPython 3.12 CPython 3.12 macOS 14.0+ ARM64 Details
mdpsolver-0.10.1-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
mdpsolver-0.10.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details
mdpsolver-0.10.1-cp311-cp311-macosx_14_0_arm64.whl CPython 3.11 CPython 3.11 macOS 14.0+ ARM64 Details
mdpsolver-0.10.1-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
mdpsolver-0.10.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details
mdpsolver-0.10.1-cp310-cp310-macosx_14_0_arm64.whl CPython 3.10 CPython 3.10 macOS 14.0+ ARM64 Details

Total release size: 6.6 MB

Release files / mdpsolver-0.10.1.tar.gz

Download URL mdpsolver-0.10.1.tar.gz
Size 226.2 kB
Tags Source
SHA-256 checksum
How to use checksums
fce438ef4e2d0807eea5f97996e4b9b7a087092c66ea117f07e681285b560003
BLAKE2b-256 checksum
How to use checksums
eac8efe6a75991e8fb0dbf0c84ef435571f581e584053ad9bee2f6d0d187067b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp314-cp314-win_amd64.whl

Download URL mdpsolver-0.10.1-cp314-cp314-win_amd64.whl
Size 653.5 kB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
47e94c32f86fd2a554f3741ba5075d34c8ae6a6bee336455ec24a5b94227b934
BLAKE2b-256 checksum
How to use checksums
8dac67eed4a8004553a494284d4637646cef865cc9becb3c51c7a36f9cbe6822
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL mdpsolver-0.10.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 271.5 kB
Tags CPython 3.14 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
c5d8e62f7d342eb8922e9c6d7f2e061d6520ee289ad959138c4f6f3cc09cf06e
BLAKE2b-256 checksum
How to use checksums
bc581f42164fd59a90756ccff800548027123ae827cea77b6d5f8a06e0b8b98d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp314-cp314-macosx_14_0_arm64.whl

Download URL mdpsolver-0.10.1-cp314-cp314-macosx_14_0_arm64.whl
Size 373.5 kB
Tags CPython 3.14 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
9110ea33288896f185cf9875f755ec2a8b24c2260bd9a5a0785c9d612c2676d5
BLAKE2b-256 checksum
How to use checksums
8052e66d484f5d186344e46f670e6d0b1f932504ab16f7b0855327698ab4fbd4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp313-cp313-win_amd64.whl

Download URL mdpsolver-0.10.1-cp313-cp313-win_amd64.whl
Size 628.3 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
ed863d8f1c0c0a802114cfa3b23d5fe233f82c3d005b90fbd3a96571add9cd5e
BLAKE2b-256 checksum
How to use checksums
35eddf5ed73141177970ca2c3abe1e8c7f0c5b9aac1c8f581a99adcaec8dd160
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL mdpsolver-0.10.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 271.4 kB
Tags CPython 3.13 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
479cf28de7928592b121b1783b255592f52cd5425a9705e1c0ee0264175e5ba6
BLAKE2b-256 checksum
How to use checksums
567f8099d34b516b71440b0c70ed87fcc5bdd283b175c29f19f35c43946dc5e8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp313-cp313-macosx_14_0_arm64.whl

Download URL mdpsolver-0.10.1-cp313-cp313-macosx_14_0_arm64.whl
Size 373.3 kB
Tags CPython 3.13 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
4d9d797c3b69919de72684434860f1d7b9e5a21f4402767e0df3fa7ddf3ed9f9
BLAKE2b-256 checksum
How to use checksums
bf698118d101f9799c72835fa24c2ca81b90eafdb80c9ce0560cbc8fcd2fe0ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp312-cp312-win_amd64.whl

Download URL mdpsolver-0.10.1-cp312-cp312-win_amd64.whl
Size 628.3 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
b298d7e6fc797a7e2a015c59efb4655a52decc9c838ea9e5bc3abaf4efb648ae
BLAKE2b-256 checksum
How to use checksums
a69a0eafe39e65f5bc2f481afdd4a2f58c1c217fc75b3149391b6cb6850e43c2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL mdpsolver-0.10.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 271.4 kB
Tags CPython 3.12 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
bfccdb5fff8833e68103986f53d8cd35f90a1dd3c77a3bbb0b4082a0924fe1c8
BLAKE2b-256 checksum
How to use checksums
62cf1a05adff0c3decc0bc4ec125df997c2f5f9884dc63f99595a2283941ecd8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp312-cp312-macosx_14_0_arm64.whl

Download URL mdpsolver-0.10.1-cp312-cp312-macosx_14_0_arm64.whl
Size 373.2 kB
Tags CPython 3.12 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
e550daae374651eaf862303bc2f9a74bb6381c060ed237c790131218f2dd4395
BLAKE2b-256 checksum
How to use checksums
42c1e9b954edd667d7eb89953554b06193d3b97884169f33d38fb86a2cea4d5e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp311-cp311-win_amd64.whl

Download URL mdpsolver-0.10.1-cp311-cp311-win_amd64.whl
Size 625.6 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
a85df2d4d6693aa878193bd3124fa5b8c7f1c8ec87ee1f888057ab24c039d16e
BLAKE2b-256 checksum
How to use checksums
5b46fd4f41c3f279dd134fcaf8c5d4e7b36d324101102d772cd72c8e6dedb13a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL mdpsolver-0.10.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 270.4 kB
Tags CPython 3.11 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
0bd90eeb6b110162c112036d779df830a6f4a38e9ee5012c66d1267f05f13801
BLAKE2b-256 checksum
How to use checksums
09d960a91268ea5e96d1d8aac6ae4f198f93f03f26c23c7b18724eb399528898
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp311-cp311-macosx_14_0_arm64.whl

Download URL mdpsolver-0.10.1-cp311-cp311-macosx_14_0_arm64.whl
Size 372.8 kB
Tags CPython 3.11 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
7149e7cc8630dff0deea589f78ff4daa4f7ab109243f6ffa65026168a402de92
BLAKE2b-256 checksum
How to use checksums
3227223954032e1dd10fc320686c3ede85b1ef9b56a167fbf1a0f4411042db94
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp310-cp310-win_amd64.whl

Download URL mdpsolver-0.10.1-cp310-cp310-win_amd64.whl
Size 625.2 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
03359c603e7c628118f4b1afba80128b2c4c3abc97624b7163203b0f5b0f6cb6
BLAKE2b-256 checksum
How to use checksums
e94aacf580237aaae13a24c607a63a863586a37d38a06e3a225276a60ed1908f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL mdpsolver-0.10.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 269.1 kB
Tags CPython 3.10 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
b354c617d735accab1e62628316e9a40fe80e4f23593225823ef8a2a02102bae
BLAKE2b-256 checksum
How to use checksums
94e7ad691c189aa54d13cb5c81c520e7c73045aaee7f88df6993802ff7e9dffc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release files / mdpsolver-0.10.1-cp310-cp310-macosx_14_0_arm64.whl

Download URL mdpsolver-0.10.1-cp310-cp310-macosx_14_0_arm64.whl
Size 371.3 kB
Tags CPython 3.10 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
f5fc134e4362bbcc15aad41c5ae7c9c503f320ebc8273095123b16372d9eeeb6
BLAKE2b-256 checksum
How to use checksums
f8822a9811c42bcfa22540eeb53e0f5e3c57e4b096470f870be12ed3d3edfdf6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.10.1 This release

16 release files

0.9.10

2 release files

0.9.9

2 release files

0.9.8

2 release files

0.9.7

2 release files

0.9.6

2 release files

0.9.5

2 release files

0.9.4

2 release files

0.9.3

2 release files

0.9.2

2 release files

0.9.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page