Observability and Selenium
Tags: testing, devops, opensource
Published: 2020-06-18 19:21:01

[Observability And Selenium](https://github.com/manoj9788/tracing-selenium-grid)
## Observability 
> *It is a measure of how well internal states of a system can be inferred from knowledge of its external outputs. It helps bring visibility into systems.* – Wikipedia 

Tracing is one of the important pillars for measuring observability along with logs and metrics. Its a way of thinking about the system, a way of being able to ask the system questions, that you need the answer to when you didn't know the questions beforehand. On the other hand, alerting is a way of asking questions when you do know the question beforehand.

Distributed Tracing can be quite helpful in answering questions for your distributed system like,

* Root cause analysis
* Performance optimisation
* dependency analysis of services

## Selenium-4 
It has a number of new exciting features and one such is a cleaner code for Selenium Grid along with support for distributed tracing via OpenTelemetry APIs. This is a pretty exciting and important feature for the admins and DevOps engineers to trace the flow of control through the Grid for each and every command.

Distributed tracing has two parts:

1. Code instrumentation: Adding instrumentation code in your application to produce traces. The major instrumentation parts are done neatly by the developers of the Selenium project, which leaves us to consume it by using Selenium Grid start-up command along with Jaeger.

2. Collection of data and providing meaning over it, Jaeger has a UI which allows us to view traces visually well.

Steps to start tracing your tests,

* Start Jaeger via docker(as it's easy)

* Instrument your Selenium Grid start-up command with Jaeger tracing as in [start-grid-distributed.sh](https://github.com/manoj9788/tracing-selenium-grid/blob/master/start-grid-distributed.sh) and [start-grid-standalone.sh](https://github.com/manoj9788/tracing-selenium-grid/blob/master/start-grid-standalone.sh) for standalone mode.

* Now execute your tests, and navigate to `http://localhost:16686/` to view the outputs.

## Pre-requisites
Assuming you have docker running on your machine,
1. Install Coursier via homebrew `brew install coursier/formulas/coursier`
2. Install [Jaeger](https://www.jaegertracing.io/download/) via docker
3. Selenium-server.jar refers to the latest alpha version of selenium releases (Tested with Alpha 5)

## Start Jaeger via docker server
The simplest way to start the all-in-one is to use the pre-built image published to DockerHub (a single command line).

```
$ docker run --rm -it --name jaeger \
    -p 16686:16686 \
    -p 14250:14250 \
    jaegertracing/all-in-one:1.17
  ```
  You can then navigate to http://localhost:16686 to access the Jaeger UI.

## Instrument your Selenium Grid command
We're going to add support for Open Telemetry API's(one of the many ways to do distributed tracing) using [Coursier](https://get-coursier.io/docs/overview) to generate a full classpath when started this way the selenium server will inform you that it has found a tracer on stdout.

Refer [start-grid-distributed.sh](https://github.com/manoj9788/tracing-selenium-grid/blob/master/start-grid-distributed.sh) if you want to start Grid in distributed mode.

```curl http://localhost:4444/status``` to check if your grid deployment is ready

![Grid status] (https://raw.githubusercontent.com/manoj9788/tracing-selenium-grid/master/images/grid-ready.png)

## Execute your tests
Point your tests as in [DistributedTracingExamples](https://github.com/manoj9788/tracing-selenium-grid/blob/master/src/test/java/com/thoughtworks/tracing/DistributedTracingExamples.java) Class and navigate to http://localhost:16686/ to view the outputs.

Under services lookup for Selenium-router and notices actions for each call made by your tests. An example below

![Traces](https://raw.githubusercontent.com/manoj9788/tracing-selenium-grid/master/images/route-traces.png)

References:
* [Tracing Info command](https://github.com/SeleniumHQ/selenium/)
* [Jaeger guide](https://www.jaegertracing.io/docs/1.17/getting-started/)
* [Three Pillars of Observability](https://learning.oreilly.com/library/view/distributed-systems-observability/9781492033431/ch04.html)

A special thanks to ever-helpful Simon Stewart

Thanks, folks!
[Follow me on Twitter] (https://twitter.com/manoj9788)