Installation
Requirements
- .NET 9.0 or later
- PostgreSQL 14+ — used by Marten for the CritterWatch event store
- A Wolverine transport (RabbitMQ is recommended) for service-to-CritterWatch communication
NuGet Packages
CritterWatch ships as two NuGet packages:
Wolverine.CritterWatch
Install this in each monitored service — the applications you want CritterWatch to observe.
dotnet add package Wolverine.CritterWatchThis package contains:
CritterWatchObserver— hooks into the Wolverine runtime and publishes telemetry- All inbound command message types (pause listener, replay messages, etc.)
- All outbound event message types (service updates, health reports, etc.)
CritterWatch
Install this in your CritterWatch server — the dedicated application that runs the monitoring console.
dotnet add package CritterWatchThis package contains:
- Hosting extensions (
AddCritterWatch,UseCritterWatch) - Marten event store projections for service state
- Alert system, SignalR hub, HTTP API
- Embedded Vue SPA (served as embedded assembly resources)
Version Compatibility
| CritterWatch | Wolverine | .NET | Marten | Polecat | JasperFx |
|---|---|---|---|---|---|
| 0.7.x (pre-1.0) | 6.5.1 | 9.0+ | 9.7.0 | 4.4.0 | 2.9.1 |
CritterWatch is built on the same JasperFx ecosystem it monitors. Pins are coordinated across JasperFx / Marten / Polecat / WolverineFx — mixing versions across the family breaks on shared internal contracts, so the CritterWatch server in this repo at each version targets one coherent JasperFx stack.
Since #310 (CW4): the client package monitored services install — Wolverine.CritterWatch — no longer carries a transitive Marten dependency, so monitored services running RavenDB, EF Core, or no event store at all can install CritterWatch monitoring without pulling Marten onto their build closure. The version table above describes what the CritterWatch server is built against; client-side, the only event-store pin that matters is the JasperFx.Events abstractions package, which both Marten and Polecat implement against.
CritterWatch is currently pre-1.0; minor version bumps may carry breaking wire-format or API changes until 1.0 ships. The version table above reflects what's in this repo's Directory.Packages.props today — see Releases for the published version history.
Transport Requirements
CritterWatch communicates with monitored services over a Wolverine transport. RabbitMQ is the recommended transport for production use because it decouples the services from the CritterWatch server and supports reliable message delivery.
You can use any Wolverine-supported transport:
| Transport | Package | Notes |
|---|---|---|
| RabbitMQ | WolverineFx.RabbitMQ | Recommended for production |
| Amazon SQS | WolverineFx.AmazonSqs | Demoed by the in-tree Trip3 sample family via LocalStack (#206). Watch for the 1 MiB message-body limit — the CritterWatch wire format applies brotli + lazy-fetch on this transport to stay under it (#204 / PR #205). |
| SQL Server | WolverineFx.SqlServer | Good for SQL Server shops |
| In-memory | (built-in) | Development/testing only |
The CritterWatch server listens on a dedicated queue (conventionally named "critterwatch"). A single CritterWatch BFF can listen on multiple transports in parallel — the in-tree dev stack does exactly that to monitor Rabbit-based and SQS-based sample services in the same dashboard. Monitored services pick whichever transport they're already using.
Don't want to run a broker at all?
CritterWatch also supports broker-less HTTP and gRPC channels between the console and monitored services. The monitored service exposes a /_wolverine/invoke endpoint or a Wolverine gRPC port; the console publishes to that URL directly. See Transport Options for when this fits and how to wire it up.
PostgreSQL Setup
CritterWatch uses Marten to store service state as events. You need a PostgreSQL database accessible to the CritterWatch server. The Marten schema is automatically created on first run.
-- Create the database (CritterWatch will create the schema)
CREATE DATABASE critterwatch;The recommended docker-compose.yml fragment:
postgres:
image: postgres:16
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: critterwatch
ports:
- "5432:5432"
rabbitmq:
image: rabbitmq:3-management
ports:
- "5672:5672"
- "15672:15672"Next Step
See the Quick Start Guide to connect your first service.
