Skip to content

Commit d0d6f1a

Browse files
committed
refactor: Inject upload_hook in Instrumentor.
1 parent 97f12c8 commit d0d6f1a

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

instrumentation-genai/opentelemetry-instrumentation-google-genai/src/opentelemetry/instrumentation/google_genai/generate_content.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
InputMessage,
5555
OutputMessage,
5656
)
57-
from opentelemetry.util.genai.upload_hook import load_upload_hook
57+
from opentelemetry.util.genai.upload_hook import UploadHook
5858

5959
from .allowlist_util import AllowList
6060
from .custom_semconv import GCP_GENAI_OPERATION_CONFIG
@@ -290,12 +290,14 @@ def __init__(
290290
models_object: Union[Models, AsyncModels],
291291
otel_wrapper: OTelWrapper,
292292
model: str,
293+
upload_hook: UploadHook,
293294
generate_content_config_key_allowlist: Optional[AllowList] = None,
294295
):
295296
self._start_time = time.time_ns()
296297
self._otel_wrapper = otel_wrapper
297298
self._genai_system = _determine_genai_system(models_object)
298299
self._genai_request_model = model
300+
self.upload_hook = upload_hook
299301
self._finish_reasons_set = set()
300302
self._error_type = None
301303
self._input_tokens = 0
@@ -490,15 +492,13 @@ def _maybe_log_completion_details(
490492
event = Event(
491493
name="gen_ai.client.inference.operation.details", attributes=attributes
492494
)
493-
hook = load_upload_hook()
494-
hook.upload(
495+
self.upload_hook.upload(
495496
inputs=input_messages,
496497
outputs=output_messages,
497498
system_instruction=system_instructions,
498499
span=span,
499500
log_record=event,
500501
)
501-
hook.shutdown()
502502
self._otel_wrapper.log_completion_details(event=event)
503503

504504
def _maybe_log_system_instruction(
@@ -689,6 +689,7 @@ def _record_duration_metric(self):
689689
def _create_instrumented_generate_content(
690690
snapshot: _MethodsSnapshot,
691691
otel_wrapper: OTelWrapper,
692+
upload_hook: UploadHook,
692693
generate_content_config_key_allowlist: Optional[AllowList] = None,
693694
):
694695
wrapped_func = snapshot.generate_content
@@ -706,6 +707,7 @@ def instrumented_generate_content(
706707
self,
707708
otel_wrapper,
708709
model,
710+
upload_hook,
709711
generate_content_config_key_allowlist=generate_content_config_key_allowlist,
710712
)
711713
with helper.start_span_as_current_span(
@@ -746,6 +748,7 @@ def instrumented_generate_content(
746748
def _create_instrumented_generate_content_stream(
747749
snapshot: _MethodsSnapshot,
748750
otel_wrapper: OTelWrapper,
751+
upload_hook: UploadHook,
749752
generate_content_config_key_allowlist: Optional[AllowList] = None,
750753
):
751754
wrapped_func = snapshot.generate_content_stream
@@ -763,6 +766,7 @@ def instrumented_generate_content_stream(
763766
self,
764767
otel_wrapper,
765768
model,
769+
upload_hook,
766770
generate_content_config_key_allowlist=generate_content_config_key_allowlist,
767771
)
768772
with helper.start_span_as_current_span(
@@ -803,6 +807,7 @@ def instrumented_generate_content_stream(
803807
def _create_instrumented_async_generate_content(
804808
snapshot: _MethodsSnapshot,
805809
otel_wrapper: OTelWrapper,
810+
upload_hook: UploadHook,
806811
generate_content_config_key_allowlist: Optional[AllowList] = None,
807812
):
808813
wrapped_func = snapshot.async_generate_content
@@ -820,6 +825,7 @@ async def instrumented_generate_content(
820825
self,
821826
otel_wrapper,
822827
model,
828+
upload_hook,
823829
generate_content_config_key_allowlist=generate_content_config_key_allowlist,
824830
)
825831
with helper.start_span_as_current_span(
@@ -861,6 +867,7 @@ async def instrumented_generate_content(
861867
def _create_instrumented_async_generate_content_stream( # type: ignore
862868
snapshot: _MethodsSnapshot,
863869
otel_wrapper: OTelWrapper,
870+
upload_hook: UploadHook,
864871
generate_content_config_key_allowlist: Optional[AllowList] = None,
865872
):
866873
wrapped_func = snapshot.async_generate_content_stream
@@ -878,6 +885,7 @@ async def instrumented_generate_content_stream(
878885
self,
879886
otel_wrapper,
880887
model,
888+
upload_hook,
881889
generate_content_config_key_allowlist=generate_content_config_key_allowlist,
882890
)
883891
with helper.start_span_as_current_span(
@@ -936,28 +944,33 @@ def uninstrument_generate_content(snapshot: object):
936944

937945
def instrument_generate_content(
938946
otel_wrapper: OTelWrapper,
947+
upload_hook: UploadHook,
939948
generate_content_config_key_allowlist: Optional[AllowList] = None,
940949
) -> object:
941950
snapshot = _MethodsSnapshot()
942951
Models.generate_content = _create_instrumented_generate_content(
943952
snapshot,
944953
otel_wrapper,
954+
upload_hook,
945955
generate_content_config_key_allowlist=generate_content_config_key_allowlist,
946956
)
947957
Models.generate_content_stream = _create_instrumented_generate_content_stream(
948958
snapshot,
949959
otel_wrapper,
960+
upload_hook,
950961
generate_content_config_key_allowlist=generate_content_config_key_allowlist,
951962
)
952963
AsyncModels.generate_content = _create_instrumented_async_generate_content(
953964
snapshot,
954965
otel_wrapper,
966+
upload_hook,
955967
generate_content_config_key_allowlist=generate_content_config_key_allowlist,
956968
)
957969
AsyncModels.generate_content_stream = (
958970
_create_instrumented_async_generate_content_stream(
959971
snapshot,
960972
otel_wrapper,
973+
upload_hook,
961974
generate_content_config_key_allowlist=generate_content_config_key_allowlist,
962975
)
963976
)

instrumentation-genai/opentelemetry-instrumentation-google-genai/src/opentelemetry/instrumentation/google_genai/instrumentor.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
1919
from opentelemetry.metrics import get_meter_provider
2020
from opentelemetry.trace import get_tracer_provider
21+
from opentelemetry.util.genai.upload_hook import load_upload_hook
2122

2223
from .allowlist_util import AllowList
2324
from .generate_content import (
@@ -58,8 +59,10 @@ def _instrument(self, **kwargs: Any):
5859
event_logger_provider=event_logger_provider,
5960
meter_provider=meter_provider,
6061
)
62+
upload_hook = kwargs.get("upload_hook") or load_upload_hook()
6163
self._generate_content_snapshot = instrument_generate_content(
6264
otel_wrapper,
65+
upload_hook,
6366
generate_content_config_key_allowlist=self._generate_content_config_key_allowlist,
6467
)
6568

0 commit comments

Comments
 (0)