---
name: paradevai-instrument-with-sazabi
description: "Get an application's logs and traces into Sazabi with OpenTelemetry — pick the SDK for the runtime, export over OTLP/HTTP to a Sazabi intake URL kept in an environment variable, and prove data arrives before calling it done. Use when the user wants to connect an app or service to Sazabi, add OpenTelemetry, set up logging or tracing, or asks why Sazabi shows no data for a service."
license: "NOASSERTION"
metadata:
  decimalai-skill-id: "d85bddcd-2c7b-4488-92cd-c2f9e2a9fb72"
  decimalai-version-id: "79911626-27b3-4816-b0cb-a5517b9c6a53"
  decimalai-version: "1"
  decimalai-body-sha256: "7aadc510786ea9b70c2527c5dcc4b87cb44166f24c1cccf1f727d59c7263333e"
  decimalai-name: "paradevai/instrument-with-sazabi"
  decimalai-format: "1"
  decimalai-invocation: "model"
  decimalai-category: "devops"
  decimalai-source: "https://app.decimal.ai/s/paradevai-instrument-with-sazabi@1/SKILL.md"
---
# Data in, proven

Sazabi can only answer questions about telemetry it receives. The job is to
make the app export logs and traces over OpenTelemetry to the user's Sazabi
project, with no secrets in the repo, and to show the first records arriving.

## 0. How the tools work

The Sazabi MCP server lists only two tools, `search` and `execute`. Browse
Sazabi's operations with `search` and `namespace: "sazabi"` (an empty query
without a namespace lists connected connectors, not Sazabi operations). Before
calling one, repeat `search` with `namespace: "sazabi"`, the hit's full name as
the query, and `includeInputSchema: true` to load its arguments. Then run it
with `execute` as `{ name, arguments }`, the name copied from the hit (for
example `sazabi/logs.ask`).

## 1. Get an intake URL

Run `sazabi/logSources.list` first; an OpenTelemetry source may already exist
for this project. If not, `sazabi/logSources.create` in manual mode for an
OpenTelemetry source returns the intake endpoint to point the sender at. The
intake URL embeds a write-only public key, so it needs no auth header, but it
still belongs in an environment variable or secret store, not in committed
code. Metrics go to the separate OpenTelemetry Metrics source, which has its
own intake path.

## 2. Wire the SDK

Use the official OpenTelemetry SDK for the runtime and initialize it before the
app handles requests:

- **Node.js:** `@opentelemetry/sdk-node`, `@opentelemetry/auto-instrumentations-node`,
  `@opentelemetry/exporter-trace-otlp-proto`, `@opentelemetry/exporter-logs-otlp-proto`
  and `@opentelemetry/sdk-logs`. Auto-instrumentation exports traces but not
  logs, so add a `BatchLogRecordProcessor` with an `OTLPLogExporter`, and
  bridge the app's existing logger (pino, winston) instead of replacing it.
- **Python:** `opentelemetry-distro` and `opentelemetry-exporter-otlp-proto-http`,
  then `opentelemetry-bootstrap -a install`, and enable the logging handler.
- **Other runtimes:** the standard OTLP/HTTP exporter for that SDK.

Configure through the standard environment variables, set in the process that
runs the app (not only at build time or in CI):

```bash
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_EXPORTER_OTLP_ENDPOINT=<intake URL>
OTEL_SERVICE_NAME=<service name>
```

Set `OTEL_SERVICE_NAME` and `deployment.environment` so every record says
which service and environment it came from. Add the variable names to
`.env.example` or the deploy config, with the value left to the user.

## 3. Prove it

Run the app (or deploy it), make a request, then ask Sazabi with
`sazabi/logs.ask`: "how many records from service `<name>` in the last 15
minutes". Records usually show up within a minute or two. If none arrive,
check that the variables are set in the running process, that the URL has its
`https://` scheme, and the app's output for SDK initialization errors.

## 4. Hand off

Commit on a branch and open a pull request. Say which signals are flowing
(logs, traces), which service name to search for, and which variables the
user must set in each environment.

## Anti-patterns

- **Committing the intake URL.** It is a write key; keep it in configuration.
- **Traces only.** Most debugging starts from log lines; export both.
- **Calling it done before a record arrives.** Configuration that has never
  delivered a record is a guess.
