Skip to content

Latest commit

 

History

History
1222 lines (912 loc) · 35.4 KB

File metadata and controls

1222 lines (912 loc) · 35.4 KB

Command reference

This document is a comprehensive reference for the dash0 CLI, aimed at enabling AI agents and automation workflows to use it effectively.

For every command, this reference lists the exact syntax, all flags, expected outputs, and concrete examples.

Prerequisites

Every command that talks to the Dash0 API or OTLP endpoint needs credentials. The CLI resolves configuration in this order (first match wins):

  1. Environment variables (DASH0_API_URL, DASH0_OTLP_URL, DASH0_AUTH_TOKEN, DASH0_DATASET)
  2. CLI flags (--api-url, --otlp-url, --auth-token, --dataset)
  3. The active profile (stored in ~/.dash0/)

Commands that read from the API (asset CRUD, logs query, spans query, traces get, metrics instant) require api-url and auth-token. Commands that write via OTLP (logs send, spans send) require otlp-url and auth-token.

Global flags

These flags are available on every command:

Flag Short Env variable Description
--api-url DASH0_API_URL API endpoint URL
--otlp-url DASH0_OTLP_URL OTLP HTTP endpoint URL
--auth-token DASH0_AUTH_TOKEN Authentication token
--dataset DASH0_DATASET Dataset identifier (not display name)
--color DASH0_COLOR semantic (default) or none
--experimental -X Enable experimental commands
DASH0_CONFIG_DIR Override config directory (default: ~/.dash0)

Configuration

config profiles create

Create a new named profile. All fields are optional at creation time. The first profile created becomes the active profile automatically.

dash0 config profiles create <name> \
    [--api-url <url>] \
    [--otlp-url <url>] \
    [--auth-token <token>] \
    [--dataset <dataset>]

Example:

$ dash0 config profiles create dev \
    --api-url https://api.us-west-2.aws.dash0.com \
    --otlp-url https://ingress.us-west-2.aws.dash0.com \
    --auth-token auth_xxx
Profile "dev" added and set as active

Aliases: add

config profiles update

Update an existing profile. Only the specified flags are changed; unspecified flags are left as-is. Pass an empty string to remove a field.

dash0 config profiles update <name> \
    [--api-url <url>] \
    [--otlp-url <url>] \
    [--auth-token <token>] \
    [--dataset <dataset>]

Example:

$ dash0 config profiles update prod --api-url https://api.us-east-1.aws.dash0.com
Profile 'prod' updated successfully

config profiles list

List all profiles. The active profile is marked with *.

dash0 config profiles list [--skip-header]
Flag Default Description
--skip-header false Omit the header row from output

Example output:

  NAME  API URL                              OTLP URL                                    DATASET  AUTH TOKEN
* dev   https://api.us-west-2.aws.dash0.com  https://ingress.us-west-2.aws.dash0.com     default  ...ULSzVkM
  prod  https://api.eu-west-1.aws.dash0.com  https://ingress.eu-west-1.aws.dash0.com     default  ...uth_yyy

Use --skip-header to omit the header row:

$ dash0 config profiles list --skip-header

Aliases: ls

config profiles select

Set the active profile.

dash0 config profiles select <name>

Example:

$ dash0 config profiles select prod
Profile 'prod' is now active

Aliases: activate

config profiles delete

Delete a profile.

dash0 config profiles delete <name>

Aliases: remove

config show

Display the resolved configuration (active profile + environment variable overrides).

dash0 config show

Example output:

Profile:    prod
API URL:    https://api.eu-west-1.aws.dash0.com
OTLP URL:   https://ingress.eu-west-1.aws.dash0.com
Dataset:    default
Auth Token: ...uth_yyy

When an environment variable overrides a profile value, the output indicates the source:

$ DASH0_API_URL='http://test' dash0 config show
Profile:    dev
API URL:    http://test    (from DASH0_API_URL environment variable)
OTLP URL:   https://ingress.us-west-2.aws.dash0.com
Dataset:    default
Auth Token: ...ULSzVkM

Asset commands

Dash0 calls dashboards, views, synthetic checks, and check rules "assets" (not "resources", which is an overloaded term in OpenTelemetry).

All four asset types (dashboards, check-rules, synthetic-checks, views) share the same CRUD subcommands. The examples below use dashboards, but the same patterns apply to every asset type.

list

List all assets in the dataset.

dash0 dashboards list [--limit <n>] [-o <format>] [--skip-header]
Flag Short Default Description
--limit -l 50 Maximum number of results
--output -o table table, wide, json, yaml, or csv
--skip-header false Omit the header row from table and wide output

Example:

$ dash0 dashboards list
NAME                                      ID
Production Overview                       a1b2c3d4-5678-90ab-cdef-1234567890ab
Staging Overview                          d4e5f6a7-8901-23de-f012-4567890abcde
...

The wide format adds DATASET, ORIGIN, and URL columns:

$ dash0 dashboards list -o wide
NAME                  ID                                    DATASET   ORIGIN       URL
Production Overview   a1b2c3d4-5678-90ab-cdef-1234567890ab  default   gitops/prod  https://app.dash0.com/goto/dashboards?dashboard_id=a1b2c3d4-...

Use -o json or -o yaml to get the full asset definitions, suitable for backup or re-applying with apply -f -. The YAML output is a multi-document stream (documents separated by ---) so it can be piped directly to dash0 apply -f -. Use -o csv for a pipe-friendly, machine-readable format with the same columns as wide:

$ dash0 dashboards list -o csv
name,id,dataset,origin,url
Production Overview,a1b2c3d4-5678-90ab-cdef-1234567890ab,default,gitops/prod,https://app.dash0.com/goto/dashboards?dashboard_id=a1b2c3d4-...

Aliases: ls

get

Retrieve a single asset by ID.

dash0 dashboards get <id> [-o <format>]

Example (default table output):

$ dash0 dashboards get a1b2c3d4-5678-90ab-cdef-1234567890ab
Kind: Dashboard
Name: Production Overview
Dataset: default
Origin: gitops/prod
URL: https://app.dash0.com/goto/dashboards?dashboard_id=a1b2c3d4-5678-90ab-cdef-1234567890ab
Created: 2026-01-15 10:30:00
Updated: 2026-01-20 14:45:00

Use -o yaml to get the full definition, suitable for editing and re-applying:

$ dash0 dashboards get a1b2c3d4-5678-90ab-cdef-1234567890ab -o yaml
kind: Dashboard
metadata:
  name: a1b2c3d4-5678-90ab-cdef-1234567890ab
  ...
spec:
  display:
    name: Production Overview
  ...

create

Create a new asset from a YAML or JSON file.

dash0 dashboards create -f <file> [--dry-run] [-o <format>]

Use -f - to read from stdin. The --dry-run flag validates the file without creating anything.

Example:

$ dash0 dashboards create -f dashboard.yaml
Dashboard "My Dashboard" created successfully

dashboards create also accepts PersesDashboard CRD files (perses.dev/v1alpha1 and perses.dev/v1alpha2).

$ dash0 dashboards create -f persesdashboard.yaml
Dashboard "My Perses Dashboard" created

check-rules create also accepts PrometheusRule CRD files. Each alerting rule in the CRD is created as a separate check rule (recording rules are skipped):

$ dash0 check-rules create -f prometheus-rules.yaml
Check rule "High Error Rate Alert" created successfully

Aliases: add

update

Update an existing asset from a YAML or JSON file. If the ID argument is omitted, the ID is extracted from the file content. The output shows a unified diff of what changed. The --dry-run flag shows the diff without applying the update.

dash0 dashboards update [id] -f <file> [--dry-run]

Examples:

# Update a dashboard from a file
$ dash0 dashboards update <id> -f dashboard.yaml
--- Dashboard (before)
+++ Dashboard (after)
@@ -2,7 +2,7 @@
 spec:
   display:
-    name: Old Dashboard Name
+    name: New Dashboard Name

# Preview changes without applying
$ dash0 dashboards update -f dashboard.yaml --dry-run
--- Dashboard (before)
+++ Dashboard (after)
@@ -2,7 +2,7 @@
 spec:
   display:
-    name: Old Dashboard Name
+    name: New Dashboard Name

When nothing changed:

$ dash0 dashboards update -f dashboard.yaml
Dashboard "My Dashboard": no changes

delete

Delete an asset by ID. Prompts for confirmation unless --force is passed.

dash0 dashboards delete <id> [--force]

Examples:

$ dash0 dashboards delete a1b2c3d4-5678-90ab-cdef-1234567890ab
Are you sure you want to delete dashboard "a1b2c3d4-..."? [y/N]: y
Dashboard "a1b2c3d4-..." deleted successfully

$ dash0 dashboards delete a1b2c3d4-5678-90ab-cdef-1234567890ab --force
Dashboard "a1b2c3d4-..." deleted successfully

Aliases: remove

Asset type quick reference

Asset type Command Notes
Dashboards dash0 dashboards <subcommand> create also accepts PersesDashboard CRD files
Check rules dash0 check-rules <subcommand> create also accepts PrometheusRule CRD files
Synthetic checks dash0 synthetic-checks <subcommand>
Views dash0 views <subcommand>

apply

Apply asset definitions from a file, directory, or stdin. If an asset already exists (matched by ID), it is updated; otherwise it is created.

dash0 apply -f <file|directory> [--dry-run]
Flag Short Description
--file -f Path to a YAML/JSON file, a directory, or - for stdin
--dry-run Validate without applying

For assets that are updated, a unified diff of the changes is shown. Assets that are created show the standard creation message.

When a directory is specified, all .yaml and .yml files are discovered recursively. Hidden files and directories (starting with .) are skipped. All documents are validated before any are applied. If any document fails validation, no changes are made.

Supported kind values: Dashboard, PersesDashboard, CheckRule, PrometheusRule, SyntheticCheck, View. A single file may contain multiple documents separated by ---.

Note

The -f flag accepts a single path. Do not use shell glob patterns like -f assets/* — the shell expands the glob into multiple arguments and only the first file is passed to -f. Use -f assets/ (the directory) instead.

Examples:

# Apply a single file
$ dash0 apply -f dashboard.yaml
Dashboard "Production Overview" (a1b2c3d4-...) created

# Apply a directory recursively
$ dash0 apply -f assets/
assets/dashboard.yaml: Dashboard "Production Overview" (a1b2c3d4-...) created
assets/rule.yaml: Check rule "High Error Rate" (b2c3d4e5-...) updated
...

# Apply from stdin
$ cat assets.yaml | dash0 apply -f -
Dashboard "Production Overview" (a1b2c3d4-...) created
...

# Dry-run validation
$ dash0 apply -f assets.yaml --dry-run
Dry run: 1 document(s) validated successfully
  1. Dashboard "Production Overview" (a1b2c3d4-5678-90ab-cdef-1234567890ab)

Asset YAML formats

Dashboard:

kind: Dashboard
metadata:
  name: a1b2c3d4-5678-90ab-cdef-1234567890ab
spec:
  display:
    name: Production Overview

PersesDashboard (Perses CRD, converted to a Dashboard on import):

apiVersion: perses.dev/v1alpha1
kind: PersesDashboard
metadata:
  name: my-perses-dashboard
spec:
  display:
    name: My Perses Dashboard
  duration: 5m
  panels: {}

Check rule:

kind: CheckRule
id: b2c3d4e5-6789-01bc-def0-234567890abc
name: High Error Rate
expression: sum(rate(http_requests_total{status=~"5.."}[5m])) > 0.1

View:

kind: View
metadata:
  name: Error Logs
  labels:
    dash0.com/id: c3d4e5f6-7890-12cd-ef01-34567890abcd
spec:
  query: "severity >= ERROR"

Synthetic check:

kind: SyntheticCheck
metadata:
  name: API Health Check
  labels:
    dash0.com/id: d4e5f6a7-8901-23de-f012-4567890abcde
spec:
  url: https://api.example.com/health
  interval: 60s

Multi-document file (separated by ---):

kind: Dashboard
metadata:
  name: e1f2a3b4-5678-90e5-6789-abcdef012345
spec:
  display:
    name: First Dashboard
---
kind: CheckRule
id: f2a3b4c5-6789-01f6-7890-bcdef0123456
name: Second Document Rule
expression: up == 0

Logging

logs send

Send a log record to Dash0 via OTLP. Requires otlp-url and auth-token.

dash0 logs send <body> [flags]

Key flags:

Flag Description
--severity-number <1-24> OpenTelemetry severity number; determines the severity range in Dash0
--severity-text <text> Severity text (e.g., INFO, WARN, ERROR); separate from severity-number
--event-name <name> Event name (e.g., dash0.deployment)
--resource-attribute <key=value> Resource attribute (repeatable)
--log-attribute <key=value> Log record attribute (repeatable)
--scope-attribute <key=value> Instrumentation scope attribute (repeatable)
--scope-name <name> Instrumentation scope name (default: dash0-cli)
--scope-version <version> Instrumentation scope version (default: CLI version)
--time <RFC3339> Log record timestamp (default: now)
--observed-time <RFC3339> Observed timestamp (default: now)
--trace-id <32 hex chars> Trace ID to correlate with
--span-id <16 hex chars> Span ID to correlate with
--flags <uint32> Log record flags
--resource-dropped-attributes-count <n> Number of dropped resource attributes
--log-dropped-attributes-count <n> Number of dropped log record attributes
--scope-dropped-attributes-count <n> Number of dropped scope attributes

Examples:

# Simple log message
$ dash0 logs send "Application started"
Log record sent successfully

# Log with severity and attributes
$ dash0 logs send "Application started" \
    --resource-attribute service.name=my-service \
    --log-attribute user.id=12345 \
    --severity-text INFO --severity-number 9
Log record sent successfully

# Deployment event with event name
$ dash0 logs send "Deployment completed" \
    --event-name dash0.deployment \
    --severity-number 9 \
    --resource-attribute service.name=my-service \
    --resource-attribute deployment.environment.name=production \
    --log-attribute deployment.status=succeeded
Log record sent successfully

# Using environment variables for connection
$ DASH0_OTLP_URL=https://ingress.us-west-2.aws.dash0.com \
  DASH0_AUTH_TOKEN=auth_xxx \
  dash0 logs send "Health check passed" \
    --severity-number 9 --severity-text INFO
Log record sent successfully

logs query (experimental)

Query log records from Dash0. Requires the -X (or --experimental) flag, plus api-url and auth-token.

dash0 -X logs query [flags]
Flag Default Description
--from now-15m Start of time range
--to now End of time range
--limit 50 Maximum number of records
--filter Filter expression (repeatable)
-o table Output format: table, json (OTLP/JSON), or csv
--skip-header false Omit the header row from table and csv output
--column Column to display (repeatable; table and csv only); see custom columns

Both --from and --to accept relative expressions like now-1h or absolute ISO 8601 timestamps. Absolute timestamps are normalized to millisecond precision, so 2024-01-25T10:00:00Z and 2024-01-25 are both accepted.

Examples:

# Query recent logs (last 15 minutes, up to 50 records)
$ dash0 -X logs query
TIMESTAMP                     SEVERITY    BODY
2026-02-16T09:12:03.456Z      INFO        Application started successfully
2026-02-16T09:12:04.789Z      ERROR       Connection timeout
...

# Query with time range
$ dash0 -X logs query --from now-1h --to now --limit 100

# Filter by service
$ dash0 -X logs query --filter "service.name is my-service"

# Filter by severity (errors and above)
$ dash0 -X logs query --filter "otel.log.severity.number gte 17"

# Multiple filters (AND logic)
$ dash0 -X logs query \
    --filter "service.name is my-service" \
    --filter "otel.log.severity.range is_one_of ERROR WARN"

# Output as JSON (full OTLP payload)
$ dash0 -X logs query -o json

# Output as CSV (pipe-friendly)
$ dash0 -X logs query -o csv
otel.log.time,otel.log.severity.range,otel.log.body
2026-02-16T09:12:03.456Z,INFO,Application started successfully
...

# CSV without header
$ dash0 -X logs query -o csv --skip-header

Filter syntax

The --filter flag accepts expressions in the form key [operator] value. When the operator is omitted, is (exact match) is assumed.

Operator Alias Description
is = Exact match (default when operator is omitted)
is_not != Not equal
contains Value contains substring
does_not_contain Value does not contain substring
starts_with Value starts with prefix
does_not_start_with Value does not start with prefix
ends_with Value ends with suffix
does_not_end_with Value does not end with suffix
matches ~ Regular expression match
does_not_match !~ Negated regular expression match
gt > Greater than
gte >= Greater than or equal
lt < Less than
lte <= Less than or equal
is_set Attribute is present
is_not_set Attribute is absent
is_one_of Matches any of the given values (space-separated)
is_not_one_of Matches none of the given values (space-separated)
is_any Matches any value

Keys containing spaces can be single-quoted: 'my key' is value. Values containing spaces can be single-quoted: deployment.environment.name is_one_of 'us east' 'eu west' staging.

Common log attribute keys: service.name, otel.log.severity.number, otel.log.severity.range, otel.log.severity.text, otel.log.body. Valid values for otel.log.severity.range: TRACE, DEBUG, INFO, WARN, ERROR, FATAL, UNKNOWN.

Custom columns

The --column flag lets you choose which columns appear in table and csv output. It is repeatable: pass one --column per column. When used, the flag replaces the default column set entirely.

# Show only timestamp and body
dash0 -X logs query --column time --column body

# Include an arbitrary attribute column
dash0 -X spans query \
    --column timestamp --column duration \
    --column "span name" --column http.request.method

# Include an arbitrary attribute column by key
dash0 -X logs query --column time --column service.name --column body

Each command has predefined columns with short aliases. Aliases are matched case-insensitively. Any OTLP attribute key (resource, scope, or record/span level) can also be used as a column; its header defaults to the attribute key as-is.

Log query aliases:

Alias Attribute key
time, timestamp otel.log.time
severity otel.log.severity.range
body otel.log.body

Span query aliases:

Alias Attribute key
timestamp, start time, time otel.span.start_time
duration otel.span.duration
span name, name otel.span.name
status, status code otel.span.status.code
service name, service service.name
parent id otel.parent.id
trace id otel.trace.id
span id otel.span.id
span links, links otel.span.links

Trace get aliases share the span query aliases.

Aliases that contain spaces must be quoted: --column "start time".

The --column flag is not supported with JSON output. Using --column with -o json returns an error.

Tracing

spans send (experimental)

Send a span to Dash0 via OTLP. Requires the -X (or --experimental) flag, plus otlp-url and auth-token.

dash0 -X spans send --name <name> [flags]
Flag Default Description
--name Span name (required)
--kind INTERNAL Span kind: INTERNAL, SERVER, CLIENT, PRODUCER, CONSUMER
--status-code UNSET Status code: UNSET, OK, ERROR
--status-message Status message (typically for ERROR status)
--start-time now Start timestamp in RFC3339 format
--end-time End timestamp in RFC3339 format; mutually exclusive with --duration
--duration Span duration (e.g., 100ms, 1.5s); mutually exclusive with --end-time
--trace-id auto Trace ID (32 hex characters); auto-generated if omitted
--span-id auto Span ID (16 hex characters); auto-generated if omitted
--parent-span-id Parent span ID (16 hex characters)
--resource-attribute Resource attribute as key=value (repeatable)
--span-attribute Span attribute as key=value (repeatable)
--span-link Span link as trace-id:span-id[,key=value,...] (repeatable)
--scope-name dash0-cli Instrumentation scope name
--scope-version CLI version Instrumentation scope version
--scope-attribute Instrumentation scope attribute as key=value (repeatable)

Examples:

# Send a simple span
$ dash0 -X spans send --name "my-operation"
Span sent successfully (trace-id: 0af7651916cd43dd8448eb211c80319c, span-id: b7ad6b7169203331)

# Send a server span with duration
$ dash0 -X spans send --name "GET /api/users" \
    --kind SERVER --status-code OK --duration 100ms \
    --resource-attribute service.name=my-service
Span sent successfully (trace-id: ..., span-id: ...)

# Send a span with a link to another trace
$ dash0 -X spans send --name "process-message" \
    --kind CONSUMER \
    --span-link 0af7651916cd43dd8448eb211c80319c:b7ad6b7169203331

# Send a child span with explicit parent
$ dash0 -X spans send --name "db-query" \
    --kind CLIENT \
    --trace-id 0af7651916cd43dd8448eb211c80319c \
    --parent-span-id b7ad6b7169203331

spans query (experimental)

Query spans from Dash0. Requires the -X (or --experimental) flag, plus api-url and auth-token.

dash0 -X spans query [flags]
Flag Default Description
--from now-15m Start of time range
--to now End of time range
--limit 50 Maximum number of spans
--filter Filter expression (repeatable)
-o table Output format: table, json (OTLP/JSON), or csv
--skip-header false Omit the header row from table and csv output
--column Column to display (repeatable; table and csv only); see custom columns

Both --from and --to accept relative expressions like now-1h or absolute ISO 8601 timestamps.

Examples:

# Query recent spans (last 15 minutes, up to 50 spans)
$ dash0 -X spans query
TIMESTAMP                     DURATION    SPAN NAME                                 STATUS    SERVICE NAME                    PARENT ID         TRACE ID                          SPAN LINKS
2026-02-16T09:12:03.456Z      150ms       GET /api/users                            OK        my-service                                        0af76519...
2026-02-16T09:12:04.789Z      500ms       POST /api/orders                          ERROR     api-gateway                     b7ad6b7169203331  3d3d3d3d...
...

# Query with time range
$ dash0 -X spans query --from now-1h --to now --limit 100

# Filter by service
$ dash0 -X spans query --filter "service.name is my-service"

# Filter by span status
$ dash0 -X spans query --filter "otel.span.status.code is ERROR"

# Output as CSV
$ dash0 -X spans query -o csv
otel.span.start_time,otel.span.duration,otel.span.name,otel.span.status.code,service.name,otel.parent.id,otel.trace.id,otel.span.links
2026-02-16T09:12:03.456Z,150ms,GET /api/users,OK,my-service,,0af76519...,
...

# Output as OTLP JSON
$ dash0 -X spans query -o json --limit 10

The --filter flag uses the same filter syntax as logs query. Common span attribute keys: service.name, otel.span.status.code, otel.trace.id, otel.span.name.

traces get (experimental)

Retrieve all spans belonging to a trace from Dash0. Requires the -X (or --experimental) flag, plus api-url and auth-token.

dash0 -X traces get <trace-id> [flags]
Flag Default Description
--from now-1h Start of time range
--to now End of time range
-o table Output format: table, json (OTLP/JSON), or csv
--skip-header false Omit the header row from table and csv output
--follow-span-links Follow span links to related traces; optional value sets the lookback period (default: 1h)
--column Column to display (repeatable; table and csv only); see custom columns

The <trace-id> argument must be 32 hex characters.

In table format, spans are displayed as a hierarchical tree with child spans indented under their parents.

Examples:

# Get all spans in a trace
$ dash0 -X traces get <trace-id>
TIMESTAMP                     DURATION    TRACE ID                          SPAN ID           PARENT ID         SPAN NAME                                   STATUS    SERVICE NAME                    SPAN LINKS
2026-02-16T09:12:03.456Z      200ms       0af7651916cd43dd8448eb211c80319c  b7ad6b7169203331                    GET /api/users                              OK        frontend
2026-02-16T09:12:03.486Z      150ms       0af7651916cd43dd8448eb211c80319c  00f067aa0ba902b7  b7ad6b7169203331  SELECT * FROM users                         UNSET     frontend
2026-02-16T09:12:03.641Z      10ms        0af7651916cd43dd8448eb211c80319c  123456789abcdef0  b7ad6b7169203331  serialize response                          UNSET     frontend

# Get a trace with a specific time range
$ dash0 -X traces get <trace-id> --from now-2h

# Follow span links to related traces
$ dash0 -X traces get <trace-id> --follow-span-links

# Follow span links with a custom lookback period
$ dash0 -X traces get <trace-id> --follow-span-links 2h

# Output as OTLP JSON
$ dash0 -X traces get <trace-id> -o json

# Output as CSV
$ dash0 -X traces get <trace-id> -o csv
otel.trace.id,otel.span.start_time,otel.span.duration,otel.span.id,otel.parent.id,otel.span.name,otel.span.status.code,service.name,otel.span.links
0af7651916cd43dd8448eb211c80319c,2026-02-16T09:12:03.456Z,200ms,b7ad6b7169203331,,GET /api/users,OK,frontend,
...

When --follow-span-links is used, linked traces are displayed after the primary trace, separated by a header line showing the linked trace ID. The command follows links recursively up to a maximum of 20 traces.

Metrics

metrics instant

Run an instant PromQL query against the Dash0 API.

dash0 metrics instant --query <promql> [--time <timestamp>] [--dataset <dataset>]
Flag Description
--query PromQL query expression (required)
--time Evaluation timestamp (default: now); supports relative expressions
--dataset Dataset to query

Example:

$ dash0 metrics instant --query 'sum(rate(http_requests_total[5m]))'

Team management

Teams and members are organizational entities (not "assets"). All team and member commands are experimental and require the -X flag. They use api-url and auth-token but do not accept --dataset.

teams list (experimental)

List all teams in the organization.

dash0 -X teams list [-o <format>] [--skip-header] [--column <col>]
Flag Default Description
-o table Output format: table, json, or csv
--skip-header false Omit the header row from table and csv output
--column Column to display (repeatable; table and csv only)

Example:

$ dash0 -X teams list
NAME            ID          MEMBERS  ORIGIN       URL
Backend Team    a1b2c3d4    3        dash0-cli    https://app.dash0.com/goto/settings/teams?team_id=a1b2c3d4
Frontend Team   b2c3d4e5    2                     https://app.dash0.com/goto/settings/teams?team_id=b2c3d4e5

Column aliases: name / team name, id / team id, members / member count, origin, url.

Aliases: ls

teams get (experimental)

Get detailed information about a team, including members and accessible assets.

dash0 -X teams get <id> [-o <format>]

The <id> argument can be a team ID or origin.

Example:

$ dash0 -X teams get <id>
Kind:    Team
Name:    Backend Team
ID:      a1b2c3d4-5678-90ab-cdef-1234567890ab
Origin:  dash0-cli
Color:   #FF6B6B -> #4ECDC4
Members: 2
...

teams create (experimental)

Create a new team.

dash0 -X teams create <name> [--color-from <hex>] [--color-to <hex>] [--member <id>]
Flag Description
--color-from Gradient start color (e.g. "#FF0000")
--color-to Gradient end color (e.g. "#00FF00")
--member Member ID to add to the team (repeatable)

Example:

$ dash0 -X teams create "Backend Team" --color-from "#FF6B6B" --color-to "#4ECDC4"
Team "Backend Team" created (id: a1b2c3d4-...)

Aliases: add

teams update (experimental)

Update the display settings of a team (name, color).

dash0 -X teams update <id> [--name <name>] [--color-from <hex>] [--color-to <hex>]

Example:

$ dash0 -X teams update <id> --name "New Team Name"
Team "<id>" updated

teams delete (experimental)

Delete a team. Prompts for confirmation unless --force is passed.

dash0 -X teams delete <id> [--force]

Example:

$ dash0 -X teams delete <id> --force
Team "<id>" deleted

Aliases: remove

teams list-members (experimental)

List all members of a team.

dash0 -X teams list-members <team-id> [-o <format>] [--skip-header] [--column <col>]
Flag Default Description
-o table Output format: table, json, or csv
--skip-header false Omit the header row from table and csv output
--column Column to display (repeatable; table and csv only)

Example:

$ dash0 -X teams list-members <team-id>
NAME              EMAIL                  ID
Alice Smith       [email protected]      m1-0000-0000-0000-000000000001
Bob Jones         [email protected]        m2-0000-0000-0000-000000000002

Column aliases are the same as for members list: name / member name, email, id / member id.

teams add-members (experimental)

Add one or more existing organization members to a team. Members can be specified by ID or email address. When an email address is provided, it is resolved to a member ID via the members list API.

dash0 -X teams add-members <team-id> <member-id-or-email> [<member-id-or-email>...]

Examples:

# Add members by ID
$ dash0 -X teams add-members <team-id> <member-id-1> <member-id-2>
2 members added to team "<team-id>"

# Add a member by email address
$ dash0 -X teams add-members <team-id> <email-address>
1 member added to team "<team-id>"

# Mix of IDs and email addresses
$ dash0 -X teams add-members <team-id> <member-id> <email-address>
2 members added to team "<team-id>"

teams remove-members (experimental)

Remove one or more members from a team. Members can be specified by ID or email address. Prompts for confirmation unless --force is passed.

dash0 -X teams remove-members <team-id> <member-id-or-email> [<member-id-or-email>...] [--force]

Examples:

# Remove a member by ID
$ dash0 -X teams remove-members <team-id> <member-id> --force
1 member removed from team "<team-id>"

# Remove a member by email address
$ dash0 -X teams remove-members <team-id> <email-address> --force
1 member removed from team "<team-id>"

Member management

members list (experimental)

List all members of the organization.

dash0 -X members list [-o <format>] [--skip-header] [--column <col>]
Flag Default Description
-o table Output format: table, json, or csv
--skip-header false Omit the header row from table and csv output
--column Column to display (repeatable; table and csv only)

Example:

$ dash0 -X members list
NAME              EMAIL                  ID
Alice Smith       [email protected]      m1-0000-0000-0000-000000000001
Bob Jones         [email protected]        m2-0000-0000-0000-000000000002
...

Column aliases: name / member name, email, id / member id.

Aliases: ls

members invite (experimental)

Invite one or more members to the organization by email address.

dash0 -X members invite <email> [<email>...] [--role <role>]
Flag Default Description
--role basic_member Role to assign: basic_member or admin

Example:

$ dash0 -X members invite [email protected]
Invitation sent to [email protected]

$ dash0 -X members invite [email protected] [email protected] --role admin
Invitations sent to 2 email addresses

Aliases: add

members remove (experimental)

Remove one or more members from the organization. Members can be specified by ID or email address. Prompts for confirmation unless --force is passed.

dash0 -X members remove <member-id-or-email> [<member-id-or-email>...] [--force]

Examples:

# Remove a member by ID
$ dash0 -X members remove <member-id> --force
Member "<member-id>" removed

# Remove a member by email address
$ dash0 -X members remove <email-address> --force
Member "<member-id>" removed

Aliases: delete

Common workflows for AI agents

Set up credentials from environment variables

When environment variables are already set, no profile is needed:

export DASH0_API_URL=https://api.us-west-2.aws.dash0.com
export DASH0_OTLP_URL=https://ingress.us-west-2.aws.dash0.com
export DASH0_AUTH_TOKEN=auth_xxx
export DASH0_DATASET=default

# All commands now work without --api-url/--auth-token flags
dash0 dashboards list
dash0 -X logs query --from now-1h

Export an asset, modify it, and re-apply

# Export to YAML
dash0 dashboards get <id> -o yaml > dashboard.yaml

# Edit the file, then update (ID is read from the file)
dash0 dashboards update -f dashboard.yaml

# Or use apply (auto-detects create vs update)
dash0 apply -f dashboard.yaml

Bulk export all assets of one type

The YAML output contains full asset definitions as a multi-document stream, ready to be re-applied:

# Export all dashboards
dash0 dashboards list -o yaml > all-dashboards.yaml

# Re-apply them later
dash0 apply -f all-dashboards.yaml

Send a deployment event

dash0 logs send "Deployment v2.3.0 completed" \
    --event-name dash0.deployment \
    --severity-number 9 \
    --resource-attribute service.name=my-service \
    --resource-attribute deployment.environment.name=production \
    --log-attribute deployment.status=succeeded

Query errors in the last hour

dash0 -X logs query \
    --from now-1h \
    --filter "otel.log.severity.range is_one_of ERROR WARN" \
    --limit 200

Non-interactive deletion (for automation)

Always pass --force to skip the confirmation prompt:

dash0 dashboards delete a1b2c3d4-... --force

Validate assets before applying

Use --dry-run to check for errors without making changes:

dash0 apply -f assets/ --dry-run