/blog/opentelemetry-for-small-teams
order of operations
free plan / 1 gb-mo
telemtra.io
// opentelemetry

OpenTelemetry for small teams:
what to collect first.

Start with the telemetry that answers real operational questions, then expand when the team has a workflow for using it.

Most OpenTelemetry guides assume you're at a 50-engineer company with a dedicated observability team and the budget for someone to maintain a Collector cluster. If you're a team of two to ten engineers shipping a product, that advice is overkill — and trying to follow it will burn weeks before you have any operational value. This post is the order we'd recommend if you're starting from scratch: traces first, then logs, then host metrics, then dashboards, then alerts. Skip steps at your own risk.

1. Start with traces for user-facing paths

Instrument the request paths where latency and errors matter — the checkout flow, the public API, the signup. Distributed traces make service ownership and dependency problems visible faster than raw metrics alone, because a single trace shows you exactly which step failed or slowed down. With auto-instrumentation in Python, Node.js, Java, .NET, and Ruby, you usually need to add 5 lines of init code and one env var.

See language-specific quickstarts: Python, Node.js, Go, Java.

2. Add structured logs for failures

Once you have traces, attach structured logs to the failure paths. Keep stable field names — route, status_code, user_id, event_id, provider — because consistent field names are what make logs searchable, groupable, and useful for alerts. Plain text logs ("an error happened") are nearly useless at scale; the same line with structured fields ("checkout failed, provider=stripe, code=card_declined") becomes a queryable record.

Bridge your existing logger (Python logging, Node pino, Go slog, .NET ILogger) into OpenTelemetry rather than rewriting log statements. Logs emitted inside an active span automatically carry the trace_id, linking logs to their parent trace.

3. Add host metrics when you own the machine

If you're on managed Heroku/Vercel/Lambda, skip this — the platform handles it. If you're on a VPS, EC2, or VMs, host metrics (CPU, memory, disk, filesystem, network) are essential for distinguishing "my app is slow" from "my app is fine but the host is saturated." Use the Collector's hostmetrics receiver instead of custom scripts — it ships dozens of host metrics out of the box with standard OpenTelemetry semantic conventions.

4. Create dashboards after you know your questions

Don't build dashboards on day one. You don't know yet which questions you'll ask repeatedly. Wait two weeks. Once you've debugged a few production issues, the dashboards almost write themselves: "what's failing right now," "what changed since yesterday," "which service is slow," "which host is saturated." Then build exactly those views, not 30 widgets you'll never look at.

5. Alert on symptoms, not every signal

Alert on user-facing symptoms first: high error counts, p95 latency above threshold, specific log patterns ("payment_failed"). Don't alert on every metric you collect — alert fatigue arrives quickly, and a paged engineer who finds the alert was noise stops trusting all alerts. Start with three to five alerts that have caused a real customer impact in the past, and grow only when the team agrees a missing signal would have helped.

Related reading