Works with the OpenTelemetry you already run.
Bolt Sight takes standard OTLP in and sends alerts out to the places your team already looks. There is no proprietary agent to install.
Data in
Nothing proprietary sits between your code and Bolt Sight. If it speaks OTLP over HTTP, it works.
| Integration | How it connects | Where it appears |
|---|---|---|
| OpenTelemetry SDKs | Go, Python, Java, .NET, Ruby, PHP and any other language with an OTLP/HTTP exporter. Set the endpoint and an Authorization header, or the standard OTEL_* variables. | Investigate, Logs, Metrics, Services, Errors |
| OpenTelemetry Collector | An otlphttp exporter to the endpoint. One key per Collector deployment. | The same pages, for every signal the Collector forwards |
| Node.js SDK | init() in your entry module. Automatic instrumentation, console output as logs. | Investigate, Logs, Metrics, Errors, Services |
| Browser SDK | initBrowser() in your app entry point. | Web Vitals, page-load and request spans, Errors, Events |
| React and Next.js | A hook for the browser SDK, navigation spans and App Router support. | Web Vitals, Investigate |
| Job events (BullMQ) | JSON events posted to /v1/job-events for each job state change. | Jobs |
| Product events | Log records whose body is an event name. | Events |
OpenTelemetry, any language
Most OpenTelemetry SDKs and agents read the standard environment variables, so often no code changes. The space after Bearer is URL-encoded as %20 there. Already running a Collector, or fanning in many hosts? Forward with the otlphttp exporter and use one key per Collector deployment. Go and Python snippets are on the developer page.
OTEL_SERVICE_NAME=billing-worker
OTEL_EXPORTER_OTLP_ENDPOINT=https://bsight.techsstuff.com
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_EXPORTER_OTLP_HEADERS=Authorization=Bearer%20bsk_your_project_key
OTEL_RESOURCE_ATTRIBUTES=deployment.environment=production,service.version=1.4.2# Zero-code: the OpenTelemetry Java agent reads the OTEL_* variables
java -javaagent:opentelemetry-javaagent.jar -jar app.jar// dotnet add package OpenTelemetry.Extensions.Hosting
// dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
builder.Services.AddOpenTelemetry()
.ConfigureResource(r => r.AddService("billing-worker"))
.WithTracing(t => t.AddAspNetCoreInstrumentation().AddOtlpExporter(o =>
{
o.Protocol = OtlpExportProtocol.HttpProtobuf;
o.Endpoint = new Uri("https://bsight.techsstuff.com/v1/traces");
o.Headers = $"Authorization=Bearer {builder.Configuration["BoltSight:ApiKey"]}";
}));exporters:
otlphttp/boltsight:
endpoint: https://bsight.techsstuff.com
headers:
Authorization: "Bearer ${env:BOLT_SIGHT_API_KEY}"
service:
pipelines:
traces: { receivers: [otlp], processors: [batch], exporters: [otlphttp/boltsight] }
metrics: { receivers: [otlp], processors: [batch], exporters: [otlphttp/boltsight] }
logs: { receivers: [otlp], processors: [batch], exporters: [otlphttp/boltsight] }Node.js, browser, React and Next.js SDKs
Thin wrappers over OpenTelemetry. Install steps are on the Developers page in the app, after you sign in; email support@techsstuff.com if you cannot reach it.
Node.js
| Automatic spans | HTTP, Express, Fastify, NestJS, gRPC, PostgreSQL, MySQL, Redis, MongoDB and the other libraries covered by OpenTelemetry auto-instrumentation. File-system spans are off. |
|---|---|
| Logs | console.log, info, warn, error, debug and stdout and stderr lines become log records with the active trace ID. |
| Services | Services, the service map and request, error and latency numbers are built from your spans and service.name. |
| Errors | Record exceptions with span.recordException() in your framework’s error handler. Uncaught exceptions are not captured automatically. |
| Short-lived processes | Call forceFlush() before a serverless function, CLI or cron job ends. |
| Privacy | An attribute policy applies a closed export allowlist to names, resources, attributes, events, links and status in your process, before export. |
Browser, React and Next.js
| Web Vitals | LCP, INP, CLS, FCP and TTFB as browser.web_vital.* metrics with page.url and rating, exported every 60 seconds by default. |
|---|---|
| Spans | A span per page load and per XMLHttpRequest, with W3C traceparent propagation so backend spans join the same trace. fetch is traced only through tracedFetch and an exact origin, method and path policy. |
| User operations | Wrap an action in a span named browser.operation, browser.navigation or http.request. Only a fixed set of attribute keys is exported. |
| Errors | Opt in to uncaught errors and unhandled rejections. Messages and stack traces (up to 1,024 characters) are off by default because they often contain user data. |
| Product events | getLogger().emit() sends events that the Events page understands. |
| Key | Browser keys are public: give the browser its own key and restrict it with allowed origins. |
Alerts out
A rule notifies its channels when it fires and when it resolves.
| Channel | You provide | What is sent |
|---|---|---|
| Webhook | A URL | A JSON POST when a rule fires and when it resolves, signed with an HMAC-SHA256 X-Webhook-Signature header. Payload and verification. |
| Slack | An incoming webhook URL | A message in the Slack channel the webhook belongs to. |
| An SMTP server and recipient addresses | An email sent through the SMTP server you configure. | |
| Telegram | A bot token and chat ID | A message through the Telegram Bot API. The app can list chats your bot can see to help you pick the ID. |
Delivery safeguards
| Test before you rely on it | Every channel has a Test button that sends a test notification. |
|---|---|
| Up to 10 channels per rule | A rule can notify several places at once. |
| Secrets stay secret | Webhook URLs, SMTP passwords and bot tokens are encrypted with AES-256-GCM at rest and are never returned by the API. |
| Safe outbound requests | Webhook, Slack and Telegram requests require HTTPS. Hostnames are resolved when the connection is made, private address ranges are blocked and redirect chains are limited to three. |