@gw-tools/gw 0.62.0 → 0.63.0-beta.73.1

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.
Files changed (2) hide show
  1. package/README.md +113 -0
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -25,6 +25,7 @@ A command-line tool for managing git worktrees, built with Deno.
25
25
  - [Auto-Detection](#auto-detection)
26
26
  - [Example Configuration](#example-configuration)
27
27
  - [Configuration Options](#configuration-options)
28
+ - [Telemetry (OpenTelemetry & Dash0)](#telemetry-opentelemetry--dash0)
28
29
  - [Commands](#commands)
29
30
  - [checkout](#checkout)
30
31
  - [Arguments](#arguments)
@@ -385,6 +386,7 @@ All fields are optional and safe to commit — no machine-specific paths or runt
385
386
  - **cleanThreshold**: Number of days before worktrees are considered stale for `gw clean` (defaults to 7, set via `gw init --clean-threshold`)
386
387
  - **autoClean**: Silently remove stale worktrees in the background when running `gw checkout` or `gw list` (defaults to false, set via `gw init --auto-clean`)
387
388
  - **updateStrategy**: Default strategy for `gw update` command: "merge" or "rebase" (defaults to "merge", set via `gw init --update-strategy`)
389
+ - **telemetry**: Opt-in OpenTelemetry / Dash0 telemetry (disabled by default). See [Telemetry](#telemetry-opentelemetry--dash0)
388
390
 
389
391
  ### Local Overrides (`config.local.json`)
390
392
 
@@ -399,6 +401,117 @@ Create `.gw/config.local.json` to override any config value for your machine onl
399
401
 
400
402
  Local config is merged on top of `config.json` (shallow merge, local wins). Useful for adding personal files to `autoCopyFiles` without modifying the team config.
401
403
 
404
+ ## Telemetry (OpenTelemetry & Dash0)
405
+
406
+ `gw` can emit [OpenTelemetry](https://opentelemetry.io/) traces and logs so you
407
+ can observe how the tool is used and **correlate releases with errors** in
408
+ [Dash0](https://www.dash0.com/). It is **opt-in and disabled by default** — no
409
+ telemetry leaves your machine unless you turn it on.
410
+
411
+ ### What gets sent
412
+
413
+ When enabled, each command emits:
414
+
415
+ - **One span** per invocation (`gw <command>`) with `gw.command`,
416
+ `gw.command.exit_code`, `gw.command.duration_ms`, and `service.version`.
417
+ - **One log record** — `INFO` on success, `ERROR` (with `error.message`) on
418
+ failure.
419
+
420
+ Every signal carries the `service.version` resource attribute. That, combined
421
+ with a **deployment event** emitted by the release pipeline (see below), is
422
+ what lets Dash0 line up "a new version shipped" with "errors started".
423
+
424
+ `gw` never sends branch names, repository paths, or file names. Error messages
425
+ are included so failures can be investigated — redact them in the Collector if
426
+ that is a concern.
427
+
428
+ > **Design note:** telemetry is fully fail-open. Any export error is swallowed
429
+ > and never slows down or breaks a command, and nothing is ever written to
430
+ > stdout (so shell-eval commands like `gw cd` stay safe).
431
+
432
+ ### Recommended setup: via a local OpenTelemetry Collector
433
+
434
+ Point `gw` at a local [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/)
435
+ that holds your Dash0 auth token and forwards telemetry on. This keeps the
436
+ token out of any committed config, keeps the CLI fast (the Collector ACKs
437
+ locally), and lets you redact/transform data centrally.
438
+
439
+ 1. Enable it in `.gw/config.json`:
440
+
441
+ ```jsonc
442
+ {
443
+ "telemetry": {
444
+ "enabled": true,
445
+ "endpoint": "http://localhost:4318", // local OTel Collector
446
+ "environment": "production" // deployment.environment.name
447
+ }
448
+ }
449
+ ```
450
+
451
+ 2. Run a Collector that exports to Dash0 (token stays in the Collector config,
452
+ not in your repo):
453
+
454
+ ```yaml
455
+ # otel-collector.yaml
456
+ receivers:
457
+ otlp:
458
+ protocols:
459
+ http: { endpoint: 0.0.0.0:4318 }
460
+ exporters:
461
+ otlp/dash0:
462
+ endpoint: ${env:DASH0_OTLP_ENDPOINT} # e.g. ingress.<region>.aws.dash0.com:4317
463
+ headers:
464
+ Authorization: Bearer ${env:DASH0_AUTH_TOKEN}
465
+ Dash0-Dataset: ${env:DASH0_DATASET}
466
+ service:
467
+ pipelines:
468
+ traces: { receivers: [otlp], exporters: [otlp/dash0] }
469
+ logs: { receivers: [otlp], exporters: [otlp/dash0] }
470
+ ```
471
+
472
+ ### Alternative: send straight to Dash0
473
+
474
+ Skip the Collector and supply the endpoint and token via env vars (or
475
+ `.gw/config.local.json`, which is gitignored). **Never** put the token in the
476
+ committed `config.json`:
477
+
478
+ ```bash
479
+ export GW_TELEMETRY=1
480
+ export OTEL_EXPORTER_OTLP_ENDPOINT="https://ingress.<region>.aws.dash0.com:4318"
481
+ export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer <token>,Dash0-Dataset=default"
482
+ ```
483
+
484
+ ### Configuration & env vars
485
+
486
+ | Setting | `config.json` key | Env override | Default |
487
+ | ------------- | ----------------------- | ----------------------------- | ----------------------- |
488
+ | Enable | `telemetry.enabled` | `GW_TELEMETRY` (`1`/`0`) | `false` |
489
+ | Endpoint | `telemetry.endpoint` | `OTEL_EXPORTER_OTLP_ENDPOINT` | `http://localhost:4318` |
490
+ | Environment | `telemetry.environment` | `OTEL_RESOURCE_ATTRIBUTES` | _(unset)_ |
491
+ | Service name | `telemetry.serviceName` | `OTEL_SERVICE_NAME` | `gw` |
492
+ | Headers | `telemetry.headers` | `OTEL_EXPORTER_OTLP_HEADERS` | _(none)_ |
493
+ | Flush timeout | `telemetry.timeoutMs` | — | `1500` |
494
+
495
+ `OTEL_SDK_DISABLED=true` is honoured as a hard kill switch. Set
496
+ `GW_TELEMETRY_DEBUG=1` to log export problems to stderr while setting things up.
497
+
498
+ ### Correlating deployments with errors
499
+
500
+ The release pipeline (`scripts/release-ci.sh`) sends a `deployment.success`
501
+ event log to Dash0 after a successful publish, tagged with the released
502
+ `service.version` and the git commit. Because runtime error signals carry the
503
+ same `service.version`, Dash0 can show a deployment marker on the error
504
+ timeline and compare error rates before and after each release.
505
+
506
+ You can also send one manually:
507
+
508
+ ```bash
509
+ OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4318" \
510
+ deno run --allow-net --allow-env --allow-read \
511
+ packages/gw-tool/scripts/send-deployment-event.ts \
512
+ --version 1.2.3 --environment production --commit "$(git rev-parse HEAD)"
513
+ ```
514
+
402
515
  ## Commands
403
516
 
404
517
  ### checkout
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gw-tools/gw",
3
- "version": "0.62.0",
3
+ "version": "0.63.0-beta.73.1",
4
4
  "description": "A command-line tool for managing git worktrees - copy files between worktrees with ease",
5
5
  "keywords": [
6
6
  "git",