Skip to Content
v0.8.0 · shippedNative mobile SDKs, optional Sentry enrichment, and bring-your-own keys/storage. Read the changelog →
SDK reference@mushi-mushi/adapters

@mushi-mushi/adapters

Inbound webhook translators that turn third-party observability events into Mushi Mushi reports — so an alert that fires in your existing monitoring also lands in your bug queue, deduped against the same knowledge graph as your user-filed reports.

Install

pnpm add @mushi-mushi/adapters

Eleven supported sources

SourceTranslatorWebhook handler
SentrytranslateSentrycreateSentryAdapter
DatadogtranslateDatadogcreateDatadogWebhookHandler
BugsnagtranslateBugsnagcreateBugsnagAdapter
RollbartranslateRollbarcreateRollbarAdapter
Firebase CrashlyticstranslateCrashlyticscreateCrashlyticsAdapter
Firebase AnalyticstranslateFirebaseAnalyticscreateFirebaseAnalyticsAdapter
New RelictranslateNewReliccreateNewRelicWebhookHandler
HoneycombtranslateHoneycombcreateHoneycombWebhookHandler
Grafana / Loki (Alertmanager)translateGrafanaLokicreateGrafanaLokiWebhookHandler
AWS CloudWatch (via SNS)translateCloudWatchcreateCloudWatchAdapter
OpsgenietranslateOpsGeniecreateOpsGenieAdapter

Every translator returns a MushiCaptureEventInput (from @mushi-mushi/core) so you can route the result to any sink — the hosted Mushi API, a queue, your own database, a fan-out of several. Subpath imports are supported, e.g. @mushi-mushi/adapters/cloudwatch.

Quick start — Datadog → Hono

import { Hono } from 'hono'; import { createDatadogWebhookHandler } from '@mushi-mushi/adapters'; import { MushiNodeClient } from '@mushi-mushi/node'; const mushi = new MushiNodeClient({ apiKey: process.env.MUSHI_API_KEY!, projectId: process.env.MUSHI_PROJECT_ID!, }); const handler = createDatadogWebhookHandler({ secret: process.env.DATADOG_WEBHOOK_SECRET!, sink: async (event) => { await mushi.captureReport({ description: event.description, severity: event.severity, component: event.component, metadata: { ...event.metadata, source: event.source, tags: event.tags }, }); }, }); const app = new Hono(); app.post('/webhooks/datadog', async (c) => { const raw = await c.req.text(); const res = await handler({ rawBody: raw, headers: Object.fromEntries(c.req.raw.headers), }); return c.json(res.body ?? {}, res.status); });

Severity mapping

Each adapter normalises the source’s native severity onto Mushi’s four-level scale.

MushiDatadogNew RelicHoneycombGrafana / AM
criticalP1criticalcriticalcritical
highP2highwarninghigh
mediumP3mediuminfowarning
lowP4–P5lowinfo

Crash-tracker adapters (Sentry / Bugsnag / Rollbar / Crashlytics) map their level / severity field directly; Opsgenie / CloudWatch / Firebase Analytics derive severity from the upstream alarm state.

Authentication

Every adapter uses the strongest auth its upstream supports — never a shared bearer where a real signature exists.

AdapterMethodHeader
Sentryshared secret (timing-safe)sentry-hook-secret
BugsnagHMAC-SHA256 (hex)X-Bugsnag-Signature
Rollbarshared token (timing-safe)X-Rollbar-Access-Token
CrashlyticsFirebase ID Token JWT (aud)X-Firebase-ID-Token
Firebase AnalyticsGoogle OIDC bearer (aud)Authorization: Bearer …
CloudWatch (SNS)RSA-SHA1 / SHA256 cert verifyx-amz-sns-message-type
OpsgenieHMAC-SHA256 (base64)X-OG-Signature
Datadogshared secret (timing-safe)x-datadog-secret-token
New RelicHMAC-SHA256 (hex)X-NewRelic-Signature
HoneycombHMAC-SHA256 (sha256=…)X-Honeycomb-Signature
Grafana / Loki (AM)shared token (timing-safe)X-Grafana-Token

The package ships ~90 unit tests covering both the happy-path translation and the forged-signature rejection for every adapter — run with pnpm --filter @mushi-mushi/adapters test.

Last updated on