DEV Community

Cover image for otel-cli - push otel traces with ease
Ashok Nagaraj
Ashok Nagaraj

Posted on

6

otel-cli - push otel traces with ease

The problem

otel-cli is a command-line interface tool that simplifies OpenTelemetry instrumentation and enables developers to quickly get started with distributed tracing. It supports a wide range of programming languages and frameworks, and provides a variety of exporters, including Jaeger, Zipkin, and Prometheus, among others.

One of the main advantages of using otel-cli is its simplicity. It provides a simple and intuitive interface that makes it easy for developers to get started with tracing, and provides real-time feedback on the traces generated by your application, making it easy to identify and diagnose issues in real-time.

Another advantage of otel-cli is its flexibility. It supports multiple exporters, giving developers the flexibility to send traces to a wide range of monitoring and observability tools. Additionally, it is an open-source tool, which means that it is available for free and can be used and modified by anyone.

Installation

On mac

brew tap equinix-labs/otel-cli
brew install otel-cli
Enter fullscreen mode Exit fullscreen mode

On other systems
Get it from the releases link

Configuration
❯ docker run --name=otel-col -p 4318:4318 -p 4317:4317  -d otel/opentelemetry-collector
638e85e867aa4b69b356b5053991ce097d946a0aa9ecfa7568c867113209a307

otel-demo/python-http on  main [!⇡] via 🐍 v3.9.7 on ☁️
❯ docker ps
CONTAINER ID   IMAGE                          COMMAND                  CREATED         STATUS        PORTS                                                                 NAMES
638e85e867aa   otel/opentelemetry-collector   "/otelcol --config /…"   2 seconds ago   Up 1 second   0.0.0.0:4317-4318->4317-4318/tcp, 55678-55679/tcp                     otel-col
Enter fullscreen mode Exit fullscreen mode
Workflow

Simple operation

# pushing in grpc mode
❯ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 otel-cli exec --name=test-001 "sleep 1" --verbose --protocol grpc
❯ docker logs otel-col 2>&1 | grep -C5 test-001
InstrumentationScope otel-cli/exec
Span #0
    Trace ID       : 874ff9770b8f13f3276e1837b377e861
    Parent ID      :
    ID             : 36e4f9b9a33b4278
    Name           : test-001
    Kind           : Client
    Start time     : 2023-05-08 13:28:39.799345 +0000 UTC
    End time       : 2023-05-08 13:28:40.816506833 +0000 UTC
    Status code    : Ok
    Status message :

# pushing in http mode (default)
❯ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 otel-cli exec --name=test-002 "sleep 1" --verbose
❯ docker logs otel-col 2>&1 | grep -C5 test-002
InstrumentationScope otel-cli/exec
Span #0
    Trace ID       : 5eff81fbe83ab6bd2027d00a289093f8
    Parent ID      :
    ID             : 85ae91f4d46f73c3
    Name           : test-002
    Kind           : Client
    Start time     : 2023-05-08 13:30:00.372481 +0000 UTC
    End time       : 2023-05-08 13:30:01.382757833 +0000 UTC
    Status code    : Ok
    Status message :
Enter fullscreen mode Exit fullscreen mode

Note the below failure modes

# pushing to grpc endpoint in http mode
❯ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 otel-cli exec --name=test-001 "sleep 1" --verbose
2023/05/08 18:58:01 OpenTelemetry error: traces export: Post "http://localhost:4317/v1/traces": net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\x05\x00\x00@\x00"

# pushing to http endpoint in grpc mode
❯ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 otel-cli exec --name=test-001 "sleep 1" --verbose --protocol grpc
2023/05/08 18:59:46 OpenTelemetry error: traces export: context deadline exceeded: rpc error: code = Unavailable desc = connection error: desc = "error reading server preface: http2: frame too large"
Enter fullscreen mode Exit fullscreen mode

Child spans

❯ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 otel-cli exec --name=test-demo-parent --kind producer "OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 otel-cli exec --name=test-demo-child --kind consumer sleep 1" --verbose
❯ docker logs otel-col 2>&1 | egrep -C5 "test-demo"
InstrumentationScope otel-cli/exec
Span #0
    Trace ID       : e383c3e41d049f3b11a85dad316643b7
    Parent ID      : c359f233b3ad20ee
    ID             : 9a70f7873e23b236
    Name           : test-demo-child
    Kind           : Consumer
    Start time     : 2023-05-08 13:40:42.674921 +0000 UTC
    End time       : 2023-05-08 13:40:43.684543334 +0000 UTC
    Status code    : Ok
    Status message :
--
InstrumentationScope otel-cli/exec
Span #0
    Trace ID       : e383c3e41d049f3b11a85dad316643b7
    Parent ID      :
    ID             : c359f233b3ad20ee
    Name           : test-demo-parent
    Kind           : Producer
    Start time     : 2023-05-08 13:40:42.659909 +0000 UTC
    End time       : 2023-05-08 13:40:43.721519167 +0000 UTC
    Status code    : Ok
    Status message :
Attributes:
     -> command: Str(OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 otel-cli exec --name=test-demo-child --kind consumer sleep 1)
Enter fullscreen mode Exit fullscreen mode

With attributes

❯ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 otel-cli exec --name=test-attr -a foo=bar -a pi=3.14 "sleep 1" --verbose
❯ docker logs otel-col 2>&1 | egrep -C10 "test-attr"
Resource SchemaURL:
Resource attributes:
     -> service.name: Str(otel-cli)
ScopeSpans #0
ScopeSpans SchemaURL:
InstrumentationScope otel-cli/exec
Span #0
    Trace ID       : dca4cf94916d31c29c160a23a8418024
    Parent ID      :
    ID             : 5a4fe44b46241c90
    Name           : test-attr
    Kind           : Client
    Start time     : 2023-05-08 13:43:08.812387 +0000 UTC
    End time       : 2023-05-08 13:43:09.82861175 +0000 UTC
    Status code    : Ok
    Status message :
Attributes:
     -> foo: Str(bar)
     -> pi: Double(3.14)
     -> command: Str(sleep 1)
    {"kind": "exporter", "data_type": "traces", "name": "logging"}
Enter fullscreen mode Exit fullscreen mode

With status update (exit status is considered)

❯ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 otel-cli exec --name=test-status  --fail "ls /nothing" --verbose
ls: /nothing: No such file or directory
❯ docker logs otel-col 2>&1 | egrep -C12 "test-status"
2023-05-08T13:44:49.513Z    info    TracesExporter  {"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 1, "spans": 1}
2023-05-08T13:44:49.513Z    info    ResourceSpans #0
Resource SchemaURL:
Resource attributes:
     -> service.name: Str(otel-cli)
ScopeSpans #0
ScopeSpans SchemaURL:
InstrumentationScope otel-cli/exec
Span #0
    Trace ID       : 183374319aa00c0672b0b9921a1cf862
    Parent ID      :
    ID             : 6e47444744c67a35
    Name           : test-status
    Kind           : Client
    Start time     : 2023-05-08 13:44:49.346037 +0000 UTC
    End time       : 2023-05-08 13:44:49.3641295 +0000 UTC
    Status code    : Error
    Status message : command failed: exit status 1
Attributes:
     -> command: Str(ls /nothing)
Events:
SpanEvent #0
     -> Name: command failed
     -> Timestamp: 2023-05-08 13:44:49.364126 +0000 UTC
     -> DroppedAttributesCount: 0
Enter fullscreen mode Exit fullscreen mode

Trace propagation with a file based trace-parent carrier

❯ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
❯ carrier=$(mktemp)
❯ otel-cli span -s test-span -k server -n "traceparent-demo" --tp-print --tp-carrier $carrier
# trace id: f0563604541c82962e9b2434f4522e86
#  span id: 17bfae9cd27127dd
TRACEPARENT=00-f0563604541c82962e9b2434f4522e86-17bfae9cd27127dd-01
❯ otel-cli exec --service test-span -n "traceparent-demo-client" --kind client --tp-carrier $carrier "sleep 1"

❯ docker logs otel-col 2>&1 | egrep -C5 "traceparent-demo"
InstrumentationScope otel-cli/span
Span #0
    Trace ID       : f0563604541c82962e9b2434f4522e86
    Parent ID      :
    ID             : 17bfae9cd27127dd
    Name           : traceparent-demo
    Kind           : Server
    Start time     : 2023-05-08 13:48:31.241478 +0000 UTC
    End time       : 2023-05-08 13:48:31.241782 +0000 UTC
    Status code    : Unset
    Status message :
--
InstrumentationScope otel-cli/exec
Span #0
    Trace ID       : f0563604541c82962e9b2434f4522e86
    Parent ID      : 17bfae9cd27127dd
    ID             : 47674b2d5cc516ea
    Name           : traceparent-demo-client
    Kind           : Client
    Start time     : 2023-05-08 13:50:28.751103 +0000 UTC
    End time       : 2023-05-08 13:50:29.776050709 +0000 UTC
    Status code    : Ok
    Status message :
Enter fullscreen mode Exit fullscreen mode

Spans in the background

❯ sockdir=$(mktemp -d)
❯ otel-cli span background -s "span-example" -n test-bg-span --sockdir $sockdir --timeout 60s &
[1] 49185
✦ ❯ otel-cli span event --name "cool thing" --attrs "foo=bar" --sockdir $sockdir
✦ ❯ otel-cli span event --name "another cool thing" --attrs "foo=bar,pi=3.14" --sockdir $sockdir
✦ ❯ otel-cli span event --name "final cool thing" --attrs "foo=bar,pi=3.14" --sockdir $sockdir
✦ ❯ otel-cli span end --sockdir $sockdir
[1]  + 49185 done       otel-cli span background -s "span-example" -n test-bg-span --sockdir $sockdir

❯ docker logs otel-col 2>&1 | egrep -C5 "span-example|cool thing"
Resource SchemaURL:
Resource attributes:
     -> service.name: Str(span-example)
ScopeSpans #0
ScopeSpans SchemaURL:
InstrumentationScope otel-cli/span
Span #0
    Trace ID       : 944487fedd6ea482908fbb26f83f0329
--
    End time       : 2023-05-08 14:18:31.290052 +0000 UTC
    Status code    : Unset
    Status message :
Events:
SpanEvent #0
     -> Name: cool thing
     -> Timestamp: 2023-05-08 14:17:53.720251 +0000 UTC
     -> DroppedAttributesCount: 0
     -> Attributes::
          -> foo: Str(bar)
SpanEvent #1
     -> Name: another cool thing
     -> Timestamp: 2023-05-08 14:18:06.132737 +0000 UTC
     -> DroppedAttributesCount: 0
     -> Attributes::
          -> foo: Str(bar)
          -> pi: Double(3.14)
SpanEvent #2
     -> Name: final cool thing
     -> Timestamp: 2023-05-08 14:18:15.368533 +0000 UTC
     -> DroppedAttributesCount: 0
     -> Attributes::
          -> foo: Str(bar)
          -> pi: Double(3.14)

Enter fullscreen mode Exit fullscreen mode

Official git repo

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read full post →

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more