Skip to content

Commit c5c54ac

Browse files
committed
Add start time for invocations
Change-Id: Ib457bdf92d0dbe92237f632473b7a3f3ab3233b9 Co-developed-by: Cursor <[email protected]>
1 parent 74f3409 commit c5c54ac

File tree

8 files changed

+44
-3
lines changed

8 files changed

+44
-3
lines changed

instrumentation-loongsuite/loongsuite-instrumentation-dashscope/examples/basic_example.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
import os
1414

1515
from dashscope import Generation, TextEmbedding
16-
from opentelemetry.instrumentation.dashscope import DashScopeInstrumentor
1716

1817
from opentelemetry import trace
18+
from opentelemetry.instrumentation.dashscope import DashScopeInstrumentor
1919
from opentelemetry.sdk.trace import TracerProvider
2020
from opentelemetry.sdk.trace.export import (
2121
ConsoleSpanExporter,

instrumentation-loongsuite/loongsuite-instrumentation-dashscope/tests/conftest.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,11 @@
1212
if "DASHSCOPE_API_KEY" not in os.environ:
1313
os.environ["DASHSCOPE_API_KEY"] = "test_dashscope_api_key"
1414

15-
from opentelemetry.instrumentation.dashscope import DashScopeInstrumentor
16-
1715
from opentelemetry.instrumentation._semconv import (
1816
OTEL_SEMCONV_STABILITY_OPT_IN,
1917
_OpenTelemetrySemanticConventionStability,
2018
)
19+
from opentelemetry.instrumentation.dashscope import DashScopeInstrumentor
2120
from opentelemetry.sdk.trace import TracerProvider
2221
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
2322
from opentelemetry.sdk.trace.export.in_memory_span_exporter import (

util/opentelemetry-util-genai/src/opentelemetry/util/genai/_extended_memory/memory_types.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,4 @@ class MemoryInvocation:
5757
# Server information
5858
server_address: str | None = None
5959
server_port: int | None = None
60+
monotonic_start_s: float | None = None

util/opentelemetry-util-genai/src/opentelemetry/util/genai/_extended_memory/memory_utils.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@
3737
from opentelemetry.util.genai._extended_memory.memory_types import (
3838
MemoryInvocation,
3939
)
40+
from opentelemetry.util.genai._extended_semconv.gen_ai_extended_attributes import (
41+
GEN_AI_SPAN_KIND,
42+
GenAiSpanKindValues,
43+
)
4044
from opentelemetry.util.genai._extended_semconv.gen_ai_memory_attributes import (
4145
GEN_AI_MEMORY_AGENT_ID,
4246
GEN_AI_MEMORY_APP_ID,
@@ -193,6 +197,8 @@ def _apply_memory_finish_attributes(
193197
else:
194198
span.update_name("memory_operation")
195199

200+
span.set_attribute(GEN_AI_SPAN_KIND, GenAiSpanKindValues.MEMORY.value)
201+
196202
# Build all attributes
197203
attributes: dict[str, Any] = {}
198204
attributes.update(_get_memory_common_attributes(invocation))

util/opentelemetry-util-genai/src/opentelemetry/util/genai/_extended_semconv/gen_ai_extended_attributes.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ class GenAiSpanKindValues(Enum):
134134
RERANKER = "RERANKER"
135135
"""Document reranking operation."""
136136

137+
MEMORY = "MEMORY"
138+
"""Memory operation."""
139+
137140

138141
class GenAiExtendedOperationNameValues(Enum):
139142
RETRIEVE_DOCUMENTS = "retrieve_documents"

util/opentelemetry-util-genai/src/opentelemetry/util/genai/extended_handler.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363

6464
from __future__ import annotations
6565

66+
import timeit
6667
from contextlib import contextmanager
6768
from typing import Iterator, Optional
6869

@@ -150,6 +151,9 @@ def start_create_agent(
150151
name=span_name,
151152
kind=SpanKind.CLIENT,
152153
)
154+
# Record a monotonic start timestamp (seconds) for duration
155+
# calculation using timeit.default_timer.
156+
invocation.monotonic_start_s = timeit.default_timer()
153157
invocation.span = span
154158
invocation.context_token = otel_context.attach(
155159
set_span_in_context(span)
@@ -224,6 +228,9 @@ def start_embedding(
224228
name=f"{GenAI.GenAiOperationNameValues.EMBEDDINGS.value} {invocation.request_model}",
225229
kind=SpanKind.CLIENT,
226230
)
231+
# Record a monotonic start timestamp (seconds) for duration
232+
# calculation using timeit.default_timer.
233+
invocation.monotonic_start_s = timeit.default_timer()
227234
invocation.span = span
228235
invocation.context_token = otel_context.attach(
229236
set_span_in_context(span)
@@ -298,6 +305,9 @@ def start_execute_tool(
298305
name=f"{GenAI.GenAiOperationNameValues.EXECUTE_TOOL.value} {invocation.tool_name}",
299306
kind=SpanKind.INTERNAL,
300307
)
308+
# Record a monotonic start timestamp (seconds) for duration
309+
# calculation using timeit.default_timer.
310+
invocation.monotonic_start_s = timeit.default_timer()
301311
invocation.span = span
302312
invocation.context_token = otel_context.attach(
303313
set_span_in_context(span)
@@ -379,6 +389,9 @@ def start_invoke_agent(
379389
name=span_name,
380390
kind=SpanKind.INTERNAL,
381391
)
392+
# Record a monotonic start timestamp (seconds) for duration
393+
# calculation using timeit.default_timer.
394+
invocation.monotonic_start_s = timeit.default_timer()
382395
invocation.span = span
383396
invocation.context_token = otel_context.attach(
384397
set_span_in_context(span)
@@ -458,6 +471,9 @@ def start_retrieve(
458471
name="retrieve_documents",
459472
kind=SpanKind.INTERNAL,
460473
)
474+
# Record a monotonic start timestamp (seconds) for duration
475+
# calculation using timeit.default_timer.
476+
invocation.monotonic_start_s = timeit.default_timer()
461477
invocation.span = span
462478
invocation.context_token = otel_context.attach(
463479
set_span_in_context(span)
@@ -530,6 +546,9 @@ def start_rerank(self, invocation: RerankInvocation) -> RerankInvocation:
530546
name="rerank_documents",
531547
kind=SpanKind.INTERNAL,
532548
)
549+
# Record a monotonic start timestamp (seconds) for duration
550+
# calculation using timeit.default_timer.
551+
invocation.monotonic_start_s = timeit.default_timer()
533552
invocation.span = span
534553
invocation.context_token = otel_context.attach(
535554
set_span_in_context(span)
@@ -603,6 +622,9 @@ def start_memory(self, invocation: MemoryInvocation) -> MemoryInvocation:
603622
name=span_name,
604623
kind=SpanKind.CLIENT,
605624
)
625+
# Record a monotonic start timestamp (seconds) for duration
626+
# calculation using timeit.default_timer.
627+
invocation.monotonic_start_s = timeit.default_timer()
606628
invocation.span = span
607629
invocation.context_token = otel_context.attach(
608630
set_span_in_context(span)

util/opentelemetry-util-genai/src/opentelemetry/util/genai/extended_metrics.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
from typing import Optional, Union
2929

3030
from opentelemetry.trace import Span
31+
from opentelemetry.util.genai._extended_memory.memory_types import (
32+
MemoryInvocation,
33+
)
3134
from opentelemetry.util.genai.extended_types import (
3235
CreateAgentInvocation,
3336
EmbeddingInvocation,
@@ -68,6 +71,7 @@ def record_extended(
6871
CreateAgentInvocation,
6972
RetrieveInvocation,
7073
RerankInvocation,
74+
MemoryInvocation,
7175
],
7276
*,
7377
error_type: Optional[str] = None,

util/opentelemetry-util-genai/src/opentelemetry/util/genai/extended_types.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class EmbeddingInvocation:
8282
encoding_formats: List[str] | None = None
8383
server_address: str | None = None
8484
server_port: int | None = None
85+
monotonic_start_s: float | None = None
8586

8687

8788
@dataclass
@@ -103,6 +104,7 @@ class ExecuteToolInvocation:
103104
tool_type: str | None = None # function, extension, datastore
104105
tool_call_arguments: Any = None
105106
tool_call_result: Any = None
107+
monotonic_start_s: float | None = None
106108

107109

108110
@dataclass
@@ -125,6 +127,7 @@ class CreateAgentInvocation:
125127
# Server information
126128
server_address: str | None = None
127129
server_port: int | None = None
130+
monotonic_start_s: float | None = None
128131

129132

130133
@dataclass
@@ -176,6 +179,7 @@ class InvokeAgentInvocation:
176179
# Server information
177180
server_address: str | None = None
178181
server_port: int | None = None
182+
monotonic_start_s: float | None = None
179183

180184

181185
@dataclass
@@ -196,6 +200,7 @@ class RetrieveInvocation:
196200
)
197201
server_address: str | None = None
198202
server_port: int | None = None
203+
monotonic_start_s: float | None = None
199204

200205

201206
@dataclass
@@ -229,3 +234,4 @@ class RerankInvocation:
229234
output_documents: Any = (
230235
None # gen_ai.rerank.output_documents (optional, sensitive)
231236
)
237+
monotonic_start_s: float | None = None

0 commit comments

Comments
 (0)