Are you prepared to start out your journey on the highway to accumulating telemetry knowledge out of your functions? Nice observability begins with nice instrumentation!
On this collection, you will discover the best way to undertake OpenTelemetry (OTel) and the best way to instrument an utility to gather tracing telemetry. You will discover ways to leverage out-of-the-box computerized instrumentation instruments and perceive when it is necessary to discover extra superior handbook instrumentation on your functions. By the top of this collection, you will have an understanding of how telemetry travels out of your functions to the OpenTelemetry Collector, and be able to carry OpenTelemetry to your future tasks. All the things mentioned right here is supported by a hands-on, self-paced workshop authored by Paige Cruze.
The earlier article launched observability ideas and phrases associated to OpenTelemetry and its parts. On this article, we proceed onwards with our first steps in producing telemetry knowledge utilizing computerized instrumentation.
Taking our first steps with OpenTelemetry entails putting in it on our machine, configuring the supplied software program improvement equipment (SDK), constructing a demo utility, operating that utility with computerized instrumentation, and verifying the hint knowledge generated in our console output.
Getting Began
There are lots of languages out there for growing our functions, and for a lot of, OpenTelemetry supplies auto-instrumentation with out having to vary current utility code. This auto-instrumentation is completed utilizing the supplied API and SDK for the applying language, which detects any wanted libraries and exporter dependencies. In our demo utility, we’re specializing in Python Flask. Python dynamically injects byte code to seize telemetry from fashionable libraries and frameworks.
To get began, our first step shall be establishing our demo utility and testing auto-instrumentation on the Python utility. Create a working mission listing as follows:
- Obtain and unzip the next utility mission into your workshop listing from this location.
- Subsequent, we construct the supplied container picture, offered right here utilizing Podman (be at liberty to substitute with Docker if desired), utilizing the mission’s
Buildfile
:
$ cd intro-to-instrument-v1.1
$ podman construct -t hello-otel:base -f Buildfile
Efficiently tagged localhost/hello-otel:base 516c5299a32b68e7a4634ce15d1fd659eed2164ebe945ef1673f7a55630e22c8
This container picture accommodates our Python utility, which is able to expose an online web page on port 8000 within the container itself, which we are going to map right here to our native port 8001 (be at liberty to make use of any port that you’ve got out there). Run the container picture with the next command:
$ podman run -i -p 8001:8000 -e FLASK_RUN_PORT=8000 hello-otel:base
* Debug mode: off WARNING: It is a improvement server. Don't use it in a manufacturing deployment.
Use a manufacturing WSGI server as an alternative. * Working on all addresses (0.0.0.0) * Working on http://127.0.0.1:8000 * Working on http://10.88.0.18:8000 Press CTRL+C to stop
Open http://localhost:8001 in a browser and you may see the output that this web page has been seen one time, verifying that the applying is operating. Anticipate to see a log entry in our console each time we refresh the web page.
10.88.0.18 - - [11/Jul/2024 10:24:55] "GET / HTTP/1.1" 200 -
There are three routes on this utility that present the performance we will use to check OpenTelemetry tracing:
- http://localhost:8001/ – Shows a depend of web page loading
- http://localhost:8001/doggo– Shows random picture of a canine
- http://localhost:8001/rolldice – Shows quantity from 1 to six
Subsequent, we’ll begin by leveraging OTel auto-instrumentation for Python to see what we get without cost telemetry knowledge out of our utility. First, cease the operating container utilizing CTRL-C.
Robotically Instrumenting Software
To begin auto-instrumenting our utility we are going to change the container picture we construct to incorporate the next set up actions:
opentelemetry-distro[otlp]
– Putting in the API, SDK,opentelemetry-bootstrap
, andopentelemetry-instrument
opentelemetry-bootstrap
– Putting in instrumentation libraries similar to put in packages
Our construct file could be discovered at computerized/Buildfile-auto and accommodates the next, with highlighting strains putting in our instrumentation dependencies:
FROM python:3.12-bullseye WORKDIR /app COPY necessities.txt necessities.txt RUN pip set up -r necessities.txt RUN pip set up opentelemetry-distro[otelp]
RUNopentelemetry-bootstrap -a set up COPY . . CMD [ "flask", "run", "--host=0.0.0.0"]
Construct this container picture with the next command:
$ podman construct -t hello-otel:auto -f computerized/Buildfile-auto
Efficiently tagged localhost/hello-otel:auto 516c5299a32b68e7a4634ce15d1fd659eed2164ebe945ef1673f7a55630e22c8
After we run this container picture, we’re going to wrap it with the OpenTelemetry agent, generally known as opentelemetry-instrument
, that dynamically injects byte code to seize telemetry. Configure a world tracer, which we set with a flag to output to the console, and supply a service identify for our utility with the next command:
$ podman run -i -p 8001:8000 -e FLASK_RUN_PORT=8000 hello-otel:auto
opentelemetry-instrument
--traces_exporter console
--service_name hello-otel
* Debug mode: off WARNING: It is a improvement server. Don't use it in a manufacturing deployment.
Use a manufacturing WSGI server as an alternative. * Working on all addresses (0.0.0.0) * Working on http://127.0.0.1:8000 * Working on http://10.88.0.19:8000 Press CTRL+C to stop
Now generate telemetry knowledge (tracing) in your console by opening the primary web page at http://localhost:8001 and word that it is only a single hint for GET/path. That is additionally the case for http://localhost:8001/rolldice, so let’s check out the Doggo utility path, which has a hint and several other spans by loading http://localhost:8001/doggo.
Beneath we have offered one of many spans captured within the hint, the compile section of the Jinja2 HTML template used to show the canine footage:
{ "name": "jinja2.compile", "context": { "trace_id": "0x1b08c2d2b8fd2e237fcc7b34d83daa44", "span_id": "0xa80f805993195e50", "trace_state": "[]" }, "kind": "SpanKind.INTERNAL", "parent_id": "0x0726f0e2421adadf", "start_time": "2024-07-11T10:37:31.562540Z", "end_time": "2024-07-11T10:37:31.567137Z", "status": { "status_code": "UNSET" }, "attributes": { "jinja2.template_name": "random-pet-pic.html" }, "events": [], "links": [], "resource": { "attributes": { "telemetry.sdk.language": "python", "telemetry.sdk.name": "opentelemetry", "telemetry.sdk.version": "1.25.0", "service.name": "hello-otel", "telemetry.auto.version": "0.46b0" }, "schema_url": "" } }
Computerized instrumentation is broadly scoped; on this case, you discover it generates issues like trace_id
, span_id
, telemetry.sdk.identify
, and extra. To get a deeper stage of perception into our utility we will manually create new spans or modify current ones.
These examples use code from a Python utility you can discover within the supplied hands-on workshop (linked originally of the article).
What’s Subsequent?
This text explored using OpenTelemetry auto-instrumentation to boost our insights into the functioning of our utility.
We noticed that the main focus was moderately broad when focusing on functions with auto-instrumentation, so within the subsequent article, we discover the best way to acquire higher insights by including handbook instrumentation to our utility leveraging the present auto-instrumentation.