Profiling
Profiling is now a first-class signal in Last9, sitting alongside Logs, Metrics, and Traces in the left nav and reachable from the command palette. It answers a question the other three cannot: inside one service, which functions are actually burning the CPU.
The explorer opens on an interactive flamegraph. Hover a frame for its self and total share, click to zoom into it with a breadcrumb trail back out, and search to highlight matching frames while the rest dim. Runtime and standard-library frames can be hidden so your own code stands out, and frames are colored by package so a hot area is visible before you read a single name. Pin a frame and the details panel shows its self and total time, sample count, and file and line when the profile carries them.
A Top functions view lists the same data as a table, sortable by self or total, for when you want a ranking rather than a shape. Filters for service, environment, runtime, pod, and profile type narrow the profile without leaving the page, and everything is stored in the URL so a link reproduces exactly what you were looking at.
Profiles connect to the rest of your telemetry: a span can take you to the profile for its service and time window, and a profile with a trace ID links back the other way. Every service also gets a Profiling tab on its overview page.
CPU profiles are what you can collect today. Profile types with no data appear disabled rather than broken, and a profile built from more than 1,000 distinct stacks tells you it has been truncated instead of quietly showing you part of the picture.
Profiling is available on request. Ask for access at app.last9.io/profiles.
Per-endpoint health in Applications (RUM)
Applications (RUM) has a new Network tab that shows how each endpoint your app calls is actually behaving — request volume, error rate, and p50, p95, and p99 latency — with a health state on every row.
Endpoints are grouped by route rather than by literal path, so GET /workspaces/1 and GET /workspaces/2 roll up into one row instead of thousands. Selecting a row opens a detail panel with the same metrics over time for that endpoint.
The tab reads from the trace_client_count and trace_client_duration metrics, so nothing new needs instrumenting and no PromQL is required.
Improvements
- Dashboards: External dashboard shares can require a password. Password protection is on by default for new external shares, so the link alone is no longer the only credential
- Discover Applications (RUM)
- Sessions can be filtered by custom event name, so you can list only the sessions where a specific
sendEventfired - App version is available as a breakdown dimension on the Mobile Vitals and Errors tabs, so you can compare one release against another
- Sessions can be filtered by custom event name, so you can list only the sessions where a specific
- Alerting
- Group By on Alert Monitor is reworked: the label chip row is gone, the picker sits with its trigger, and your grouping choice is stored
- Changeboard subtabs (Breached, Threat + Breach, All Entities) and view toggles are stored in the URL, so a refresh or a shared link keeps the state
- Changeboards with no active breach or threat alerts show a status dot in the list instead of no indicator at all
- Agents
- The hosted MCP server is reachable at a single URL,
app.last9.io/mcp, with no organization slug in the path - MCP tool descriptions are much shorter. Enabling all tools at once no longer spends tens of thousands of tokens on
tools/listalone
- The hosted MCP server is reachable at a single URL,
Fixes
- AI Assistant: Date-only questions such as “yesterday” or “July 20” resolved to the wrong year, so incident queries ran against 2025
- Discover Applications (RUM)
- Error details showed only some of the custom properties passed to
captureError, hiding fields such asmethodandaction - The iOS RUM SDK deadlocked the main thread and hung the app when
L9Rum.shared.instrument(webView:)was called right after creating aWKWebView
- Error details showed only some of the custom properties passed to
- Agents:
get_database_slow_queriesbuilt trace filters with dot notation on map attributes, which produced invalid ClickHouse map access and returned nothing