Skip to main content

Python extensions for OpenTelemetry

Project description

otel-extensions-python: OpenTelemetry Extensions for Python

OpenTelemetry Extensions for Python is a collection of helper classes, functions, and decorators to facilitate the use of the OpenTelemetry Python API & SDK packages

Version Support

Python >= 3.6

Installation

pip install

You can install through pip using:

pip install otel-extensions

(you may need to run pip with root permission: sudo pip install otel-extensions)

Setuptools

Install via Setuptools.

python setup.py install --user

(or sudo python setup.py install to install the package for all users)

Features

Tracer Provider Initialization

from otel_extensions import init_telemetry_provider, TelemetryOptions

# Provide options for telemetry provider
# Alternatively, any of the following options can be specified through
# environment variables with the equivalent name
options = TelemetryOptions(
    # OTLP receiver endpoint
    OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4317/",
    # CA bundle for TLS verification of endpoint (if endpoint scheme is https)
    OTEL_EXPORTER_OTLP_CERTIFICATE="/path/to/ca/bundle",
    # protocol for OTLP receiver (supported: gprc | http/protobuf | custom)
    OTEL_EXPORTER_OTLP_PROTOCOL="grpc",
    # Custom span exporter class name (needed if protocol set to 'custom')
    OTEL_EXPORTER_CUSTOM_SPAN_EXPORTER_TYPE="pkg.ClassName",
    # Name of service
    OTEL_SERVICE_NAME="My Service",
    # Processor type
    #   batch:  use BatchSpanProcessor
    #   simple: use SimpleSpanProcessor
    OTEL_PROCESSOR_TYPE="batch",
    # Optional parent span id.  Will be injected into current context
    TRACEPARENT="001233454656...."
)
# Initialize the global tracer provider
init_telemetry_provider(options)

Instrumentation Decorator

You can use the @instrumented decorator to automatically wrap a span around a function or method. (As of version 0.2.0, the decorator can support coroutine functions defined as async def as well as normal functions)

from otel_extensions import init_telemetry_provider, instrumented
import asyncio

async def main():
    foo()
    await async_foo()
    
@instrumented
def foo():
    """Creates a span named 'foo'"""
    bar()

@instrumented(span_name="custom span name")
def bar():
    """Creates a span named 'custom span name'"""
    print("Hello World")
    
@instrumented(span_attributes={"attr1": "val1", "attr2": "val2"})
def fn_with_attrs():
    """Creates a span named 'fn_with_attrs' and sets key/value pairs
    from `span_attributes` as span attributes"""
    print("Hello World")

@instrumented
async def async_foo():
    """Creates a span named 'async_foo'"""
    await async_bar()

@instrumented(span_name="custom span name")
async def async_bar():
    """Creates a span named 'custom span name'"""
    print("Hello World")
    
@instrumented(span_name="custom span name")
async def async_bar():
    """Creates a span named 'custom span name'"""
    print("Hello World")
    
@instrumented(span_attributes={"attr1": "val1", "attr2": "val2"})
async def async_fn_with_attrs():
    """Creates a span named 'async_fn_with_attrs' and sets key/value pairs
    from `span_attributes` as span attributes"""
    print("Hello World")
    
if __name__ == '__main__':
    # init telemetry provider (using options from environment variables)
    init_telemetry_provider()
    asyncio.run(main())

Conditional span creation

If the OTEL_PROCESS_MODULES environment variable is set, the @instrumented decorator will only create a span if the module of the decorated function is in the list of modules specified in the environment variable.

import os
from otel_extensions import instrumented

os.environ["OTEL_PROCESS_MODULES"] = "module1,module2"
    
@instrumented
def foo():
    """
    Would create a span named 'foo', but only if the module of this function 
    were named 'module1' or 'module2'
    """
    bar()

Trace Context helper class

The TraceContextCarrier class is useful when propagating context across process or thread boundaries

from otel_extensions import TraceContextCarrier
from threading import Thread


def main_program():
    ...
    # capture current context
    ctx = TraceContextCarrier()
    thread = Thread(thread_func, args=(ctx))
    thread.start()
    ...

def thread_func(ctx: TraceContextCarrier):
    # attach to context stored in ctx
    ctx.attach()
    ...

Also, the TraceContextCarrier class can attach to context stored in the TRACEPARENT environment variable. Note that this is done automatically when calling the init_telemetry_provider() function.

from otel_extensions import TraceContextCarrier

TraceContextCarrier.attach_from_env()

TraceContextCarrier can also inject the current context into the TRACEPARENT environment variable. This is useful for context propagation when using Popen to create a subprocess

from otel_extensions import TraceContextCarrier
from subprocess import Popen

TraceContextCarrier.inject_to_env()
process = Popen(...)

Log messages as events

The TraceEventLogHandler class is a logging.Handler class that creates events for any log message that occurs in a span.

from otel_extensions import TraceEventLogHandler, init_telemetry_provider, get_tracer
import logging

init_telemetry_provider()

logging.basicConfig()
logging.getLogger(__name__).addHandler(TraceEventLogHandler())

with get_tracer(__name__).start_as_current_span("foo") as span:
    logging.getLogger(__name__).warning("Some log message")
    # 'Some Log message' will be created as an event in 'span',
    # as if you had called
    # span.add_event('Some Log message')

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

otel_extensions-1.1.0.tar.gz (15.0 kB view details)

Uploaded Source

Built Distribution

otel_extensions-1.1.0-py2.py3-none-any.whl (11.8 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file otel_extensions-1.1.0.tar.gz.

File metadata

  • Download URL: otel_extensions-1.1.0.tar.gz
  • Upload date:
  • Size: 15.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.12

File hashes

Hashes for otel_extensions-1.1.0.tar.gz
Algorithm Hash digest
SHA256 20ff10fb360d9bf1d8498f3c698e384ee81b07331206754b814d7f3fc1c71ed2
MD5 2bda14aeca82dabd5b5066c2e3f1c2b6
BLAKE2b-256 dd4e5ee78ffa054e5ba1fc9ea91a25a09befa5264c9438a3658685ae94cdb28a

See more details on using hashes here.

File details

Details for the file otel_extensions-1.1.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for otel_extensions-1.1.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 695df880d1cbf6df9274c5e414728f9781a5fabd9c44b865a92efe056d724f2c
MD5 b1c4794a694e66f2ffc417dbdadbf8cf
BLAKE2b-256 e9dc56211b810e066da30ffa7df0ef240fba8379fc52304db127c7accbe56a45

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page