All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
<!-- next version -->spam-filters: Fix spam filter FilterCriteria format in fixtures and tests to match the Dash0 API schema (#134)
The filter criteria now use the correct flat format with operator and value fields instead of the nested stringValue format.spam-filters: Add spam-filters command with list, get, create, update, and delete subcommands (#132)
Manage dataset-scoped spam filters via dash0 spam-filters <subcommand>.
Supports file-based input (-f), dry-run validation, and all standard output formats (table, wide, json, yaml, csv).recording-rules: Fix recording rules create and update not passing the dataset as a query parameter (#130)
The --dataset flag and profile dataset were silently ignored for recording-rules create and recording-rules update.
Updated dash0-api-client-go to v1.11.1 which passes the dataset as a query parameter.recording-rules: Add recording rules commands (create, list, get, update, delete) for managing Prometheus recording rules via the PrometheusRule CRD format. (#126)config: Add --profile global flag and DASH0_PROFILE environment variable to select a profile per invocation. (#127)
The selector overrides the active profile on disk for the current invocation
without modifying ~/.dash0/. Precedence is --profile flag → DASH0_PROFILE
→ the active profile. A non-existent profile fails before any API call with a
message listing the available profiles. Passing an empty value falls through
to the next step. config show annotates the Profile: line with the source
when a selector is in effect.api: Add experimental api command for raw HTTP calls to the Dash0 API. (#122)
The dash0 -X api command performs a raw HTTP request against any Dash0 API endpoint,
reusing the active profile's API URL, auth token, and (by default) dataset.
It is useful for endpoints that do not yet have a dedicated subcommand.metrics: Rework metrics instant with new flags and output formats (#45)
Add --promql flag (replacing the deprecated --query), --filter for PromQL label matcher generation,
--from (replacing the deprecated --time), -o csv output format, --skip-header, and --column for
columnar table and CSV output. The timestamp and value columns are always included automatically.
Deprecated flags (--query, --time) remain functional for backwards compatibility.
logs, spans, traces: Promote logs query, spans query, spans send, and traces get commands to stable (#124)
These commands no longer require the --experimental (-X) flag.
notification-channels: Add notification-channels command for managing notification channels (list, get, create, update, delete) (#119)
Notification channels are organization-level resources (no --dataset flag).
The command uses CRD-enveloped NotificationChannelDefinition types with file-based input.
All subcommands are experimental and require the -X flag.check-rules: check-rules update now accepts PrometheusRule CRD files (#110)
Previously, check-rules update -f failed with "no check rule ID provided" when given a PrometheusRule CRD file,
because it did not detect the kind and route to the PrometheusRule parser. Both apply and check-rules create
already handled this correctly.
dashboards: dashboards update now accepts PersesDashboard CRD files (#111)
Previously, dashboards update -f did not detect PersesDashboard CRD files, so the CRD-specific conversion
(v1alpha1/v1alpha2 normalization, ID extraction from labels, annotation mapping) was skipped.
Both apply and dashboards create already handled this correctly.
agent-mode: Add agent mode for AI coding agents (#68)
When active, agent mode defaults output to JSON, returns errors as JSON on
stderr, emits --help as structured JSON, skips confirmation prompts, and
disables colored output. Agent mode is activated via --agent-mode, the
DASH0_AGENT_MODE environment variable, or auto-detection of known AI agent
environment variables (CLAUDE_CODE, MCP_SESSION_ID, CURSOR_SESSION_ID, etc.).dashboards: Clear dashboard ID from the request body before update calls to avoid server-side rejection (#101)
When updating a dashboard whose user-defined ID is a UUID, the server rejects the request if the
same ID appears in both the URL path parameter and the request body. The CLI now strips the ID from
the body before sending the update, since it is already passed as the URL path parameter.
dashboards: Fix PersesDashboard annotations (folder-path, sharing, source) being silently dropped during conversion (#103)
User-settable annotations (dash0.com/folder-path, dash0.com/sharing, dash0.com/source) on PersesDashboard CRDs
were not carried over when converting to a Dashboard definition, affecting both apply and dashboards create.
query: --filter now accepts JSON filter criteria copied from the Dash0 UI (#96)
The --filter flag on logs query and spans query now accepts JSON arrays and objects
as produced by the Dash0 UI "copy filter criteria" feature, in addition to the
existing text-based filter syntax. JSON and text filters can be mixed freely.apply: Preserve user-settable annotations and permissions on asset round-trips (#99)
dash0.com/folder-path, dash0.com/source, and dash0.com/sharing annotations were silently dropped during apply, <asset> create and <asset> update.
spec.permissions on views and synthetic checks was also stripped.apply: Migrate asset create/update from Import APIs to standard CRUD APIs (#90)
The apply command and individual asset create/update subcommands now use the standard
Create and Update APIs instead of the Import APIs, which are intended for one-time migrations.apply: When an asset definition includes a user-defined ID, apply now always upserts, making repeated applies idempotent and preventing duplicate assets from being created. (#94)output: The update and apply commands now show a unified diff of changes (#66)
dashboards: <asset> list -o yaml and -o json now output full asset definitions instead of summary list items (#67)
YAML output is a multi-document stream (separated by ---) that can be piped directly to dash0 apply -f -.
JSON output is an array of full asset definitions.
This applies to all four asset types: dashboards, check-rules, views, and synthetic-checks.
dashboards: Accept PersesDashboard CRD files in apply and dashboards create (#85)
PersesDashboard CRDs (perses.dev/v1alpha1 and perses.dev/v1alpha2) are now accepted as input.logs, spans, traces: Add explorer deep link URL as the first line of output for logs query, spans query, and traces get (#71)
The URL is printed after the table output and links to the corresponding Dash0 explorer view.synthetic-checks, views: Display the human-readable name instead of the CRD name for synthetic checks and views (#80)
The get, create, and update commands for synthetic checks and views now read from
spec.display.name instead of metadata.name, consistent with dashboards.errors: Include API response body in error messages when the backend does not return a structured error (#75)
Previously, errors like 400 Bad Request only showed the HTTP status code and trace ID.
Now, the full response body is displayed so that users can see the reason for the failure.
dashboards: Make the <id> argument of dash0 <asset> update optional (#76)
When the <id> argument is omitted, the ID is extracted from the file content.
This applies to all asset types: dashboards, check rules, synthetic checks, and views.
dashboards: Fix dashboards update overwriting dash0Extensions.id with the origin string (#77)
Unify ID and name extraction between apply and per-asset CRUD commands by
delegating to shared Extract* functions in internal/asset/.
dashboards: Stop force-setting origin in asset update commands (#78)
The synthetic-checks update, views update, and check-rules update commands
were force-setting the origin to "dash0-cli", causing 400 errors when updating
assets originally created with a different origin.
views: Fix view deeplink URLs to use the correct path for each view type (#72)
Previously, all view deeplinks used /goto/logs regardless of view type.
Now each view type maps to its correct deeplink path (e.g., /goto/traces/explorer for span views, /goto/metrics/explorer for metric views).
The views list output also includes a new TYPE column.teams: Add experimental team and member management commands (#47)
New teams commands: list, get, create, update, delete, add-members, remove-members.
New members commands: list, invite, remove.
All commands require the --experimental (-X) flag.assets: Add CSV output format to asset list commands (#62)
The dashboards list, check-rules list, views list, and synthetic-checks list commands now accept -o csv.
CSV output includes all columns from the wide format (name, id, dataset, origin, url).
query: --column flag for logs query, spans query, and traces get to customize displayed columns (#56)
Users can now select which columns appear in table and CSV output using repeatable --column flags.
Predefined columns have short aliases (e.g., time, severity, body for logs).
Any OTLP attribute key can be used as a column, enabling ad-hoc display of arbitrary attributes.
spans: Add spans query command to query spans from Dash0 (#51)
Supports table, CSV, and OTLP JSON output formats with filtering, time range selection, and pagination.
spans: Add spans send command to send spans to Dash0 via OTLP (#51)
Supports span kind, status, duration, trace/span ID (auto-generated or explicit), parent span, span links, resource/span/scope attributes, and custom instrumentation scope.
traces: Add traces get command to retrieve all spans in a trace from Dash0 (#51)
Displays spans in table, JSON (OTLP/JSON), or CSV format.
Table output shows timestamp, duration, trace ID, span ID, parent ID, span name, status, service name, and span links.
Supports --follow-span-links to recursively fetch traces linked through span links.
logs: Color-code severity levels in logs query table output (#46)
Severity levels (FATAL, ERROR, WARN, DEBUG, TRACE) are now color-coded when output is a terminal.
A new global --color flag (env: DASH0_COLOR) controls color output: semantic (default) or none.
output: Add --skip-header flag to suppress the header row in tabular output formats (#50)
Available on all asset list commands (table and wide formats), config profiles list and logs query (table and CSV formats).
logs: Add dash0 logs query command to query log records from Dash0 (#41)
The command syntax — especially the --filter format — is experimental and may change in future releases.github-actions: send-log-event GitHub Action to send log events to Dash0 directly from your GitHub workflows. (#40)
The action is standalone and installs the Dash0 CLI automatically.
If the setup action has already run, the existing installation is reused.assets: Add deeplink URLs to get and list -o wide output for all asset types (#36)
The get command now shows a URL field linking directly to the asset in the Dash0 web UI.
The list -o wide command includes a URL column with deeplink URLs for each asset.logging: The zerolog logging library has been removed in favor of the standard log package. (#30)
This affects the logging output format and may require updates to any log parsing tools or
scripts that were previously used with zerolog's output.
(But let's be real here: there are no known users of the CLI's logging output, so this is
effectively a non-breaking change.)github-actions: Add setup GitHub Action to install the Dash0 CLI in CI/CD workflows (#37)
The dash0hq/dash0-cli/.github/actions/setup action installs and caches the Dash0 CLI binary.
It supports optional profile configuration via inputs (api-url, otlp-url, auth-token, dataset)
and runs on Linux x64 and arm64 runners.apply: dash0 apply -f now accepts directories, recursively discovering and applying all .yaml and .yml files. (#28)
Hidden files and directories (starting with .) are automatically skipped.
All documents across all files are validated before any are applied; if any document fails validation, no changes are made.
The apply output now includes asset IDs alongside names, and when applying from a directory, each line is prefixed with the relative file path.
Dry-run output groups documents by file and shows file and document counts.
check-rules: dash0 check-rules create now accepts PrometheusRule CRD files in addition to plain CheckRule definitions. (#29)
When a PrometheusRule CRD file is provided, each alerting rule in the CRD is created as a separate check rule.
Recording rules are skipped.
config: Allow creating profiles without requiring all fields upfront (#37)
dash0 config profiles create no longer requires --auth-token and at least one of --api-url or --otlp-url.
All profile fields are now optional at creation time; missing values can be supplied later via config profiles update
or overridden at runtime with environment variables or CLI flags.
config: Add dataset to configuration profiles, with DASH0_DATASET environment variable support (#22)
Profiles now support a --dataset flag in config profiles create and config profiles update.
The dataset is shown in config show and config profiles list.
When no dataset is configured, default is displayed.
The DASH0_DATASET environment variable can override the profile's dataset.
logs: Added dash0 logs create command to create log records from the CLI, with support for setting all the attributes and fields of log records. (#3)
This is the first step in a larger effort to add support for logs in the dash0 CLI.
The dash0 logs create command allows users to create log records from the CLI, which can be useful for integration in CI/CD and other automation workflows.
The scope name and version are hard-coded to dash0-cli and the version of the dash0 binary.
check-rules: Fix check rule re-import failing with 400 Bad Request (#34)
Exported check rule YAML (from check-rules get -o yaml) could not be re-imported
via check-rules create or apply because the server-managed dataset field was not
stripped before sending the request to the API.
dashboards: Fix dashboard re-import failing with 400 Bad Request (#33)
Exported dashboard YAML (from dashboards get -o yaml) could not be re-imported
via dashboards create or apply because the server-managed metadata.dash0Extensions.dataset
field was not stripped before sending the request to the API.
config: Fix a bug that would prevent the creation of new profiles in the config file when no profiles existed yet. (#19)
cli: Expanding the scope of the Dash0 CLI to managing assets (#2)
Provides commands for managing Dash0 assets including dashboards, check rules,
synthetic checks, and views. Supports multiple configuration profiles and various
output formats.config: Improved error messages with colored output (#)
Error messages now display "Error:" in red and "Hint:" in cyan for better visibility.
The error message for invalid profile JSON now includes the actual file path instead
of a hardcoded value, making it easier to identify and fix configuration issues.