mirror of
https://github.com/hoshikawa2/nemo_guardrails_configuration.git
synced 2026-07-09 17:04:20 +00:00
Langfuse
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
64
final_pkg/company_nemo_guardrails/tracing_opentelemetry.py
Normal file
64
final_pkg/company_nemo_guardrails/tracing_opentelemetry.py
Normal 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
|
||||||
Reference in New Issue
Block a user