Skip to content

Commit

Permalink
Add Python support
Browse files Browse the repository at this point in the history
Signed-off-by: Helder Correia <174525+helderco@users.noreply.github.com>
  • Loading branch information
helderco committed Mar 28, 2024
1 parent dbc13df commit 08aa92c
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 0 deletions.
2 changes: 2 additions & 0 deletions sdk/python/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ dependencies = [
"platformdirs>=2.6.2",
"typing_extensions>=4.8.0",
"rich>=10.11.0",
"opentelemetry-sdk>=1.23.0",
"opentelemetry-exporter-otlp-proto-grpc>=1.23.0",
]

[project.urls]
Expand Down
60 changes: 60 additions & 0 deletions sdk/python/src/dagger/client/_otel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import contextlib
import logging
import os

import httpx
from opentelemetry import context, propagate, trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.semconv.resource import ResourceAttributes
from opentelemetry.trace import propagation

logger = logging.getLogger(__name__)


class AsyncTransport(httpx.AsyncHTTPTransport):
async def handle_async_request(self, request: httpx.Request) -> httpx.Response:
# Get traceparent from request headers if present.
propagate.inject(request.headers)
return await super().handle_async_request(request)


provider = TracerProvider(
resource=Resource.create(
attributes={ResourceAttributes.SERVICE_NAME: "dagger-python-sdk"},
schema_url=ResourceAttributes.SCHEMA_URL,
),
)
provider.add_span_processor(
BatchSpanProcessor(OTLPSpanExporter(insecure=True)),
)

trace.set_tracer_provider(provider)

tracer = trace.get_tracer(__name__)


def get_context() -> context.Context:
ctx = context.get_current()

if propagation.get_current_span(ctx).get_span_context().is_valid:
return ctx

if p := os.getenv("TRACEPARENT"):
logger.debug("Falling back to $TRACEPARENT: %s", p)
return propagate.extract({"traceparent": p}, context=ctx)

return ctx


@contextlib.asynccontextmanager
async def start_as_current_span(name: str):
with tracer.start_as_current_span(
name,
context=get_context(),
kind=trace.SpanKind.CLIENT,
attributes={"dagger.io/ui.internal": True},
) as span:
yield span
6 changes: 6 additions & 0 deletions sdk/python/src/dagger/client/_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from dagger import ClientConnectionError
from dagger._config import ConnectConfig, Retry
from dagger._managers import ResourceManager
from dagger.client import _otel as otel

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -64,6 +65,7 @@ def __init__(self, conn: ConnectParams, cfg: ConnectConfig | None = None):

transport = HTTPXAsyncTransport(
conn.url,
transport=otel.AsyncTransport(),
timeout=cfg.timeout,
auth=(conn.session_token, ""),
)
Expand All @@ -88,6 +90,10 @@ async def start(self) -> AsyncClientSession:

async with self.get_stack() as stack:
logger.debug("Establishing client session to GraphQL server")

await stack.enter_async_context(
otel.start_as_current_span("GraphQL client session"),
)
try:
session = await stack.enter_async_context(self.client)
except TimeoutError as e:
Expand Down

0 comments on commit 08aa92c

Please sign in to comment.