SGLang Tracing: Supports propagating trace headers through sgl.Engine… (#15814)
Signed-off-by: Feng Su <sufeng@linux.alibaba.com>
This commit is contained in:
@@ -230,6 +230,7 @@ class Engine(EngineBase):
|
|||||||
bootstrap_port: Optional[Union[List[int], int]] = None,
|
bootstrap_port: Optional[Union[List[int], int]] = None,
|
||||||
bootstrap_room: Optional[Union[List[int], int]] = None,
|
bootstrap_room: Optional[Union[List[int], int]] = None,
|
||||||
data_parallel_rank: Optional[int] = None,
|
data_parallel_rank: Optional[int] = None,
|
||||||
|
external_trace_header: Optional[Dict] = None,
|
||||||
rid: Optional[Union[List[str], str]] = None,
|
rid: Optional[Union[List[str], str]] = None,
|
||||||
) -> Union[Dict, Iterator[Dict]]:
|
) -> Union[Dict, Iterator[Dict]]:
|
||||||
"""
|
"""
|
||||||
@@ -266,6 +267,7 @@ class Engine(EngineBase):
|
|||||||
bootstrap_port=bootstrap_port,
|
bootstrap_port=bootstrap_port,
|
||||||
bootstrap_room=bootstrap_room,
|
bootstrap_room=bootstrap_room,
|
||||||
data_parallel_rank=data_parallel_rank,
|
data_parallel_rank=data_parallel_rank,
|
||||||
|
external_trace_header=external_trace_header,
|
||||||
rid=rid,
|
rid=rid,
|
||||||
)
|
)
|
||||||
generator = self.tokenizer_manager.generate_request(obj, None)
|
generator = self.tokenizer_manager.generate_request(obj, None)
|
||||||
@@ -315,6 +317,7 @@ class Engine(EngineBase):
|
|||||||
bootstrap_port: Optional[Union[List[int], int]] = None,
|
bootstrap_port: Optional[Union[List[int], int]] = None,
|
||||||
bootstrap_room: Optional[Union[List[int], int]] = None,
|
bootstrap_room: Optional[Union[List[int], int]] = None,
|
||||||
data_parallel_rank: Optional[int] = None,
|
data_parallel_rank: Optional[int] = None,
|
||||||
|
external_trace_header: Optional[Dict] = None,
|
||||||
rid: Optional[Union[List[str], str]] = None,
|
rid: Optional[Union[List[str], str]] = None,
|
||||||
) -> Union[Dict, AsyncIterator[Dict]]:
|
) -> Union[Dict, AsyncIterator[Dict]]:
|
||||||
"""
|
"""
|
||||||
@@ -352,6 +355,7 @@ class Engine(EngineBase):
|
|||||||
bootstrap_port=bootstrap_port,
|
bootstrap_port=bootstrap_port,
|
||||||
bootstrap_room=bootstrap_room,
|
bootstrap_room=bootstrap_room,
|
||||||
data_parallel_rank=data_parallel_rank,
|
data_parallel_rank=data_parallel_rank,
|
||||||
|
external_trace_header=external_trace_header,
|
||||||
rid=rid,
|
rid=rid,
|
||||||
)
|
)
|
||||||
generator = self.tokenizer_manager.generate_request(obj, None)
|
generator = self.tokenizer_manager.generate_request(obj, None)
|
||||||
@@ -368,6 +372,7 @@ class Engine(EngineBase):
|
|||||||
audio_data: Optional[MultimodalDataInputFormat] = None,
|
audio_data: Optional[MultimodalDataInputFormat] = None,
|
||||||
video_data: Optional[MultimodalDataInputFormat] = None,
|
video_data: Optional[MultimodalDataInputFormat] = None,
|
||||||
dimensions: Optional[int] = None,
|
dimensions: Optional[int] = None,
|
||||||
|
external_trace_header: Optional[Dict] = None,
|
||||||
rid: Optional[Union[List[str], str]] = None,
|
rid: Optional[Union[List[str], str]] = None,
|
||||||
) -> Dict:
|
) -> Dict:
|
||||||
"""
|
"""
|
||||||
@@ -380,6 +385,7 @@ class Engine(EngineBase):
|
|||||||
audio_data=audio_data,
|
audio_data=audio_data,
|
||||||
video_data=video_data,
|
video_data=video_data,
|
||||||
dimensions=dimensions,
|
dimensions=dimensions,
|
||||||
|
external_trace_header=external_trace_header,
|
||||||
rid=rid,
|
rid=rid,
|
||||||
)
|
)
|
||||||
generator = self.tokenizer_manager.generate_request(obj, None)
|
generator = self.tokenizer_manager.generate_request(obj, None)
|
||||||
@@ -393,6 +399,7 @@ class Engine(EngineBase):
|
|||||||
audio_data: Optional[MultimodalDataInputFormat] = None,
|
audio_data: Optional[MultimodalDataInputFormat] = None,
|
||||||
video_data: Optional[MultimodalDataInputFormat] = None,
|
video_data: Optional[MultimodalDataInputFormat] = None,
|
||||||
dimensions: Optional[int] = None,
|
dimensions: Optional[int] = None,
|
||||||
|
external_trace_header: Optional[Dict] = None,
|
||||||
rid: Optional[Union[List[str], str]] = None,
|
rid: Optional[Union[List[str], str]] = None,
|
||||||
) -> Dict:
|
) -> Dict:
|
||||||
"""
|
"""
|
||||||
@@ -407,6 +414,7 @@ class Engine(EngineBase):
|
|||||||
audio_data=audio_data,
|
audio_data=audio_data,
|
||||||
video_data=video_data,
|
video_data=video_data,
|
||||||
dimensions=dimensions,
|
dimensions=dimensions,
|
||||||
|
external_trace_header=external_trace_header,
|
||||||
rid=rid,
|
rid=rid,
|
||||||
)
|
)
|
||||||
generator = self.tokenizer_manager.generate_request(obj, None)
|
generator = self.tokenizer_manager.generate_request(obj, None)
|
||||||
|
|||||||
@@ -255,6 +255,9 @@ class GenerateReqInput(BaseReq, APIServingTimingMixin):
|
|||||||
# Whether to return entropy
|
# Whether to return entropy
|
||||||
return_entropy: bool = False
|
return_entropy: bool = False
|
||||||
|
|
||||||
|
# Propagates trace context via Engine.generate/async_generate
|
||||||
|
external_trace_header: Optional[Dict] = None
|
||||||
|
|
||||||
# For EPD-disaggregated inference
|
# For EPD-disaggregated inference
|
||||||
need_wait_for_image: Optional[bool] = None
|
need_wait_for_image: Optional[bool] = None
|
||||||
num_items_assigned: Optional[List] = None
|
num_items_assigned: Optional[List] = None
|
||||||
@@ -662,6 +665,7 @@ class GenerateReqInput(BaseReq, APIServingTimingMixin):
|
|||||||
custom_labels=self.custom_labels,
|
custom_labels=self.custom_labels,
|
||||||
return_bytes=self.return_bytes,
|
return_bytes=self.return_bytes,
|
||||||
return_entropy=self.return_entropy,
|
return_entropy=self.return_entropy,
|
||||||
|
external_trace_header=self.external_trace_header,
|
||||||
http_worker_ipc=self.http_worker_ipc,
|
http_worker_ipc=self.http_worker_ipc,
|
||||||
**{
|
**{
|
||||||
field: getattr(self, field)
|
field: getattr(self, field)
|
||||||
@@ -796,8 +800,8 @@ class EmbeddingReqInput(BaseReq, APIServingTimingMixin):
|
|||||||
# For background responses (OpenAI responses API)
|
# For background responses (OpenAI responses API)
|
||||||
background: bool = False
|
background: bool = False
|
||||||
|
|
||||||
# tracing context
|
# Propagates trace context via Engine.encode/async_encode
|
||||||
trace_context: Optional[Dict] = None
|
external_trace_header: Optional[Dict] = None
|
||||||
|
|
||||||
# The number of dimensions the resulting output embeddings should have. It is applicable for Matryoshka Embeddings.
|
# The number of dimensions the resulting output embeddings should have. It is applicable for Matryoshka Embeddings.
|
||||||
dimensions: Optional[int] = None
|
dimensions: Optional[int] = None
|
||||||
@@ -878,6 +882,7 @@ class EmbeddingReqInput(BaseReq, APIServingTimingMixin):
|
|||||||
video_data=self.video_data[i] if self.video_data is not None else None,
|
video_data=self.video_data[i] if self.video_data is not None else None,
|
||||||
sampling_params=self.sampling_params[i],
|
sampling_params=self.sampling_params[i],
|
||||||
rid=self.rid[i],
|
rid=self.rid[i],
|
||||||
|
external_trace_header=self.external_trace_header,
|
||||||
dimensions=self.dimensions,
|
dimensions=self.dimensions,
|
||||||
http_worker_ipc=self.http_worker_ipc,
|
http_worker_ipc=self.http_worker_ipc,
|
||||||
**{
|
**{
|
||||||
|
|||||||
@@ -461,7 +461,6 @@ class TokenizerManager(TokenizerCommunicatorMixin, TokenizerManagerMultiItemMixi
|
|||||||
self,
|
self,
|
||||||
obj: Union[GenerateReqInput, EmbeddingReqInput],
|
obj: Union[GenerateReqInput, EmbeddingReqInput],
|
||||||
request: Optional[fastapi.Request] = None,
|
request: Optional[fastapi.Request] = None,
|
||||||
traceparent: Optional[str] = None,
|
|
||||||
):
|
):
|
||||||
created_time = obj.received_time if obj.received_time else time.time()
|
created_time = obj.received_time if obj.received_time else time.time()
|
||||||
self.auto_create_handle_loop()
|
self.auto_create_handle_loop()
|
||||||
@@ -469,7 +468,7 @@ class TokenizerManager(TokenizerCommunicatorMixin, TokenizerManagerMultiItemMixi
|
|||||||
# Normalize the request
|
# Normalize the request
|
||||||
obj.normalize_batch_and_arguments()
|
obj.normalize_batch_and_arguments()
|
||||||
if self.enable_trace:
|
if self.enable_trace:
|
||||||
self._trace_request_start(obj, created_time, request, traceparent)
|
self._trace_request_start(obj, created_time, request)
|
||||||
if self.server_args.language_only:
|
if self.server_args.language_only:
|
||||||
self._handle_epd_disaggregation_encode_request(obj)
|
self._handle_epd_disaggregation_encode_request(obj)
|
||||||
if self.server_args.tokenizer_worker_num > 1:
|
if self.server_args.tokenizer_worker_num > 1:
|
||||||
@@ -2147,7 +2146,6 @@ class TokenizerManager(TokenizerCommunicatorMixin, TokenizerManagerMultiItemMixi
|
|||||||
obj: Union[GenerateReqInput, EmbeddingReqInput],
|
obj: Union[GenerateReqInput, EmbeddingReqInput],
|
||||||
created_time: Optional[float] = None,
|
created_time: Optional[float] = None,
|
||||||
request: Optional[fastapi.Request] = None,
|
request: Optional[fastapi.Request] = None,
|
||||||
traceparent: Optional[str] = None,
|
|
||||||
):
|
):
|
||||||
external_trace_header = None
|
external_trace_header = None
|
||||||
if request:
|
if request:
|
||||||
@@ -2155,11 +2153,11 @@ class TokenizerManager(TokenizerCommunicatorMixin, TokenizerManagerMultiItemMixi
|
|||||||
trace_set_remote_propagate_context(request.headers["trace_context"])
|
trace_set_remote_propagate_context(request.headers["trace_context"])
|
||||||
else:
|
else:
|
||||||
external_trace_header = extract_trace_headers(request.headers)
|
external_trace_header = extract_trace_headers(request.headers)
|
||||||
elif traceparent:
|
elif obj.external_trace_header:
|
||||||
# When the request comes form the rust grpc server there isn't a
|
# When the request comes form the rust grpc server or Engine there isn't a
|
||||||
# real request object but we still need to propagate the traceparent from
|
# real request object but we still need to propagate the trace context from
|
||||||
# the traceparent that is explicitly passed in
|
# the trace context that is explicitly passed in
|
||||||
external_trace_header = {"traceparent": traceparent}
|
external_trace_header = obj.external_trace_header
|
||||||
|
|
||||||
if obj.is_single:
|
if obj.is_single:
|
||||||
bootstrap_room = (
|
bootstrap_room = (
|
||||||
|
|||||||
Reference in New Issue
Block a user