Skip to content

Commit 5804600

Browse files
sg263shige
andauthored
merge 2.0.2 into 2.0.3 (#2917)
Co-authored-by: shige <shige@baidu.com>
1 parent 4dbc483 commit 5804600

File tree

5 files changed

+107
-34
lines changed

5 files changed

+107
-34
lines changed

fastdeploy/engine/engine.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ class LLMEngine(object):
5858
Attributes:
5959
cfg (Config): Configuration object containing all the parameters.
6060
cached_generated_tokens (queue.Queue): Queue to store generated tokens.
61-
cached_generated_tokens (queue.Queue): Queue to store generated tokens.
6261
scheduler (LocalScheduler or GlobalScheduler): Scheduling tasks.
6362
input_processor (InputPreprocessor): Preprocessor for input data.
6463
resource_manager (ResourceManager): Manager for resource allocation.

fastdeploy/entrypoints/openai/api_server.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from fastapi import FastAPI, Request
2525
from fastapi.responses import JSONResponse, Response, StreamingResponse
2626
from prometheus_client import CONTENT_TYPE_LATEST
27-
from fastdeploy.metrics.trace_util import inject_to_metadata
27+
from fastdeploy.metrics.trace_util import inject_to_metadata,instrument
2828

2929
from fastdeploy.engine.args_utils import EngineArgs
3030
from fastdeploy.engine.engine import LLMEngine
@@ -141,6 +141,7 @@ async def lifespan(app: FastAPI):
141141

142142

143143
app = FastAPI(lifespan=lifespan)
144+
instrument(app)
144145

145146

146147
# TODO 传递真实引擎值 通过pid 获取状态
@@ -397,11 +398,6 @@ def launch_controller_server():
397398
"""Controller server running the sub thread"""
398399
if args.controller_port < 0:
399400
return
400-
401-
if not is_port_available(args.host, args.controller_port):
402-
raise Exception(
403-
f"The parameter `controller_port`:{args.controller_port} is already in use."
404-
)
405401

406402
if not is_port_available(args.host, args.controller_port):
407403
raise Exception(

fastdeploy/envs.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,30 @@
105105
# Whether to use aggregate send.
106106
"FD_USE_AGGREGATE_SEND":
107107
lambda: bool(int(os.getenv("FD_USE_AGGREGATE_SEND", "0"))),
108+
109+
# Whether to open Trace.
110+
"TRACES_ENABLE":
111+
lambda: os.getenv("TRACES_ENABLE", "false"),
112+
113+
# set traec Server name.
114+
"FD_SERVICE_NAME":
115+
lambda: os.getenv("FD_SERVICE_NAME", "FastDeploy"),
116+
117+
# set traec host name.
118+
"FD_HOST_NAME":
119+
lambda: os.getenv("FD_HOST_NAME", "localhost"),
120+
121+
# set traec exporter.
122+
"TRACES_EXPORTER":
123+
lambda: os.getenv("TRACES_EXPORTER", "console"),
124+
125+
# set traec exporter_otlp_endpoint.
126+
"EXPORTER_OTLP_ENDPOINT":
127+
lambda: os.getenv("EXPORTER_OTLP_ENDPOINT"),
128+
129+
# set traec exporter_otlp_headers.
130+
"EXPORTER_OTLP_HEADERS":
131+
lambda: os.getenv("EXPORTER_OTLP_HEADERS"),
108132
}
109133

110134

fastdeploy/metrics/trace_util.py

Lines changed: 80 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,83 @@
11
from opentelemetry.propagate import inject, extract
22
from opentelemetry import trace
3-
3+
from opentelemetry.sdk.trace import TracerProvider
4+
from opentelemetry.sdk.trace.export import BatchSpanProcessor
5+
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
6+
from opentelemetry.sdk.trace.export import ConsoleSpanExporter
7+
from opentelemetry.sdk.resources import Resource
8+
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
9+
from fastapi import FastAPI
10+
from fastdeploy.utils import (llm_logger)
11+
from fastdeploy import envs
412
import json
5-
import os
613

7-
# create global OpenTelemetry tracer
8-
tracer = trace.get_tracer(__name__)
914

1015
# OpenTelemetry Trace context store in metadata
1116
TRACE_CARRIER = "trace_carrier"
1217

18+
traces_enable = False
19+
tracer = trace.get_tracer(__name__)
20+
21+
def set_up():
22+
try:
23+
# when TRACES_ENABLED=true start trace
24+
global traces_enable
25+
traces_enable = envs.TRACES_ENABLE.lower() == "true"
26+
if not traces_enable:
27+
llm_logger.warning("Opentelemetry is DISABLED.")
28+
return
29+
30+
llm_logger.info("Opentelemetry is ENABLED, configuring...")
31+
# --- read env ---
32+
service_name = envs.FD_SERVICE_NAME
33+
host_name = envs.FD_HOST_NAME
34+
# --- set attributes (Service Name, Host Name, etc.) ---
35+
resource_attributes = {
36+
"service.name": service_name
37+
}
38+
if host_name:
39+
resource_attributes["host.name"] = host_name
40+
41+
resource = Resource(attributes=resource_attributes)
42+
43+
# --- set Exporter ---
44+
exporter_type = envs.TRACES_EXPORTER.lower()
45+
if exporter_type == "otlp":
46+
endpoint = envs.EXPORTER_OTLP_ENDPOINT # should be set
47+
headers = envs.EXPORTER_OTLP_HEADERS # e.g., "Authentication=***,k2=v2"
48+
49+
otlp_exporter = OTLPSpanExporter(
50+
endpoint=endpoint,
51+
headers=dict(item.split("=") for item in headers.split(",")) if headers else None
52+
)
53+
processor = BatchSpanProcessor(otlp_exporter)
54+
llm_logger.info(f"Using OTLP Exporter, sending to {endpoint} with headers {headers}")
55+
else: # default console
56+
processor = BatchSpanProcessor(ConsoleSpanExporter())
57+
llm_logger.info("Using Console Exporter.")
58+
59+
# --- set Tracer Provider ---
60+
provider = TracerProvider(resource=resource)
61+
provider.add_span_processor(processor)
62+
trace.set_tracer_provider(provider)
63+
global tracer
64+
tracer = trace.get_tracer(__name__)
65+
except:
66+
llm_logger.error("set_up failed")
67+
pass
68+
69+
def instrument(app: FastAPI):
70+
try:
71+
set_up()
72+
if traces_enable:
73+
llm_logger.info("Applying instrumentors...")
74+
FastAPIInstrumentor.instrument_app(app)
75+
except:
76+
llm_logger.info("instrument failed")
77+
pass
78+
79+
80+
1381
def inject_to_metadata(request, metadata_attr='metadata'):
1482
"""
1583
Inject OpenTelemetry trace context into the metadata field of the request.
@@ -28,9 +96,7 @@ def inject_to_metadata(request, metadata_attr='metadata'):
2896
- If there is no metadata attribute in the request, an empty dict will be created for it as its attribute
2997
"""
3098
try:
31-
if request is None:
32-
return
33-
if is_opentelemetry_instrumented() == False:
99+
if request is None or traces_enable == False:
34100
return
35101

36102
metadata = request.get(metadata_attr) if isinstance(request, dict) else getattr(request, metadata_attr, None)
@@ -48,6 +114,7 @@ def inject_to_metadata(request, metadata_attr='metadata'):
48114
except:
49115
pass
50116

117+
51118
def extract_from_metadata(request, metadata_attr='metadata'):
52119
"""
53120
Extract trace context from metadata of request object (dict or class instance).
@@ -74,7 +141,7 @@ def extract_from_metadata(request, metadata_attr='metadata'):
74141
return ctx
75142
except:
76143
return None
77-
144+
78145

79146
def extract_from_request(request):
80147
"""
@@ -100,12 +167,13 @@ def extract_from_request(request):
100167
except:
101168
return None
102169

170+
103171
def start_span(span_name, request, kind=trace.SpanKind.CLIENT):
104172
"""
105173
just start a new span in request trace context
106174
"""
107175
try:
108-
if is_opentelemetry_instrumented() == False:
176+
if not traces_enable:
109177
return
110178
# extract Trace context from request.metadata.trace_carrier
111179
ctx = extract_from_metadata(request)
@@ -114,31 +182,17 @@ def start_span(span_name, request, kind=trace.SpanKind.CLIENT):
114182
except:
115183
pass
116184

185+
117186
def start_span_request(span_name, request, kind=trace.SpanKind.CLIENT):
118187
"""
119188
just start a new span in request trace context
120189
"""
121190
try:
122-
if is_opentelemetry_instrumented() == False:
191+
if not traces_enable:
123192
return
124193
# extract Trace context from request.metadata.trace_carrier
125194
ctx = extract_from_request(request)
126195
with tracer.start_as_current_span(span_name, context=ctx, kind=kind) as span:
127196
pass
128197
except:
129-
pass
130-
131-
def is_opentelemetry_instrumented() -> bool:
132-
"""
133-
check OpenTelemetry is start or not
134-
"""
135-
try:
136-
return (
137-
os.getenv("OTEL_PYTHONE_DISABLED_INSTRUMENTATIONS") is not None
138-
or os.getenv("OTEL_SERVICE_NAME") is not None
139-
or os.getenv("OTEL_TRACES_EXPORTER") is not None
140-
)
141-
except Exception:
142-
return False
143-
144-
198+
pass

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,4 @@ opentelemetry-instrumentation-redis
3636
opentelemetry-instrumentation-mysql
3737
opentelemetry-distro 
3838
opentelemetry-exporter-otlp
39-
39+
opentelemetry-instrumentation-fastapi

0 commit comments

Comments
 (0)