import os
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk.resources import Resource
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
# Stabil olmayan GenAI semconv için opt-in
os.environ.setdefault("OTEL_SEMCONV_STABILITY_OPT_IN", "gen_ai_latest_experimental")
resource = Resource.create({"service.name": "duzenek-harness"})
provider = TracerProvider(resource=resource)
provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter()))
trace.set_tracer_provider(provider)
tracer = trace.get_tracer("duzenek.harness", "0.1.0")
SESSION_ID = "session-2026-05-18-001"
with tracer.start_as_current_span("session") as session_span:
session_span.set_attribute("gen_ai.conversation.id", SESSION_ID)
session_span.set_attribute("harness.session.id", SESSION_ID)
with tracer.start_as_current_span("chat claude-sonnet-4-7") as feature_span:
feature_span.set_attribute("gen_ai.operation.name", "chat")
feature_span.set_attribute("gen_ai.provider.name", "anthropic")
feature_span.set_attribute("gen_ai.request.model", "claude-sonnet-4-7")
feature_span.set_attribute("gen_ai.request.temperature", 0.2)
feature_span.set_attribute("gen_ai.request.max_tokens", 4096)
feature_span.set_attribute("gen_ai.response.model", "claude-sonnet-4-7")
feature_span.set_attribute("gen_ai.response.finish_reasons", ["stop"])
feature_span.set_attribute("gen_ai.usage.input_tokens", 1842)
feature_span.set_attribute("gen_ai.usage.output_tokens", 612)
feature_span.set_attribute("harness.feature.id", "F03-cart-items")
with tracer.start_as_current_span("verify e2e") as verify_span:
verify_span.set_attribute("harness.verify.step", "e2e")
verify_span.set_attribute("harness.verify.status", "pass")
verify_span.set_attribute("harness.verify.retry_count", 1)