Skip to content

Commit 90a1e52

Browse files
authored
repo-sync-2024-05-06T16:44:15+0800 (#59)
1 parent d123372 commit 90a1e52

File tree

88 files changed

+3289
-653
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+3289
-653
lines changed

.ci/integration_test.py

Lines changed: 91 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -496,12 +496,20 @@ def __init__(self, base_path: str):
496496
self.parties = ["alice", "bob"]
497497
self.serving_cmd_dict = {}
498498
self.serving_config_dict = {}
499+
500+
self.trace_configs = {}
501+
502+
self.trace_files = {}
499503
for p in self.parties:
500504
party_base_path = os.path.join(base_path, p)
501505
serving_config_file = os.path.join(party_base_path, "serving.config")
502506
logging_config_file = os.path.join(party_base_path, "logging.config")
507+
trace_config_file = os.path.join(party_base_path, "trace.config")
508+
509+
self.trace_configs[p] = trace_config_file
510+
503511
self.serving_cmd_dict[p] = (
504-
f"./bazel-bin/secretflow_serving/server/secretflow_serving --serving_config_file={serving_config_file} --logging_config_file={logging_config_file}"
512+
f"./bazel-bin/secretflow_serving/server/secretflow_serving --serving_config_file={serving_config_file} --logging_config_file={logging_config_file} --trace_config_file={trace_config_file}"
505513
)
506514

507515
with open(serving_config_file, "r") as file:
@@ -526,13 +534,21 @@ def exec(self):
526534
},
527535
}
528536

537+
trace_id_prefix = "1234567890abcdef1234567890abcde"
538+
self.span_id = "1234567890abcdef"
539+
self.trace_id_map = {}
540+
parties_index = 0
529541
# make request
530542
for p in self.parties:
543+
trace_id = f"{trace_id_prefix}{parties_index}"
544+
self.trace_id_map[p] = trace_id
545+
parties_index += 1
531546
res = self.run_cmd(
532547
build_predict_cmd(
533548
"127.0.0.1",
534549
self.serving_config_dict[p]['serverConf']['servicePort'],
535550
json.dumps(body_dict),
551+
{'X-B3-TraceId': trace_id, 'X-B3-SpanId': self.span_id},
536552
)
537553
)
538554
out = res.stdout.decode()
@@ -541,11 +557,85 @@ def exec(self):
541557
assert (
542558
res["status"]["code"] == 1
543559
), f'return status code({res["status"]["code"]}) should be OK(1)'
560+
561+
# check trace log
562+
self.check_trace_log()
563+
544564
finally:
545565
self.cleanup_sub_procs()
566+
self.cleanup_trace_files()
567+
568+
def cleanup_trace_files(self):
569+
for p in self.parties:
570+
trace_config_file = self.trace_configs[p]
571+
with open(trace_config_file, "r") as f:
572+
trace_config = json.load(f)
573+
trace_dir = trace_config["traceLogConf"]["traceLogPath"]
574+
if os.path.exists(trace_dir):
575+
os.remove(trace_dir)
576+
577+
def check_trace_log(self):
578+
def decode_bytes(proto_bytes):
579+
import base64
580+
581+
return base64.b16encode(base64.b64decode(proto_bytes)).lower().decode()
582+
583+
def get_spans_from_trace_file(trace_filename):
584+
spans = []
585+
with open(trace_filename, 'r') as trace_file:
586+
for line in trace_file:
587+
start_index = line.find('{')
588+
if start_index == -1:
589+
continue
590+
resource_span = json.loads(line[start_index:])
591+
for scopeSpan in resource_span['scopeSpans']:
592+
spans.extend(scopeSpan['spans'])
593+
return spans
594+
595+
stub_span_id_dict = {}
596+
service_span_id_dict = {}
597+
598+
for p, config in self.trace_configs.items():
599+
stub_span_id_dict[p] = set()
600+
service_span_id_dict[p] = set()
601+
602+
with open(config, "r") as f:
603+
trace_config = json.load(f)
604+
trace_dir = trace_config["traceLogConf"]["traceLogPath"]
605+
spans = get_spans_from_trace_file(trace_dir)
606+
intrest_span_found = False
607+
for span in spans:
608+
if span['name'] == "PredictionService/Predict":
609+
assert self.trace_id_map[p] == decode_bytes(
610+
span['traceId']
611+
), f"trace id mismatch, expected: {self.trace_id_map[p]}, actual: {decode_bytes(span['traceId'])}"
612+
assert self.span_id == decode_bytes(
613+
span['parentSpanId']
614+
), f"parent span id mismatch, expected: {self.span_id}, actual: {decode_bytes(span['parentSpanId'])}"
615+
intrest_span_found = True
616+
if (
617+
span['name'].startswith("ExecutionService")
618+
and span['kind'] == "SPAN_KIND_SERVER"
619+
):
620+
service_span_id_dict[p].add(decode_bytes(span['parentSpanId']))
621+
if (
622+
span['name'].startswith("ExecutionService")
623+
and span['kind'] == "SPAN_KIND_CLIENT"
624+
):
625+
stub_span_id_dict[p].add(decode_bytes(span['spanId']))
626+
assert intrest_span_found
627+
assert (
628+
service_span_id_dict["alice"] == stub_span_id_dict["bob"]
629+
), f"execution parent span id mismatch, expected: {service_span_id_dict['alice']}, actual: {stub_span_id_dict['bob']}"
630+
631+
assert (
632+
service_span_id_dict["bob"] == stub_span_id_dict["alice"]
633+
), f"execution parent span id mismatch, expected: {service_span_id_dict['bob']}, actual: {stub_span_id_dict['alice']}"
546634

547635

548636
if __name__ == "__main__":
637+
ExampleTest('examples').exec()
638+
549639
# glm
550640
with open(".ci/simple_test/node_processing_alice.json", "rb") as f:
551641
alice_trace_content = f.read()
@@ -1904,5 +1994,3 @@ def exec(self):
19041994
PredefineTest('model_path').exec()
19051995
CsvTest('model_path').exec()
19061996
SpecificTest('model_path').exec()
1907-
1908-
ExampleTest('examples').exec()

.ci/test_common.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,15 @@ def exec_cmd(cmd, background=False, envs=None):
9595
raise
9696

9797

98-
def build_predict_cmd(host: str, port: int, request_body: str):
98+
def build_predict_cmd(
99+
host: str, port: int, request_body: str, headers: Dict[str, str] = {}
100+
):
101+
headers_str = ""
102+
for k, v in headers.items():
103+
headers_str += f"--header '{k}: {v}' "
104+
99105
url = f"http://{host}:{port}/PredictionService/Predict"
100-
return f'curl --location "{url}" --header "Content-Type: application/json" --data \'{request_body}\''
106+
return f'curl --location "{url}" --header "Content-Type: application/json" {headers_str} --data \'{request_body}\''
101107

102108

103109
def build_get_model_info_cmd(host: str, port: int, service_spec_id: str):

.ci/test_data/bin_sgb/xgb/alice/alice.csv

Lines changed: 0 additions & 20 deletions
This file was deleted.
-1.2 KB
Binary file not shown.

.ci/test_data/bin_sgb/xgb/bob/bob.csv

Lines changed: 0 additions & 20 deletions
This file was deleted.
-1.01 KB
Binary file not shown.

.ci/test_data/bin_sgb/xgb/predict.csv

Lines changed: 0 additions & 20 deletions
This file was deleted.

WORKSPACE

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,23 @@ load("@rules_proto_grpc//:repositories.bzl", "rules_proto_grpc_repos", "rules_pr
6060
rules_proto_grpc_toolchains()
6161

6262
rules_proto_grpc_repos()
63+
64+
# Load OpenTelemetry dependencies after load.
65+
load("@io_opentelemetry_cpp//bazel:repository.bzl", "opentelemetry_cpp_deps")
66+
67+
opentelemetry_cpp_deps()
68+
69+
# (required after v1.8.0) Load extra dependencies required for OpenTelemetry
70+
load("@io_opentelemetry_cpp//bazel:extra_deps.bzl", "opentelemetry_extra_deps")
71+
72+
opentelemetry_extra_deps()
73+
74+
# Load gRPC dependencies after load.
75+
load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps")
76+
77+
grpc_deps()
78+
79+
# Load extra gRPC dependencies due to https://github.com/grpc/grpc/issues/20511
80+
load("@com_github_grpc_grpc//bazel:grpc_extra_deps.bzl", "grpc_extra_deps")
81+
82+
grpc_extra_deps()

bazel/aws_c_common.BUILD

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@ package(default_visibility = ["//visibility:public"])
1818

1919
filegroup(
2020
name = "all_srcs",
21-
srcs = glob(["**"]),
21+
srcs = glob(
22+
["**"],
23+
exclude = [
24+
"tests/**/*",
25+
],
26+
),
2227
)
2328

2429
serving_cmake_external(

0 commit comments

Comments
 (0)