This guide takes a Node service from zero to a deploy-annotated latency timeline. It takes about ten minutes, and nothing here is reversible in a way that should worry you — the SDK is a no-op until an ingest key is present.
Install the CLI
The CLI is a single binary. It is the same tool your CI uses, so install it the same way in both places.
brew install signalhq/tap/sgl
# or: curl -fsSL https://get.signal.sh | sh
sgl --version
# sgl 2.4.0 (darwin/arm64)Create a service
A service is the unit everything else hangs off: spans, alerts, deploys and cost. Create one per deployable, not per repo.
sgl login
sgl service create payments-worker --env prod
# wrote SIGNAL_INGEST_KEY to .env.local
# scoped to payments-worker/prod
# rotate with: sgl key rotateInstrument it
The SDK wraps HTTP, gRPC and your database driver. It has to load before your application code, which is what the --import flag is for.
import { init } from "@signal/node";
init({
service: "payments-worker",
env: process.env.SIGNAL_ENV ?? "dev",
});{
"scripts": {
"start": "node --import ./instrument.js dist/app.js"
}
}Running the collector yourself? Set SIGNAL_ENDPOINT before this step. In self-hosted mode the SDK never opens a connection to signal.sh — the checks to run first are under sgl collector.
Mark your deploys
This is the step that makes the rest of Signal worth having. Run it at the end of your deploy job, after traffic shifts.
sgl deploy mark \
--service payments-worker \
--env prod \
--sha "$(git rev-parse HEAD)" \
--by "$CI_ACTOR"Watch it
Once a deploy and a few thousand spans are in, the timeline can attribute a change to a release. Add --json to the same command to gate a rollout in CI.
sgl watch --env prod --since 15m
sgl watch --env prod --since 15m --json | jq '.regressions'