hobots 1.7.4 → 1.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -125,18 +125,18 @@ interface EventPayload {
125
125
  release?: string;
126
126
  environment?: string;
127
127
  }
128
- /** Status de um span (etapa). `warning` = terminou, mas merece atenção (não é falha). */
129
- type SpanStatus = 'ok' | 'warning' | 'error' | 'cancelled';
130
- interface SpanData {
128
+ /** Status de uma step (etapa). `warning` = terminou, mas merece atenção (não é falha). */
129
+ type StepStatus = 'ok' | 'warning' | 'error' | 'cancelled';
130
+ interface StepData {
131
131
  /** 16 hex */
132
- span_id: string;
133
- parent_span_id?: string;
132
+ step_id: string;
133
+ parent_step_id?: string;
134
134
  op?: string;
135
135
  description?: string;
136
- status?: SpanStatus;
136
+ status?: StepStatus;
137
137
  /** ISO 8601 */
138
138
  start_timestamp: string;
139
- /** ISO 8601 (fim do span) */
139
+ /** ISO 8601 (fim da step) */
140
140
  timestamp: string;
141
141
  data?: Record<string, unknown>;
142
142
  }
@@ -147,7 +147,7 @@ interface TransactionPayload {
147
147
  status: string;
148
148
  start_timestamp: string;
149
149
  timestamp: string;
150
- spans: SpanData[];
150
+ steps: StepData[];
151
151
  tags?: Record<string, string>;
152
152
  release?: string;
153
153
  environment?: string;
@@ -199,4 +199,4 @@ interface Envelope {
199
199
  items: EnvelopeItem[];
200
200
  }
201
201
 
202
- export type { AgentInfo, Breadcrumb, CheckInPayload, CheckInStatus, Envelope, EnvelopeItem, EventPayload, EventUser, ExceptionData, HeartbeatPayload, PollRequest, PollResponse, RunDescriptor, RunError, RunLogEntry, RunLogLevel, RunStatus, RunUpdateRequest, RunUpdateResponse, RunUpdateStatus, Severity, SpanData, SpanStatus, StackFrame, TransactionPayload };
202
+ export type { AgentInfo, Breadcrumb, CheckInPayload, CheckInStatus, Envelope, EnvelopeItem, EventPayload, EventUser, ExceptionData, HeartbeatPayload, PollRequest, PollResponse, RunDescriptor, RunError, RunLogEntry, RunLogLevel, RunStatus, RunUpdateRequest, RunUpdateResponse, RunUpdateStatus, Severity, StackFrame, StepData, StepStatus, TransactionPayload };
@@ -125,18 +125,18 @@ interface EventPayload {
125
125
  release?: string;
126
126
  environment?: string;
127
127
  }
128
- /** Status de um span (etapa). `warning` = terminou, mas merece atenção (não é falha). */
129
- type SpanStatus = 'ok' | 'warning' | 'error' | 'cancelled';
130
- interface SpanData {
128
+ /** Status de uma step (etapa). `warning` = terminou, mas merece atenção (não é falha). */
129
+ type StepStatus = 'ok' | 'warning' | 'error' | 'cancelled';
130
+ interface StepData {
131
131
  /** 16 hex */
132
- span_id: string;
133
- parent_span_id?: string;
132
+ step_id: string;
133
+ parent_step_id?: string;
134
134
  op?: string;
135
135
  description?: string;
136
- status?: SpanStatus;
136
+ status?: StepStatus;
137
137
  /** ISO 8601 */
138
138
  start_timestamp: string;
139
- /** ISO 8601 (fim do span) */
139
+ /** ISO 8601 (fim da step) */
140
140
  timestamp: string;
141
141
  data?: Record<string, unknown>;
142
142
  }
@@ -147,7 +147,7 @@ interface TransactionPayload {
147
147
  status: string;
148
148
  start_timestamp: string;
149
149
  timestamp: string;
150
- spans: SpanData[];
150
+ steps: StepData[];
151
151
  tags?: Record<string, string>;
152
152
  release?: string;
153
153
  environment?: string;
@@ -199,4 +199,4 @@ interface Envelope {
199
199
  items: EnvelopeItem[];
200
200
  }
201
201
 
202
- export type { AgentInfo, Breadcrumb, CheckInPayload, CheckInStatus, Envelope, EnvelopeItem, EventPayload, EventUser, ExceptionData, HeartbeatPayload, PollRequest, PollResponse, RunDescriptor, RunError, RunLogEntry, RunLogLevel, RunStatus, RunUpdateRequest, RunUpdateResponse, RunUpdateStatus, Severity, SpanData, SpanStatus, StackFrame, TransactionPayload };
202
+ export type { AgentInfo, Breadcrumb, CheckInPayload, CheckInStatus, Envelope, EnvelopeItem, EventPayload, EventUser, ExceptionData, HeartbeatPayload, PollRequest, PollResponse, RunDescriptor, RunError, RunLogEntry, RunLogLevel, RunStatus, RunUpdateRequest, RunUpdateResponse, RunUpdateStatus, Severity, StackFrame, StepData, StepStatus, TransactionPayload };
package/docs/README.md CHANGED
@@ -6,16 +6,16 @@ O SDK expõe **duas capabilities** autenticadas pelo **mesmo Client Secret do ag
6
6
 
7
7
  | Capability | Como habilita | Para quê |
8
8
  | --- | --- | --- |
9
- | **Telemetria** | sempre ativa no `init()` | O que o programa **emite** sozinho: erros com stack trace (módulo **Issues**), performance (transactions/spans) e heartbeats de uptime (módulo **Agentes**), check-ins de cron (módulo **Monitores**). Instala handlers globais de erro; os timers são `unref`'d, então nunca seguram o processo vivo. |
9
+ | **Telemetria** | sempre ativa no `init()` | O que o programa **emite** sozinho: erros com stack trace (módulo **Issues**), performance (transactions/etapas) e heartbeats de uptime (módulo **Agentes**), check-ins de cron (módulo **Monitores**). Instala handlers globais de erro; os timers são `unref`'d, então nunca seguram o processo vivo. |
10
10
  | **Tasks** | `tasks: true` (ou opções) no `init()` | Execução **sob demanda**: o agente faz polling no app, executa handlers registrados e reporta status/logs — o módulo **Solicitações**. `start()` **mantém o processo vivo** até `stop()`/`close()`. |
11
11
 
12
12
  ## Páginas
13
13
 
14
- Se termos como transaction, span, breadcrumb, tag, context, extra, flush e close ainda não são familiares, comece por **Conceitos** — as outras páginas assumem esse vocabulário.
14
+ Se termos como transaction, step, breadcrumb, tag, context, extra, flush e close ainda não são familiares, comece por **Conceitos** — as outras páginas assumem esse vocabulário.
15
15
 
16
16
  - [Conceitos](./concepts.md) — o vocabulário: o que cada coisa é, por que existe e quando escolher uma em vez da outra.
17
17
  - [Getting started](./getting-started.md) — instalação, Client Secret, o `init` único, telemetria e tasks.
18
- - [Telemetria](./monitor.md) — erros, breadcrumbs, escopo, transactions/spans, crons e heartbeat.
18
+ - [Telemetria](./monitor.md) — erros, breadcrumbs, escopo, transactions/etapas, crons e heartbeat.
19
19
  - [Tasks](./tasks.md) — registro de handlers, `RunContext`, cancelamento, concorrência, idempotência.
20
20
  - [Referência de API](./api-reference.md) — todas as funções e tabelas de opções com defaults.
21
21
  - [Protocolo & transporte](./protocol.md) — o Client Secret, endpoints, envelope, retries e onde vive o claim atômico.
@@ -4,7 +4,7 @@
4
4
 
5
5
  | Import | Conteúdo |
6
6
  | --- | --- |
7
- | `hobots` | Tudo: `init` único, funções de telemetria, `register`/`start`/`stop` de tasks, `close`, classes (`Client`, `Scope`, `Transaction`, `Span`), `DEFAULT_BASE_URL`, `scrubSecrets` e tipos. |
7
+ | `hobots` | Tudo: `init` único, funções de telemetria, `register`/`start`/`stop` de tasks, `close`, classes (`Client`, `Scope`, `Transaction`, `Step`), `DEFAULT_BASE_URL`, `scrubSecrets` e tipos. |
8
8
  | `hobots/protocol` | Tipos do wire format (telemetria e tasks). |
9
9
 
10
10
  ---
@@ -50,7 +50,7 @@ Os conceitos por trás dessas chamadas estão em [Conceitos](./concepts.md); aqu
50
50
  - **`flush(timeoutMs = 5_000)`** → `Promise<boolean>` — empurra a fila do transport e aguarda os envios em andamento. `true` = tudo saiu no prazo; `false` = o SDK parou de esperar (os envios em voo seguem tentando). O SDK **continua utilizável** depois. Conceito: [Fila, flush e close](./concepts.md#fila-flush-e-close).
51
51
  - **`close(timeoutMs = 5_000)`** → `Promise<boolean>` — encerra tudo na ordem agente → heartbeat → flush final. O `timeoutMs` é gasto **duas vezes** (espera das runs, depois flush). Depois do `close()` o transport está fechado e todo item novo é descartado com aviso no console; não há `reopen()`. Conceito: [Fila, flush e close](./concepts.md#fila-flush-e-close).
52
52
 
53
- Classes exportadas: `Client`, `Scope`, `Transaction`, `Span`. A resolução da credencial nos endpoints é interna ao `init()` (constante `DEFAULT_BASE_URL = 'https://api2.hobots.app'`, exportada; em desenvolvimento a env `HOBOTS_API_URL` sobrescreve a URL base). A config resolvida fica acessível em `getClient()?.config`:
53
+ Classes exportadas: `Client`, `Scope`, `Transaction`, `Step`. A resolução da credencial nos endpoints é interna ao `init()` (constante `DEFAULT_BASE_URL = 'https://api2.hobots.app'`, exportada; em desenvolvimento a env `HOBOTS_API_URL` sobrescreve a URL base). A config resolvida fica acessível em `getClient()?.config`:
54
54
 
55
55
  ```ts
56
56
  getClient()?.config; // {
@@ -61,12 +61,12 @@ getClient()?.config; // {
61
61
  // }
62
62
  ```
63
63
 
64
- ### Métodos de `Transaction` / `Span` / `Scope`
64
+ ### Métodos de `Transaction` / `Step` / `Scope`
65
65
 
66
66
  Todos encadeáveis, exceto `finish()` e `toJSON()`.
67
67
 
68
- - **`Transaction`** — `startChild(op?, description?) → Span` abre um [span](./concepts.md#span) direto; `setTag(k, v)` marca a transaction (tags de scope **não** são herdadas); `setStatus(s)` (default `'ok'`); `setName(n)` renomeia antes do envio; `finish()` fecha os spans abertos, monta o payload e envia — é **idempotente** e não envia nada se a transaction não foi amostrada.
69
- - **`Span`** — `startChild(op?, description?) → Span` aninha um filho (profundidade arbitrária); `setStatus(s)` (default `'ok'`); `setData(k, v)` anexa dados só àquele span; `finish()` marca o fim — **opcional**, porque o `finish()` da transaction fecha o que ficou aberto; `toJSON()` serializa no formato do wire.
68
+ - **`Transaction`** — `startChild(op?, description?) → Step` abre uma [step](./concepts.md#step) direta; `setTag(k, v)` marca a transaction (tags de scope **não** são herdadas); `setStatus(s)` (default `'ok'`); `setName(n)` renomeia antes do envio; `finish()` fecha as etapas abertas, monta o payload e envia — é **idempotente** e não envia nada se a transaction não foi amostrada.
69
+ - **`Step`** — `startChild(op?, description?) → Step` aninha uma filha (profundidade arbitrária); `setStatus(s)` (default `'ok'`); `setData(k, v)` anexa dados só àquela step; `finish()` marca o fim — **opcional**, porque o `finish()` da transaction fecha o que ficou aberto; `toJSON()` serializa no formato do wire.
70
70
  - **`Scope`** — `setTag`/`setTags`/`setUser`/`setContext`/`setExtra`/`setExtras`/`setLevel`/`setFingerprint`/`addBreadcrumb`/`clearBreadcrumbs`/`clone`. Alcançável via [`withScope`](./concepts.md#withscope). `setContext(name, null)` apaga o grupo; `setUser(null)` remove o usuário.
71
71
  > **Atenção:** `setLevel` **não tem efeito** em `captureException` (que já grava `error`) nem em `captureMessage` (que já grava `info`) — os dois definem o level do evento antes de o scope ser consultado. Use o `hint`.
72
72
 
package/docs/concepts.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Conceitos
2
2
 
3
- Esta página explica **o que cada coisa é** — o vocabulário que as outras páginas usam sem parar: evento, scope, tag, context, extra, breadcrumb, transaction, span, check-in, heartbeat, run, claim, flush, close. As outras páginas mostram **como usar**; aqui está o **por que existe** e **quando você escolhe um em vez do outro**.
3
+ Esta página explica **o que cada coisa é** — o vocabulário que as outras páginas usam sem parar: evento, scope, tag, context, extra, breadcrumb, transaction, step, check-in, heartbeat, run, claim, flush, close. As outras páginas mostram **como usar**; aqui está o **por que existe** e **quando você escolhe um em vez do outro**.
4
4
 
5
5
  Não é preciso ler de ponta a ponta. Se você só quer o mapa, o quadro abaixo resolve; se um termo apareceu numa página e você travou, pule direto para a seção dele.
6
6
 
@@ -20,7 +20,7 @@ Os defaults numéricos **não** estão aqui — eles vivem em [Tempos e interval
20
20
  | [Extra](#extra) | Depósito livre, sem estrutura | Não é filtro nem grupo coerente — é anexo |
21
21
  | [Breadcrumb](#breadcrumb) | Migalha da trilha que levou até o erro | Marcar cada passo relevante do robô |
22
22
  | [Transaction](#transaction) | Unidade de trabalho nomeada, com duração | Medir quanto uma rotina inteira demorou |
23
- | [Span](#span) | Uma etapa medida dentro da transaction | Descobrir **onde** o tempo foi gasto |
23
+ | [Step](#step) | Uma etapa medida dentro da transaction | Descobrir **onde** o tempo foi gasto |
24
24
  | [ctx.tx](#transaction-de-run-ctxtx) | A transaction que o SDK já abriu para a run | Medir as etapas de um handler de task |
25
25
  | [Amostragem](#amostragem-samplerate-e-tracessamplerate) | Enviar só uma fração do que acontece | Volume alto demais para enviar tudo |
26
26
  | [Check-in](#check-in) | Par de avisos "comecei" / "terminei" de um job agendado | Cron que precisa ser vigiado |
@@ -45,7 +45,7 @@ Cada API do SDK alimenta um módulo do app da Hobots (app.hobots.app). O mapa:
45
45
  | **Instância** — o par `(project_id, instance_id)`; heartbeat e poll de tasks convergem nele | Módulo **Agentes** (uptime, performance) |
46
46
  | **[Evento](#evento)** agrupado em **issue** — `captureException` / `captureMessage` | Módulo **Issues** |
47
47
  | **Monitor (cron)** — `withMonitor` / `checkIn` com `schedule` | Módulo **Monitores** |
48
- | **[Transaction](#transaction) / spans** — `startTransaction` (e [`ctx.tx`](#transaction-de-run-ctxtx) dentro de uma run) | Performance no módulo **Agentes**; nas execuções, a aba de performance da solicitação |
48
+ | **[Transaction](#transaction) / etapas** — `startTransaction` (e [`ctx.tx`](#transaction-de-run-ctxtx) dentro de uma run) | Performance no módulo **Agentes**; nas execuções, a aba de performance da solicitação |
49
49
  | **Task / [run](#run)** — `register('task-slug', …)` casa com o `task_slug` do formulário | Módulo **Solicitações** (formulários em **Configurações → Formulários**) |
50
50
 
51
51
  ---
@@ -218,7 +218,7 @@ Tamanho do buffer: [`maxBreadcrumbs`](./api-reference.md#initoptions).
218
218
 
219
219
  ## Transaction
220
220
 
221
- Uma **transaction** é uma unidade de trabalho **nomeada** e **medida**: ela começa, termina, e o que fica registrado é quanto tempo levou. É a resposta para "quanto demora minha rotina de emissão?" — e, quando você adiciona [spans](#span), para "onde foram esses minutos?".
221
+ Uma **transaction** é uma unidade de trabalho **nomeada** e **medida**: ela começa, termina, e o que fica registrado é quanto tempo levou. É a resposta para "quanto demora minha rotina de emissão?" — e, quando você adiciona [etapas](#step), para "onde foram esses minutos?".
222
222
 
223
223
  Enquanto o [evento](#evento) responde _o que quebrou_, a transaction responde _quanto tempo levou_. São os dois eixos da telemetria.
224
224
 
@@ -234,37 +234,37 @@ O primeiro argumento é o **nome** (o que agrupa transactions comparáveis no ap
234
234
  Três coisas que valem saber:
235
235
 
236
236
  - **Nada é enviado até o `finish()`.** A transaction vive em memória; o `finish()` é que monta o payload e enfileira. Se o processo morrer antes, ela simplesmente não existe.
237
- - **`finish()` é idempotente e fecha o resto.** Chamar duas vezes não envia duas; e ele **finaliza automaticamente** todos os spans que ficaram abertos.
237
+ - **`finish()` é idempotente e fecha o resto.** Chamar duas vezes não envia duas; e ele **finaliza automaticamente** todas as etapas que ficaram abertas.
238
238
  - **A [amostragem](#amostragem-samplerate-e-tracessamplerate) é decidida no `startTransaction()`**, não no `finish()`. Se aquela transaction não foi sorteada, o `finish()` não envia nada — mas os `startChild` continuam funcionando normalmente e não custam quase nada.
239
239
 
240
240
  O `status` default é `'ok'`; encadeáveis: `setStatus`, `setName`, `setTag`.
241
241
 
242
242
  Dentro de um handler de task você **não** cria transaction — já existe uma em [`ctx.tx`](#transaction-de-run-ctxtx), e o `startTransaction()` chamado lá dentro devolve exatamente ela.
243
243
 
244
- ## Span
244
+ ## Step
245
245
 
246
- Um **span** é uma etapa medida **dentro** de uma [transaction](#transaction). A transaction diz que a rotina levou 4 minutos; os spans dizem que 3min40 foram esperando o portal.
246
+ Uma **step** (etapa) é medida **dentro** de uma [transaction](#transaction). A transaction diz que a rotina levou 4 minutos; as etapas dizem que 3min40 foram esperando o portal.
247
247
 
248
248
  ```js
249
- const span = tx.startChild('http.client', 'GET /api/notas');
249
+ const step = tx.startChild('http.client', 'GET /api/notas');
250
250
  await api.buscarNotas();
251
- span.setData('notas', 42).finish();
251
+ step.setData('notas', 42).finish();
252
252
  ```
253
253
 
254
- `startChild(op?, description?)` existe **tanto na transaction quanto no span**, então você aninha quanto quiser — um span de "processar nota" com filhos de "baixar XML" e "gravar no banco". No app isso vira o **waterfall**: barras encaixadas, cada uma com sua duração.
254
+ `startChild(op?, description?)` existe **tanto na transaction quanto na step**, então você aninha quanto quiser — uma step de "processar nota" com filhas de "baixar XML" e "gravar no banco". No app isso vira o **waterfall**: barras encaixadas, cada uma com sua duração.
255
255
 
256
- O `op` é a categoria (útil para agrupar "todas as queries") e a `description` é o detalhe humano ("`INSERT INTO notas`"). `setData(chave, valor)` anexa dados àquele span específico — contagens, tamanhos, ids.
256
+ O `op` é a categoria (útil para agrupar "todas as queries") e a `description` é o detalhe humano ("`INSERT INTO notas`"). `setData(chave, valor)` anexa dados àquela step específica — contagens, tamanhos, ids.
257
257
 
258
258
  - Métodos encadeáveis: `setStatus`, `setData`, `finish`.
259
- - **Status do span:** `'ok'` (default), `'warning'` (terminou, mas merece atenção — não é falha) ou `'error'` (falhou). No waterfall do app cada um tem sua cor: verde/neutro, âmbar e vermelho. Use `span.setStatus('warning')` para etapas que passaram com ressalva (ex.: retry que deu certo, resultado parcial).
260
- - Esquecer o `finish()` de um span **não perde o dado**: o `finish()` da transaction fecha os spans abertos, marcando o fim naquele instante.
261
- - Os spans são guardados numa lista plana ligada por `parent_span_id` — o aninhamento que você vê no app é reconstruído a partir dessas referências, não da ordem das chamadas.
259
+ - **Status da step:** `'ok'` (default), `'warning'` (terminou, mas merece atenção — não é falha) ou `'error'` (falhou). No waterfall do app cada um tem sua cor: verde/neutro, âmbar e vermelho. Use `step.setStatus('warning')` para etapas que passaram com ressalva (ex.: retry que deu certo, resultado parcial).
260
+ - Esquecer o `finish()` de uma step **não perde o dado**: o `finish()` da transaction fecha as etapas abertas, marcando o fim naquele instante.
261
+ - As etapas são guardadas numa lista plana ligada por `parent_step_id` — o aninhamento que você vê no app é reconstruído a partir dessas referências, não da ordem das chamadas.
262
262
 
263
263
  ## Transaction de run (ctx.tx)
264
264
 
265
265
  Dentro de um handler de task você **não precisa** criar uma transaction: o SDK já abriu uma para aquela execução e entregou em `ctx.tx`. Ela nasce quando o agente captura a run, é **correlacionada** à execução pelo `run_id`, recebe o status conforme o desfecho (`ok`, `error` ou `cancelled`) e é **finalizada automaticamente** quando o handler termina — você nunca chama `ctx.tx.finish()`.
266
266
 
267
- O que sobra para você é a parte interessante: marcar as **etapas** do trabalho com [spans](#span). Cada `startChild` vira uma barra no waterfall da aba de performance daquela execução no app.
267
+ O que sobra para você é a parte interessante: marcar as **etapas** do trabalho com [steps](#step). Cada `startChild` vira uma barra no waterfall da aba de performance daquela execução no app.
268
268
 
269
269
  ```js
270
270
  Hobots.register('processar-nfe', async (params, ctx) => {
@@ -273,17 +273,17 @@ Hobots.register('processar-nfe', async (params, ctx) => {
273
273
  login.finish();
274
274
 
275
275
  for (const nota of params.notas) {
276
- const span = ctx.tx.startChild('nfe', `nota ${nota.numero}`);
276
+ const step = ctx.tx.startChild('nfe', `nota ${nota.numero}`);
277
277
  ctx.throwIfCanceled();
278
278
  await processar(nota);
279
- span.setData('valor', nota.valor).finish();
279
+ step.setData('valor', nota.valor).finish();
280
280
  }
281
281
  });
282
282
  ```
283
283
 
284
- Sem nenhum `startChild` a transaction ainda existe e ainda mede o tempo total da run — o waterfall só fica com uma barra. Cada span que você abre é uma resposta a mais para "onde foram os 4 minutos".
284
+ Sem nenhum `startChild` a transaction ainda existe e ainda mede o tempo total da run — o waterfall só fica com uma barra. Cada step que você abre é uma resposta a mais para "onde foram os 4 minutos".
285
285
 
286
- - **`Hobots.startTransaction()` dentro de um handler devolve a própria `ctx.tx`.** Cada execução tem exatamente **uma** transaction: o SDK detecta o contexto da run e reutiliza a transaction dela em vez de criar uma segunda — os spans caem no mesmo waterfall. Fora de um handler, `startTransaction()` cria uma transaction nova, sem `run_id`.
286
+ - **`Hobots.startTransaction()` dentro de um handler devolve a própria `ctx.tx`.** Cada execução tem exatamente **uma** transaction: o SDK detecta o contexto da run e reutiliza a transaction dela em vez de criar uma segunda — as etapas caem no mesmo waterfall. Fora de um handler, `startTransaction()` cria uma transaction nova, sem `run_id`.
287
287
  - `ctx.tx` **não respeita o `tracesSampleRate`** — toda run gera uma transaction. A amostragem vale para as transactions que **você** abre com `startTransaction()` fora de uma run.
288
288
  - O nome é `run:<task>` e o `op` é `hobots.task`, preenchidos pelo SDK.
289
289
 
package/docs/monitor.md CHANGED
@@ -88,18 +88,18 @@ Hobots.withScope((scope) => {
88
88
 
89
89
  > **Atenção:** `withScope` é **síncrono** — ele troca o scope global e restaura no fim do callback. Se você der `await` lá dentro, o scope isolado vale para qualquer código que capturar eventos enquanto aquele `await` está pendente. Em código concorrente (várias runs em paralelo), passe as tags no `hint`: `captureException(error, { tags: { lote: '128' } })`. Conceito: [withScope](./concepts.md#withscope).
90
90
 
91
- ## Performance: transactions e spans
91
+ ## Performance: transactions e etapas
92
92
 
93
- Uma **transaction** é uma unidade de trabalho nomeada e medida ("quanto minha rotina demorou"); os **spans** são as etapas dentro dela ("onde o tempo foi gasto"). Conceitos: [Transaction](./concepts.md#transaction) · [Span](./concepts.md#span).
93
+ Uma **transaction** é uma unidade de trabalho nomeada e medida ("quanto minha rotina demorou"); as **etapas** são as unidades dentro dela ("onde o tempo foi gasto"). Conceitos: [Transaction](./concepts.md#transaction) · [Step](./concepts.md#step).
94
94
 
95
95
  ```js
96
96
  const tx = Hobots.startTransaction('processar-lote', 'rpa.job');
97
97
 
98
- const span = tx.startChild('http.client', 'GET /api/notas');
98
+ const step = tx.startChild('http.client', 'GET /api/notas');
99
99
  await api.buscarNotas();
100
- span.setData('notas', 42).finish();
100
+ step.setData('notas', 42).finish();
101
101
 
102
- const filho = span.startChild('db.query', 'INSERT INTO notas'); // spans aninham
102
+ const filho = step.startChild('db.query', 'INSERT INTO notas'); // etapas aninham
103
103
  await gravar();
104
104
  filho.finish();
105
105
 
@@ -107,11 +107,11 @@ tx.setStatus('ok'); // ou 'error'
107
107
  tx.finish(); // só aqui a transaction é enviada (respeitando tracesSampleRate)
108
108
  ```
109
109
 
110
- - `startChild(op?, description?)` existe tanto em `Transaction` quanto em `Span` (aninhamento arbitrário).
111
- - Métodos encadeáveis: `setStatus`, `setData` (span), `setTag`/`setName` (transaction).
112
- - Status de span: `'ok'` (default), `'warning'` (atenção, não é falha) ou `'error'` — cores distintas no waterfall.
113
- - `finish()` na transaction fecha spans abertos e envia o payload; nada é enviado se ela não foi amostrada. É **idempotente** — chamar duas vezes não envia duas.
114
- - A decisão de amostragem acontece no **`startTransaction()`**, não no `finish()`. Esquecer o `finish()` de um span não perde o dado: ele é fechado no instante em que a transaction fecha.
110
+ - `startChild(op?, description?)` existe tanto em `Transaction` quanto em `Step` (aninhamento arbitrário).
111
+ - Métodos encadeáveis: `setStatus`, `setData` (step), `setTag`/`setName` (transaction).
112
+ - Status de step: `'ok'` (default), `'warning'` (atenção, não é falha) ou `'error'` — cores distintas no waterfall.
113
+ - `finish()` na transaction fecha etapas abertas e envia o payload; nada é enviado se ela não foi amostrada. É **idempotente** — chamar duas vezes não envia duas.
114
+ - A decisão de amostragem acontece no **`startTransaction()`**, não no `finish()`. Esquecer o `finish()` de uma step não perde o dado: ela é fechada no instante em que a transaction fecha.
115
115
  - Uma transaction leva as tags do `init()` e as que você marcar com `tx.setTag()` — ela **não** herda as tags do scope.
116
116
 
117
117
  Dentro de um handler de task, `startTransaction()` **retorna a transaction da própria run** ([`ctx.tx`](./concepts.md#transaction-de-run-ctxtx)) em vez de criar uma segunda — cada execução tem exatamente **uma** transaction. Fora de um handler, ela cria uma transaction nova, sem correlação com run nenhuma.
package/docs/tasks.md CHANGED
@@ -79,20 +79,20 @@ Hobots.register('processar-nfe', async (params, ctx) => {
79
79
  login.finish();
80
80
 
81
81
  for (const nota of params.notas) {
82
- const span = ctx.tx.startChild('nfe', `nota ${nota.numero}`);
82
+ const step = ctx.tx.startChild('nfe', `nota ${nota.numero}`);
83
83
  ctx.throwIfCanceled();
84
84
  await processar(nota);
85
- span.setData('valor', nota.valor).finish();
85
+ step.setData('valor', nota.valor).finish();
86
86
  }
87
87
  });
88
88
  ```
89
89
 
90
- Cada `startChild` vira uma barra no waterfall da aba de performance daquela execução no app — é como você responde "onde foram os 4 minutos". Sem nenhum span, a transaction ainda mede o tempo total da run; o waterfall só fica com uma barra.
90
+ Cada `startChild` vira uma barra no waterfall da aba de performance daquela execução no app — é como você responde "onde foram os 4 minutos". Sem nenhuma step, a transaction ainda mede o tempo total da run; o waterfall só fica com uma barra.
91
91
 
92
- - **`startTransaction()` dentro do handler devolve a própria `ctx.tx`.** Cada execução tem exatamente **uma** transaction: se o seu código (ou uma lib sua já instrumentada) chamar `Hobots.startTransaction()` dentro de um handler, o SDK detecta o contexto da run e retorna a transaction dela em vez de criar uma segunda — os spans caem no mesmo waterfall. Fora de um handler, `startTransaction()` cria uma transaction nova, sem `run_id`.
92
+ - **`startTransaction()` dentro do handler devolve a própria `ctx.tx`.** Cada execução tem exatamente **uma** transaction: se o seu código (ou uma lib sua já instrumentada) chamar `Hobots.startTransaction()` dentro de um handler, o SDK detecta o contexto da run e retorna a transaction dela em vez de criar uma segunda — as etapas caem no mesmo waterfall. Fora de um handler, `startTransaction()` cria uma transaction nova, sem `run_id`.
93
93
  - `ctx.tx` **não respeita o `tracesSampleRate`** — toda run gera uma transaction. A amostragem vale só para as transactions abertas com `startTransaction()` fora de uma run.
94
- - Span que você esquecer aberto é fechado no `finish()` da transaction, então o dado não se perde.
95
- - Marque etapas com ressalva usando `span.setStatus('warning')` (ex.: retry que deu certo, resultado parcial): elas aparecem em âmbar no waterfall, distintas de sucesso e de falha (`'error'`).
94
+ - Step que você esquecer aberta é fechada no `finish()` da transaction, então o dado não se perde.
95
+ - Marque etapas com ressalva usando `step.setStatus('warning')` (ex.: retry que deu certo, resultado parcial): elas aparecem em âmbar no waterfall, distintas de sucesso e de falha (`'error'`).
96
96
 
97
97
  ## Cancelamento cooperativo
98
98
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hobots",
3
- "version": "1.7.4",
3
+ "version": "1.7.6",
4
4
  "description": "SDK JavaScript da Hobots — telemetria (erros, transactions, check-ins de cron e heartbeats) e execução remota de tarefas sob demanda (tasks) para RPAs e integrações. Um único import e um único init().",
5
5
  "type": "module",
6
6
  "sideEffects": false,