All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
teams:teams updatenow accepts-f <file>with a TeamDefinitionV1Alpha1 document, enabling the export → edit → reapply workflow every other asset kind already supports. (#237) The imperative--name,--color-from, and--color-toflags keep working for backward compatibility but are now deprecated in favor of-f. Unliketeams create -f,teams update -fdoes not create a team on 404 — the target must already exist.
-
config: SettingDASH0_AUTH_TOKENtogether withDASH0_API_URLorDASH0_OTLP_URLno longer discards the rest of the active profile, so the profile'sdatasetreaches the API again. (#240) That combination used to bypass the active profile wholesale, so requests went out with nodatasetquery parameter and the API fell back todefault— whiledash0 config showkept reporting the profile's dataset, leaving nothing in the CLI to tell you the two disagreed. Every setting is now resolved on its own, asdocs/commands.mdhas always documented: an environment variable overrides only the setting it names, andotlp-urlanddatasetkeep coming from the profile.--datasetandDASH0_DATASETare unaffected, and env vars alone still work with no profile configured at all. -
views, synthetic-checks:spec.permissionson views and synthetic checks is now sorted lexicographically (by role, then team, then user) before being displayed or diffed. (#231) The Dash0 API does not guarantee a stable order for this field, which previously showed up as spurious changes inviews/synthetic-checksupdate --dry-runandapplydiffs, and as reordered output across repeatedget/list -o yamlcalls. -
metrics:metrics instant's verbose table output now prints Prometheus labels in a stable, sorted order instead of Go's randomized map iteration order. (#231) Part of an audit into non-deterministic key/array ordering in CLI output (see docs/code-style.md's "Deterministic output ordering" section for the pattern and the guardrail added against recurrence). -
notification-channels: Warn when aDash0NotificationChanneldefinition carries a non-emptyspec.routing.assets, and omit the API-managed field from exports (#15826)spec.routing.assetslists the check rules and synthetic checks bound to the channel; the Dash0 API populates it as a back-reference and silently ignores any value supplied on write (existing bindings are unaffected).apply,notification-channels create, andnotification-channels updatenow warn when a definition carries non-empty assets, pointing at the supported binding mechanisms (the check rule'sdash0.com/notification-channel-idsannotation, the synthetic check'sspec.notifications.channels).notification-channels getandlistomit the field from-o yaml/-o jsonoutput, so exported definitions re-apply without warnings.
-
teams:teams create -fandapplyare now idempotent for team YAMLs downloaded from the Dash0 platform UI (#227)ImportTeamnow consultsdash0.com/idinmetadata.labelsas a fallback upsert key whendash0.com/originis not set — the API accepts either as the{originOrId}path segment. UI-downloaded YAMLs carry only id, so before this fix everycreate -fand everyapplyPOSTed a new team.For the cross-environment case (a YAML downloaded from one org, applied to another), a preflight
GET /api/teams/{id}gates the routing: on hit the CLI PUTs (idempotent update), on miss it falls back to POST (fresh create, the id in the file becomes advisory). Previously the miss path surfaced as a "Forbidden: The given team does not belong to your organization" 404.Origin still wins when both labels are present.
-
delete:delete --forcenow treats an already-deleted asset as idempotent success (#217) Everydeletesubcommand (dashboards, check-rules, synthetic-checks, views, recording-rules, notification-channels, spam-filters, teams) and everyremove-shaped variant (members remove,teams remove-members) now exits 0 and prints a short "already deleted" line to stderr when the target is already gone and--forcewas set. Theremovevariants apply the check per member so one concurrently-removed member does not fail the whole--forcecall. Without--force, a missing target still surfaces as a non-zero exit with a clean "not found" error. This makesdelete --forcesafe to invoke from CI/CD and agent-driven pipelines where the target may have been removed concurrently by another actor. -
metrics:metrics instantnow honors--profileandDASH0_PROFILE(#221) Previously the command always resolved its API URL, auth token, and dataset from the on-disk active profile, silently ignoring the per-invocation profile selector. It now goes through the same context-carried configuration that every other API-backed command uses.
skill: Adddash0 skill installanddash0 skill show, which distribute an Agent Skill teaching AI coding agents (Claude Code, Codex, Cursor, GitHub Copilot) this CLI's command surface without spending turns on--helpexploration. (#212)skill installdetects the current agent host (Claude Code, Codex, Cursor, or GitHub Copilot) and installs a SKILL.md plus reference docs into that host's conventional directory in the current project;skill show [topic]prints the same content to stdout for CI or ephemeral sessions. Neither command calls the Dash0 API or requires--experimental. In agent mode, a failing command now carries a follow-up hint pointing atdash0 skill installwhen the skill isn't installed yet, or atdash0 skill show/dash0 --agent-mode --helpwhen it is — so an agent that mis-invokes has a concrete next step. Suppress with--no-skill-hintorDASH0_NO_SKILL_HINT=1; explicit--no-skill-hint=falseorDASH0_NO_SKILL_HINT=0re-enables the hint on demand.
teams:teams get -o jsonandteams get -o yamlnow emit theTeamDefinitionV1Alpha1envelope only, without the enrichedmembers/dashboards/checkRules/syntheticChecks/views/datasetsarrays (#200) Prior versions emitted the enrichedGetTeamResponsewrapper ({team, members, dashboards, ...}). The new output is the CRD envelope directly ({apiVersion, kind, metadata, spec}), sodash0 apply -fcan round-trip the exported document without post-processing.spec.membersrenders as email addresses rather than internal user ids. Scripts that read.team.metadata.labels["dash0.com/id"]or.team.spec.display.nameneed to drop the.team.prefix — e.g..metadata.labels["dash0.com/id"],.spec.display.name. Scripts that consumed the enriched arrays (.dashboards[],.members[].spec.display.email, etc.) should usedash0 teams get <id>(the default table output) for a human-readable view, ordash0 teams list-members <id>for programmatic access to the member list. Thedash0 teams *command tree is gated behind--experimentaland does not carry a stability guarantee, but this shape change is nevertheless disruptive enough to warrant an explicit callout.
teams: Manage teams declaratively viateams create -fandapply -fonDash0TeamYAML (#200)dash0 --experimental teams create -f <file>accepts aTeamDefinitionV1Alpha1document. When the document carries ametadata.labels["dash0.com/origin"]label, the CLI upserts by origin (PUT, idempotent); otherwise it creates a new team (POST) and the server assigns id and origin.dash0 applyrecognizeskind: Dash0Teamand routes it through the same upsert path, so team definitions round-trip through the standard export-edit-reapply GitOps workflow alongside other assets.spec.membersaccepts either email addresses or internal member ids; the server resolves emails during reconciliation and rejects unresolvable ones with a single 400 listing every offender. The CLI renders team membership as emails onteams get,teams list-members, and theapplydiff so review artifacts stay legible. The existing imperative commands (teams create <name>,teams add-members,teams remove-members,teams update) are preserved and now accept emails or ids for member arguments.
check-rules: Name check rules imported from a PrometheusRule CRD as<group name> - <alert name>, matching the Dash0 Kubernetes operator and Terraform provider (#182) Previously the CLI named such check rules after the alert only, so the same CRD produced a different name than the operator and Terraform provider. This affectscheck-rules create,check-rules update, andapply. Check rule identity for upsert is thedash0.com/id/id, not the name, so for definitions that pin an identifier this is a non-destructive in-place rename surfaced as a one-line diff on the nextapply.
build: Add Nix flake packaging so the CLI can be installed and run on Nix and NixOS (#174) The flake builds the CLI withbuildGoModule, installs Bash, Zsh, and Fish completions, and exposesnix run,nix profile install, anoverlays.defaultfor NixOS and Home Manager, and anix developshell. Non-flakedefault.nixandshell.nixshims are provided for systems without flakes enabled. AhomeManagerModules.defaultdeclares profiles under~/.dash0: static tokens are read fromauthTokenFileat activation time and OAuth profiles are seeded fordash0 login, with runtime-acquired tokens preserved across rebuilds. A pre-built binary is published to a Nix User Repository for a compile-free install on small or non-x86_64 machines.
homebrew: Resume publishing the Homebrew cask to the dedicated tap on every release (#175) Tagged releases failed to updateCasks/dash0.rbindash0hq/homebrew-dash0-clibecause the release pipeline could not write to the tap repository, leaving cask users pinned to a stale version. The cask is now published again on each release, sobrew upgrade --cask dash0tracks the latest version.
homebrew: Fixbrew install --cask dash0hq/dash0-cli/dash0failing on Linux (#172) The generated Homebrew cask ran an unconditionalpostflighthook invoking the macOS-only/usr/bin/xattrto strip the Gatekeeper quarantine attribute. On Linux that tool does not exist, so the install aborted at the postflight step even though the cask shipped correct Linux binaries. The hook is now guarded withif OS.mac?.
failed-checks: Adddash0 failed-checks querycommand to query active and historical alerting issues (#92) Supports filtering by--status critical,degraded,--active(unresolved only), and generic--filterexpressions using the same syntax aslogs queryandspans query. Output formats: table (with semantic coloring for status), json, csv. Customize the displayed columns with--column; any issue label (such aspriorityorowner) can be used directly as a column name. Thelistandlsaliases are available for backwards compatibility.
spam-filters: Accept group-prefixed apiVersion values (e.g.operator.dash0.com/v1alpha1,dash0.com/v1alpha1) in spam filter YAML input (#169) The CLI rejected spam filter documents exported from the Dash0 Kubernetes operator because they carry a group-prefixed apiVersion. The CLI now normalizes these to the bare version before dispatching, so operator-exported and canonical-form YAML files work with create, update, and apply.
-
auth: Adddash0 loginanddash0 logoutfor browser-based OAuth 2.0 + PKCE authentication (#27) Profiles now have an explicit auth mode: static (long-livedauth_*token) or OAuth (browser flow). Mark a new profile as OAuth at creation time withdash0 config profiles create <name> --oauth --api-url <url>, then rundash0 loginto obtain access and refresh tokens. Access tokens are refreshed transparently before they expire;dash0 logoutrevokes them best-effort and clears the tokens from the profile while keeping the profile shell for re-login. Switch a profile between static and OAuth at any time withdash0 config profiles update <name> --oauth[=true|=false](the transition is destructive and prompts for confirmation unless--forceis passed).dash0 config profiles listgains anAUTHcolumn showing the auth mode and remaining token lifetime, anddash0 config showannotates theAuth Token:line with OAuth state.dash0 loginrequires an interactive terminal — agent mode and non-TTY environments still use static tokens viaDASH0_AUTH_TOKENordash0 config profiles create --auth-token.dash0 logoutrequires--forcewhen invoked in agent mode (or when auto-detected via env vars likeCLAUDE_CODE), so an AI agent cannot silently revoke a profile's refresh token. Telemetry send commands (dash0 logs send,dash0 spans send) refuse upfront when the active profile is OAuth-typed, because the Dash0 OTLP ingress does not (yet) accept OAuth access tokens — only staticauth_*tokens. The error names the workarounds: pass--auth-token auth_<...>for the invocation, setDASH0_AUTH_TOKEN, or convert the profile withdash0 config profiles update <name> --oauth=false. Olderdash0CLI binaries from before OAuth support shipped (e.g. v1.12.0) do not understand OAuth-typed profiles.dash0 config showanddash0 config profiles listsilently render the access token as if it were a static one (no(OAuth, ...)annotation), and any command that calls the API fails withauth token must start with 'auth_'when the api-client library rejects thedash0_at_*prefix. If you have multipledash0binaries installed (for example a homebrew-installeddash0alongside a development build) make sure every binary reading the profile is from this release or later. Static-token profiles are unaffected. -
otlp: Adddash0 otlp proxy, a long-running local OTLP forwarder that accepts OTLP/HTTP and OTLP/gRPC traffic and forwards every batch to Dash0 using the active profile's credentials. (#159) The proxy binds 127.0.0.1:4318 (OTLP/HTTP) and 127.0.0.1:4317 (OTLP/gRPC) by default — an OpenTelemetry SDK at default endpoint configuration connects with no environment variable change. It is gated behind-X(experimental) and is not intended as a replacement for the OpenTelemetry Collector. Seedocs/commands.mdfor the full reference including the agent-mode event schema and failure-mode classification.
-
logs, spans, traces: Add--precision <adaptive|disabled>tologs queryandspans queryto select the API sampling mode for the request.traces getalways disables adaptive sampling so the complete trace is returned. (#167) Without the flag the API defaults to adaptive sampling, which samples telemetry data during query execution to keep queries fast on large datasets while returning statistically representative results. Pass--precision disabledfor the API equivalent of the Precision toggle in the Dash0 UI: every matching record is returned, at the cost of higher query latency on wide time ranges. Use this for narrow lookups (e.g.test.id is <uuid>,trace.id is <hex>) that must be deterministic.traces getalways disables adaptive sampling — retrieving a trace must return every span in the trace regardless of query window, so the flag is not exposed on that command. -
homebrew: Homebrew distribution is moving to a dedicated tap atdash0hq/homebrew-dash0-cliand switching from a formula to a cask. (#82, #162) Starting with the next release, new users install with:brew install --cask dash0hq/dash0-cli/dash0— nobrew tap, nobrew trust. Existing tap users will see a deprecation warning onbrew upgrade dash0pointing at the new install path. The formula-to-cask switch follows Homebrew's convention for pre-built binary CLIs and aligns with goreleaser's deprecation of itsbrews:configuration. Seedocs/brew-tap-migration-2026-06.mdfor the full migration guide.
notification-channels: surface the Dash0 web app deep link innotification-channels listandnotification-channels get(#147) Thelisttable and CSV output now include aURLcolumn with a direct link to the channel in the Dash0 web app. Thegettable output prints the same URL as a newURL:field.
config: RenameDASH0_RETRY_COUNTtoDASH0_MAX_RETRIESand add--max-retriesglobal flag (#141) The environment variableDASH0_RETRY_COUNThas been renamed toDASH0_MAX_RETRIESfor consistency with the Terraform provider. A new--max-retriesglobal flag is now available on all commands as an alternative to the environment variable. Resolution order:--max-retriesflag, thenDASH0_MAX_RETRIESenv var, then default (3).
send-log-event action: Fixsend-log-eventaction ignoring connection inputs when a profile already exists (#143) When a profile already existed (e.g., from the setup action), the action skipped profile creation and ignored anyotlp-url,auth-token, ordatasetinputs. The action now updates the existing profile with the provided values.
-
apply: AcceptDash0NotificationChanneland recording-rulePrometheusRuledocuments indash0 apply(#137)dash0 applynow acceptsDash0NotificationChanneldocuments and dispatches them to the organization-level notification-channels endpoint without a dataset query parameter. PrometheusRule CRDs containing recording rules (entries withrecord:) are now dispatched to the recording-rule endpoint as a single PrometheusRule CRD; mixed CRDs that contain both alerting and recording rules are dispatched to both endpoints in one apply. Previously, recording rules in a PrometheusRule CRD were silently dropped during apply. A CRD with no rules of either kind now fails validation up front with a clear error. The unified diff that apply prints for notification channels and recording rules now strips server-managed fields (dash0.com/created-at,dash0.com/updated-at, and similar) so the second apply on unchanged input renders as "no changes". -
spam-filters: Accept v1alpha2 schema in spam-filters create/update/get and in apply (#136) The CLI now detects theapiVersionon spam filter documents (v1alpha1orv1alpha2) and routes to the matching API endpoint.v1alpha2usesspec.context(a single signal type) instead ofspec.contexts(an array). A missingapiVersiondefaults tov1alpha1. An unknown value is rejected with a clear error listing the supported versions.dash0 applyacceptsDash0SpamFilterdocuments in either schema and rejects unknownapiVersionvalues during validation, before any document is applied.
client: include the parsed server message, HTTP status, and trace ID in every API error printed by the CLI (#139) Errors now show the human-readable message extracted from the Dash0 API response (instead of dumping the raw JSON body). 404 responses now also surface the HTTP status and trace ID so support can correlate to server-side logs.
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 withoperatorandvaluefields instead of the nestedstringValueformat.
spam-filters: Add spam-filters command with list, get, create, update, and delete subcommands (#132) Manage dataset-scoped spam filters viadash0 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--datasetflag and profile dataset were silently ignored forrecording-rules createandrecording-rules update. Updateddash0-api-client-goto 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--profileglobal flag andDASH0_PROFILEenvironment 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--profileflag →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 showannotates theProfile:line with the source when a selector is in effect.
api: Add experimentalapicommand for raw HTTP calls to the Dash0 API. (#122) Thedash0 -X apicommand 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: Reworkmetrics instantwith new flags and output formats (#45) Add--promqlflag (replacing the deprecated--query),--filterfor PromQL label matcher generation,--from(replacing the deprecated--time),-o csvoutput format,--skip-header, and--columnfor columnar table and CSV output. Thetimestampandvaluecolumns are always included automatically. Deprecated flags (--query,--time) remain functional for backwards compatibility. -
logs, spans, traces: Promotelogs query,spans query,spans send, andtraces getcommands 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 updatenow accepts PrometheusRule CRD files (#110) Previously,check-rules update -ffailed 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. Bothapplyandcheck-rules createalready handled this correctly. -
dashboards:dashboards updatenow accepts PersesDashboard CRD files (#111) Previously,dashboards update -fdid not detect PersesDashboard CRD files, so the CRD-specific conversion (v1alpha1/v1alpha2 normalization, ID extraction from labels, annotation mapping) was skipped. Bothapplyanddashboards createalready 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 bothapplyanddashboards create.
query:--filternow 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, anddash0.com/sharingannotations were silently dropped duringapply,<asset> createand<asset> update.spec.permissionson views and synthetic checks was also stripped.
apply: Migrate asset create/update from Import APIs to standard CRUD APIs (#90) Theapplycommand and individual assetcreate/updatesubcommands 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,applynow always upserts, making repeated applies idempotent and preventing duplicate assets from being created. (#94)
-
output: Theupdateandapplycommands now show a unified diff of changes (#66) -
dashboards:<asset> list -o yamland-o jsonnow output full asset definitions instead of summary list items (#67) YAML output is a multi-document stream (separated by---) that can be piped directly todash0 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 inapplyanddashboards 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 ofdash0 <asset> updateoptional (#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: Fixdashboards updateoverwritingdash0Extensions.idwith the origin string (#77) Unify ID and name extraction betweenapplyand per-asset CRUD commands by delegating to sharedExtract*functions ininternal/asset/. -
dashboards: Stop force-setting origin in asset update commands (#78) Thesynthetic-checks update,views update, andcheck-rules updatecommands 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/logsregardless of view type. Now each view type maps to its correct deeplink path (e.g.,/goto/traces/explorerfor span views,/goto/metrics/explorerfor metric views). Theviews listoutput also includes a new TYPE column.
teams: Add experimental team and member management commands (#47) Newteamscommands: list, get, create, update, delete, add-members, remove-members. Newmemberscommands: list, invite, remove. All commands require the--experimental(-X) flag.
-
assets: Add CSV output format to asset list commands (#62) Thedashboards list,check-rules list,views list, andsynthetic-checks listcommands now accept-o csv. CSV output includes all columns from thewideformat (name, id, dataset, origin, url). -
query:--columnflag forlogs query,spans query, andtraces getto customize displayed columns (#56) Users can now select which columns appear in table and CSV output using repeatable--columnflags. Predefined columns have short aliases (e.g.,time,severity,bodyfor logs). Any OTLP attribute key can be used as a column, enabling ad-hoc display of arbitrary attributes.
-
spans: Addspans querycommand to query spans from Dash0 (#51) Supports table, CSV, and OTLP JSON output formats with filtering, time range selection, and pagination. -
spans: Addspans sendcommand 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: Addtraces getcommand 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-linksto recursively fetch traces linked through span links.
-
logs: Color-code severity levels inlogs querytable output (#46) Severity levels (FATAL, ERROR, WARN, DEBUG, TRACE) are now color-coded when output is a terminal. A new global--colorflag (env:DASH0_COLOR) controls color output:semantic(default) ornone. -
output: Add--skip-headerflag to suppress the header row in tabular output formats (#50) Available on all assetlistcommands (table and wide formats),config profiles listandlogs query(table and CSV formats).
logs: Adddash0 logs querycommand to query log records from Dash0 (#41) The command syntax — especially the--filterformat — is experimental and may change in future releases.
github-actions:send-log-eventGitHub Action to send log events to Dash0 directly from your GitHub workflows. (#40) The action is standalone and installs the Dash0 CLI automatically. If thesetupaction has already run, the existing installation is reused.
assets: Add deeplink URLs togetandlist -o wideoutput for all asset types (#36) Thegetcommand now shows aURLfield linking directly to the asset in the Dash0 web UI. Thelist -o widecommand includes aURLcolumn with deeplink URLs for each asset.
logging: Thezerologlogging library has been removed in favor of the standardlogpackage. (#30) This affects the logging output format and may require updates to any log parsing tools or scripts that were previously used withzerolog'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: AddsetupGitHub Action to install the Dash0 CLI in CI/CD workflows (#37) Thedash0hq/dash0-cli/.github/actions/setupaction 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 -fnow accepts directories, recursively discovering and applying all.yamland.ymlfiles. (#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 createnow 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 createno longer requires--auth-tokenand at least one of--api-urlor--otlp-url. All profile fields are now optional at creation time; missing values can be supplied later viaconfig profiles updateor overridden at runtime with environment variables or CLI flags. -
config: Add dataset to configuration profiles, withDASH0_DATASETenvironment variable support (#22) Profiles now support a--datasetflag inconfig profiles createandconfig profiles update. The dataset is shown inconfig showandconfig profiles list. When no dataset is configured,defaultis displayed. TheDASH0_DATASETenvironment variable can override the profile's dataset. -
logs: Addeddash0 logs createcommand 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 thedash0CLI. Thedash0 logs createcommand allows users to create log records from the CLI, which can be useful for integration in CI/CD and other automation workflows. Thescopename and version are hard-coded todash0-cliand the version of thedash0binary.
-
check-rules: Fix check rule re-import failing with 400 Bad Request (#34) Exported check rule YAML (fromcheck-rules get -o yaml) could not be re-imported viacheck-rules createorapplybecause the server-manageddatasetfield was not stripped before sending the request to the API. -
dashboards: Fix dashboard re-import failing with 400 Bad Request (#33) Exported dashboard YAML (fromdashboards get -o yaml) could not be re-imported viadashboards createorapplybecause the server-managedmetadata.dash0Extensions.datasetfield 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)- The bug was caused by a check that would prevent any command with "config" as an ancestor from running, which would include "config profiles create" when no profiles existed yet.
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.