use std::sync::Arc;
pub(crate) const SEMCONV_PIN: &str =
"open-telemetry/semantic-conventions-genai@434c91dcc34ed038e3048c07720ddfed2c6bddfc";
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum UpstreamField {
TraceId,
SpanId,
ParentSpanId,
InstrumentationScopeName,
InstrumentationScopeVersion,
SpanKind,
StatusCode,
McpMethodName,
GenAiOperationName,
GenAiToolName,
JsonRpcRequestId,
McpProtocolVersion,
ErrorType,
RpcResponseStatusCode,
}
impl UpstreamField {
pub(crate) fn upstream_name(self) -> &'static str {
match self {
UpstreamField::TraceId => "traceId",
UpstreamField::SpanId => "spanId",
UpstreamField::ParentSpanId => "parentSpanId",
UpstreamField::InstrumentationScopeName => "scope.name",
UpstreamField::InstrumentationScopeVersion => "scope.version",
UpstreamField::SpanKind => "kind",
UpstreamField::StatusCode => "status.code",
UpstreamField::McpMethodName => "mcp.method.name",
UpstreamField::GenAiOperationName => "gen_ai.operation.name",
UpstreamField::GenAiToolName => "gen_ai.tool.name",
UpstreamField::JsonRpcRequestId => "jsonrpc.request.id",
UpstreamField::McpProtocolVersion => "mcp.protocol.version",
UpstreamField::ErrorType => "error.type",
UpstreamField::RpcResponseStatusCode => "rpc.response.status_code",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum SpanKind {
Unspecified,
Internal,
Server,
Client,
Producer,
Consumer,
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum StatusObservation {
Absent,
Unset,
Ok,
Error,
Unknown,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub(crate) enum MethodObservation {
#[default]
Absent,
ToolsCall,
OtherMethod,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub(crate) enum OperationObservation {
#[default]
Absent,
ExecuteTool,
OtherOperation,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) enum RequestIdObservation {
String(String),
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub(crate) enum ErrorTypeObservation {
#[default]
Absent,
Present(String),
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub(crate) enum RpcResponseStatusObservation {
#[default]
Absent,
Present(String),
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub(crate) enum SpanProtocolVersion {
#[default]
Absent,
Malformed,
PresentSupported(String),
PresentUnsupported(String),
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub(crate) struct InstrumentationScopeObservation {
pub(crate) name: Option<String>,
pub(crate) version: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct McpSpanObservation {
pub(crate) trace_id: String,
pub(crate) span_id: String,
pub(crate) parent_span_id: Option<String>,
pub(crate) instrumentation_scope: Option<Arc<InstrumentationScopeObservation>>,
pub(crate) kind: SpanKind,
pub(crate) method: MethodObservation,
pub(crate) operation: OperationObservation,
pub(crate) tool_name: Option<String>,
pub(crate) request_id: Option<RequestIdObservation>,
pub(crate) protocol_version: SpanProtocolVersion,
pub(crate) status: StatusObservation,
pub(crate) error_type: ErrorTypeObservation,
pub(crate) rpc_response_status: RpcResponseStatusObservation,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct McpResourceSpansObservation {
pub(crate) semconv_pin: &'static str,
pub(crate) spans: Vec<McpSpanObservation>,
}