Self-Hosted AI Agent Monitoring: Keep Your Data Where It Belongs
Why Self-Hosted Monitoring Matters for AI Agents
When your AI agents handle customer conversations, internal documents, or proprietary workflows, every prompt and response becomes sensitive data. Sending that telemetry to a third-party SaaS dashboard creates compliance headaches, vendor lock-in, and an uncomfortable dependency on someone else's uptime.
Self-hosted AI agent monitoring flips that equation. You keep the logs, traces, and metrics inside your own perimeter while still getting the visibility you need to debug failures, control costs, and prove reliability to stakeholders. For regulated industries — healthcare, legal, finance — it is often the only viable path to production.
What You Actually Need to Monitor
AI agents are not traditional web services. A useful monitoring stack has to capture signals that classic APM tools miss:
- Prompt and completion pairs with token counts per call
- Tool invocations and their success or failure outcomes
- Latency breakdowns between model calls, tool execution, and orchestration overhead
- Cost per session so a runaway loop does not silently burn your budget
- Error patterns like rate limits, context overflows, and malformed tool arguments
- Conversation drift when an agent stops following its system prompt
Without these, you are flying blind. A 200 OK response from an LLM endpoint tells you nothing about whether the agent actually solved the user's problem.
The Trade-Offs of Going Self-Hosted
Running your own observability stack is not free. You take on patching, backups, scaling, and on-call rotations. You also need engineers comfortable with time-series databases, log pipelines, and dashboarding tools.
In exchange, you get:
- Data sovereignty — nothing leaves your VPC
- Predictable pricing — no per-event billing surprises
- Custom retention — keep traces for years if compliance demands it
- Full schema control — instrument exactly what your agents need
For teams already running Kubernetes or a serious cloud footprint, the marginal cost is small. For a two-person startup, a managed option usually wins until scale forces a rethink.
How ClawPulse Approaches the Problem
ClawPulse was built specifically for OpenClaw and Anthropic-based agent deployments, with a self-hostable architecture as a first-class option. Instead of forcing every customer onto a shared multi-tenant cluster, you can deploy the ClawPulse collector and dashboard inside your own environment and stream agent telemetry locally.
Key capabilities include:
- Per-agent dashboards that surface token usage, tool call success rates, and latency percentiles
- Session replay so you can walk through any conversation step by step
- Cost attribution broken down by agent, user, and feature flag
- Alerting hooks for runaway loops, prompt injection attempts, and quota burns
- A lightweight SDK that drops into existing OpenClaw or Claude SDK projects with a few lines of code
Because the collector speaks open protocols, you are not locked into a proprietary agent runtime. If you later switch models or orchestrators, your historical telemetry stays intact and queryable.
A Practical Rollout Plan
If you are introducing monitoring to an existing agent deployment, resist the urge to instrument everything on day one. A workable sequence looks like this:
1. Start with cost and error tracking — these have the highest ROI and are the cheapest to capture.
2. Add latency traces once you have a baseline of which calls dominate response times.
3. Layer in prompt and completion logging behind a feature flag so you can sample rather than store everything.
4. Wire up alerts only after you understand normal behavior. Premature alerting trains the team to ignore the dashboard.
This staged approach keeps storage costs manageable and avoids drowning your team in noise during the first week.
Get Started With ClawPulse
Whether you choose the hosted version on clawpulse.org or run the collector inside your own infrastructure, you get the same agent-aware visibility built for modern LLM workflows. Stop guessing why your agent failed at 3 a.m. and start shipping with confidence.
Create your free ClawPulse account and instrument your first agent in under ten minutes.
Self-Hosted vs SaaS: The Real Total Cost of Ownership
Most teams underestimate self-hosting because they only price the software (often free or low-cost) and forget the surrounding stack. Here is what each tier actually looks like for a fleet of fifty agents at production traffic (~5M LLM calls / month, ~30M trace events).
| Component | Langfuse self-hosted | Helicone self-hosted | ClawPulse self-hosted |
|---|---|---|---|
| Application containers | 2x node + worker (~1 vCPU, 2GB) | 1x web + 2x jobs (~2 vCPU, 4GB) | 1x collector + 1x web (~1 vCPU, 2GB) |
| Primary datastore | Postgres + ClickHouse | Postgres + ClickHouse | Postgres only (ClickHouse optional) |
| Cache layer | Redis | Redis | Redis |
| Queue / streaming | None | Kafka (mandatory above ~1M events/day) | None |
| Object storage for trace blobs | S3 / MinIO | S3 / MinIO | S3 / MinIO |
| Estimated infra cost (AWS, eu-west) | $480 – $720 / month | $1,100 – $1,600 / month | $180 – $260 / month |
| Engineer time to install | 1 – 2 days | 3 – 5 days | 1 – 3 hours |
| Engineer time to maintain | ~4 hours / month | ~8 – 12 hours / month | ~1 hour / month |
ClickHouse and Kafka stop being optional once you scale past a few hundred thousand events per day — schema migrations, version pinning, and disk-pressure tuning become a recurring cost. ClawPulse keeps the hot path on Postgres because the agent-monitoring data model is narrow (one row per task, one row per LLM call) compared to general-purpose LLM gateways. For deep context on instrumenting clients without putting the model API behind a critical-path proxy, the Anthropic production best practices document the same trade-off.
A 30-Minute Self-Hosted Deployment
The ClawPulse self-hosted collector runs as a single container behind your existing reverse proxy. A minimal `docker-compose.yml` looks like this:
```yaml
version: "3.9"
services:
postgres:
image: postgres:16
environment:
POSTGRES_USER: clawpulse
POSTGRES_PASSWORD: ${PG_PASSWORD}
POSTGRES_DB: clawpulse
volumes:
- pgdata:/var/lib/postgresql/data
restart: unless-stopped
redis:
image: redis:7-alpine
restart: unless-stopped
collector:
image: ghcr.io/clawpulse/collector:latest
environment:
DATABASE_URL: postgres://clawpulse:${PG_PASSWORD}@postgres:5432/clawpulse
REDIS_URL: redis://redis:6379
CLAWPULSE_LICENSE: ${LICENSE_KEY}
JWT_SECRET: ${JWT_SECRET}
ports:
- "8080:8080"
depends_on: [postgres, redis]
restart: unless-stopped
volumes:
pgdata:
```
Point your agent SDK at the local collector instead of the hosted endpoint:
```python
# pip install clawpulse
import os
from clawpulse import ClawPulse, trace
cp = ClawPulse(
endpoint="https://monitoring.internal.example.com", # your self-hosted collector
api_key=os.environ["CLAWPULSE_AGENT_TOKEN"],
flush_interval_ms=2000,
batch_size=100,
)
@trace(name="customer_support_agent")
def run_agent(user_input: str, session_id: str) -> str:
with cp.span("retrieval", session_id=session_id) as span:
docs = retriever.search(user_input)
span.set_attr("docs.count", len(docs))
with cp.span("llm_call", session_id=session_id) as span:
resp = anthropic_client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": user_input}],
)
span.set_attr("input_tokens", resp.usage.input_tokens)
span.set_attr("output_tokens", resp.usage.output_tokens)
return resp.content[0].text
```
Three environment variables, two containers, and a `flush_interval_ms` you can dial down if you want sub-second alerting. Compare that with the Langfuse self-hosting guide which requires a working ClickHouse cluster, S3-compatible storage, Postgres, Redis, and a separate worker — every piece of which is another on-call rotation.
Compliance and Data Sovereignty Use Cases
Self-hosted monitoring is not just a cost-control choice. Several regulated workloads make it the only legal path forward:
- HIPAA-covered agents processing patient context cannot send PHI to a third-party SaaS without a signed BAA — and even with a BAA, your security team often prefers the data never leaves the VPC.
- GDPR Article 28 processors in the EU need a documented legal basis for every cross-border transfer. A self-hosted collector inside an eu-west region eliminates the entire chain.
- Quebec Loi 25 (Bill 64) mandates impact assessments before any personal data leaves Canadian soil. Hosting the collector in `ca-central` makes the assessment trivial.
- SOC 2 Type II auditors look for documented data flow diagrams. A self-hosted ClawPulse appears as one box on your existing diagram instead of adding another vendor questionnaire.
- FedRAMP-adjacent workloads sometimes block all egress to non-approved domains. Self-hosted is the only way to keep telemetry alive in that environment.
- Air-gapped environments (defense, certain financial trading floors) cannot reach `*.clawpulse.org` at all. The same Docker image runs offline with a locally-issued license.
For each of these, the integration story is identical: install once, never explain again to legal.
Six Metrics Your Self-Hosted Collector Must Capture
Whatever stack you pick, make sure these six metrics are queryable from day one. Skip any of them and you will end up adding instrumentation in the middle of an incident, which is the worst possible time.
1. Tool call success rate per tool — a single misbehaving tool can drop overall agent reliability by 20% without raising any classic APM signal.
2. End-to-end task latency p95 / p99 — agents chain calls, so the user-visible number is the sum, not the per-call latency you might already track.
3. Token-cost-per-task — surfaces runaway loops before the bill arrives. See the OpenAI batch API pricing reference for batched cost reduction patterns.
4. Stuck-session rate — sessions that have not advanced in N minutes despite an open transcript. Often correlates with provider-side issues at status.anthropic.com or status.openai.com.
5. Failure-mode taxonomy frequency — categorize failures (rate_limit / context_overflow / tool_arg_invalid / output_parse_error / timeout / hallucination) and trend each one separately. A flat error count tells you nothing.
6. Cost-per-successful-outcome — divide spend by the number of tasks that actually closed successfully. This is the only number that survives quarterly review.
ClawPulse exposes each of these as a queryable dimension out of the box; if you build your own stack on Postgres + Grafana, plan for at least one engineer-week to wire them up properly.
When Hosted Beats Self-Hosted
Self-hosting is not a free lunch and not always the right answer. Hosted ClawPulse wins when:
- Your team is under five engineers and nobody owns infrastructure full-time.
- Your data is non-sensitive (internal dev tooling, public-facing chatbots without PII).
- You need multi-region failover and do not want to operate it yourself.
- You want zero-touch upgrades — new failure-mode taxonomies, new alert types, and new dashboards land automatically.
- Your monthly LLM spend is under ~$5,000; the hosted plan is cheaper than the engineer hours you would spend on the self-hosted stack.
Many teams run a hybrid: hosted for staging and small projects, self-hosted for the production cluster handling regulated traffic. Both write to the same SDK, so dashboards and alert rules are identical.
Start monitoring your OpenClaw agents in 2 minutes
Free 14-day trial. No credit card. Just drop in one curl command.
Prefer a walkthrough? Book a 15-min demo.
Backup, Retention, and Upgrade Strategy
Self-hosted means you own the data lifecycle. A pragmatic baseline:
- Hot retention — 30 days of full traces, queryable from the dashboard.
- Warm retention — 90 days of aggregated daily summaries (no per-call payloads).
- Cold retention — 13 months of monthly cost rollups for compliance audits.
- Backups — nightly `pg_dump` to S3 with seven-day point-in-time recovery via WAL shipping; test restore monthly.
- Upgrades — pin to minor versions, read the changelog before bumping major versions, run upgrades in staging for one week before production.
If that sounds like more than you want to operate, that is your honest signal to start hosted and migrate later. Both paths are documented and the SDK is identical — there is no rewrite cost when you switch.
Frequently Asked Questions
Can I migrate from hosted ClawPulse to self-hosted later?
Yes. The data model is identical and the SDK takes one environment variable change. Historical data can be exported via the dashboard or replayed from your application logs.
Does self-hosted ClawPulse phone home?
Only the license check, which is a single signed-token request once per day. All telemetry stays inside your perimeter. Air-gapped customers receive offline license bundles.
How does self-hosted compare to OpenTelemetry plus Grafana?
OTel + Grafana is a generic observability stack — it has no concept of agents, tools, tokens, or sessions. You can build agent-aware dashboards on top, but expect 2–4 weeks of engineering and ongoing maintenance whenever your agent stack evolves.
What is the smallest production-ready deployment?
One 4 vCPU / 8 GB virtual machine running the docker-compose above can comfortably handle 1M LLM calls per month. Above that, split Postgres onto its own instance.
Does self-hosted ClawPulse support the same alert destinations as the hosted version?
Yes — Slack, PagerDuty, generic webhooks, email, and the upcoming Microsoft Teams connector all ship in the same image.
If you want to try it without committing to self-hosted, start with a hosted ClawPulse trial, then migrate when your compliance team is ready. Or book a demo to walk through the deployment and decide which path fits your environment.
For a deeper take on the operational side, read our guides on monitoring OpenClaw AI agents in production, the OpenClaw observability platform deep-dive, and how this compares to general-purpose stacks in our ClawPulse vs Datadog comparison.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Can I migrate from hosted ClawPulse to self-hosted later?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. The data model is identical and the SDK takes one environment variable change. Historical data can be exported via the dashboard or replayed from your application logs."
}
},
{
"@type": "Question",
"name": "Does self-hosted ClawPulse phone home?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Only the license check, which is a single signed-token request once per day. All telemetry stays inside your perimeter. Air-gapped customers receive offline license bundles."
}
},
{
"@type": "Question",
"name": "How does self-hosted ClawPulse compare to OpenTelemetry plus Grafana?",
"acceptedAnswer": {
"@type": "Answer",
"text": "OpenTelemetry plus Grafana is a generic observability stack with no concept of agents, tools, tokens, or sessions. You can build agent-aware dashboards on top, but expect 2 to 4 weeks of engineering and ongoing maintenance whenever your agent stack evolves."
}
},
{
"@type": "Question",
"name": "What is the smallest production-ready self-hosted deployment?",
"acceptedAnswer": {
"@type": "Answer",
"text": "One 4 vCPU / 8 GB virtual machine running the documented docker-compose can comfortably handle 1 million LLM calls per month. Above that, split Postgres onto its own instance."
}
},
{
"@type": "Question",
"name": "Does self-hosted ClawPulse support the same alert destinations as hosted?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Slack, PagerDuty, generic webhooks, email, and the Microsoft Teams connector all ship in the same image."
}
}
]
}
Choosing Your Self-Hosted Topology
Before you write a single line of YAML, decide which deployment shape actually fits your team. Three patterns dominate in production self-hosted AI agent monitoring:
- Single-node compose: a tight reference for fewer than five engineers, evaluation environments, and on-prem proofs of value. One virtual machine, one disk, one Postgres. Easy to reason about, easy to back up, harder to scale beyond roughly 10 million LLM calls per month before write contention shows up.
- Kubernetes with managed Postgres: the right answer for any team already running k8s. The collector, ingest API, and dashboard run as stateless deployments behind a horizontal pod autoscaler, while the database lives on a managed service like AWS RDS, GCP Cloud SQL, or Azure Database for PostgreSQL. This is the default we recommend for production AI agent monitoring at most companies.
- Air-gapped on-prem cluster: regulated industries — defense, health records, financial settlement — usually need this. Everything inside the perimeter, license bundles delivered offline, no outbound calls. The architecture is identical to k8s, but image registries and Helm charts ship through your internal artifact server.
The choice is not just operational; it influences how aggressively you can sample. Self-hosted teams typically sample 100 percent of traces because the marginal cost of storing one more row is a few hundred bytes of disk, not a per-event invoice line. That single change — keeping every trace instead of one in ten — is often what makes a previously invisible production bug suddenly trivial to debug.
Docker Compose Reference Deployment
For evaluation or single-node production, the docker-compose definition below brings up the collector, the ingest API, the dashboard, and Postgres. It assumes a Linux host with at least 4 vCPU, 8 GB RAM, and 100 GB of attached SSD. Save it as `docker-compose.yml` and run `docker compose up -d`.
```yaml
version: "3.9"
services:
postgres:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_DB: clawpulse
POSTGRES_USER: clawpulse
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- pgdata:/var/lib/postgresql/data
command: >
postgres
-c shared_buffers=2GB
-c effective_cache_size=6GB
-c work_mem=32MB
-c maintenance_work_mem=512MB
-c max_connections=200
-c jit=off
ingest:
image: ghcr.io/clawpulse/ingest:stable
restart: unless-stopped
depends_on: [postgres]
environment:
DATABASE_URL: postgres://clawpulse:${POSTGRES_PASSWORD}@postgres:5432/clawpulse
LICENSE_KEY: ${LICENSE_KEY}
INGEST_BATCH_SIZE: "500"
INGEST_FLUSH_MS: "750"
ports: ["4318:4318"]
dashboard:
image: ghcr.io/clawpulse/dashboard:stable
restart: unless-stopped
depends_on: [postgres, ingest]
environment:
DATABASE_URL: postgres://clawpulse:${POSTGRES_PASSWORD}@postgres:5432/clawpulse
AUTH_SECRET: ${AUTH_SECRET}
PUBLIC_URL: https://monitoring.example.com
ports: ["3000:3000"]
volumes:
pgdata:
```
The official Docker Compose specification covers the syntax in depth, but the important lines for ClawPulse are the Postgres tuning flags. We override `shared_buffers`, `effective_cache_size`, `work_mem`, and disable just-in-time compilation because LLM telemetry queries are I/O-bound rollups, not CPU-heavy analytical workloads — the JIT planner overhead actually hurts more than it helps for the typical query shape.
If you need TLS at the edge, sit a Caddy or nginx reverse proxy in front of the dashboard service. Caddy auto-provisions Let's Encrypt certificates; for fully internal hostnames, terminate TLS with your private CA and pass the certificate via a bind-mounted volume.
Kubernetes Deployment with Helm
For multi-tenant or multi-region production, run on Kubernetes. The official Helm chart ships three deployments and one stateful set fallback for embedded Postgres, but most teams disable the embedded database and point at a managed Postgres instance.
```bash
helm repo add clawpulse https://charts.clawpulse.org
helm repo update
helm upgrade --install clawpulse clawpulse/clawpulse \
--namespace observability --create-namespace \
--set postgres.embedded=false \
--set postgres.url="postgres://clawpulse:$PG_PASS@pg-primary.observability.svc:5432/clawpulse" \
--set ingress.host=monitoring.example.com \
--set licenseKey=$LICENSE_KEY \
--set replicaCount.ingest=3 \
--set replicaCount.dashboard=2 \
--set autoscaling.enabled=true \
--set autoscaling.targetCPU=65
```
Key Kubernetes patterns we recommend:
- Separate ingest and dashboard scale. Ingest is write-heavy and scales with LLM call volume. Dashboard is read-heavy and scales with active engineer count. Decoupling lets you pay for each curve independently.
- Pod disruption budgets. Set `minAvailable: 1` on ingest so a node drain never drops traces. Buffered writes survive short interruptions but a full outage will lose in-flight events.
- Resource requests over limits. Burst CPU is fine on ingest pods — the periodic flush spikes briefly and idles in between. Setting hard limits below the burst causes throttling that surfaces as inflated `p99_latency` metrics.
- Network policies. Allow ingest ingress on port 4318 from your application namespaces only. The dashboard should be reachable only from your VPN or identity-aware proxy.
The Kubernetes documentation on horizontal pod autoscaling is the right reference for tuning the scale-up curve. We default to a 30-second scale-up window and a 5-minute scale-down window because LLM traffic is bursty and you do not want pods churning every minute.
Postgres Tuning for High-Cardinality Telemetry
ClawPulse stores three tables that dominate disk usage: `trace_events`, `tool_calls`, and `token_usage`. All three are append-only and partitioned by day. The default schema works for moderate volume, but anything above 5 million LLM calls per month rewards explicit tuning.
```sql
-- Daily partitions reduce vacuum pressure and let you drop old data quickly
ALTER TABLE trace_events PARTITION BY RANGE (created_at);
-- BRIN indexes are dramatically smaller than B-tree for time-ordered data
CREATE INDEX trace_events_created_at_brin
ON trace_events USING BRIN (created_at) WITH (pages_per_range = 64);
-- Covering index for the dashboard's most expensive query
CREATE INDEX trace_events_agent_session_covering
ON trace_events (agent_id, session_id, created_at DESC)
INCLUDE (status, latency_ms, total_tokens);
-- Retention: drop partitions older than 90 days for token-usage rollups
SELECT drop_old_partitions('trace_events', INTERVAL '90 days');
```
A BRIN index is the unsung hero of telemetry workloads. For a billion-row time-ordered table, BRIN is roughly 1000 times smaller than the equivalent B-tree and gives you the same lookup performance for `WHERE created_at BETWEEN ...` filters that dashboards constantly run. The trade-off is poor random-row lookups, which you would not do on telemetry data anyway.
Set `autovacuum_vacuum_scale_factor = 0.05` for these tables specifically. The default 0.2 lets dead tuples accumulate until 20 percent of the table is bloat, which on a billion-row table means a five-minute vacuum window that blocks the planner statistics. A 5 percent threshold runs vacuum more often but each pass finishes in seconds.
If you run on AWS Aurora or Google AlloyDB, the columnar engines automatically optimize this access pattern. Pay attention to the IOPS budget — large telemetry queries are sequential reads, not random ones, and provisioning random-IOPS tiers wastes money for this workload.
Air-Gapped and Sovereign Cloud Patterns
For Defense, healthcare under HIPAA, or jurisdictions enforcing data localization (Quebec's Loi 25, Germany's BDSG, India's DPDP), you need a deployment with no outbound connectivity except to your internal artifact server.
The pattern that works:
1. Mirror the container registry to your internal artifact server (Harbor, Artifactory, or Nexus). ClawPulse images are signed with Sigstore Cosign, so verify signatures during the mirror to detect supply-chain tampering.
2. Generate an offline license bundle through the customer portal. The bundle is a signed JWT with a 90-day validity window that the ingest service validates locally without phoning home.
3. Disable the auto-update channel. Set `clawpulse.updateCheck=false` in the Helm values. You promote new versions through your internal change-management process, never automatically.
4. Pin every image by SHA digest, not by tag. Tags can be overwritten; digests cannot. Your GitOps tool of choice should reject any manifest that references a mutable tag in production.
5. Audit egress firewall rules. The collector should only egress to Postgres and to internal Slack or PagerDuty webhooks. A unit test in your network policy CI pipeline that asserts "no public IP egress" prevents drift over time.
Air-gapped deployments interact well with our self-hosted alternative to Helicone discussion — many regulated teams arrived at ClawPulse precisely because their legal team rejected SaaS observability vendors after a one-page review.
Backup, Restore, and Disaster Recovery
Telemetry is not customer data, but losing six months of trace history during an investigation is a career-defining event. Set up backups before you have anything worth backing up.
```bash
# Logical backup of recent data, runs every 4 hours
pg_dump --format=custom --no-owner \
--table='trace_events' --table='tool_calls' --table='token_usage*' \
-h pg-primary -U clawpulse clawpulse \
| aws s3 cp - s3://backups-clawpulse/$(date -u +%Y/%m/%d/%H).dump
# Physical base backup with WAL archiving for point-in-time recovery
pg_basebackup -D /backup/base -F tar -z -P -h pg-primary -U replicator
```
Three rules we live by:
- Test restores quarterly. An untested backup is a thoughts-and-prayers backup. Pick a random Friday, spin up a parallel database, restore last night's dump, and confirm the dashboard loads. We have caught two silent corruption issues this way that would otherwise have surfaced only in a real incident.
- Cross-region replication. The S3 destination should live in a different region than the primary database. AWS S3 cross-region replication, GCS dual-region buckets, or Azure RA-GRS all work.
- Document the runbook. The on-call engineer at 03:00 should not have to figure out the restore procedure from first principles. A `RESTORE.md` in your repo with copy-pastable commands wins more than the most elegant backup tool.
Pair backups with PITR from PostgreSQL's continuous archiving documentation if you cannot tolerate losing the last four hours of telemetry. For most teams, four-hour RPO on observability data is acceptable; the agents are still running and re-emitting traces.
Monitoring the Monitoring Stack
The observability stack itself needs observability. Otherwise you discover the dashboard is down because nobody is looking at it. Three signals matter:
- Ingest queue depth. If buffered events climb past a threshold, your write path is falling behind production traffic. Alert at the 10th percentile of historical depth, not at a fixed number; absolute thresholds need re-tuning every quarter while percentile thresholds adapt automatically.
- Postgres replication lag. If you run a read replica for the dashboard, lag above 30 seconds means dashboards show stale data. Page on this — engineers debugging an outage will think the problem is fixed when really their dashboard is just behind.
- License token expiry. The offline license bundle has a hard expiry date. Alert at 14 days remaining so finance and legal have time to renew without an outage.
Expose these as Prometheus metrics on `/metrics` and scrape them with your existing Prometheus or OpenTelemetry collector. ClawPulse does not insist on monitoring itself with itself; that meta-loop ends in tears the first time the database is the failing component.
Migration: From SaaS Vendors to Self-Hosted
If you arrived here from Langfuse, Helicone, LangSmith, or Portkey and want to migrate trace history along with the move, the playbook is straightforward:
1. Export historical traces from the existing vendor's API to JSONL files in S3. Most vendors throttle to 100 requests per second; budget a few hours for a year of data.
2. Run the ClawPulse importer in dry-run mode first. The importer normalizes vendor-specific schemas into the ClawPulse trace format and reports any rows it cannot interpret. Fix the mapping before flipping the dry-run flag.
3. Replay in chronological order. Out-of-order replay still produces correct dashboards thanks to immutable trace IDs, but it inflates the apparent ingest rate during the import window and can trigger the alerting layer. Easier to import in order than to debug spurious alerts.
4. Run both stacks in parallel for two weeks. New traces stream to both the old vendor and ClawPulse. Compare the dashboards day by day. After two weeks of agreement, decommission the SaaS contract.
Teams who follow this sequence typically migrate in 7 to 14 calendar days end to end, with most of the elapsed time being the parallel-run validation rather than the technical lift. See our deeper dive into why teams switch from Langfuse to purpose-built monitoring and the LangSmith alternatives comparison for context on what to expect from each migration source.
Ready to deploy? Book a self-hosted walkthrough or check the pricing tiers — the self-hosted SKU includes the full Helm chart, license bundle, and a dedicated support channel for your DevOps team.
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "Deploy Self-Hosted ClawPulse for AI Agent Monitoring",
"description": "Step-by-step procedure to deploy self-hosted ClawPulse on Kubernetes with managed Postgres, including backup and air-gapped considerations.",
"totalTime": "PT2H",
"tool": [
{"@type": "HowToTool", "name": "Kubernetes cluster (1.28+)"},
{"@type": "HowToTool", "name": "Managed PostgreSQL 16+"},
{"@type": "HowToTool", "name": "Helm 3.12+"}
],
"step": [
{"@type": "HowToStep", "name": "Provision Postgres", "text": "Create a managed PostgreSQL 16 instance with at least 4 vCPU and 16 GB RAM. Enable point-in-time recovery and configure cross-region backup replication."},
{"@type": "HowToStep", "name": "Install the Helm chart", "text": "Run helm upgrade --install clawpulse clawpulse/clawpulse with postgres.embedded=false and your managed database URL."},
{"@type": "HowToStep", "name": "Configure ingress and TLS", "text": "Point a DNS record at your ingress controller and provision a TLS certificate via cert-manager or your private CA."},
{"@type": "HowToStep", "name": "Apply network policies", "text": "Allow ingest port 4318 only from application namespaces; restrict dashboard access to your VPN or identity-aware proxy."},
{"@type": "HowToStep", "name": "Validate end-to-end", "text": "Send a test trace from your agent code, confirm it appears in the dashboard within 5 seconds, and verify alerts fire to your Slack or PagerDuty destination."}
]
}