OTel tracing and logging tools, emphasizing data pipeline use cases with Dagster.
pip install formenergy-observability
See the examples/ directory for examples you can run and screenshots of the traces they produce.
Some key features demonstrated in the examples:
Context-aware tracing, so that spans and events can inherit attributes from parents:
from form_observability import ContextAwareTracer, ctx
_trace = ContextAwareTracer(__name__)
with ctx.set({"my_attribute_name": my_attribute_value}):
# There could be many intervening function calls and spans.
# Spans and events in this context automatically have the my_attribute_name
# attribute set on them.
_trace.add_event("my_event")Trace context propagation for Dagster ops:
from form_observability.dagster_otel import otel_op, publish_current_trace_context
from form_observability import ContextAwareTracer
_trace = ContextAwareTracer(__name__)
@op
def root_trace_context_op(context):
with _trace.start_as_current_span("root"):
# writes the trace context (as an asset materialization event) for later ops
publish_current_trace_context(context)
@otel_op() # picks up the trace context and starts a new span for this op
def my_op(context):
_trace.add_event("my_event")
@graph
def my_graph()
# In the graph, publish a root trace using a regular op, and then subsequent
# @otel_op ops will pick it up and contribute to the same trace.
setup_done = root_trace_context_op()
my_op(start=setup_done)Get an API key for uploading traces to your observability service (preferably in a development environment), set it in your environment, and run the examples. This should publish traces that you can then view.
export OTEL_EXPORTER_OTLP_HEADERS_JSON="{'x-honeycomb-team': '<API key>'}"
export OTEL_EXPORTER_OTLP_ENDPOINT="your observability service, defaults to Honeycomb"
python examples/basics.py
dagster job execute --python-file examples/dagster_job.pyThis library is provided under the MIT license, see LICENSE.
- 0.3.2 Update
grpciominimum dependency version to 1.48.1 anddagsterto 1.5.0. Thanks @dang-kaiko ! - 0.3.1 Fix type used for
otlp_headersto be adict. Thanks @spenczar ! - 0.3.0 Add
ContextAwareTracer.start_new_linked_trace. - 0.2.0 Switch to
context.op_handleandmaterialization.metadataas dict for Dagster 1.2. - 0.1.0 Initial external release, including
ContextAwareTracer,ctx, and@otel_op.
If you contribute, please ensure you and your employer accept the license for any of your contributions.
Create and activate a virtual environment with your favorite tool, such as direnv. This project requires Python 3.8.
pip install flit
flit install --deps all --symlink [--python /path/to/venv/python]By default, flit installs into the current virtual environment. Using the --python argument can let you install into a specific venv other than the currently active one. For example you can activate some other venv, run which python, and then pass the output of that command to flit's --python argument when installing from the form-observability repo.
Initialize pre-commit hooks:
pre-commit install --hook-type pre-commit --hook-type pre-pushFrom the project root directory:
pytest