Skip to content

Commit 96f0407

Browse files
authored
More robust tracer setup. (#1445)
1 parent ccbceda commit 96f0407

File tree

4 files changed

+69
-34
lines changed

4 files changed

+69
-34
lines changed

custom_model_runner/datarobot_drum/drum/adapters/model_adapters/python_model_adapter.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,22 @@ def __init__(self, model_dir, target_type=None):
126126
# doing this here because moderation library is loaded before custom.py.
127127
try:
128128
from opentelemetry.instrumentation.requests import RequestsInstrumentor
129-
from opentelemetry.instrumentation.aiohttp_client import AioHttpClientInstrumentor
130129

131130
RequestsInstrumentor().instrument()
132-
AioHttpClientInstrumentor().instrument()
133131
except (ImportError, ModuleNotFoundError):
134-
msg = """Instrumentation for requests or aiottp is not loaded, make sure appropriate
132+
msg = """Instrumentation for requests is not loaded, make sure appropriate
135133
packages are installed:
136134
137135
pip install opentelemetry-instrumentation-requests
136+
"""
137+
try:
138+
from opentelemetry.instrumentation.aiohttp_client import AioHttpClientInstrumentor
139+
140+
AioHttpClientInstrumentor().instrument()
141+
except (ImportError, ModuleNotFoundError):
142+
msg = """Instrumentation for aiottp is not loaded, make sure appropriate
143+
packages are installed:
144+
138145
pip install opentelemetry-instrumentation-aiohttp-client
139146
"""
140147
self._logger.warning(msg)

custom_model_runner/datarobot_drum/drum/common.py

Lines changed: 55 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -135,37 +135,62 @@ def make_otel_endpoint(datarobot_endpoint):
135135
return result
136136

137137

138-
def setup_tracer(runtime_parameters):
139-
# OTEL disabled by default for now.
140-
if not (
141-
runtime_parameters.has("OTEL_SDK_ENABLED") and runtime_parameters.get("OTEL_SDK_ENABLED")
138+
def setup_tracer(runtime_parameters, options):
139+
"""Setups OTEL tracer if not configured externally.
140+
141+
It is possible to provied OTEL compliant OTEL_EXPORTER_OTLP_ENDPOINT
142+
or OTEL_EXPORTER_OTLP_TRACES_ENDPOINT and override trace collector
143+
to anydd
144+
145+
146+
Parameters
147+
----------
148+
runtime_parameters: Type[RuntimeParameters] class handles runtime parameters for custom modes
149+
used to check if OTEL configuration from user.
150+
options: argparse.Namespace: object obtained from argparser filled with user supplied
151+
command argumetns
152+
Returns
153+
-------
154+
None
155+
"""
156+
if os.environ.get("OTEL_EXPORTER_OTLP_ENDPOINT") or os.environ.get(
157+
"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"
142158
):
143-
return
144-
# if deployment_id is not found, most likely this is custom model
145-
# testing
146-
deployment_id = os.environ.get("MLOPS_DEPLOYMENT_ID", os.environ.get("DEPLOYMENT_ID"))
147-
if not deployment_id:
148-
return
149-
150-
service_name = f"deployment-{deployment_id}"
151-
resource = Resource.create(
152-
{
153-
"service.name": service_name,
154-
"datarobot.deployment_id": deployment_id,
155-
}
156-
)
157-
key = os.environ.get("DATAROBOT_API_TOKEN")
158-
datarobot_endpoint = os.environ.get("DATAROBOT_ENDPOINT")
159-
if not key or not datarobot_endpoint:
160-
return
161-
endpoint = make_otel_endpoint(datarobot_endpoint)
162-
163-
os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = endpoint
164-
headers = {
165-
"Authorization": f"Bearer {key}",
166-
"X-DataRobot-Entity-Id": f"entity=deployment; id={deployment_id};",
167-
}
168-
otlp_exporter = OTLPSpanExporter(headers=headers)
159+
# OTEL configured externaly via env vars
160+
resource = Resource.create()
161+
else:
162+
gpu_predictor = getattr(options, "gpu_predictor", None)
163+
164+
# if explicitly asked enable/disable otel
165+
if runtime_parameters.has("OTEL_SDK_ENABLED"):
166+
enable_otel = runtime_parameters.get("OTEL_SDK_ENABLED")
167+
# if not expliciety specified, enable otel by default for gpu models
168+
elif gpu_predictor:
169+
enable_otel = True
170+
else:
171+
enable_otel = False
172+
# if deployment_id is not found, most likely this is custom model
173+
# testing
174+
deployment_id = os.environ.get("MLOPS_DEPLOYMENT_ID", os.environ.get("DEPLOYMENT_ID"))
175+
if not enable_otel or not deployment_id:
176+
return
177+
178+
resource = Resource.create(
179+
{
180+
"datarobot.deployment_id": deployment_id,
181+
}
182+
)
183+
key = os.environ.get("DATAROBOT_API_TOKEN")
184+
datarobot_endpoint = os.environ.get("DATAROBOT_ENDPOINT")
185+
if not key or not datarobot_endpoint:
186+
return
187+
188+
endpoint = make_otel_endpoint(datarobot_endpoint)
189+
h = f"X-DataRobot-Api-Key={key},X-DataRobot-Entity-Id=deployment-{deployment_id}"
190+
os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = endpoint
191+
os.environ["OTEL_EXPORTER_OTLP_HEADERS"] = h
192+
193+
otlp_exporter = OTLPSpanExporter()
169194
provider = TracerProvider(resource=resource)
170195
provider.add_span_processor(BatchSpanProcessor(otlp_exporter))
171196
trace.set_tracer_provider(provider)

custom_model_runner/datarobot_drum/drum/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ def signal_handler(sig, frame):
9292
_setup_required_environment_variables(options)
9393
# Env vars may setup OTEL configuration, lets setup
9494
# tracer after all env vars updated
95-
setup_tracer(RuntimeParameters)
95+
96+
setup_tracer(RuntimeParameters, options)
9697
if RuntimeParameters.has("CUSTOM_MODEL_WORKERS"):
9798
options.max_workers = RuntimeParameters.get("CUSTOM_MODEL_WORKERS")
9899
runtime.options = options

custom_model_runner/requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,5 @@ datarobot>=3.1.0,<4
2828
opentelemetry-api
2929
opentelemetry-sdk
3030
opentelemetry-exporter-otlp-proto-http
31+
opentelemetry-instrumentation-aiohttp-client
32+
opentelemetry-instrumentation-requests

0 commit comments

Comments
 (0)