Jaeger

Jaeger, inspired by Dapper and OpenZipkin, is a distributed tracing system released as open source by Uber Technologies. It is used for monitoring and troubleshooting microservices-based distributed systems, including:

  • Distributed context propagation
  • Distributed transaction monitoring
  • Root cause analysis
  • Service dependency analysis
  • Performance / latency optimization

Jaeger can be used with various storage backends. YugabyteDB's YCQL API can also be used as a storage backend for Jaeger (version 1.43.0, previous versions are unsupported).

The Jaeger example on this page uses the HotROD sample application to illustrate the use of YCQL as a storage backend.

Additionally, it uses Jaeger All-in-one, which is a special distribution that combines three Jaeger components, agent, collector, and query service/UI, in a single binary or container image.

Note

The following example is for testing purposes only. For production deployment, refer to the Jaeger documentation.

Prerequisites

To use Jaeger, ensure that you have the following:

  • YugabyteDB up and running. Download and install YugabyteDB by following the steps in Quick start.

  • Go 1.20.

Build the application

To build the application, do the following:

  1. Jaeger natively supports two databases, Cassandra and Elasticsearch. So you need to set an environment variable SPAN_STORAGE_TYPE to specify your choice of database. For YCQL examples, set it to cassandra as follows:

    export SPAN_STORAGE_TYPE=cassandra
    
  2. Clone the Jaeger repository.

    git clone git@github.com:jaegertracing/jaeger.git && cd jaeger
    
  3. Initialize the cassandra keyspace and create the schema on YCQL using ycqlsh shell as follows:

    MODE=test sh ./plugin/storage/cassandra/schema/create.sh | path/to/ycqlsh
    
  4. Verify that a keyspace jaeger_v1_test is created using ycqlsh as follows:

    ycqlsh> desc keyspaces;
    
    system_auth  jaeger_v1_test  system_schema  system
    
  5. From the Jaeger project home directory, add the jaeger-ui submodule as follows:

    git submodule update --init --recursive
    
  6. Compile, package the UI assets in the jaeger-ui source code, and run Jaeger All-in-one using the following command:

    make run-all-in-one
    

    Wait for the logs to settle, then navigate to http://localhost:16686 to access the Jaeger UI, where you can view the traces created by the application. This indicates that the Jaeger UI, collector, query, and agent are running.

Run the application

To run the application, do the following:

  1. From a new terminal, set the SPAN_STORAGE_TYPE environment variable again as follows:

    export SPAN_STORAGE_TYPE=cassandra
    
  2. From your Jaeger project's home directory, start the HotROD application as follows:

    go run ./examples/hotrod/main.go all
    

Verify the integration

To verify the integration, navigate to the HotROD landing page and click a few options on the page to verify if you get a response about a driver arriving in a few minutes. This triggers a few traces which are in turn stored in the YCQL backend storage. You can view the traces in the Jaeger UI at http://localhost:16686.

You can also verify the integration from your ycqlsh shell using the following commands:

```sql
use jaeger_v1_test;
select * from jaeger_v1_test.traces;
```

All the traces created by the HotROD application are stored in the traces table.