
Welcome to Jaeger Distributed Tracing
High-level overview on End to end distributed tracing
Solution by Jaeger like Distributed transaction monitoring, Service dependency analysis, Distributed context propagation, Root cause analysis, etc
Need for distributed tracing in microservice distributed applications
Introduction to three pillars of observability - Logging, Tracing, Metrics
Detailed discussion on three pillars of observability
The relation between Logging, Tracing, Metrics
Introduction to Fluentd, ELK Stack for logging
Introduction to Jaeger, Zipkin for Tracing
Introduction to Grafana, Prometheus for Metrics
Overview of Jaeger UI
Introduction to various features and functionality in web UI
High-level overview on Hot Rod applications
Identifying error/bottleneck in the application
Overview of compare trace options
View system architecture using DAG graph
Introduction to open tracing
Need for open tracing
Detailed discussion on open tracing
Introduction to concept and terminology like Spans, Tags, Scopes, Tracers, etc.,
Installing Jaeger in the Windows system
Downloading the executables for hotrod, agent, all-in-one, collector, ingester and query
Executing all-in-one exe in port 9411
Checking Jaeger-query service from web UI
Overview of hot rod application
Starting all service of hot rod application
Verify various service of hot rod application
Create sample booking with hot rod application and verify Jaeger web UI
Overview on how Agent collects data from collector using Thrift protocol
Architectural design on how application data collected by the agent through jaeger client, open tracking API, and Instrumentation
Role of Jaeger collector
How data gets stored in a database like Cassandra
Using data in a database for Jaeger UI with Jaeger query
Detailed discussion on Jaeger instrumentation
Start and end of tracepoint
Adding datapoint between tracepoint
Sample datapoint and tracepoint
Overview of sample hot rod application
Verify container running with the name Jaeger
Run example hot rod container with the agent host port configuration
Access the sample application in the port 8080
Create a few sample requests
Validate the logs
Verify docker installation
Verify Jaeger tracing image in docker hub
Run Jaeger as docker image by opening all required ports
Check the container running status
Different application on Jaeger samples
Detailed discussion on the all-in-one sample application
Run and validate all-in-one sample application
Detailed discussion on Span
Discussion on operation name, start and finish timestamp
Tags, logs and SpanContext purpose and detailed discussion
Tags uses and purpose in Span
Different semantic conventions
Logging key-value pairs
Purpose of logs for spans
Sample logs for various requests
Detailed discussion on issues built-in sample application
Identify the issues using the span and log details in Jaeger
Discuss the cause and reason for the issues
Options to fix the issues with the sample application
Fix the built-in issues in the sample application
Fix aggregate latency of Mysql DB query
Fix by disabling the mutex guarding DB connection
Fix router worker pool size issue
Check the effect in the traces by making sample requests
Details on open tracing, the implementation by Jaeger
Application instrumentation using Java
API discussion on JaegerTracer class
API discussion on activeSpan and ScopeManager
Introduction to Spring Tools 4 for Eclipse IDE
Install Spring Tools Suite
Creating a sample application and verify pom file
Create a sample class to verify the installation
Execute the sample Java program and check the output
Creating SamplerConfiguration object with required arguments
Initialize Jager service
Creating a tracer object
Execute the program and check the tracer and the logs
Creating a span object using buildspan method of tracer
Run the program to check the sample trace in web UI
Call span finish() method to close the span tracing
Adding the tag to the span using setTag() method
Run the sample and check the tags from web UI
Discussion on role and purpose of tags
Syntax and various format of the tags
Adding logs to the span using log method
Role and the purpose of logs
Verify the logs added from web UI
Using ImmutableMap with the logs
Detailed discussion on adding instrumentation to functions
Passing span as an argument to the function to continue the trace
Make sample request and verify the trace of functions in web UI
Creating multiple spans for functions
Need and purpose of multiple span
Different ways to handle childOf span
The disadvantage of not using childOf span
Introduction to childOf function for span
Usecase and need for using childOf function
Verify the child span in web UI
Detailed discussion on scopeManager and activate method
Need and purpose of calling activate method
Differentiate and realize the advantage of using activate span method
Create sample spring boot application
Execute the sample application for verification
Adding dependency for tracing spring cloud starter
Discussion on various environmental variables for Jaeger
Verify spring boot application trace in web UI
Tracing chain of methods in Spring boot application
Verify result in web UI
Need and purpose of chaining the method calls
Introduction to sidecar in a microservice architecture
Roles played by sidecar
Leveraging sidecar for tracing, logging and metrics collection
Detailed discussion on Istio and sidecar
Interaction of microservices without sidecar
Discussion on the control plane and data plane
Various components of Istio like Pilot, Citadel, Galley, and Mixer
Overview of the product page with and without Istio configuration
Verify Kubernetes installation
Download and extract the latest version on Istio
Overview of Istio profiles and Addons like Grafana, Istio-tracing, Kiali, and Prometheus
Install Istio using istioctl
Enable istio-injection for the default namespace
Verify Istio installation in the istio-system namespace
Installing the tracing and configuring tracing only in Istio using values.tracing.enabled=true
Overview of product page sample
Installing the sample product page sample and verify
Verify the product page pods, service, and its cluster IP details
Introduction to SSH Tunneling
Check the pods deployed in namespace without enabling Istio
Overview on sample application
Configure SSH Tunnel with target IP and port of the bookinfo sample application
Access the sample application using localhost and port 9080
Introduction to Kiali
Configure IP and port for Kiali to access from localhost
Verify Kiali web UI access from localhost in port 20001
Overview of Kiali Web UI
Create sample namespace
Add istio-injection=enabled label
Install sample application
Verify the number of containers in each Pod as two
Configure product page IP and port with SSH tunneling
Access the sample page in the port 9080
Verify the access in Kiali at the port 20001
Check the microservice graph in Kiali
Verify traffic percentage by enabling traffic animation and percentage
Using Jaeger tracing with product page sample application
Accessing Jaeger UI using SSH Tunnel
Accessing various version of reviews
Overview of trace and span of the sample application
List of headers to be collected and propagated to correlate the spans to a single trace
Overview of the sample application to propagate the context
Need and purpose of context propagation
Ways of capturing the headers and sending it to next microservice
Code walkthrough on context propagation in python language
Overview of container orchestration
Advantage and need for container orchestration
orchestration within master-worker architecture
Different components of Kubernetes introduction
Introduction to Pods
Master worker architecture of Kubernetes cluster
Different controllers for node, replication, etc.,
Introduction to container runtime and kubelet
Kube Scheduler role and introduction
Introduction to API-Server
etcd database and its role
Introduction to YAML file and its syntax
Different members of yaml file
Adding maps, keys, values to yaml file
Handling maps of maps, maps of list, lists of lists, lists of maps
Using template and selector in Kubernetes yaml file
Introduction to different core components
The relation between the control plane and run time components
Introduction to apiserver, controller manager, scheduler, etcd, kubelet, Kube-proxy, and container runtime
Understand various component with an analogy
Verify various component in Kube-system namespace
Different types of installation overview
Compare Minikube installation with a fully distributed cluster installation
Download and installation of Minikube in windows
Setting required environmental variables
Installing and configure kubectl executable
Verify and test Minikube
Check the status fo Minikube
Create sample deployment to test the installation
Get the list of pods and verify
Verify Minikube web UI and verify
Setup AWS EC2 instance with earlier defined AMI
Login to EC2 Instance
Create users and groups for docker
Install docker
Start docker service
Download and install Minikube
Start Minikube
Install Kubectl
Verify Kubectl and Minikube installation
Start Kubectl proxy to access Web Dashboard
Verify the status of Kubernetes environment
Run a sample pod with Nginx image
Check the status of the pod
Describe the pod to get more details on the pod
Delete the pod
Create sample yaml file with Nginx image
Kubernetes API doc overview on yaml elements
Create pod by applying the yaml file
Describe and verify the pod IP and port details
Map port between container and Host
Configure address forward using port-forward
Access using curl and verify port forward configuration
Opening bash shell using exec command
Copy files between containers and host
Introduction to Replicaset
Configure replicas in yaml file
Details on Selector, label matching and template
Create replicaset and verify the pod count
Delete a pod and verify the number of pods at desired, current and ready state
Introduction to deployments in Kubernetes environment
Create yaml file with deployment as kind
Details on replicas, selector and template in deployments
Verify selector in deployment describe command
Introduction and purpose of service in Kubernetes environment
Port configuration with nodePort, port, protocol and targetPort in service
Create service with node port
Access Nginx service from the browser using node port
Purpose of label and selector in yaml file
Create guestbook sample application
Overview of label selector with the sample application
List the labels of the pod with -L option
Use --selector to list the pods
Use --show-labels to display pod labels
Select multiple labels using 'in' --selector
Using different operator like ! for not
Introduction to Volumes in containers
Attaching volumeMounts to Pod containers
Introduction to emptyDir volume
Check the mount path in container description
Check volume mapping to host machine
Create folder and files in mapped location in host machine and verify
List of volumes under cache-volume for pods
Introduction to Config maps.
Purpose and its use of config maps
Creating sample config maps with multiple keys
Create pod by using the config maps
Verify how config maps used in pods by checking the logs
Introduction to secrets
Use and purpose of secrets in config maps
Verify created secret
Introduction to Namespace
Use and purpose of Namespace
Create new namespace
Create new pods in new namespace
List various entity in new namespace
Create pods, deployments, service and various entity in new namespace
Delete and clean namespace and all entities
Presentation used in the Course
Solve the major operation problem of distributed applications in networking and observability
Learn the following skills on distributed applications
Distributed transaction monitoring
Performance and latency optimization
Root cause analysis
Service dependency analysis
Distributed context propagation
Learn various components in Jaeger like
Jaeger UI
Collector
Query
Agent
Jaeger-ingester
In-memory Storage
Deploy and use all-in-one open telemetry application for learning purpose
Using Jaeger configuration along with OpenTelemetry configuration
Jager API and its architecture
Sampling and its importance
Learn different terminologies like
Span: The basic unit of work in tracing, representing a single operation within a trace, including details like operation name, start and end times, logs, and tags.
Trace: A collection of spans that share the same trace ID, representing a complete end-to-end execution path across services.
Components: Different parts of the Jaeger architecture, including the agent, collector, query service, and storage backends, each responsible for a specific role in the tracing pipeline.
Jaeger Client Libraries: Language-specific libraries provided by Jaeger that allow applications to create and manage spans and traces, supporting languages like Go, Java, Node.js, Python, C++, and C#.
Agent: A lightweight process that listens for span data sent by client libraries and forwards it to the Jaeger collector.
Collector: The backend component that receives span data from agents, processes it, and stores it in the chosen storage system.
Query: The service that provides APIs and a user interface for searching and visualizing trace data stored by the collector.
Ingester: A component used when storing spans in streaming or scalable storage backends (like Kafka), responsible for consuming spans and writing them to permanent storage.
Using different client libraries and languages like Go, Java, Node.js, Python, C++, C#
Performance tuning and troubleshooting
Monitoring Jaeger and its different component