Always on watch.

Monitoring you run yourself.

Metrics, logs, traces and alerts in one place. A small agent on your Linux, macOS and Windows machines, a Helm chart for Kubernetes and a standard OpenTelemetry endpoint feed one server that stores everything, draws the dashboards and pages you when something breaks.

Add a Linux host with one command:

curl --proto '=https' --tlsv1.2 -fsSL https://app.meerkatlog.com/install.sh | MEERKAT_API_KEY=mk_... sudo -E sh
Meerkat's host page for test-fedora-1: operating system, kernel, agent version and uptime above charts of CPU usage by state, load average, memory and swap over the past hour, with the app's navigation on the left.
The real app, from our test organization: a host page with its charts.
  • One binarya static Go agent for Linux, macOS and Windows
  • ~20 MBagent memory on a 1 GB VM, under 1 % CPU
  • OTLPHTTP and gRPC from any OpenTelemetry SDK
  • Push onlyno inbound ports on the machines you monitor

Infrastructure

Every host, with its processes and containers

The agent reports CPU, memory, disks, network, processes and Docker containers every 15 seconds. The host list shows who is busy and who is filling up; each host has a page of its own with its charts, logs, processes, traces and events.

  • Linux, macOS (memory pressure and swap traffic, Apple Silicon or Intel) and Windows (services, Event Log)
  • Signed apt and yum repositories, so apt upgrade keeps the agent current
  • Buffers to disk while the server is unreachable
  • Decommission a retired host and keep its history
The Processes tab of a host page: a table of processes such as meerkat-agent, systemd and journald with their user, count, CPU percentage, resident memory and threads.
The Infrastructure host list: counts of hosts up and down, and a row per host with CPU, a CPU trend line, memory, disk, load, agent version and when it was last seen.

Logs

Search every log line, or watch them arrive

Full-text and field search with facets, a histogram by level and live tail. Open a line to see all of its fields and filter on any of them with one click.

  • journald, Docker, log files, the Windows Event Log, the macOS unified log, syslog and OTLP
  • Pipelines parse lines at intake with regex, grok and built-in nginx/Apache parsers, remap or drop them and turn them into metrics
  • Tokens, passwords and similar secrets are scrubbed before anything is stored
Log search: facets for host, service, source and level on the left, a histogram of log volume by level, the newest lines from two hosts, and below them the detail of one error line with its message and fields.

Traces and APM

See where a request spent its time

Rate, errors and duration for every service and endpoint, derived from your OpenTelemetry spans. Open a trace for its waterfall and jump to its logs; the service map shows who calls what, with databases and external calls.

  • Error tracking: exceptions grouped into issues, with regressions
  • Database query analytics by query shape, with N+1 detection
  • Deployment markers from service.version, with a before-and-after comparison
  • SLOs with burn-rate alerts
A trace of GET /owners/{ownerId} in a Java demo service: a waterfall of 12 spans with repository calls and SQL SELECT statements and the time each one took.
The service map: the petclinic service calling its database, with the call rate, error rate and p95 latency on the edge.
Errors. Exceptions grouped by type and stack, per service, with a trend and the version that first raised them.
The Errors page: one grouped issue, java.lang.RuntimeException on GET /oups, with its trend, event count and when it was first and last seen.
Databases. Every database and cache call grouped by query shape, sorted by the time it costs, with the endpoints behind it.
The Databases page: SQL query shapes with literals removed, with calls, total, average and p95 time, and the endpoints that call them most.

Monitors and alerting

Alerts that reach you, even with the app closed

Monitors are evaluated on the server. Built-in monitors cover hosts, disks, containers, checks, network devices, Kubernetes and vSphere; switch on the ones you need and add your own.

  • Metric, APM, log, host down, process, disk space, disk-full forecast, new error and SLO burn-rate monitors
  • Warn and alert thresholds, recovery thresholds, no-data handling and re-notify
  • Mute a monitor, or hosts during maintenance; acknowledge an alert so its reminders stop while someone works on it
  • E-mail, Slack, Telegram and webhooks
The Monitors page: counts by state (alert, warn, no data, OK, muted, acknowledged) and a list of built-in monitors such as Host down, Disk full forecast and Check failing, each with its status, type, tags and an on/off switch.

Dashboards and metrics

Dashboards that come ready, and ones you build

Built-in dashboards for hosts, the fleet, web traffic, the JVM and network devices. Clone one or start fresh with timeseries, query value, top list, table, log stream, text and SLO widgets and template variables.

  • A metrics explorer with a query builder or raw MetricsQL
  • Deployment markers on the charts, so a change in a line meets the release that caused it
  • A DogStatsD listener on localhost for your own application metrics
Charts from the built-in JVM dashboard: heap by pool showing the garbage-collection sawtooth, non-heap by pool, heap used against committed and limit, and time in GC by collector.

Also built in

The rest of what a hosted monitoring service does, running on your own hardware.

  • Kubernetes

    A Helm chart installs a node agent on every node (host, pod and container metrics, pod logs, volume usage) and a cluster agent for nodes, pods, deployments, daemonsets, statefulsets, Jobs, CronJobs, autoscalers and cluster events. Clusters, workloads and pods get their own pages: why a container fails (OOMKilled, CrashLoopBackOff), memory against its limit, node pressure, full volumes, failed Jobs, late CronJobs and autoscalers at their maximum, with monitor templates for each.

  • Real user monitoring

    A small script in your web pages measures what visitors get: Web Vitals (LCP, INP, CLS) per page, sessions with a timeline of page views, API requests and JavaScript errors, with a link to the backend trace of each request that carried a trace header. JavaScript errors are grouped like backend errors, with built-in monitors for poor vitals and error spikes.

  • Synthetic checks

    Ping, TCP (with an optional banner match, such as SSH-), HTTP (status, keyword and JSON assertions, a degraded threshold, encrypted secret headers) and certificate checks (days to expiry, invalid chains), run by the agents you pick, so internal URLs and certificates work too. Heartbeat checks are a dead-man switch your backups and cron jobs ping.

  • Network devices

    The agent polls routers and switches over SNMP v2c and v3: interface traffic, errors and status, CPU, memory and uptime, with a MikroTik RouterOS profile for temperature, voltage and client counts. A syslog receiver (RFC 3164 and 5424) with a RouterOS parsing pipeline.

  • VMware vSphere and ESXi

    The agent reads a vCenter or a standalone ESXi host through the vSphere API, read-only: ESXi hosts with CPU, memory, power draw, health and maintenance mode, virtual machines with power state, CPU ready, disk, network and snapshot age, datastores with free space, and vCenter alarms and events. Hosts that disconnect alert like any other host.

  • Integrations

    systemd units and Windows services, WireGuard tunnels, nginx, PostgreSQL and Redis, plus the DogStatsD listener for your own metrics.

  • Organizations, users and roles

    Separate organizations with their own hosts, telemetry, monitors and keys. Admin, editor and viewer roles, e-mail invites, two-factor authentication (TOTP), an audit log and a full data export. Self-hosted installs can switch on single sign-on (OIDC: Google, Microsoft Entra ID, Authentik, Keycloak) per organization; it is not yet available on app.meerkatlog.com.

  • API keys and HTTP API

    Everything the UI does is in the HTTP API. Intake keys can be bound to host name patterns, read-only keys serve the API and the MCP server, write keys may make only the changes they are granted, and CI can report deployments with a deploy key.

  • Configuration as code

    An organization's notification channels, synthetic checks, dashboards and monitors as one YAML document to keep in git. meerkat config exports it, shows a plan of what would change and applies it. Channel credentials are never exported.

How it works

Agents and apps push over HTTPS with an API key, so monitored machines need no inbound firewall rules. One server receives, processes and stores the data and serves the app.

Data flow: agents, Kubernetes and OpenTelemetry send data to intake; the Meerkat server stores it in VictoriaMetrics, VictoriaLogs, VictoriaTraces and Postgres; the web app, monitors and the MCP server read it. Sources Intake Storage Use Host agent Linux, macOS, Windows: metrics, logs, checks, SNMP Kubernetes node + cluster agent (Helm chart) Your apps OpenTelemetry SDK or Collector (OTLP) meerkat-server HTTPS via Caddy API key check log pipelines secret scrubbing RED, service map, errors, DB shapes per-org isolation VictoriaMetrics metrics VictoriaLogs logs VictoriaTraces spans Postgres hosts, monitors, users Web app and API dashboards, logs, traces, APM Monitors e-mail, Slack, Telegram, webhooks MCP server for AI assistants, read-only by default Data flow: agents, Kubernetes and OpenTelemetry send data to intake; the Meerkat server stores it in VictoriaMetrics, VictoriaLogs, VictoriaTraces and Postgres; the web app, monitors and the MCP server read it. Host agent Linux, Mac, Windows Kubernetes Helm chart Your apps OTel SDK or Collector meerkat-server HTTPS via Caddy, API key check log pipelines, secret scrubbing RED, service map, errors, DB shapes per-org isolation VictoriaMetrics metrics VictoriaLogs logs VictoriaTraces spans Postgres hosts, monitors Web app and API dashboards, logs, traces, APM Monitors e-mail, Slack, Telegram, webhooks MCP server for AI assistants, read-only by default
  1. Collect. The agent reads metrics every 15 seconds and tails logs; SDKs and the Collector export OTLP. Everything is batched, compressed and pushed to the intake host.
  2. Process. The server checks the API key, runs your log pipelines, scrubs secrets and derives request, error and latency series, service-map edges, error issues and query shapes from spans.
  3. Store. Metrics go to VictoriaMetrics, logs to VictoriaLogs, spans to VictoriaTraces, and hosts, dashboards, monitors and users to Postgres.
  4. Watch. Monitors evaluate on the server even when nobody has the app open, and notify your channels when a state changes.

OpenTelemetry

Bring your OpenTelemetry

Point any OpenTelemetry SDK at Meerkat with the standard environment variables. Traces, metrics and logs arrive with the service, version and environment you set; a new service.version shows up as a deployment marker on the charts. No Meerkat agent is needed inside your app.

  • OTLP/HTTP with protobuf or JSON, optionally gzip
  • OTLP/gRPC on port 443
  • Java, Python, Node.js and Go examples in the docs
  • Works through the OpenTelemetry Collector too
  • Kubernetes attributes (k8s.pod.name, …) link traces and errors to their pods

Environment for any OpenTelemetry SDK

export OTEL_SERVICE_NAME=checkout
export OTEL_RESOURCE_ATTRIBUTES=service.version=1.4.2,deployment.environment=prod
export OTEL_EXPORTER_OTLP_ENDPOINT=https://intake.meerkatlog.com/intake/v1/otlp
export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
export OTEL_EXPORTER_OTLP_HEADERS=Authorization=Bearer%20mk_your_key_here
export OTEL_TRACES_EXPORTER=otlp
export OTEL_METRICS_EXPORTER=otlp
export OTEL_LOGS_EXPORTER=otlp

The space in Bearer mk_… is written %20: header values in this variable are URL-encoded.

Self-hosted

Your data stays yours

Meerkat runs as a Docker Compose stack on a machine you control. Your metrics, logs and traces are stored there and nowhere else.

  • Small footprint

    The server stack needs about 1 GB of free RAM. The agent uses about 20 MB of RAM and under 1 % CPU on a 1 GB VM by default, with a lean profile for the smallest machines.

  • Proven storage engines

    VictoriaMetrics, VictoriaLogs, VictoriaTraces and Postgres behind Caddy with automatic Let's Encrypt certificates. Retention is configurable; make backup dumps Postgres and snapshots the metric and log stores, and a nightly script sends encrypted archives of every store to another server.

  • Secrets stay out

    Tokens in URLs, authorization and cookie headers and similar secrets are removed at intake, before anything is written to disk. Add your own rules and try them with a dry run. Credentials you give Meerkat (Telegram and Slack tokens, webhook URLs) are encrypted at rest.

One load test, for scale: 200 simulated hosts sent data to the public intake for 15 minutes: about 1,650 intake requests per minute with no errors, while the server stayed at or below 16 MB of memory (VictoriaMetrics about 80 MB, VictoriaLogs about 120 MB), and the host list and a fleet-wide query answered in under 50 ms.

AI assistants

Ask your AI assistant

Meerkat includes a Model Context Protocol (MCP) server, so Claude, ChatGPT and other MCP clients can investigate your hosts, metrics, logs, traces, APM data, synthetic checks, monitors and events. Claude and ChatGPT connect as connectors: you sign in to Meerkat and pick the organization, with no key to paste. Other clients use a read key.

It is read-only by default: the assistant sees what you may see, with the same rate limits, and you can disconnect it at any time. If you opt in, an editor can let it mute hosts and monitors, acknowledge alerts, create and adjust monitors and synthetic checks, mark deployments and decommission hosts. Each change can be tried as a dry run first and is recorded in the audit log.

  • Hosts and their metrics, MetricsQL, log search and facets
  • Traces, service map, RED, errors and database queries
  • Monitor status, checks, SLOs and recent events
  • An incident investigation prompt that sticks to the evidence

Connect Claude Code (sign in in the browser)

claude mcp add --transport http meerkat \
  https://app.meerkatlog.com/mcp

In claude.ai or ChatGPT, add the same address as a custom connector; use /mcp/write for the write tools. A read key in an Authorization header, or the standalone meerkat-mcp binary (stdio), works with any MCP client.

Always on watch.

A meerkat mob always keeps one member on sentry duty while the others work. That is the job.