PageSourceSearch

https://docs.skysignal.app/assets/js/0e384e19.6ef71593.js

js skysignal.app collected 2026-10-08 07:51:41 UTC 17,391 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkskysignal_docs=globalThis.webpackChunkskysignal_docs||[]).push([[3976],{2053:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"intro","title":"Welcome to SkySignal","description":"SkySignal is a full-featured APM platform built specifically for Meteor.js applications. It gives you deep visibility into Methods, Subscriptions, Live Queries, DDP connections, Errors, Sessions, System Metrics, and more -- all designed around how Meteor actually works.","source":"@site/docs/intro.md","sourceDirName":".","slug":"/","permalink":"/docs/","draft":false,"unlisted":false,"editUrl":"https://github.com/skysignalapm/skysignal-docs/tree/main/docs/intro.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"slug":"/"},"sidebar":"tutorialSidebar","next":{"title":"Getting Started","permalink":"/docs/getting-started"}}');var r=i(4848),t=i(8453);const l={sidebar_position:1,slug:"/"},o="Welcome to SkySignal",a={},c=[{value:"Why SkySignal?",id:"why-skysignal",level:2},{value:"Quick Start",id:"quick-start",level:2},{value:"Features",id:"features",level:2},{value:"Method Tracing",id:"method-tracing",level:3},{value:"Subscription Monitoring",id:"subscription-monitoring",level:3},{value:"Live Query Monitoring",id:"live-query-monitoring",level:3},{value:"DDP/WebSocket Monitoring",id:"ddpwebsocket-monitoring",level:3},{value:"Error Tracking",id:"error-tracking",level:3},{value:"Log Collection",id:"log-collection",level:3},{value:"Session Replay",id:"session-replay",level:3},{value:"Incidents",id:"incidents",level:3},{value:"SLOs (Service Level Objectives)",id:"slos-service-level-objectives",level:3},{value:"Deployments",id:"deployments",level:3},{value:"Anomaly Detection",id:"anomaly-detection",level:3},{value:"Real-Time Dashboards",id:"real-time-dashboards",level:3},{value:"Uptime Monitoring",id:"uptime-monitoring",level:3},{value:"Scheduled Status Reports",id:"scheduled-status-reports",level:3},{value:"VS Code Extension",id:"vs-code-extension",level:3},{value:"Getting Help",id:"getting-help",level:2},{value:"Next Steps",id:"next-steps",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"welcome-to-skysignal",children:"Welcome to SkySignal"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"SkySignal"})," is a full-featured APM platform built specifically for Meteor.js applications. It gives you deep visibility into Methods, Subscriptions, Live Queries, DDP connections, Errors, Sessions, System Metrics, and more -- all designed around how Meteor actually works."]}),"\n",(0,r.jsx)(n.h2,{id:"why-skysignal",children:"Why SkySignal?"}),"\n",(0,r.jsx)(n.p,{children:"Generic APM tools treat Meteor like any other Node.js app and miss the things that matter: DDP, reactive publications, observer lifecycle, change streams vs oplog, method latency breakdowns. SkySignal understands all of it natively."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Meteor Methods"})," - Response times, error rates, argument inspection, slow method detection"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"DDP Subscriptions"})," - Document counts, data transfer, response times, memory usage per subscription"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Live Query Monitoring"})," - Observer tracking with change stream, oplog, and polling detection (supports Meteor 3.5+ change streams)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"DDP/WebSocket Monitoring"})," - Connection tracking, message rates, protocol-level DDP inspector"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Error Tracking"})," - Full stack traces, error grouping, deduplication, browser + server correlation"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Log Collection"})," - Structured log capture with ",(0,r.jsx)(n.code,{children:"console.*"})," and ",(0,r.jsx)(n.code,{children:"Meteor._debug"})," interception"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Session Replay"})," - Session detail with page flow, event timeline, and error correlation"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Backgroun
1d Jobs"})," - Job queue monitoring, execution times, failure tracking"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"System Metrics"})," - CPU, memory, event loop lag, MongoDB performance"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Uptime Monitoring"})," - HTTP endpoint checks with downtime alerts"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Incidents"})," - Full incident lifecycle management with timeline and status tracking"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"SLOs"})," - Service Level Objectives with error budget tracking and burn-rate alerts"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Deployments"})," - Deployment tracking with version comparison and performance diff"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Anomaly Detection"})," - Automated baseline learning with anomaly alerting"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Custom Dashboards"})," - Build your own dashboards with flexible widget layouts"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Scheduled Reports"})," - Weekly and monthly performance summaries delivered via email"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Real-Time Dashboards"})," - Live metrics with sub-second updates, host filtering, and data export"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"VS Code Extension"})," - Performance insights, diagnostics, and detail panels directly in your editor"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"quick-start",children:"Quick Start"}),"\n",(0,r.jsx)(n.admonition,{title:"Requirements",type:"info",children:(0,r.jsxs)(n.p,{children:["SkySignal requires ",(0,r.jsx)(n.strong,{children:"Meteor 3.0 or later"}),". The agent package uses Meteor 3.x async APIs (",(0,r.jsx)(n.code,{children:"Meteor.callAsync"}),", async method handlers, etc.) and is not compatible with Meteor 2.x or earlier."]})}),"\n",(0,r.jsx)(n.p,{children:"Get started in under 5 minutes:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Add the SkySignal agent package\nmeteor add skysignal:agent\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Then add your API key to ",(0,r.jsx)(n.code,{children:"settings.json"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n  "skysignal": {\n    "apiKey": "sk_live_xxxxxxxxxxxx"\n  },\n  "public": {\n    "skysignal": {\n      "publicKey": "pk_live_xxxxxxxxxxxx"\n    }\n  }\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"Run with settings:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"meteor run --settings settings.json\n"})}),"\n",(0,r.jsxs)(n.p,{children:["That's it! Data will start flowing to your ",(0,r.jsx)(n.a,{href:"https://dash.skysignal.app",children:"SkySignal dashboard"})," immediately."]}),"\n",(0,r.jsx)(n.h2,{id:"features",children:"Features"}),"\n",(0,r.jsx)(n.h3,{id:"method-tracing",children:"Method Tracing"}),"\n",(0,r.jsx)(n.p,{children:"Track every Meteor Method call with detailed timing information:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Response times and percentiles (p50, p95, p99)"}),"\n",(0,r.jsx)(n.li,{children:"Error rates and stack traces"}),"\n",(0,r.jsx)(n.li,{children:"Argument inspection for debugging"}),"\n",(0,r.jsx)(n.li,{children:"Slow method detection and alerts"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"subscription-monitoring",children:"Subscription Monitoring"}),"\n",(0,r.jsx)(n.p,{children:"Understand your DDP subscription performance:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Document counts and data transfer sizes"}),"\n",(0,r.jsx)(n.li,{children:"Response times and latency"}),"\n",(0,r.jsx)(n.li,{children:"Active subscription tracking"}),"\n",(0,r.jsx)(n.li,{children:"Memory usage per subscription"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"live-query-monitoring",children:"Live Query Monitoring"}),"\n",(0,r.jsx)(n.p,{children:"Track your app's reactive observers and understand their cost:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Per-observer type detection: change stream, oplog, or polling"}
1),"\n",(0,r.jsx)(n.li,{children:"Reactive efficiency scoring (change stream + oplog vs total)"}),"\n",(0,r.jsx)(n.li,{children:"Meteor 3.5+ change stream support with automatic driver detection"}),"\n",(0,r.jsx)(n.li,{children:"Observer count and lifecycle tracking"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"ddpwebsocket-monitoring",children:"DDP/WebSocket Monitoring"}),"\n",(0,r.jsx)(n.p,{children:"Full visibility into your DDP transport layer:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Active connection tracking with client metadata"}),"\n",(0,r.jsx)(n.li,{children:"Message rate monitoring (sent/received)"}),"\n",(0,r.jsx)(n.li,{children:"Protocol-level DDP inspector for debugging"}),"\n",(0,r.jsx)(n.li,{children:"Connection lifecycle and reconnect tracking"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"error-tracking",children:"Error Tracking"}),"\n",(0,r.jsx)(n.p,{children:"Catch and diagnose errors before your users report them:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Full stack traces with source map support"}),"\n",(0,r.jsx)(n.li,{children:"Error grouping and deduplication"}),"\n",(0,r.jsx)(n.li,{children:"Browser and server error correlation"}),"\n",(0,r.jsx)(n.li,{children:"Custom error context and metadata"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"log-collection",children:"Log Collection"}),"\n",(0,r.jsx)(n.p,{children:"Centralized logging without extra infrastructure:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Intercepts ",(0,r.jsx)(n.code,{children:"console.log"}),", ",(0,r.jsx)(n.code,{children:"console.error"}),", ",(0,r.jsx)(n.code,{children:"console.warn"}),", and ",(0,r.jsx)(n.code,{children:"Meteor._debug"})]}),"\n",(0,r.jsx)(n.li,{children:"Structured log entries with timestamps, levels, and context"}),"\n",(0,r.jsx)(n.li,{children:"Server-side and client-side log capture"}),"\n",(0,r.jsx)(n.li,{children:"Searchable log history in the dashboard"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"session-replay",children:"Session Replay"}),"\n",(0,r.jsx)(n.p,{children:"Understand what your users actually experienced:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Page-by-page session flow reconstruction"}),"\n",(0,r.jsx)(n.li,{children:"Event timeline with clicks, navigations, and errors"}),"\n",(0,r.jsx)(n.li,{children:"Error correlation -- see exactly what the user did before an error"}),"\n",(0,r.jsx)(n.li,{children:"Session metadata (browser, OS, connection quality)"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"incidents",children:"Incidents"}),"\n",(0,r.jsx)(n.p,{children:"Track and resolve production issues in one place:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Full incident lifecycle (detected, acknowledged, investigating, resolved)"}),"\n",(0,r.jsx)(n.li,{children:"Automatic incident creation from alerts and anomalies"}),"\n",(0,r.jsx)(n.li,{children:"Timeline with events, status changes, and notes"}),"\n",(0,r.jsx)(n.li,{children:"Integration with alerting and notification channels"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"slos-service-level-objectives",children:"SLOs (Service Level Objectives)"}),"\n",(0,r.jsx)(n.p,{children:"Define reliability targets and track them:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Error budget tracking with burn-rate calculation"}),"\n",(0,r.jsx)(n.li,{children:"SLO status dashboard with current compliance"}),"\n",(0,r.jsx)(n.li,{children:"Alerts when error budget is being consumed too fast"}),"\n",(0,r.jsx)(n.li,{children:"Historical SLO performance over time"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"deployments",children:"Deployments"}),"\n",(0,r.jsx)(n.p,{children:"Correlate performance changes with code deploys:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Automatic deployment detection and version tracking"}),"\n",(0,r.jsx)(n.li,{children:"Side-by-side version comparison (before/after metrics)"}),"\n",(0,r.jsx)(n.li,{children:"Performance regression detection across deploys"}),"\n",(0,r.jsx)(n.li,{children:"Deploy markers on all time-series charts"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"anomaly-detection",children:"Anomaly Detection"}),"\n",(0,r.jsx)(n.p,{children:"Catch problems before they become incidents:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Automated baseline learning from historical data"}),"\n",(0,r.jsx)(n.li,{children:"Anomaly alerts when metrics deviate from normal patterns"}),"\n",(0,r.jsx)(n.li,{children:"Configurable sensitivity and detection windows"}),"\n",(0,r.jsx)(n.li,{children:"Baseline visualization on dashboards"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"real-time-dashboards",children:"Real-Time Dashboards"}),"\n",(0,r.jsx)(n.p,{children:"Get instant visibility into your application's health:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Live metrics with sub-second updates"}),"\n",(0,r.jsx)(n.li,{children:"Customizable time ranges and host filtering"}),"\n",(0,r.jsx)(n.li,{children:"Built-in visualizations: heartbeat timeline, request flow sankey, health heatmap"}),"\n",(0,r.jsx)(n.li,{children:"Custom dashboards with flexible widget layouts"}),"\n",(0,r.jsx)(n.li,{children:"Export data for further analysis"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"uptime-monitoring",children:"Uptime Monitoring"}),"\n",(0,r.jsx)(n.p,{children:"Keep your application online and know immediately when issues occur:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"HTTP endpoint monitoring with customizable intervals"}),"\n",(0,r.jsx)(n.li,{children:"Instant downtime alerts via email"}),"\n",(0,r.jsx)(n.li,{children:"Response time tracking and historical uptime stats"}),"\n",(0,r.jsx)(n.li,{children:"Incident timeline integration"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"scheduled-status-reports",children:"Scheduled Status Reports"}),"\n",(0,r.jsx)(n.p,{children:"Stay informed without constantly checking the dashboard:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Weekly Reports"})," - Summary of key metrics, top errors, and performance trends"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Monthly Reports"})," - Comprehensive analysis with month-over-month comparisons"]}),"\n",(0,r.jsx)(n.li,{children:"Delivered straight to your inbox"}),"\n",(0,r.jsx)(n.li,{children:"Share with your team to keep everyone aligned"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"vs-code-extension",children:"VS Code Extension"}),"\n",(0,r.jsx)(n.p,{children:"Get APM insights without leaving your editor:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Hover tooltips on Meteor methods, publications, and collections with live metrics"}),"\n",(0,r.jsx)(n.li,{children:"Code lenses showing call counts, latency, and error rates above definitions"}),"\n",(0,r.jsx)(n.li,{children:"Inline diagnostics for N+1 queries, COLLSCAN, observer leaks, and deprecated APIs"}),"\n",(0,r.jsx)(n.li,{children:"Rich detail panels with charts and tables for deep-diving into specific constructs"}),"\n",(0,r.jsx)(n.li,{children:"Sidebar tree view with all methods, publications, collections, and errors"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"getting-help",children:"Getting Help"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Documentation"})," - You're here! Browse the sidebar for detailed guides."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"GitHub"})," - ",(0,r.jsx)(n.a,{href:"https://github.com/skysignalapm/agent/issues",children:"Report issues"})," or contribute"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Email"})," - Contact us at ",(0,r.jsx)(n.a,{href:"mailto:[email protected]",children:"[email protected]"})]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsxs)(n.p,{children:["Ready to get started? Check out our ",(0,r.jsx)(n.a,{href:"/docs/getting-started",children:"Getting Started guide"})," for detailed installation instructions."]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>o});var s=i(6540);const r={},t=s.createContext(r);function l(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.