[Feature] OTEL tracing during loading (#31162)
This commit is contained in:
87
tests/tracing/test_loading_tracing.py
Normal file
87
tests/tracing/test_loading_tracing.py
Normal file
@@ -0,0 +1,87 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
import asyncio
|
||||
|
||||
import pytest
|
||||
from opentelemetry.sdk.environment_variables import OTEL_EXPORTER_OTLP_TRACES_INSECURE
|
||||
|
||||
from tests.tracing.conftest import FAKE_TRACE_SERVER_ADDRESS, FakeTraceService
|
||||
from vllm.tracing import init_tracer, instrument, is_otel_available
|
||||
|
||||
# Skip everything if OTel is missing
|
||||
pytestmark = pytest.mark.skipif(not is_otel_available(), reason="OTel required")
|
||||
|
||||
|
||||
class TestCoreInstrumentation:
|
||||
"""Focuses on the @instrument decorator's ability to capture execution data."""
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def setup_tracing(self, monkeypatch):
|
||||
monkeypatch.setenv(OTEL_EXPORTER_OTLP_TRACES_INSECURE, "true")
|
||||
init_tracer("test.core", FAKE_TRACE_SERVER_ADDRESS)
|
||||
|
||||
def test_decorator_captures_sync_and_async(self, trace_service: FakeTraceService):
|
||||
"""Verify basic span creation for both sync and async functions."""
|
||||
|
||||
@instrument(span_name="sync_task")
|
||||
def sync_task():
|
||||
return True
|
||||
|
||||
@instrument(span_name="async_task")
|
||||
async def async_task():
|
||||
return True
|
||||
|
||||
sync_task()
|
||||
asyncio.run(async_task())
|
||||
|
||||
assert trace_service.wait_for_spans(count=2)
|
||||
span_names = [s["name"] for s in trace_service.get_all_spans()]
|
||||
assert "sync_task" in span_names
|
||||
assert "async_task" in span_names
|
||||
|
||||
def test_nested_spans_hierarchy(self, trace_service: FakeTraceService):
|
||||
"""Verify that nested calls create a parent-child relationship."""
|
||||
|
||||
@instrument(span_name="child")
|
||||
def child():
|
||||
pass
|
||||
|
||||
@instrument(span_name="parent")
|
||||
def parent():
|
||||
child()
|
||||
|
||||
parent()
|
||||
|
||||
assert trace_service.wait_for_spans(count=2)
|
||||
spans = trace_service.get_all_spans()
|
||||
parent_span = next(s for s in spans if s["name"] == "parent")
|
||||
child_span = next(s for s in spans if s["name"] == "child")
|
||||
|
||||
assert child_span["parent_span_id"] == parent_span["span_id"]
|
||||
|
||||
|
||||
class TestInterProcessPropagation:
|
||||
"""Test the propagation of trace context between processes."""
|
||||
|
||||
def test_pickup_external_context(self, monkeypatch, trace_service):
|
||||
"""Test that vLLM attaches to an existing trace ID if in environment."""
|
||||
monkeypatch.setenv(OTEL_EXPORTER_OTLP_TRACES_INSECURE, "true")
|
||||
|
||||
# Manually simulate an external parent trace ID
|
||||
fake_trace_id = "4bf92f3577b34da6a3ce929d0e0e4736"
|
||||
fake_parent_id = "00f067aa0ba902b7"
|
||||
monkeypatch.setenv("traceparent", f"00-{fake_trace_id}-{fake_parent_id}-01")
|
||||
|
||||
init_tracer("test.external", FAKE_TRACE_SERVER_ADDRESS)
|
||||
|
||||
@instrument(span_name="follower")
|
||||
def follower_func():
|
||||
pass
|
||||
|
||||
follower_func()
|
||||
|
||||
assert trace_service.wait_for_spans(count=1)
|
||||
span = trace_service.get_all_spans()[0]
|
||||
|
||||
assert span["trace_id"] == fake_trace_id
|
||||
assert span["parent_span_id"] == fake_parent_id
|
||||
Reference in New Issue
Block a user