Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

Introduction to Distributed Tracing

tracing-intro

In this episode we take a look at distributed tracing. We'll take a look at the concept, what distributed tracing is, what problems it solves, how to emit traces and the platform architecture to collect traces.

Example microservice architecture

First of all, we need an example application. In this demo, I have a few microservices that work together to form a video catalog.

A simple Web UI: videos-web



Consider videos-web
It's an HTML application that lists a bunch of playlists with videos in them.

+------------+
| videos-web |
|            |
+------------+

A simple API: playlists-api



For videos-web to get any content, it needs to make a call to playlists-api

+------------+     +---------------+
| videos-web +---->+ playlists-api |
|            |     |               |
+------------+     +---------------+

Playlists consist of data like title, description etc, and a list of videos.
Playlists are stored in a database.
playlists-api stores its data in a database

+------------+     +---------------+    +--------------+
| videos-web +---->+ playlists-api +--->+ playlists-db |
|            |     |               |    |              |
+------------+     +---------------+    +--------------+


A little complexity



Each playlist item contains only a list of video id's.
A playlist does not have the full metadata of each video.

Example playlist:

{
  "id" : "playlist-01",
  "title": "Cool playlist",
  "videos" : [ "video-1", "video-x" , "video-b"]
}

Take not above videos: [] is a list of video id's

Videos have their own title and description and other metadata.

To get this data, we need a videos-api
This videos-api has its own database too

+------------+       +-----------+
| videos-api +------>+ videos-db |
|            |       |           |
+------------+       +-----------+

For the playlists-api to load all the video data, it needs to call videos-api for each video ID it has.

Traffic flow



A single `GET` request to the `playlists-api` will get all the playlists from its database with a single DB call

For every playlist and every video in each list, a separate GET call will be made to the videos-api which will retrieve the video metadata from its database.

This will result in many network fanouts between playlists-api and videos-api and many call to its database.
This is intentional to demonstrate a busy network.


Full application architecture




+------------+     +---------------+    +--------------+
| videos-web +---->+ playlists-api +--->+ playlists-db |
|            |     |               |    |    [redis]   |
+------------+     +-----+---------+    +--------------+
                         |
                         v
                   +-----+------+       +-----------+
                   | videos-api +------>+ videos-db |
                   |            |       |  [redis]  |
                   +------------+       +-----------+


Run the apps: Docker



There is a `docker-compose.yaml` in this directory.
Change your terminal to this folder and run:
cd tracing

docker-compose build

docker-compose up

You can access the app on http://localhost.
You should now see the complete architecture in the browser

Traces



To see our traces, we can access the Jaeger UI on http://localhost:16686