Skip to content

Commit ac0bb11

Browse files
committed
Create tracer to use with middleware
1 parent 6b01e1a commit ac0bb11

File tree

3 files changed

+64
-1
lines changed

3 files changed

+64
-1
lines changed

requirements/cli.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ fastapi
33
click
44
unstructured-ingest
55
opentelemetry-instrumentation-fastapi
6+
opentelemetry-exporter-otlp-proto-grpc

unstructured_platform_plugins/etl_uvicorn/api_generator.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from starlette.responses import RedirectResponse
1212
from uvicorn.importer import import_from_string
1313

14+
from unstructured_platform_plugins.etl_uvicorn.otel import get_provider
1415
from unstructured_platform_plugins.etl_uvicorn.utils import (
1516
get_func,
1617
get_input_schema,
@@ -171,6 +172,6 @@ async def get_id() -> str:
171172
except TypeError as e:
172173
raise TypeError(f"failed to validate function schema: {e}") from e
173174

174-
FastAPIInstrumentor.instrument_app(fastapi_app)
175+
FastAPIInstrumentor.instrument_app(fastapi_app, tracer_provider=get_provider())
175176

176177
return fastapi_app
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import os
2+
from typing import Literal, TypedDict
3+
4+
from opentelemetry.environment_variables import OTEL_TRACES_EXPORTER
5+
from opentelemetry.sdk.environment_variables import OTEL_SERVICE_NAME
6+
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
7+
from opentelemetry.sdk.trace import TracerProvider
8+
from opentelemetry.sdk.trace.export import (
9+
ConsoleSpanExporter,
10+
SimpleSpanProcessor,
11+
)
12+
13+
ExporterType = Literal["otlp", "jaeger", "zipkin", "console"]
14+
15+
16+
class OtelSettings(TypedDict):
17+
service_name: str
18+
exporters: list[ExporterType]
19+
20+
21+
def get_settings() -> OtelSettings:
22+
service_name = os.environ.get(OTEL_SERVICE_NAME, "unknown_service")
23+
exporters = os.environ.get(OTEL_TRACES_EXPORTER)
24+
exporters = exporters.split(",") if exporters else []
25+
return OtelSettings(service_name=service_name, exporters=exporters)
26+
27+
28+
def get_provider() -> TracerProvider:
29+
settings = get_settings()
30+
provider = TracerProvider(resource=Resource({SERVICE_NAME: settings["service_name"]}))
31+
32+
for exporter_type in settings["exporters"]:
33+
_add_exporter(exporter_type=exporter_type, provider=provider)
34+
35+
return provider
36+
37+
38+
def _add_exporter(exporter_type: ExporterType, provider: TracerProvider):
39+
if exporter_type == "otlp":
40+
_add_traces_otlp_exporter(
41+
provider,
42+
)
43+
44+
elif exporter_type == "console":
45+
_add_traces_console_exporter(provider)
46+
else:
47+
raise NotImplementedError(f"{exporter_type} implementation not supported yet")
48+
49+
50+
def _add_traces_console_exporter(provider: TracerProvider) -> None:
51+
exporter = ConsoleSpanExporter()
52+
processor = SimpleSpanProcessor(exporter)
53+
provider.add_span_processor(processor)
54+
55+
56+
def _add_traces_otlp_exporter(provider: TracerProvider) -> None:
57+
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
58+
59+
exporter = OTLPSpanExporter()
60+
processor = SimpleSpanProcessor(exporter)
61+
provider.add_span_processor(processor)

0 commit comments

Comments
 (0)