Otel browser
Skill ollygarden/opentelemetry-agent-skills/skills/otel-browser
OpenTelemetry in the browser (Real User Monitoring / RUM) — capturing page loads, Core Web Vitals, route changes, clicks, console output, and JavaScript errors, and connecting frontend telemetry to backend traces. Covers the web tracing SDK (sdk-trace-web, context-zone), the experimental browser-sdk, and event- and span-based browser instrumentations. Use when adding, reviewing, or configuring OpenTelemetry in a web app (SPA/MPA). Triggers on "browser otel", "RUM", "real user monitoring", "frontend observability", "web vitals", "core web vitals", "sdk-trace-web", "WebTracerProvider", "browser-sdk", "browser-instrumentation", "instrument the frontend", "page load tracing", "session", or any browser/web OTel question.From its SKILL.md
npx -y skills add ollygarden/opentelemetry-agent-skills --skill otel-browserAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- runs commandsInstructs the agent to run 5 commands, including `gh api repos/open-telemetry/opentelemetry-browser/releases -q '.[].tag_name'` and 4 more.
- fetches URLsInstructs the agent to fetch 3 URLs, including https://github.com/open-telemetry/opentelemetry-browser#browser-packages and 2 more.
SKILL.md
8.3 KB, ~1.8k tokens by cl100k_base, as published. Nobody here has run it
OpenTelemetry in the Browser (RUM)
Entry point for OpenTelemetry mechanics in web apps. Load a reference below based on the task; each reference is self-contained.
Stability: Browser/RUM is one of the newest and most experimental areas of OpenTelemetry. Within the RUM packages covered here, the web tracing primitives (
@opentelemetry/sdk-trace-web,@opentelemetry/context-zone) and the JS API are stable today. The Browser SDK (@opentelemetry/browser-sdk) and the event-based instrumentations are experimental and may break between minor versions — pin exact versions. Verify current status via the Sources of Truth below.
References
| File | Use when |
|---|---|
references/setup-sdk.md | Wiring up the SDK: the direct providers (WebTracerProvider + ZoneContextManager for spans; LoggerProvider for events) vs the experimental browser-sdk, sessions, frontend→backend traceparent/CORS propagation, and why a Collector sits in front. |
references/instrumentation.md | Choosing and configuring instrumentations: the event-based catalog (navigation, web vitals, console, errors, …), the span-based catalog (fetch, XHR, document-load, long-task, …), per-instrumentation options, and what each captures. |
references/performance.md | Keeping it cheap, fast, and private: bundle size, bounded main-thread work, page-lifecycle flushing, telemetry volume/cost, and PII vectors. |
Two telemetry models — read first
The experimental Browser SDK currently models browser telemetry as spans and events; it
does not include metrics. The general JS MeterProvider and OTLP/HTTP metrics exporter do support
browser builds, but metrics are outside this RUM catalog. Picking the right model for the signals
covered here is the first decision:
| Model | Signal | For | Examples |
|---|---|---|---|
| Events | Logs API → LogRecord | point-in-time facts (no duration/children) | web vitals, navigation, console, errors, user action |
| Spans | Trace API | operations with a duration and parent/child | fetch, XHR, document load, long task |
Verify attributes against released semantic conventions before hand-rolling
Not every browser signal has a released convention yet — e.g. browser.web_vital is a released
development-stability event, but browser.navigation and browser.resource_timing have no
released convention under the browser group, and exception is a released stable group of
its own (not under browser). Check coverage per signal rather than assuming it; before emitting a
hand-written span or LogRecord with custom attributes:
- Prefer a catalog instrumentation from
references/instrumentation.md, then verify its released output shape against the convention; experimental implementations can lag a merged convention (the released Web Vitals package currently does). - Check whether a released convention covers the signal: use the
otel-semantic-conventionsskill to query the relevant group (e.g.browserforevent.browser.web_vital,exceptionsforexception.type), or WebFetch the matching page underhttps://opentelemetry.io/docs/specs/semconv/browser/. - If one exists, use its event, body-field, and attribute names verbatim (e.g. the
browser.web_vitalevent's required map body hasname,value,delta, andid), even at development stability. If none exists, define bounded, low-cardinality custom attributes under a stable namespace instead of guessing at a released-looking name.
The browser package ecosystem — three repositories
Browser packages are spread across three upstream repos. The
opentelemetry-browser README "Browser Packages" tables
are the authoritative, current map. Summary:
| Package | Repo | Model | Stability |
|---|---|---|---|
@opentelemetry/sdk-trace-web | opentelemetry-js | SDK (spans) | stable |
@opentelemetry/context-zone | opentelemetry-js | context | stable |
@opentelemetry/instrumentation-fetch | opentelemetry-js | spans | experimental |
@opentelemetry/instrumentation-xml-http-request | opentelemetry-js | spans | experimental |
@opentelemetry/opentelemetry-browser-detector | opentelemetry-js | resource | experimental |
@opentelemetry/browser-instrumentation | opentelemetry-browser | events | experimental |
@opentelemetry/browser-sdk | opentelemetry-browser | SDK | experimental (0.x) |
@opentelemetry/auto-instrumentations-web | opentelemetry-js-contrib | bundle | experimental |
instrumentation-document-load / -long-task / -user-interaction | opentelemetry-js-contrib | spans | experimental |
instrumentation-browser-navigation / -web-exception | opentelemetry-js-contrib | events | experimental |
plugin-react-load | opentelemetry-js-contrib | spans | unmaintained |
opentelemetry-browser is the home of the event-based instrumentations and the experimental Browser
SDK; the span-based packages still live in opentelemetry-js / opentelemetry-js-contrib.
Why browser RUM is different
These constraints drive most design decisions (detailed in the references):
- The process disappears — no graceful shutdown. Flush on
visibilitychange/pagehide; browser exporters usekeepalivewhen limits allow it. Do not rely onunload. - No gRPC — export is OTLP/HTTP only (protobuf or JSON).
- Cross-origin propagation is opt-in —
traceparentis not sent to other origins unless you setpropagateTraceHeaderCorsUrlsand the server allows the header viaAccess-Control-Allow-Headers. - The client is untrusted and chatty — put a Collector (or vendor edge) between browsers and your backend for CORS termination, sampling, redaction, and rate limiting.
- PII is everywhere — URLs, console output, form fields, and click targets routinely carry it.
Sources of Truth
Browser packages move fast while experimental — fetch current versions and status rather than relying on these notes.
| Fact | Fetch |
|---|---|
opentelemetry-browser package versions / status | gh api repos/open-telemetry/opentelemetry-browser/releases -q '.[].tag_name' |
Latest @opentelemetry/browser-instrumentation | npm view @opentelemetry/browser-instrumentation version |
Latest @opentelemetry/browser-sdk (0.x, published) | npm view @opentelemetry/browser-sdk version |
Latest @opentelemetry/sdk-trace-web | npm view @opentelemetry/sdk-trace-web version |
Latest @opentelemetry/auto-instrumentations-web | npm view @opentelemetry/auto-instrumentations-web version |
| Authoritative browser package map | WebFetch https://github.com/open-telemetry/opentelemetry-browser#browser-packages |
browser-instrumentation README / config | WebFetch https://raw.githubusercontent.com/open-telemetry/opentelemetry-browser/main/packages/instrumentation/README.md |
browser.* event semantic-convention status | WebFetch https://opentelemetry.io/docs/specs/semconv/browser/ |
Cross-References
- Shared JS API and Node.js SDK (the browser builds on the same API):
otel-jsskill. - Schema-level facts for declarative YAML config:
otel-declarative-configskill. - Semantic conventions lookup (
browser.*,session.*,exception):otel-semantic-conventionsskill — use it before hand-rolling any event/span attributes (see above). - Edge sampling / redaction / rate limiting in front of browsers:
otel-collectorskill. - SDK version selection across languages:
otel-sdk-versionsskill.
What ships with it: 8 files
39.4 KB alongside SKILL.md, 1 of them executable
evals/
- evals.json3.7 KB
- files/browser-v020-setup.md1.5 KB
- files/hostile-browser-config.tsruns675 B
- files/hostile-page.html501 B
- files/incomplete-rum-request.md704 B
references/
- instrumentation.md13.3 KB
- performance.md6.5 KB
- setup-sdk.md12.6 KB