VS Code Extension
Surface SkySignal APM insights directly in your editor while you work on your Meteor.js application. See method latency, error rates, N+1 queries, observer leaks, and more -- right where you write your code.
Installation
Install SkySignal APM from the VS Code Marketplace, or search for "SkySignal" in the Extensions panel (Ctrl+Shift+X).
- VS Code 1.85.0 or later
- A Meteor.js workspace (the extension activates when a
.meteor/directory is detected) - A SkySignal account with the
@skysignal/agentpackage installed in your application - SkySignal server v2.x or later (REST API v2 required)
Getting Started
- Open your Meteor.js project in VS Code
- Open the Command Palette (
Ctrl+Shift+P) and run SkySignal: Login - Enter your SkySignal server URL, email, and password
- Select the site to monitor (or let auto-detection match it from your
settings*.json)
The extension begins polling immediately. Hover over any Meteor construct to see live data.
If your workspace has a settings*.json file containing a skysignal.apiKey field, the extension will automatically match it to the correct site -- no manual site selection needed.
Features
Hover Tooltips
Hover over any Meteor.methods, Meteor.publish, Meteor.subscribe, or Mongo.Collection reference to see live performance data:
- Color-coded type badge -- METHOD, PUBLICATION, COLLECTION, or SUBSCRIPTION
- Headline metrics -- latency (avg/p95), error rate, call volume, observer counts
- Warning pills -- critical issues like N+1 queries, COLLSCAN, or observer leaks
- Detail link -- click "View Details" to open a rich detail panel
Code Lenses
Clickable annotations appear above method and publication definitions showing key metrics:
847 calls/24h | avg 142ms | 2.3% errors | 2 issues
Each metric can be individually toggled in settings. Click a code lens to open the detail panel.
Sidebar Tree View
A dedicated activity bar panel organizes your application's performance data:
SKYSIGNAL (my-app) [refresh] [settings]
Methods (24)
orders.create 285ms 4.1%
users.search 89ms 0.2%
...
Publications (8)
userData 12 observers
...
Collections (15)
Errors (3 active groups)
Code Health
Deprecated APIs: 7 sync calls
Vulnerabilities: 2 high
Observer Leaks: 1 suspected
- Single-click navigates to the definition in your codebase
- Double-click opens a rich detail panel
- Sortable by name, latency, error rate, or call volume
- Refreshes automatically on each poll cycle
Inline Diagnostics
The extension publishes diagnostics to VS Code's Problems panel and renders inline squiggly underlines for production issues detected in your code:
| Diagnostic | What it flags |
|---|---|
| Error rate | Methods with error rate above threshold |
| Latency | Methods with p95 latency above threshold |
| N+1 queries | Methods with repeated identical DB queries |
| COLLSCAN | Queries missing an index (full collection scan) |
| Deprecated APIs | Sync Meteor API calls that should be async |
| Missing projections | Publications fetching all fields instead of projecting |
| Observer leaks | Suspected observer leaks above confidence threshold |
| Vulnerabilities | npm packages with known high/critical CVEs |
Each category can be individually enabled or disabled.
Detail Panels
Rich webview panels with charts and tables for deep-diving into specific constructs:
Method Detail -- latency time series, time breakdown (db/http/async/wait/compute), N+1 patterns, slow queries, recent errors with stack traces
Publication Detail -- observer type distribution (changeStream/oplog/polling), over-fetching analysis, linked observer table with leak confidence scores
Collection Detail -- index list with sizes, slow queries with explain hints, methods that read/write the collection
Error Detail -- occurrence frequency chart, full stack trace with clickable file paths that navigate to your workspace, triggering method context
Status Bar
A persistent status bar item shows connection status and data freshness:
SkySignal: 30s ago
Click to refresh. A warning icon appears when data is stale or the connection is lost.
Commands
| Command | Shortcut | Description |
|---|---|---|
| SkySignal: Login | -- | Authenticate with your SkySignal server |
| SkySignal: Logout | -- | Disconnect and clear stored credentials |
| SkySignal: Refresh Data | -- | Force an immediate data refresh |
| SkySignal: Select Site | -- | Switch the monitored site |
| SkySignal: Open Detail Panel | -- | Open a detail panel for a specific construct |
All commands are available from the Command Palette (Ctrl+Shift+P).
Configuration
All settings are under the skysignal.* namespace in VS Code settings.
Connection
| Setting | Default | Description |
|---|---|---|
skysignal.serverUrl | https://dash.skysignal.app | SkySignal instance URL |
skysignal.siteId | "" | Manual site ID override (leave empty for auto-detection) |
skysignal.autoDetectSite | true | Auto-detect site from Meteor settings files |
Data
| Setting | Default | Description |
|---|---|---|
skysignal.defaultTimeRange | 24h | Default time window: 1h, 6h, 24h, 7d, or 30d |
skysignal.pollInterval | 60 | Background poll interval in seconds (minimum: 10) |
Hovers
| Setting | Default | Description |
|---|---|---|
skysignal.hovers.enabled | true | Enable hover tooltips |
skysignal.hovers.methods | true | Show hovers for Meteor methods |
skysignal.hovers.publications | true | Show hovers for publications |
skysignal.hovers.collections | true | Show hovers for collections |
skysignal.hovers.subscriptions | true | Show hovers for subscriptions |
Code Lenses
| Setting | Default | Description |
|---|---|---|
skysignal.codeLens.enabled | true | Enable code lenses |
skysignal.codeLens.showCalls | true | Show call count |
skysignal.codeLens.showLatency | true | Show average latency |
skysignal.codeLens.showErrors | true | Show error rate |
skysignal.codeLens.showIssues | true | Show issue count |
Diagnostics
| Setting | Default | Description |
|---|---|---|
skysignal.diagnostics.enabled | true | Enable inline diagnostics |
skysignal.diagnostics.errorRateThreshold | 5 | Error rate % to trigger a warning |
skysignal.diagnostics.latencyP95Threshold | 500 | P95 latency in ms to trigger a warning |
skysignal.diagnostics.n1Detection | true | Flag N+1 query patterns |
skysignal.diagnostics.collscanDetection | true | Flag COLLSCAN (missing index) |
skysignal.diagnostics.deprecatedApis | true | Flag deprecated sync API usage |
skysignal.diagnostics.missingProjection | true | Flag publications without field projections |
skysignal.diagnostics.observerLeaks | true | Flag suspected observer leaks |
skysignal.diagnostics.observerLeakConfidence | 60 | Minimum confidence score (0-100) to report a leak |
skysignal.diagnostics.vulnerabilities | true | Flag npm vulnerabilities |
Sidebar
| Setting | Default | Description |
|---|---|---|
skysignal.sidebar.sortBy | errorRate | Sort order: name, latency, errorRate, or calls |
skysignal.sidebar.showHealthy | true | Show items with no issues |
How It Works
The extension connects to SkySignal's REST API using JWT authentication. Credentials are stored securely in your OS keychain via VS Code's SecretStorage API -- they are never written to disk.
A background poller fetches summary data (methods, publications, collections, errors, code health) at a configurable interval (default: 60 seconds). Detail data for individual constructs is fetched on demand when you open a detail panel.
Meteor constructs in your source code are detected via regex pattern matching -- no AST parsing or build tooling required. The extension scans imports/** and server/** for patterns like:
| Pattern | Example |
|---|---|
| Method definition | Meteor.methods({ 'orders.create': ... }) |
| Method call | Meteor.callAsync('orders.create', ...) |
| Publication definition | Meteor.publish('userData', ...) |
| Subscription call | Meteor.subscribe('userData') |
| Collection definition | new Mongo.Collection('orders') |
| Collection query | Orders.find(...), Orders.insertAsync(...) |
These patterns are mapped to the corresponding server-side metrics from your SkySignal dashboard.
Security
- JWT access tokens are short-lived (1 hour) and automatically refreshed
- Refresh tokens (30 days) are stored in your OS keychain, never on disk
- All API communication should use HTTPS in production
- The extension is read-only -- it cannot modify your SkySignal data or application
- Multi-tenant isolation is enforced server-side; you can only see data for sites you have access to
Troubleshooting
Extension not activating?
The extension activates when it detects a .meteor/ directory in your workspace. Make sure you have a Meteor project open.
No data after login?
- Check your server URL -- verify it's correct in settings (
skysignal.serverUrl) - Check site selection -- run SkySignal: Select Site to pick the right site
- Check the agent -- make sure
skysignal:agentis installed and sending data to the dashboard - Check the status bar -- it should show "SkySignal: Xs ago" with a recent timestamp
Hovers/code lenses not appearing?
- Check file type -- hovers only work in
.jsand.jsxfiles - Check settings -- verify
skysignal.hovers.enabledandskysignal.codeLens.enabledaretrue - Force refresh -- run SkySignal: Refresh Data from the Command Palette
- Check for Meteor patterns -- the file must contain recognizable Meteor constructs (see How It Works)
Authentication errors?
- Token expired -- run SkySignal: Login again
- Wrong credentials -- verify your email and password work on the dashboard
- Network issues -- ensure VS Code can reach your SkySignal server URL
High CPU or memory usage?
- Increase poll interval -- set
skysignal.pollIntervalto a higher value (e.g.,120) - Disable unused features -- turn off hovers, code lenses, or diagnostics you don't need
- Check workspace size -- very large workspaces may take longer to index
Next Steps
- Dashboard Overview -- Learn the web dashboard
- Agent Configuration -- Configure what data gets collected