Skip to main content

MemStrata Agent Hooks SDK

This is one small SDK for two separate product jobs:

  1. Conversational retrieves a bounded memory context and stores completed turns.
  2. Governance checks tool calls and records their outcomes.

LangChain, LangGraph, CrewAI, OpenClaw, NeoClaw, Hermes, and custom agents call the same local product services through this package. A framework-defined exact key-value contract, such as LangGraph BaseStore, still uses an authoritative framework backing store rather than pretending the compiled context endpoint supports exact lookup or deletion.

Install

Install the wheel matching your CPython version and operating system:

python -m pip install memstrata-agent-hooks

Optional framework dependencies remain separate:

python -m pip install "memstrata-agent-hooks[langchain]"
python -m pip install "memstrata-agent-hooks[langgraph]"
python -m pip install "memstrata-agent-hooks[crewai]"

Released wheels compile the proprietary transport, validation, facade, and generic adapter implementation into native extensions. They contain no Python source for those modules, and the project does not publish a source distribution. Small framework adapters and host bundles remain readable because LangChain, LangGraph, CrewAI, OpenClaw, Hermes, OpenCode, and NeoClaw load that interoperability glue directly. The memory engine and Governance policy implementation remain inside their separately licensed local products.

Install for development

Python 3.10 through 3.13 is supported. The current CrewAI dependency stack is not compatible with Python 3.14, so this release fails installation there instead of leaving users with a broken optional adapter.

Release wheels target Windows x86-64, Linux glibc x86-64, and macOS 15 Apple silicon. macOS Intel, Linux arm64, and Alpine Linux are not part of this first release matrix.

python -m pip install -e sdk/agent-hooks

Configure

export MEMSTRATA_MEMORY_URL=http://127.0.0.1:9101
export MEMSTRATA_GOVERNANCE_URL=http://127.0.0.1:9003
export MEMSTRATA_PROJECT=my-workspace
export MEMSTRATA_GOVERNANCE_SYSTEM_ID=my-enrolled-agent-system
export MEMSTRATA_GOVERNANCE_AGENT_ID=my-agent
export MEMSTRATA_GOVERNANCE_ACTOR='Support automation'
export MEMSTRATA_GOVERNANCE_PURPOSE='the exact purpose enrolled in Governance'
# Optional when the two products use separate credentials:
export MEMSTRATA_MEMORY_TOKEN='memory service token'
export MEMSTRATA_GOVERNANCE_TOKEN='governance service token'

On PowerShell, replace export NAME=value with $env:NAME='value'. Both product-specific token variables fall back to MEMSTRATA_TOKEN. Tokens are read from the environment and are never written into copied host configuration files.

Use one SDK object

MemStrataAgentSDK exposes the two product contracts without mixing them:

from memstrata_agent_hooks import MemStrataAgentSDK

sdk = MemStrataAgentSDK.from_env()

sdk.memory.add_exchange(
    "Which plan should we use?",
    "The customer selected annual billing.",
    session_id="support-42",
)
context = sdk.memory.retrieve("Which billing plan did the customer select?")

with sdk.governance.guard(
    "send_email",
    {"to": "customer@example.com"},
    agent_id="support-agent",
):
    send_email()

The guard checks Governance before the side effect and records completion or failure afterward using the same trace ID. If a receipt cannot be recorded after the tool already ran, the SDK warns but does not make the host retry the side effect.

AsyncMemStrataAgentSDK provides the same memory and Governance surfaces for async hosts. The base package stays dependency-free and runs blocking HTTP in worker threads.

Use the low-level client

from memstrata_agent_hooks import MemStrataClient

client = MemStrataClient.from_env()
client.remember("The customer chose annual billing", session_id="support-42")
context = client.context("What billing plan did the customer choose?")

decision = client.gate(
    "send_email",
    agent_id="support-agent",
    tool_input={"to": "customer@example.com"},
)
decision.require()

gate uses POST /v1/pipeline/gate and falls back to the compatible hook endpoint. If Governance is unreachable, the default response is a visible degraded allow decision only for a connection failure. This prevents an optional local daemon from freezing an agent. Administrators can set MEMSTRATA_GOVERNANCE_FAIL_CLOSED=1 for a workflow where an unavailable policy service must stop execution.

Authentication, license, schema, policy, and server responses remain visible errors. Only an explicit allow runs a tool. review and block both stop the generic adapter so a host can route review to its own human approval surface.

Framework adapters

The package root stays dependency-free. Install only the framework surfaces an application uses:

python -m pip install "memstrata-agent-hooks[langchain]"
python -m pip install "memstrata-agent-hooks[langgraph]"
python -m pip install "memstrata-agent-hooks[crewai]"

LangChain

MemStrataRetriever follows the current BaseRetriever Runnable contract. It returns the complete bounded context pack as one Document and supports both invoke and ainvoke:

from memstrata_agent_hooks import MemStrataClient
from memstrata_agent_hooks.langchain import MemStrataRetriever

retriever = MemStrataRetriever(client=MemStrataClient.from_env())
documents = retriever.invoke("What changed in the release plan?")

MemStrataConversationCallback and AsyncMemStrataConversationCallback store the current human message and the completed answer. They do not re-ingest the system prompt or replayed history. Set the callback metadata key memstrata_session_id when a workflow needs a session ID other than the configured default.

MemStrataGovernanceCallback and AsyncMemStrataGovernanceCallback run a Governance decision at on_tool_start, before the tool body, then correlate on_tool_end or on_tool_error with the same trace ID. The handler sets LangChain's raise_error flag so review and block decisions stop execution instead of becoming callback warnings:

from memstrata_agent_hooks.langchain import MemStrataGovernanceCallback

governance = MemStrataGovernanceCallback(
    MemStrataClient.from_env(), agent_id="support-agent"
)
answer = tool.invoke(tool_input, config={"callbacks": [governance]})

Register this callback where the host actually dispatches tools. Attaching it only to a model call does not govern side effects performed elsewhere.

LangGraph

MemStrataLangGraphStore is a real current BaseStore decorator. It delegates exact get, search, put, delete, namespace listing, filtering, pagination, TTL, batch, and async behavior to an authoritative LangGraph backing store:

from langgraph.store.memory import InMemoryStore
from memstrata_agent_hooks import MemStrataClient
from memstrata_agent_hooks.langgraph import MemStrataLangGraphStore

store = MemStrataLangGraphStore(
    MemStrataClient.from_env(),
    InMemoryStore(),
)

For production, use a persistent LangGraph backing store. Conversational's SDK API does not expose exact key lookup, filtered listing, or item-scoped erase, so the adapter does not invent those semantics. Optional put mirroring must be enabled explicitly with mirror_mode="strict" or "best_effort". Mirrored deletion also requires an administrator-approved delete_mirror callback. Strict mirroring makes errors visible, but the backing-store write and Conversational ingest are not one atomic transaction.

Namespaces organize a LangGraph store. They are not an authorization or tenant boundary. Use separate MemStrata projects and credentials where isolation is required.

The tested upstream contracts and exact remaining boundaries are recorded in FRAMEWORK_CONTRACTS.md.

CrewAI

Install the adapter once before a crew starts:

from memstrata_agent_hooks import MemStrataClient
from memstrata_agent_hooks.crewai import install_crewai_hooks

registration = install_crewai_hooks(MemStrataClient.from_env())
try:
    result = crew.kickoff(inputs={"question": "What changed?"})
finally:
    registration.close()

The native before_tool_call hook gates every tool before its implementation runs. The matching after_tool_call hook records completion with the same trace ID. A review decision blocks by default. An application may supply a review_resolver that returns an approval ID issued by MemStrata Governance; the adapter then repeats the gate with that ID. For an attended terminal, the opt-in console_governance_review helper asks the operator to paste that ID.

Before the first model call in each task, the adapter compiles bounded memory from the original task text and inserts it as a clearly marked user-level evidence message immediately before the real task. It is intentionally not a system message because retrieved content may be untrusted and must not gain instruction authority. After the agent completes the task, a CrewAI event listener stores the task and final answer as one conversational turn. Event replay is ignored so restoring a CrewAI checkpoint does not write the same turn again.

CrewAI also offers a custom StorageBackend, but its search contract receives an embedding rather than the original query. MemStrata's context compiler needs the query text, temporal constraints, and project identity, so the adapter uses the supported LLM hook instead of claiming false drop-in storage compatibility.

The implementation follows CrewAI's current official contracts:

memstrata_agent_hooks.adapters retains the earlier dependency-free helpers for compatibility, plus voluntary OpenAI-compatible tools and a generic context manager usable by any Python agent.

Function tools are a convenience, not enforcement. A host must invoke gate from its before-tool lifecycle hook to guarantee that denied work never runs. The CLI covers hosts that only support executable stop hooks:

memstrata-hooks gate --agent hermes --tool terminal --input-json '{"command":"git status"}'

Exit code 0 means allow. Exit code 2 means the decision was review or block. A daemon error uses exit code 1 for memory commands, while Governance availability follows the chosen fail-open or fail-closed policy.

Native host bundles

The wheel includes tested bundles for OpenClaw, Hermes, OpenCode, and a generic NeoClaw bridge. List or copy them without downloading additional code:

memstrata-hooks list-hosts
memstrata-hooks copy-host openclaw ./memstrata-openclaw
memstrata-hooks copy-host hermes ./memstrata-hermes
memstrata-hooks copy-host opencode ./memstrata-opencode
memstrata-hooks copy-host neoclaw ./memstrata-neoclaw

Read the copied host README before enabling it. copy-host does not edit host configuration or overwrite files unless --overwrite is supplied.

  • OpenClaw uses the typed before_tool_call, after_tool_call, before_prompt_build, and agent_end plugin hooks.
  • Hermes uses its supported model and tool lifecycle hooks in one plugin.
  • OpenCode uses tool.execute.before, tool.execute.after, the current prompt transform, and session events.
  • NeoClaw remains an explicit JSON executable bridge because several unrelated projects use that name and no stable common native plugin contract exists.

A Governance review never becomes permission merely because a host user clicks yes. The call remains blocked until Governance supplies an approval and a new gate returns allow. See host plugin documentation and integration status.

Operational boundary

The SDK is a transport layer. It does not duplicate the memory index, embed documents, evaluate policy, certify regulatory compliance, or turn an unsigned local cache into an audit record. Those responsibilities remain in the running MemStrata products.

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

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

memstrata_agent_hooks-0.2.0-cp313-cp313-win_amd64.whl (325.1 kB view details)

Uploaded CPython 3.13Windows x86-64

memstrata_agent_hooks-0.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (401.8 kB view details)

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

memstrata_agent_hooks-0.2.0-cp313-cp313-macosx_11_0_arm64.whl (334.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

memstrata_agent_hooks-0.2.0-cp312-cp312-win_amd64.whl (326.2 kB view details)

Uploaded CPython 3.12Windows x86-64

memstrata_agent_hooks-0.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (401.6 kB view details)

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

memstrata_agent_hooks-0.2.0-cp312-cp312-macosx_11_0_arm64.whl (336.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

memstrata_agent_hooks-0.2.0-cp311-cp311-win_amd64.whl (332.5 kB view details)

Uploaded CPython 3.11Windows x86-64

memstrata_agent_hooks-0.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (419.2 kB view details)

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

memstrata_agent_hooks-0.2.0-cp311-cp311-macosx_11_0_arm64.whl (337.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

memstrata_agent_hooks-0.2.0-cp310-cp310-win_amd64.whl (335.4 kB view details)

Uploaded CPython 3.10Windows x86-64

memstrata_agent_hooks-0.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (421.1 kB view details)

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

memstrata_agent_hooks-0.2.0-cp310-cp310-macosx_11_0_arm64.whl (340.8 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file memstrata_agent_hooks-0.2.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for memstrata_agent_hooks-0.2.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 95e194286ae5c30fea37d119c6428b66da6b16bb0442ecf5c2b8fbcdc4c74cb2
MD5 b29f132fe472787139ae0762a1640335
BLAKE2b-256 cbd0d5888cae290df381a2f8ba634acc54bc71aeccc9a99bcf99f988bd3e4541

See more details on using hashes here.

Provenance

The following attestation bundles were made for memstrata_agent_hooks-0.2.0-cp313-cp313-win_amd64.whl:

Publisher: release.yml on yadu9989/memstrata-agent-hooks-build

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

File details

Details for the file memstrata_agent_hooks-0.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for memstrata_agent_hooks-0.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 214fb4e02d0baf8ace22f1e44a5f037c7cbec5373ebe29ef266380cc24e36f6a
MD5 832197dc0f48aa72957b99c499d9f255
BLAKE2b-256 4a487a72dabc935189ae58f94d339092cffe9576d8793474e02dddfe3d72e57e

See more details on using hashes here.

Provenance

The following attestation bundles were made for memstrata_agent_hooks-0.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on yadu9989/memstrata-agent-hooks-build

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

File details

Details for the file memstrata_agent_hooks-0.2.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for memstrata_agent_hooks-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c7f708c9a8f07d8962eb42ee229e2a91783361b97495e69bc13571009fcfc24b
MD5 9f2e7d28b4374b3e218f98ec79a2f7d7
BLAKE2b-256 c125cbcadfa27356bc548a7702303e4190036f42de3d601f304b4b35d6f0fdec

See more details on using hashes here.

Provenance

The following attestation bundles were made for memstrata_agent_hooks-0.2.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: release.yml on yadu9989/memstrata-agent-hooks-build

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

File details

Details for the file memstrata_agent_hooks-0.2.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for memstrata_agent_hooks-0.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 90d43c6bbfe231ecadc1b8f7a2bce62750044785bea964df9d6a9af8e4e0c0ee
MD5 aacec5251db8a6eb8561694af899001d
BLAKE2b-256 d38276d6c9bfcdf70ee052ce219c2bedda57f2eedb3bd72c59cd760080549b7f

See more details on using hashes here.

Provenance

The following attestation bundles were made for memstrata_agent_hooks-0.2.0-cp312-cp312-win_amd64.whl:

Publisher: release.yml on yadu9989/memstrata-agent-hooks-build

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

File details

Details for the file memstrata_agent_hooks-0.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for memstrata_agent_hooks-0.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 41b883a1992268b0e1f69ffd6efd39bd04c1de1b2c97a206c2a4367da48aad1e
MD5 5e21cd15e9fc93bc795f85d4f133ce77
BLAKE2b-256 41192c83cc09f234de5279e15ad5ec826dad8a72ca930d9b82ba4f682b9cf2cb

See more details on using hashes here.

Provenance

The following attestation bundles were made for memstrata_agent_hooks-0.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on yadu9989/memstrata-agent-hooks-build

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

File details

Details for the file memstrata_agent_hooks-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for memstrata_agent_hooks-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cd89f59e92b94000c4bbe59c8dd6bc851ba6ffd3aea126598cf89d15e345c949
MD5 7120c8a846d0492e07563a4c85698dc3
BLAKE2b-256 7989329f392e0954f62eb3838cf894c835a2e8a8e40c0e27e67ffce43c877842

See more details on using hashes here.

Provenance

The following attestation bundles were made for memstrata_agent_hooks-0.2.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: release.yml on yadu9989/memstrata-agent-hooks-build

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

File details

Details for the file memstrata_agent_hooks-0.2.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for memstrata_agent_hooks-0.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 da71bc7657506cc3150c5617e8ebc1ed603fbb9002d983879185abf05a8f16c4
MD5 a763b5ff8fded35f91fb5eccfd105353
BLAKE2b-256 a9e36fcc0d357ff4cdee67072d4797685745646c2608567643149a7737baa959

See more details on using hashes here.

Provenance

The following attestation bundles were made for memstrata_agent_hooks-0.2.0-cp311-cp311-win_amd64.whl:

Publisher: release.yml on yadu9989/memstrata-agent-hooks-build

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

File details

Details for the file memstrata_agent_hooks-0.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for memstrata_agent_hooks-0.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a042bea5ea054bbc74555c09be1c351c7cf2043f6652e07906ddf2040e27bf1c
MD5 c457dd03ffcaef0a117519cefadf7f75
BLAKE2b-256 85fffdaa2a63772343d83b0466617e36db92d9c01f16231aaa9d4c6cfe6e7fbf

See more details on using hashes here.

Provenance

The following attestation bundles were made for memstrata_agent_hooks-0.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on yadu9989/memstrata-agent-hooks-build

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

File details

Details for the file memstrata_agent_hooks-0.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for memstrata_agent_hooks-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 85469634e7e8768c69eaacc766744c49ef21f28dfc232325713b0dfb9d7ff06c
MD5 e539b99d68c4a39c253bd722166d21f2
BLAKE2b-256 179af50c6a427cf8e8304e75693a9ed68936699c01daaf608b2ac215404cb563

See more details on using hashes here.

Provenance

The following attestation bundles were made for memstrata_agent_hooks-0.2.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: release.yml on yadu9989/memstrata-agent-hooks-build

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

File details

Details for the file memstrata_agent_hooks-0.2.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for memstrata_agent_hooks-0.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a88e22bbca62bf13b962b2e3deab9320be967d5fe26700744a37cd5f12bb5230
MD5 7e901d4ce77941950594f0bd1df5ab41
BLAKE2b-256 b49980130dc2bc51a040e0dc0d8191280c123cadcd23b2bba862dbf4a9e9725b

See more details on using hashes here.

Provenance

The following attestation bundles were made for memstrata_agent_hooks-0.2.0-cp310-cp310-win_amd64.whl:

Publisher: release.yml on yadu9989/memstrata-agent-hooks-build

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

File details

Details for the file memstrata_agent_hooks-0.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for memstrata_agent_hooks-0.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1025208d7d3392d238d34eb6c608b655ad816be961686a2d7770a082ec378db9
MD5 e3a5ba31643a57349cceab4007f9d227
BLAKE2b-256 7c2c1c395eaaa031d75b16c73c678fd33c2964d72eda25a320f31658e8a3c05d

See more details on using hashes here.

Provenance

The following attestation bundles were made for memstrata_agent_hooks-0.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on yadu9989/memstrata-agent-hooks-build

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

File details

Details for the file memstrata_agent_hooks-0.2.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for memstrata_agent_hooks-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f97461da35f9b17317afd44356669850337ae68ad0e6ecd158d0b5b4db13ebd4
MD5 325779c3de8d73ae01cb524c58ea764e
BLAKE2b-256 1e3b41f784fdae228cff53dcd85371d0ebbda8b352002840016add002982de97

See more details on using hashes here.

Provenance

The following attestation bundles were made for memstrata_agent_hooks-0.2.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: release.yml on yadu9989/memstrata-agent-hooks-build

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

Release history Release notifications | RSS feed

This release

0.2.0 This release

12 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