Manual instrumentation page for python (#1184)

* Most of manual instrumentation for python

* finish span links
This commit is contained in:
Phillip Carter 2022-03-08 08:43:01 -08:00 committed by GitHub
parent 540d6b4908
commit 393c5490cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 178 additions and 0 deletions

View File

@ -0,0 +1,178 @@
---
title: Manual Instrumentation
linkTitle: Manual
weight: 3
---
Manual instrumentation is the process of adding observability code to your
application.
## Initializing tracing
To start tracing, you'll need to initialize a `TracerProvider`.
First, ensure you have the API and SDK packages:
```
pip install opentelemetry-api
pip install opentelemetry-sdk
```
Next, initialize a `TracerProvider` and set it for your app:
```python
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import (
BatchSpanProcessor,
ConsoleSpanExporter,
)
provider = TracerProvider()
processor = BatchSpanProcessor(ConsoleSpanExporter())
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(__name__)
```
With a call to `get_tracer`, you can create spans.
## Creating spans
To create a span, you'll typically want it to be started as the current span.
```python
with tracer.start_as_current_span("span-name") as span:
# do some work that 'span' will track
# When the 'while' block goes out of scope, 'span' is closed for you
```
You can also use `start_span` to create a span without making it the current
span. This is usually done to track concurrent or asynchronous operations.
You can also
## Creating nested spans
If you have a distinct sub-operation you'd like to track as a part of another
one, you can create spans to represent the relationship:
```python
with tracer.start_as_current_span("parent") as parent:
# do some work that 'parent' tracks
# Create a nested span to track nested work
with tracer.start_as_current_span("child") as child:
# do some work that 'child' tracks
# the nested span is closed when it's out of scope
# This span is also closed when it goes out of scope
```
When you view spans in a trace visualization tool, `child` will be tracked as a
nested span under `parent`.
## Get the current span
Sometimes it's helpful to access whatever the current span is at a point in time
so that you can enrich it with more information.
```python
from opentelemetry import trace
current_span = trace.get_current_span()
# enrich 'current_span' with some information
```
## Add attributes to a span
Attributes let you attach key/value pairs to a span so it carries more
information about the current operation that it's tracking.
```python
from opentelemetry import trace
current_span = trace.get_current_span()
current_span.set_attribute("operation.value", 1)
current_span.set_attribute("operation.name", "Saying hello!")
current_span.set_attribute("operation.other-stuff", [1, 2, 3])
```
## Adding events
AN event is a human-readable message on a span that represents "something
happening" during its lifetime. You can think of it as a primitive log.
```python
from opentelemetry import trace
current_span = trace.get_current_span()
currrent_span.add_event("Gonna try it!")
# Do the thing
current_span.add_event("Did it!")
```
## Adding links
A span can be created with zero or more span links that causally link it to
another span. A link needs a span context to be created.
```python
from opentelemetry import trace
ctx = trace.get_current_span().abstractget_span_context()
link_from_current = Link(ctx)
with tracer.start_as_current_span("new-span", links=[link_from_current]) as new_span:
# do something that 'new_span' tracks
# The link in 'new_span' casually associated it with the previous one,
# but it is not a child span.
```
## Set span status
A status can be set on a span, typically used to specify that a span has not
completed successfully - `StatusCode.ERROR`. In rare scenarios, you could
override the Error status with `StatusCode.OK`, but dont set `StatusCode.OK` on
successfully-completed spans.
The status can be set at any time before the span is finished:
```python
from opentelemetry import trace
current_span = trace.get_current_span()
try:
# something that might fail
except:
current_span.set_status(StatusCode.ERROR)
```
## Record exceptions in spans
It can be a good idea to record exceptions when they happen. Its recommended to
do this in conjunction with setting [span status](#set-span-status).
```python
from opentelemetry import trace
current_span = trace.get_current_span()
try:
# something that might fail
# Consider catching a more specific exception in your code
except Exception as ex:
current_span.set_status(StatusCode.ERROR)
current_span.record_exception(ex)
```