← Back to list

Trace Tickle: Observability’s Funny Footprints

Overview

Valar A · 2025-06-16 06:52 · 0 claps · 5.7 min read
#observability #tracing #monitoring #datadog #distributed-tracing
Open on Medium ↗
Wiki topics: SOC · Sociology & Politics 😂 · Humor & Satire

Trace Tickle: Observability’s Funny Footprints

Overview

Observability lets you understand a system from the outside by letting you ask questions about that system without knowing its inner workings. Furthermore, it allows you to troubleshoot and handle novel problems easily, that is, “unknown unknowns”. It also helps you answer the question “Why is this happening?

Your application must be properly instrumented to ask those questions about your system. That is, the application code must emit signals such as traces, metrics, and logs

Difference between distributed tracing and logging

Logging tools collect timestamped events, such as system errors, user interactions, HTTP response statuses, and other metrics, to help development teams detect system anomalies. Logging provides a static overview of incidents that show developers what happened in the application.

Logs from Spring boot app

Logs from Spring boot app

In contrast, distributed tracing provides an audit trail that clarifies why an incident occurred by correlating various telemetry data collected throughout a service request’s period.

Traces record the end-to-end ‘journey’ of every user request, from the API Gateway through the entire distributed architecture.

Distributed tracing may use logging and other data collection methods for tracing a specific service request.

Sample Trace Flame Graph

Sample Trace Flame Graph

Benefits of Tracing

With distributed tracing, developers can trace or visually follow a request path across different Microservices (Services). This visibility helps

  • Troubleshoot errors
  • Find latency and performance issues

Accelerate software troubleshooting

With distributed tracing, developers can monitor data that passes through complex paths connecting various microservices and data storage. Using distributed tracing tools, developers can track requests and visualize data propagation paths with precision.

Performance issue monitoring

Developers can solve performance issues promptly and minimize service disruptions. One example is finding Slow Code, Query or API call, etc, and fixing it. Then monitor the fixes.

Reduce time to market

Developers review distributed traces to gain insight that speeds up software development, minimizes development costs, understands user behaviors, and improves market readiness.

Challenges

Distributed tracing has simplified the efforts of developers in diagnosing, debugging, and fixing software issues. The following challenges remain for software teams when choosing tracing tools

Performance impact

Instrumentation is not free. It intercepts an application’s operations and collects (often) a large amount of data, which takes additional CPU and memory. This can have a direct effect on throughput and response time, which can affect the end-user experience with the application.

Manual instrumentation

Some tracing tools require developers to manually instrument their codes to generate the necessary traces. When developers modify codes to trace requests, there are risks of coding errors that affect production releases.

Sampling

If we sample 100% data, all the trace data will be collected, and storage costs will increase. If we sample 10% trace, then only the 10% trace data will be available. With limited sample data, we need additional software troubleshooting approaches to capture major issues that escape the tracing tool. We need to choose a sampling(filter) policy to sample the required traces.

Sampling policy

Sampling policy

Data Retention Policy

We need to choose the Trace data retention policy. Because older trace data will become outdated due to frequent code changes. So we need to define an appropriate Trace data retention policy.

Tracing Framework

OpenTelemetry Framework

OpenTelemetry is an open-source project managed by the Cloud Native Computing Foundation (CNCF), which provides a unified set of APIs to collect telemetry data from software systems.

It is an Observability framework and toolkit designed to create and manage telemetry data such as traces, metrics, and logs.

OpenTelemetry is not an observability backend like Jaeger, Prometheus, or other commercial vendors.

OpenTelemetry is focused on the generation, collection, management, and export of telemetry. A major goal of OpenTelemetry is that you can easily instrument your applications or systems, no matter their language, infrastructure, or runtime environment.

Note: The storage and visualization of telemetry is not part of Open Telemetry.

Tracer

A Tracer creates spans containing more information about what is happening for a given operation, such as a request in a service.

Trace Exporters

Send telemetry to the OpenTelemetry Collector to make sure it’s exported correctly. Using the Collector in production environments is a best practice. To visualize your telemetry, export it to a backend such as Jaeger, Zipkin, Prometheus, or a vendor-specific backend

Among exporters, OpenTelemetry Protocol (OTLP) exporters are designed with the OpenTelemetry data model in mind, emitting OTel data without any loss of information.

Traces

Traces give us the big picture of what happens when a request is made to an application.

Traces are essential to understanding the full “path” a request takes in your application. Traces are identified using TraceId

Traces in OpenTelemetry are defined implicitly by their Spans. In particular, a Trace can be thought of as a directed acyclic graph (DAG) of Spans, where the edges between Spans are defined as a parent/child relationship.

Here example Trace made up of 6 Spans


Causal relationships between Spans in a single Trace

      [Span A]  ←←←(the root span)
            |
     +------+------+
     |             |
 [Span B]      [Span C] ←←←(Span C is a `child` of Span A)
     |             |
 [Span D]      +---+-------+
               |           |
           [Span E]    [Span F]

Sometimes it’s easier to visualize Traces with a time axis as in the diagram below:

Temporal relationships between Spans in a single Trace
––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–> time
 [Span A···················································]
   [Span B··········································]
      [Span D······································]
    [Span C····················································]
         [Span E·······]        [Span F··]

Spans

A span represents a unit of work or operation. Spans are the building blocks of Traces. In OpenTelemetry, they include the following information:

  • Name
  • Parent span ID (empty for root spans)
  • Start and End Timestamps
  • Span Context
  • Attributes
  • Span Events
  • Span Links
  • Span Status

Span Context

Span context is an immutable object on every span that contains the following:

  • The Trace ID represents the trace that the span is a part of
  • The span’s Span ID
  • Trace Flags, a binary encoding containing information about the trace
  • Trace State, a list of key-value pairs that can carry vendor-specific trace information

Span attributes (Tags)

Span attributes are metadata attached to a span. Attributes are mostly auto-collected. But we can add custom attributes to the spans.

Span Status

Each span has a status. The three possible values are: Unset , Error , andOk

Span Kind

This property is used to identify the type of Span. Here are a few Span kind:

SERVER

A server span represents a synchronous incoming remote call, such as an incoming HTTP request or remote procedure call.

CLIENT

A client span represents a synchronous outgoing remote cal,l such as an outgoing HTTP request or database call. Note that in this context, “synchronous” does not refer to async/await, but to the fact that it is not queued for later processing.

INTERNAL

Internal spans represent operations that do not cross a process boundary. Things like instrumenting a function call or an Express middleware may use internal spans.

Span Links (Links between spans)

A Span may be linked to zero or more other Spans (defined by SpanContext) that are causally related. Links can point to Spans inside a single Trace or across different Traces.

Tracing Architecture

Components

The following are the 3 components involved in collecting & Storing tracing data

1. Application

By using a Java Agent jar file, our application generates Trace data. Then, the generated trace data is exported to OTel Collector.

Java agents are a special type of class that, by using the Java Instrumentation API, can intercept applications running on the JVM, modifying their bytecode.

2. Datadog Agent or OTEL Collector

The Datadog Agent/Collector offers a vendor-agnostic implementation of receiving, processing, and exporting telemetry data. It acts as a middleman between the applications and Datadog.

3. Datadog or Prometheus

Datadog is a SaaS platform that analyzes log, metric, and trace data. All the trace data will be stored in Datadog and available to view, search, export, etc.

Prometheus and Grafana are commonly used together for monitoring and observability. Prometheus is a monitoring and alerting toolkit, while Grafana is a data visualization platform. Prometheus collects metrics from various sources, and Grafana visualizes those metrics in dashboards and graphs

Resources


메타데이터
post_id
abc691e01af7
slug
trace-tickle-observabilitys-funny-footprints-abc691e01af7
url
https://medium.com/@valarc/trace-tickle-observabilitys-funny-footprints-abc691e01af7
canonical_url
https://medium.com/@valarc/trace-tickle-observabilitys-funny-footprints-abc691e01af7
author_url
https://medium.com/@valarc
status
ok
fetched_at
2026-06-17 08:20:12