diff --git a/packages/opentelemetry-instrumentation-anthropic/opentelemetry/instrumentation/anthropic/__init__.py b/packages/opentelemetry-instrumentation-anthropic/opentelemetry/instrumentation/anthropic/__init__.py index bde6777973..149406a81d 100644 --- a/packages/opentelemetry-instrumentation-anthropic/opentelemetry/instrumentation/anthropic/__init__.py +++ b/packages/opentelemetry-instrumentation-anthropic/opentelemetry/instrumentation/anthropic/__init__.py @@ -29,6 +29,7 @@ LLMRequestTypeValues, SpanAttributes, Meters, + MetricUtils, ) from opentelemetry.trace import SpanKind, Tracer, get_tracer from opentelemetry.trace.status import Status, StatusCode @@ -372,24 +373,8 @@ def wrapper(wrapped, instance, args, kwargs): def _create_metrics(meter: Meter): - token_histogram = meter.create_histogram( - name=Meters.LLM_TOKEN_USAGE, - unit="token", - description="Measures number of input and output tokens used", - ) - - choice_counter = meter.create_counter( - name=Meters.LLM_GENERATION_CHOICES, - unit="choice", - description="Number of choices returned by chat completions call", - ) - - duration_histogram = meter.create_histogram( - name=Meters.LLM_OPERATION_DURATION, - unit="s", - description="GenAI operation duration", - ) - + token_histogram, choice_counter, duration_histogram = MetricUtils.basic_metrics(meter) + exception_counter = meter.create_counter( name=Meters.LLM_ANTHROPIC_COMPLETION_EXCEPTIONS, unit="time", diff --git a/packages/opentelemetry-instrumentation-groq/opentelemetry/instrumentation/groq/__init__.py b/packages/opentelemetry-instrumentation-groq/opentelemetry/instrumentation/groq/__init__.py index 14a0cfd5ba..b3aa7eb3e2 100644 --- a/packages/opentelemetry-instrumentation-groq/opentelemetry/instrumentation/groq/__init__.py +++ b/packages/opentelemetry-instrumentation-groq/opentelemetry/instrumentation/groq/__init__.py @@ -26,6 +26,7 @@ LLMRequestTypeValues, SpanAttributes, Meters, + MetricUtils, ) from opentelemetry.trace import SpanKind, Tracer, get_tracer from opentelemetry.trace.status import Status, StatusCode @@ -245,24 +246,7 @@ def wrapper(wrapped, instance, args, kwargs): def _create_metrics(meter: Meter): - token_histogram = meter.create_histogram( - name=Meters.LLM_TOKEN_USAGE, - unit="token", - description="Measures number of input and output tokens used", - ) - - choice_counter = meter.create_counter( - name=Meters.LLM_GENERATION_CHOICES, - unit="choice", - description="Number of choices returned by chat completions call", - ) - - duration_histogram = meter.create_histogram( - name=Meters.LLM_OPERATION_DURATION, - unit="s", - description="GenAI operation duration", - ) - + token_histogram, choice_counter, duration_histogram = MetricUtils.basic_metrics(meter) return token_histogram, choice_counter, duration_histogram diff --git a/packages/opentelemetry-semantic-conventions-ai/opentelemetry/semconv_ai/__init__.py b/packages/opentelemetry-semantic-conventions-ai/opentelemetry/semconv_ai/__init__.py index 10d074ff2f..c0f96e467c 100644 --- a/packages/opentelemetry-semantic-conventions-ai/opentelemetry/semconv_ai/__init__.py +++ b/packages/opentelemetry-semantic-conventions-ai/opentelemetry/semconv_ai/__init__.py @@ -236,3 +236,26 @@ class TraceloopSpanKindValues(Enum): AGENT = "agent" TOOL = "tool" UNKNOWN = "unknown" + +class MetricUtils: + + def basic_metrics(meter): + token_histogram = meter.create_histogram( + name=Meters.LLM_TOKEN_USAGE, + unit="token", + description="Measures number of input and output tokens used", + ) + + choice_counter = meter.create_counter( + name=Meters.LLM_GENERATION_CHOICES, + unit="choice", + description="Number of choices returned by chat completions call", + ) + + duration_histogram = meter.create_histogram( + name=Meters.LLM_OPERATION_DURATION, + unit="s", + description="GenAI operation duration", + ) + + return token_histogram, choice_counter, duration_histogram