Skip to content

Commit

Permalink
Add tests for tracing
Browse files Browse the repository at this point in the history
Also moves tracing.py into a services/ directory, and adds it to
the coverage paths.
  • Loading branch information
rebkwok committed Mar 20, 2024
1 parent 2d2a8b1 commit 1183546
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 9 deletions.
2 changes: 1 addition & 1 deletion gunicorn.conf.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import tracing
import services.tracing as tracing


# workers
Expand Down
1 change: 1 addition & 0 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ test *ARGS: devenv
--cov=local_db \
--cov=tests \
--cov=old_api \
--cov=services \
--cov-report=html \
--cov-report=term-missing:skip-covered

Expand Down
2 changes: 1 addition & 1 deletion manage.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import os
import sys

import tracing
import services.tracing as tracing


def main():
Expand Down
3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ DJANGO_SETTINGS_MODULE = "airlock.settings"
testpaths = [
"tests"
]
filterwarnings = [
"ignore::DeprecationWarning:opentelemetry.*:",
]

[tool.coverage.run]
branch = true
Expand Down
Empty file added services/__init__.py
Empty file.
13 changes: 8 additions & 5 deletions tracing.py → services/tracing.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,11 @@ def get_provider():
# https://github.com/open-telemetry/semantic-conventions/tree/main/docs/resource#service
resource = Resource.create(
attributes={
"service.name": "airlock",
"service.name": os.environ.get("OTEL_SERVICE_NAME", "airlock"),
"service.namespace": os.environ.get("BACKEND", "unknown"),
}
)
provider = TracerProvider(resource=resource)
trace.set_tracer_provider(provider)
return provider
return TracerProvider(resource=resource)


def add_exporter(provider, exporter, processor=BatchSpanProcessor):
Expand All @@ -34,7 +32,7 @@ def add_exporter(provider, exporter, processor=BatchSpanProcessor):
provider.add_span_processor(processor(exporter))


def setup_default_tracing():
def setup_default_tracing(set_global=True):
provider = get_provider()

"""Inspect environment variables and set up exporters accordingly."""
Expand All @@ -49,6 +47,11 @@ def setup_default_tracing():
if "OTEL_EXPORTER_CONSOLE" in os.environ:
add_exporter(provider, ConsoleSpanExporter())

if set_global: # pragma: nocover
trace.set_tracer_provider(provider)

from opentelemetry.instrumentation.auto_instrumentation import ( # noqa: F401
sitecustomize,
)

return provider
6 changes: 4 additions & 2 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@
from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter

import airlock.business_logic
import services.tracing as tracing
import tests.factories
import tracing


# set up tracing for tests
provider = tracing.get_provider()
tracing.trace.set_tracer_provider(provider)
test_exporter = InMemorySpanExporter()
tracing.add_exporter(tracing.get_provider(), test_exporter, SimpleSpanProcessor)
tracing.add_exporter(provider, test_exporter, SimpleSpanProcessor)


def get_trace():
Expand Down
60 changes: 60 additions & 0 deletions tests/test_tracing.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import os

import opentelemetry.exporter.otlp.proto.http.trace_exporter
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace.export import ConsoleSpanExporter

import services.tracing as tracing


def test_setup_default_tracing_empty_env(monkeypatch):
env = {"PYTHONPATH": ""}
monkeypatch.setattr(os, "environ", env)
provider = tracing.setup_default_tracing(set_global=False)
assert provider._active_span_processor._span_processors == ()


def test_setup_default_tracing_console(monkeypatch):
env = {"PYTHONPATH": "", "OTEL_EXPORTER_CONSOLE": "1"}
monkeypatch.setattr(os, "environ", env)
provider = tracing.setup_default_tracing(set_global=False)

processor = provider._active_span_processor._span_processors[0]
assert isinstance(processor.span_exporter, ConsoleSpanExporter)


def test_setup_default_tracing_otlp_defaults(monkeypatch):
env = {"PYTHONPATH": "", "OTEL_EXPORTER_OTLP_HEADERS": "foo=bar"}
monkeypatch.setattr(os, "environ", env)
monkeypatch.setattr(
opentelemetry.exporter.otlp.proto.http.trace_exporter, "environ", env
)
provider = tracing.setup_default_tracing(set_global=False)
assert provider.resource.attributes["service.name"] == "airlock"

exporter = provider._active_span_processor._span_processors[0].span_exporter
assert isinstance(exporter, OTLPSpanExporter)
assert exporter._endpoint == "https://api.honeycomb.io/v1/traces"
assert exporter._headers == {"foo": "bar"}
assert env["OTEL_EXPORTER_OTLP_ENDPOINT"] == "https://api.honeycomb.io"


def test_setup_default_tracing_otlp_with_env(monkeypatch):
env = {
"PYTHONPATH": "",
"OTEL_EXPORTER_OTLP_HEADERS": "foo=bar",
"OTEL_SERVICE_NAME": "service",
"OTEL_EXPORTER_OTLP_ENDPOINT": "https://endpoint",
}
monkeypatch.setattr(os, "environ", env)
monkeypatch.setattr(
opentelemetry.exporter.otlp.proto.http.trace_exporter, "environ", env
)
provider = tracing.setup_default_tracing(set_global=False)
assert provider.resource.attributes["service.name"] == "service"

exporter = provider._active_span_processor._span_processors[0].span_exporter

assert isinstance(exporter, OTLPSpanExporter)
assert exporter._endpoint == "https://endpoint/v1/traces"
assert exporter._headers == {"foo": "bar"}

0 comments on commit 1183546

Please sign in to comment.