Tracing mit benutzerdefiniertem OpenTelemetry Collector#

Autor(en):  Avatar AvatarAuf GitHub öffnen

In bestimmten Szenarien möchten Sie möglicherweise Ihren eigenen OpenTelemetry Collector verwenden und Ihre Abhängigkeiten minimieren.

In diesem Fall können Sie die Abhängigkeit von promptflow-devkit, das den Standard-Collector von Promptflow bereitstellt, vermeiden und nur von promptflow-tracing abhängig sein.

Lernziele - Nach Abschluss dieses Tutorials sollten Sie in der Lage sein:

  • LLM-Aufrufe (OpenAI) mit benutzerdefiniertem OpenTelemetry Collector verfolgen.

0. Abhängige Pakete installieren#

%%capture --no-stderr
%pip install -r ./requirements.txt

1. Richten Sie einen OpenTelemetry Collector ein#

Implementieren Sie einen einfachen Collector, der die Traces auf der Standardausgabe ausgibt.

import threading
from http.server import BaseHTTPRequestHandler, HTTPServer

from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import (
    ExportTraceServiceRequest,
)


class OTLPCollector(BaseHTTPRequestHandler):
    def do_POST(self):
        content_length = int(self.headers["Content-Length"])
        post_data = self.rfile.read(content_length)

        traces_request = ExportTraceServiceRequest()
        traces_request.ParseFromString(post_data)

        print("Received a POST request with data:")
        print(traces_request)

        self.send_response(200, "Traces received")
        self.end_headers()
        self.wfile.write(b"Data received and printed to stdout.\n")


def run_server(port: int):
    server_address = ("", port)
    httpd = HTTPServer(server_address, OTLPCollector)
    httpd.serve_forever()


def start_server(port: int):
    server_thread = threading.Thread(target=run_server, args=(port,))
    server_thread.daemon = True
    server_thread.start()
    print(f"Server started on port {port}. Access https://:{port}/")
    return server_thread
# invoke the collector service, serving on OTLP port
start_server(port=4318)

2. Verfolgen Sie Ihre Anwendung mit Tracing#

Angenommen, wir haben bereits eine Python-Funktion, die die OpenAI-API aufruft

from llm import my_llm_tool

deployment_name = "gpt-35-turbo-16k"

Rufen Sie start_trace() auf und konfigurieren Sie den OTLP-Exporter für den oben genannten Collector.

from promptflow.tracing import start_trace

start_trace()
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace.export import BatchSpanProcessor

tracer_provider = trace.get_tracer_provider()
otlp_span_exporter = OTLPSpanExporter()
tracer_provider.add_span_processor(BatchSpanProcessor(otlp_span_exporter))

Visualisieren Sie Traces auf der Standardausgabe.

result = my_llm_tool(
    prompt="Write a simple Hello, world! python program that displays the greeting message. Output code only.",
    deployment_name=deployment_name,
)
result
# view the traces under this cell