diff --git a/final_pkg/company_nemo_guardrails/env.variables b/final_pkg/company_nemo_guardrails/env.variables index 85d31f5..6e84155 100644 --- a/final_pkg/company_nemo_guardrails/env.variables +++ b/final_pkg/company_nemo_guardrails/env.variables @@ -5,9 +5,12 @@ OPENAI_API_KEY=dummy OPENAI_MODEL=gpt-5 # Tracing / Phoenix / OpenTelemetry -OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:6006/v1/traces -OTEL_SERVICE_NAME=nemo-guardrails-demo -ENABLE_TRACING=true +export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:8087/api/public/otel/v1/traces +export OTEL_SERVICE_NAME=nemo-guardrails-demo +export ENABLE_TRACING=true +export LANGFUSE_SECRET_KEY="sk-lf-0bb4d15d-6101-4874-991b-68780cf7b748" +export LANGFUSE_PUBLIC_KEY="pk-lf-1b51d3b4-af8d-4b8b-8ac4-e81e6006123f" +export LANGFUSE_BASE_URL="http://localhost:8087" # Modo demo: usa cliente fake se o proxy não estiver disponível USE_MOCK_LLM=false diff --git a/nemo_guardrails_tracing_project/env.variables b/nemo_guardrails_tracing_project/env.variables index 85d31f5..6e84155 100644 --- a/nemo_guardrails_tracing_project/env.variables +++ b/nemo_guardrails_tracing_project/env.variables @@ -5,9 +5,12 @@ OPENAI_API_KEY=dummy OPENAI_MODEL=gpt-5 # Tracing / Phoenix / OpenTelemetry -OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:6006/v1/traces -OTEL_SERVICE_NAME=nemo-guardrails-demo -ENABLE_TRACING=true +export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:8087/api/public/otel/v1/traces +export OTEL_SERVICE_NAME=nemo-guardrails-demo +export ENABLE_TRACING=true +export LANGFUSE_SECRET_KEY="sk-lf-0bb4d15d-6101-4874-991b-68780cf7b748" +export LANGFUSE_PUBLIC_KEY="pk-lf-1b51d3b4-af8d-4b8b-8ac4-e81e6006123f" +export LANGFUSE_BASE_URL="http://localhost:8087" # Modo demo: usa cliente fake se o proxy não estiver disponível USE_MOCK_LLM=false diff --git a/nemo_guardrails_tracing_project/src/tracing.py b/nemo_guardrails_tracing_project/src/tracing.py index 849a619..51d3b92 100644 --- a/nemo_guardrails_tracing_project/src/tracing.py +++ b/nemo_guardrails_tracing_project/src/tracing.py @@ -1,64 +1,142 @@ import os +import base64 + from contextlib import contextmanager -_TRACING_ENABLED = os.getenv("ENABLE_TRACING", "false").lower() == "true" +_TRACING_ENABLED = os.getenv( + "ENABLE_TRACING", + "false" +).lower() == "true" tracer = None if _TRACING_ENABLED: + try: + from opentelemetry import trace - from opentelemetry.sdk.trace import TracerProvider - from opentelemetry.sdk.resources import Resource - from opentelemetry.sdk.trace.export import BatchSpanProcessor - from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter + + from opentelemetry.sdk.trace import ( + TracerProvider + ) + + from opentelemetry.sdk.resources import ( + Resource + ) + + from opentelemetry.sdk.trace.export import ( + BatchSpanProcessor + ) + + from opentelemetry.exporter.otlp.proto.http.trace_exporter import ( + OTLPSpanExporter + ) endpoint = os.getenv( "OTEL_EXPORTER_OTLP_ENDPOINT", - "http://localhost:6006/v1/traces" + "http://localhost:8087/api/public/otel/v1/traces" ) - # ✅ Define metadata do serviço (IMPORTANTE pro Phoenix) + # ----------------------------------- + # LANGFUSE AUTH + # ----------------------------------- + + public_key = os.getenv( + "LANGFUSE_PUBLIC_KEY" + ) + + secret_key = os.getenv( + "LANGFUSE_SECRET_KEY" + ) + + headers = {} + + if public_key and secret_key: + + auth = base64.b64encode( + f"{public_key}:{secret_key}".encode() + ).decode() + + headers["Authorization"] = ( + f"Basic {auth}" + ) + + # ----------------------------------- + # RESOURCE + # ----------------------------------- + resource = Resource.create({ - "service.name": "nemo_guardrails_governed_project" + "service.name": + "nemo_guardrails_governed_project" }) - provider = TracerProvider(resource=resource) + provider = TracerProvider( + resource=resource + ) exporter = OTLPSpanExporter( endpoint=endpoint, - timeout=5 # evita travamentos + headers=headers, + timeout=5 ) - span_processor = BatchSpanProcessor(exporter) - provider.add_span_processor(span_processor) + span_processor = BatchSpanProcessor( + exporter + ) - # ✅ Evita sobrescrever provider existente - if not isinstance(trace.get_tracer_provider(), TracerProvider): + provider.add_span_processor( + span_processor + ) + + if not isinstance( + trace.get_tracer_provider(), + TracerProvider + ): trace.set_tracer_provider(provider) tracer = trace.get_tracer(__name__) + print( + f"[Tracing Enabled] endpoint={endpoint}" + ) + except Exception as e: - print(f"[Tracing Disabled] Error initializing tracing: {e}") + + print( + f"[Tracing Disabled] Error: {e}" + ) + tracer = None @contextmanager def span(name: str, **attrs): + if tracer is None: yield None return try: + with tracer.start_as_current_span(name) as sp: + for k, v in attrs.items(): - # ✅ mantém tipo quando possível - if isinstance(v, (str, int, float, bool)): + + if isinstance( + v, + (str, int, float, bool) + ): sp.set_attribute(k, v) + else: sp.set_attribute(k, str(v)) + yield sp + except Exception as e: - print(f"[Tracing Error] Span '{name}' failed: {e}") - yield None \ No newline at end of file + + print( + f"[Tracing Error] Span '{name}' failed: {e}" + ) + + yield None diff --git a/nemo_guardrails_tracing_project/src/tracing_langfuse.py b/nemo_guardrails_tracing_project/src/tracing_langfuse.py index 38e501e..51d3b92 100644 --- a/nemo_guardrails_tracing_project/src/tracing_langfuse.py +++ b/nemo_guardrails_tracing_project/src/tracing_langfuse.py @@ -34,7 +34,7 @@ if _TRACING_ENABLED: endpoint = os.getenv( "OTEL_EXPORTER_OTLP_ENDPOINT", - "http://localhost:6006/v1/traces" + "http://localhost:8087/api/public/otel/v1/traces" ) # ----------------------------------- @@ -139,4 +139,4 @@ def span(name: str, **attrs): f"[Tracing Error] Span '{name}' failed: {e}" ) - yield None \ No newline at end of file + yield None diff --git a/nemo_guardrails_tracing_project/src/tracing_opentelemetry.py b/nemo_guardrails_tracing_project/src/tracing_opentelemetry.py new file mode 100644 index 0000000..849a619 --- /dev/null +++ b/nemo_guardrails_tracing_project/src/tracing_opentelemetry.py @@ -0,0 +1,64 @@ +import os +from contextlib import contextmanager + +_TRACING_ENABLED = os.getenv("ENABLE_TRACING", "false").lower() == "true" + +tracer = None + +if _TRACING_ENABLED: + try: + from opentelemetry import trace + from opentelemetry.sdk.trace import TracerProvider + from opentelemetry.sdk.resources import Resource + from opentelemetry.sdk.trace.export import BatchSpanProcessor + from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter + + endpoint = os.getenv( + "OTEL_EXPORTER_OTLP_ENDPOINT", + "http://localhost:6006/v1/traces" + ) + + # ✅ Define metadata do serviço (IMPORTANTE pro Phoenix) + resource = Resource.create({ + "service.name": "nemo_guardrails_governed_project" + }) + + provider = TracerProvider(resource=resource) + + exporter = OTLPSpanExporter( + endpoint=endpoint, + timeout=5 # evita travamentos + ) + + span_processor = BatchSpanProcessor(exporter) + provider.add_span_processor(span_processor) + + # ✅ Evita sobrescrever provider existente + if not isinstance(trace.get_tracer_provider(), TracerProvider): + trace.set_tracer_provider(provider) + + tracer = trace.get_tracer(__name__) + + except Exception as e: + print(f"[Tracing Disabled] Error initializing tracing: {e}") + tracer = None + + +@contextmanager +def span(name: str, **attrs): + if tracer is None: + yield None + return + + try: + with tracer.start_as_current_span(name) as sp: + for k, v in attrs.items(): + # ✅ mantém tipo quando possível + if isinstance(v, (str, int, float, bool)): + sp.set_attribute(k, v) + else: + sp.set_attribute(k, str(v)) + yield sp + except Exception as e: + print(f"[Tracing Error] Span '{name}' failed: {e}") + yield None \ No newline at end of file