This commit is contained in:
2026-05-08 00:37:24 -03:00
parent dc58e8c19b
commit 0237fff63c
3 changed files with 163 additions and 21 deletions

View File

@@ -1,64 +1,142 @@
import os import os
import base64
from contextlib import contextmanager from contextlib import contextmanager
_TRACING_ENABLED = os.getenv("ENABLE_TRACING", "false").lower() == "true" _TRACING_ENABLED = os.getenv(
"ENABLE_TRACING",
"false"
).lower() == "true"
tracer = None tracer = None
if _TRACING_ENABLED: if _TRACING_ENABLED:
try: try:
from opentelemetry import trace from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import (
from opentelemetry.sdk.trace.export import BatchSpanProcessor TracerProvider
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter )
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( endpoint = os.getenv(
"OTEL_EXPORTER_OTLP_ENDPOINT", "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({ 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( exporter = OTLPSpanExporter(
endpoint=endpoint, endpoint=endpoint,
timeout=5 # evita travamentos headers=headers,
timeout=5
) )
span_processor = BatchSpanProcessor(exporter) span_processor = BatchSpanProcessor(
provider.add_span_processor(span_processor) exporter
)
# ✅ Evita sobrescrever provider existente provider.add_span_processor(
if not isinstance(trace.get_tracer_provider(), TracerProvider): span_processor
)
if not isinstance(
trace.get_tracer_provider(),
TracerProvider
):
trace.set_tracer_provider(provider) trace.set_tracer_provider(provider)
tracer = trace.get_tracer(__name__) tracer = trace.get_tracer(__name__)
print(
f"[Tracing Enabled] endpoint={endpoint}"
)
except Exception as e: except Exception as e:
print(f"[Tracing Disabled] Error initializing tracing: {e}")
print(
f"[Tracing Disabled] Error: {e}"
)
tracer = None tracer = None
@contextmanager @contextmanager
def span(name: str, **attrs): def span(name: str, **attrs):
if tracer is None: if tracer is None:
yield None yield None
return return
try: try:
with tracer.start_as_current_span(name) as sp: with tracer.start_as_current_span(name) as sp:
for k, v in attrs.items(): 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) sp.set_attribute(k, v)
else: else:
sp.set_attribute(k, str(v)) sp.set_attribute(k, str(v))
yield sp yield sp
except Exception as e: except Exception as e:
print(f"[Tracing Error] Span '{name}' failed: {e}")
yield None print(
f"[Tracing Error] Span '{name}' failed: {e}"
)
yield None

View File

@@ -34,7 +34,7 @@ if _TRACING_ENABLED:
endpoint = os.getenv( endpoint = os.getenv(
"OTEL_EXPORTER_OTLP_ENDPOINT", "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}" f"[Tracing Error] Span '{name}' failed: {e}"
) )
yield None yield None

View File

@@ -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