mAPIng
MONITORED API · NG
Sign in Start free →
ZERO-CONFIG · SYMPTOM → CAUSE

Know why your Go endpoint slowed down. Without correlating ten dashboards.

mAPI-ng correlates RED metrics with Go runtime, deployment, and downstream signals and, when an endpoint breaks, ranks the likely causes with the evidence behind each, not another graph to read.

One middleware call and one environment variable. No Prometheus or Grafana to operate.

Get your ingest key → See the 5 lines

Free tier · no card · absent key = no-op, safe to ship

main.go
import (
    maping "github.com/arhuman/maping/client"
    mapinggin "github.com/arhuman/maping/client/gin"
)

rec := maping.NewRecorder(
    maping.WithService("checkout-api"),
)
r.Use(mapinggin.MiddlewareWithRecorder(rec)) // above Recovery
r.Use(gin.Recovery())
import (
    maping "github.com/arhuman/maping/client"
    mapinghttp "github.com/arhuman/maping/client/nethttp"
)

rec := maping.NewRecorder(
    maping.WithService("checkout-api"),
)
mux := http.NewServeMux()
mux.HandleFunc("GET /orders/{id}", ordersHandler)
// wrap the mux; the ServeMux pattern is the route template
handler := mapinghttp.MiddlewareWithRecorder(rec)(mux)
import (
    maping "github.com/arhuman/maping/client"
    mapingecho "github.com/arhuman/maping/client/echo"
)

rec := maping.NewRecorder(
    maping.WithService("checkout-api"),
)
e.Use(mapingecho.MiddlewareWithRecorder(rec)) // before Recover
e.Use(middleware.Recover())
import (
    maping "github.com/arhuman/maping/client"
    mapingchi "github.com/arhuman/maping/client/chi"
)

rec := maping.NewRecorder(
    maping.WithService("checkout-api"),
)
r.Use(mapingchi.MiddlewareWithRecorder(rec)) // above Recoverer
r.Use(middleware.Recoverer)
import (
    maping "github.com/arhuman/maping/client"
    mapingbeego "github.com/arhuman/maping/client/beego"
)

rec := maping.NewRecorder(
    maping.WithService("checkout-api"),
)
// filter runs after routing; panic recovery is inner, so no ordering needed
web.InsertFilterChain("/*", mapingbeego.FilterWithRecorder(rec))
3 · THE ONLY REQUIRED INPUT
export MAPING_KEY=mk_live_…
live · flush ~10s
5m 1h 24h
TOTAL TRAFFIC
12.4k req/s
REQUESTS (1H)
44.6M
ERROR RATE
0.42%
WORST p99
210 ms
SERVICERATEERR%p99
checkout-api 3.1k 0.18% 88 ms
payments-api 2.4k 2.10% 142 ms
catalog-api 4.9k 0.05% 61 ms
auth-api 1.6k 5.30% 640 ms
THE DIAGNOSIS DIFFERENCE

Grafana shows the spike. mAPI-ng names the cause.

When an endpoint goes red, the detail page doesn't hand you ten charts to correlate by hand. It ranks the likely cause from signals already collected, and tells you how to prove it wrong.

RAW METRICS SAY
"p95 is 6.4× baseline on GET /v1/checkout."
Now open five dashboards and figure out why.
mAPI-ng CORRELATES IT FOR YOU
NO NEW QUERY · NO EXTRA COST
Ranks the cause from signals already on the page
Confidence as discrete tiers, never a fake %
Every read ships a falsifier: how to rule it out
Critical GET /v1/checkout last 5m
RANKED CAUSE Latency p95 6.4× the trailing baseline
Memory / GC pressure High · 3/4 signals
Scope: 2 of 8 instances · v1.8.3 · success and error
  • Heap live-set climbing across the window, not reclaimed by GC.
  • GC CPU 14% vs 3% baseline.
  • Alloc rate 512 MiB/s vs 180 MiB/s baseline.
Rules this out: heap and GC CPU stay flat over a longer window while latency persists.
ALSO CONSIDERED Overload / timeouts · Low Downstream / IO · Low

mAPI-ng targets the onboarding, interpretation, and operational cost of the OTel + Prometheus + Grafana stack, not its flexibility. It gives you RED metrics and a ranked, evidence-backed diagnosis for every Go endpoint, with nothing to operate. It does not replace full distributed tracing or custom dashboards.

THREE PRINCIPLES

Diagnosis, simplicity, efficiency

Diagnosis

When an endpoint goes red, the detail page ranks 8 cause families from signals it already loads, each with its evidence and a falsifier that says what would rule it out. Confidence is a discrete tier, never a fake percentage, and when nothing explains the anomaly it says Unattributed rather than inventing a cause.

8 cause families evidence + falsifier no fake %

Simplicity

One required input: MAPING_KEY. Service name is inferred from the binary, instance from the hostname, flush timing and sketch params from defaults. An absent key makes the middleware a no-op, so adding mAPI-ng is always safe, and activation is decoupled from the code change.

5 lines to instrument no YAML no agents

Efficiency

The client aggregates per-endpoint metrics in-process into a DDSketch before sending. The server stores compact Summaries in ClickHouse and rolls them up through 1-minute, 1-hour and 1-day tiers. More data ingested per second, less disk used, faster queries than raw-event pipelines. The ~77× disk figure assumes ~300 B per raw event.

DDSketch latency ClickHouse rollups ~77× less disk
QUICKSTART

From zero to RED metrics in three steps

1
Install
go get github.com/arhuman/maping/client
go get github.com/arhuman/maping/client/gin

Core client has no web-framework deps. The Gin adapter is a separate module, so it never leaks into your binary unless you use it.

2
Instrument
import (
  maping "github.com/arhuman/maping/client"
  mgin   "github.com/arhuman/maping/client/gin"
)

rec := maping.NewRecorder(
  maping.WithService("my-api"))
r.Use(mgin.MiddlewareWithRecorder(rec))

Mount it above gin.Recovery(). Service and instance are inferred, no further wiring.

3
Set the key
export MAPING_KEY=mk_live_…

The only required input. It carries both the secret and the collector endpoint. Absent = no-op.

Start free, get your ingest key →