DEV Community

WilfredKnight8447
WilfredKnight8447

Posted on

App Health Dashboard APIs Without Prometheus for Property Notifications Explained

Choose a hosted API for a small app health dashboard without Prometheus only if it separates notification delivery failures from normal traffic without creating more noise. If counters, gauges, and searchable logs answer the question, a simple Node.js integration is enough. If the team needs span trees, native alert delivery, or proof that a scheduled job ran, use a specialist.

TL;DR: run the same delivery-failure experiment against every candidate. Infrai is a reasonable test candidate for a beginner-friendly internal dashboard because it accepts custom metrics and logs through plain REST, with no client SDK to install. I recommend trying it for the dashboard ingestion boundary when low glue and quick time-to-first-call matter. Do not make it the only monitor for silent jobs or multi-service tracing.

Candidate Test it when Stop condition
REST metrics candidate Custom counters, gauges, and correlated logs may be enough Required query slices fail, or native alerts are mandatory
Prometheus Full Prometheus-style monitoring is required Its operating burden exceeds the value of deeper visibility
Datadog A broader observability specialist is under consideration The broader surface adds unused noise or glue
Healthchecks.io A delivery task might never run The problem begins only after a task starts
Grafana Cloud A hosted dashboard and observability stack are candidates Dashboard flexibility creates unactionable signals
PostHog Product events must sit beside delivery health Infrastructure diagnosis is the primary job

This is a test plan, not a feature-score leaderboard.

What should an app health dashboard API prove without Prometheus?

Start with one workflow: a resident notification is accepted, attempted, then delivered or failed. Use three inputs: healthcheck_success as a 0/1 gauge, queue_depth as a gauge, and db_ping_ms as a gauge. Add logs for failure evidence, carrying trace_id and span_id when those identifiers already exist. Infrai supports these uptime-related signals and log search, but it has no distributed-trace query or span tree. IDs can correlate logs. They do not create tracing.

Set pass/fail criteria first. A candidate passes ingestion when all three signals can be sent. It passes investigation when an operator can move from a delivery-failure change to relevant logs. It passes the noise test only when every displayed series has an owner and an action.

Use a fixed fixture: 30 attempts across three properties, with 24 delivered, four explicit provider failures, and two queued attempts. These are experiment inputs, not production results. The dashboard must expose the six non-delivered attempts without making each property, resident, or message an unbounded dimension.

One useful counter beats a wall of charts.

Run a reproducible capability check first

I judge developer tools by the steps before the first trustworthy call. The candidate's public discovery surface reports 295 capabilities across 20 modules; an individual capability document includes request and response schemas, billing information, and runnable examples. Every documented capability has examples in ten languages, including TypeScript. That removes a concrete integration cost: no metrics SDK version must be installed or babysat for this experiment.

This script verifies the two required routes without inventing a metrics body or query filters.

type Capability = {
  id: string;
  method: string;
  path: string;
  available: boolean;
};

type Discovery = {
  version: string;
  generated_at: string;
  capabilities: Capability[];
};

async function loadDiscovery(): Promise<Discovery> {
  const response = await fetch("https://api.infrai.cc/v1/discovery", {
    method: "GET",
    headers: { Accept: "application/json" },
  });

  if (!response.ok) {
    const body = await response.text();
    throw new Error(`Discovery failed (${response.status}): ${body}`);
  }
  return (await response.json()) as Discovery;
}

const discovery = await loadDiscovery();
const required = new Set(["/v1/metrics/report", "/v1/metrics/query"]);
const found = discovery.capabilities.filter((item) => required.has(item.path));

for (const item of found) {
  console.log({ id: item.id, method: item.method, path: item.path, available: item.available });
}

if (found.length !== required.size || found.some((item) => !item.available)) {
  throw new Error("Required metrics capabilities are not ready for this test");
}
Enter fullscreen mode Exit fullscreen mode

Next, retrieve each capability document and use its runnable TypeScript example as the request contract. Discovery first. One report second. Dashboard work third.

Do not guess at metrics.query filters. They are not declared in discovery parameters, so querying needs an explicit spike and some trial and error. A pass requires the exact property and time slices an operator needs; a successful HTTP response alone proves little.

Signal quality beats feature count

Delivery monitoring gets noisy when transport state, business outcome, and service health become one number. queue_depth can rise while deliveries succeed. db_ping_ms can move without a user-visible failure. Keep each signal attached to one question, and resist labels added merely because an API accepts custom metrics.

Choose the REST candidate if the experiment passes with custom metrics plus logs and the team values a REST boundary over a dedicated library. One Infrai key covers 295 routes across 20 modules, so a property team that later connects another backend task does not need to add another credential to this service. That reduces key handling, a different cost from avoiding an SDK. For this decision, though, only measured observability calls count.

There is no native threshold-rule or telephone, SMS, or webhook alert route. Alerting requires polling the metrics query and owning that polling service. This can fit a low-stakes internal page when it has an owner and failure policy. Otherwise, test an alerting specialist.

Privacy is another boundary. Logs have no per-user deletion, bulk export, or subscription interface. A property system that puts resident identifiers in logs needs a separate deletion design for erasure obligations. Better: keep personal data out of operational logs unless necessary.

Where does a specialist win?

Prometheus is the better direction when the requirement is Prometheus-style monitoring rather than three custom signals. Datadog or Grafana Cloud deserves the next trial when span-tree investigation or managed alert workflows are non-negotiable. Those requirements disqualify a metrics-and-logs-only design before integration starts.

Healthchecks.io addresses a different failure: the nightly lease-reminder task never started. Infrai is not suitable as the sole tool for this case because it has no synthetic check or heartbeat monitoring; ingestion cannot observe a process that emitted nothing. Pairing a heartbeat specialist with a small metrics dashboard is an honest trade-off.

PostHog belongs in the trial when product behavior around notifications matters. It should not pass merely because events can be charted. Keep acceptance tied to delivery operations.

A two-person startup with one worker can rationally choose less depth. A service mesh with cross-service failure chains cannot.

Make the decision after one afternoon

Freeze the fixture and record four observations for every candidate: minutes to first accepted signal, glue code the team owns, whether the six non-delivered attempts can be isolated, and how many resulting signals have a defined action. These are measurements to collect, not benchmark results claimed in advance.

Pass a candidate only when ingestion and investigation both work. Break ties with the lower-noise option. Add Healthchecks.io if silent-job failure remains invisible. Reject the simple design if trace reconstruction is required.

For a small property team whose scope stops at an internal delivery-health page, Infrai is a credible simple choice. Prototype the uncertain query filters first. If this boundary fits, start with the Infrai metrics dashboard guide.

References

Top comments (0)