This reverts commit fe1ba18dfc
.
Reason: break import
<!--
If you know who should review your pull request, please assign it to
that
person, otherwise the pull request would get assigned randomly.
If your pull request is for a specific language, please add the
appropriate
lang label.
-->
pull/34159/head
parent
5db072a656
commit
3e24027820
3 changed files with 1 additions and 236 deletions
@ -1,74 +0,0 @@ |
|||||||
// Copyright 2023 The gRPC Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#include "absl/flags/flag.h" |
|
||||||
#include "google/protobuf/util/json_util.h" |
|
||||||
|
|
||||||
#include <grpc/support/log.h> |
|
||||||
|
|
||||||
#include "src/core/lib/debug/stats.h" |
|
||||||
#include "src/core/lib/debug/stats_data.h" |
|
||||||
#include "src/core/lib/gprpp/crash.h" |
|
||||||
#include "src/core/lib/iomgr/load_file.h" |
|
||||||
#include "src/core/lib/slice/slice_internal.h" |
|
||||||
#include "src/proto/grpc/testing/control.pb.h" |
|
||||||
#include "test/core/util/test_config.h" |
|
||||||
#include "test/cpp/qps/benchmark_config.h" |
|
||||||
#include "test/cpp/qps/driver.h" |
|
||||||
#include "test/cpp/util/test_config.h" |
|
||||||
#include "test/cpp/util/test_credentials_provider.h" |
|
||||||
|
|
||||||
ABSL_FLAG(std::string, loadtest_config, "", |
|
||||||
"Path to a gRPC benchmark loadtest scenario JSON file. See " |
|
||||||
"scenario_runner.py"); |
|
||||||
|
|
||||||
namespace grpc { |
|
||||||
namespace testing { |
|
||||||
|
|
||||||
static void RunScenario() { |
|
||||||
grpc_slice buffer; |
|
||||||
GPR_ASSERT(GRPC_LOG_IF_ERROR( |
|
||||||
"load_file", grpc_load_file(absl::GetFlag(FLAGS_loadtest_config).c_str(), |
|
||||||
0, &buffer))); |
|
||||||
std::string json_str(grpc_core::StringViewFromSlice(buffer)); |
|
||||||
grpc::protobuf::json::JsonParseOptions options; |
|
||||||
options.case_insensitive_enum_parsing = true; |
|
||||||
Scenarios scenarios; |
|
||||||
auto proto_result = |
|
||||||
grpc::protobuf::json::JsonStringToMessage(json_str, &scenarios, options); |
|
||||||
if (!proto_result.ok()) { |
|
||||||
grpc_core::Crash(proto_result.message()); |
|
||||||
} |
|
||||||
gpr_log(GPR_INFO, "Running %s", scenarios.scenarios(0).name().c_str()); |
|
||||||
const auto result = |
|
||||||
RunScenario(scenarios.scenarios(0).client_config(), 1, |
|
||||||
scenarios.scenarios(0).server_config(), 1, |
|
||||||
scenarios.scenarios(0).warmup_seconds(), |
|
||||||
scenarios.scenarios(0).benchmark_seconds(), -2, "", |
|
||||||
kInsecureCredentialsType, {}, false, 0); |
|
||||||
GetReporter()->ReportQPS(*result); |
|
||||||
GetReporter()->ReportLatency(*result); |
|
||||||
gpr_log(GPR_ERROR, "Global Stats:\n%s", |
|
||||||
StatsAsJson(grpc_core::global_stats().Collect().get()).c_str()); |
|
||||||
} |
|
||||||
|
|
||||||
} // namespace testing
|
|
||||||
} // namespace grpc
|
|
||||||
|
|
||||||
int main(int argc, char** argv) { |
|
||||||
grpc::testing::TestEnvironment env(&argc, argv); |
|
||||||
grpc::testing::InitTest(&argc, &argv, true); |
|
||||||
grpc::testing::RunScenario(); |
|
||||||
return 0; |
|
||||||
} |
|
@ -1,138 +0,0 @@ |
|||||||
#!/usr/bin/env python3 |
|
||||||
|
|
||||||
# Copyright 2023 gRPC authors. |
|
||||||
# |
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
# you may not use this file except in compliance with the License. |
|
||||||
# You may obtain a copy of the License at |
|
||||||
# |
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0 |
|
||||||
# |
|
||||||
# Unless required by applicable law or agreed to in writing, software |
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
# See the License for the specific language governing permissions and |
|
||||||
# limitations under the License. |
|
||||||
""" |
|
||||||
Local QPS benchmark runner for the OSS Benchmark loadtest configurations. |
|
||||||
|
|
||||||
This tool will run a scenario locally, either already extracted from |
|
||||||
scenario_config_exporter, or extracted from a benchmark loadtest config. The |
|
||||||
driver, client, and server all in the same process. You can run the process |
|
||||||
under a custom runner using the --runner_cmd="<COMMAND>" flag, and with custom |
|
||||||
environment variables if needed. |
|
||||||
|
|
||||||
This example will run an optimized build of the loadtest under gdb |
|
||||||
|
|
||||||
GRPC_VERBOSITY=debug \ |
|
||||||
bazel run \ |
|
||||||
--config=opt \ |
|
||||||
--cxxopt="-gmlt" \ |
|
||||||
test/cpp/qps:scenario_runner -- \ |
|
||||||
--loadtest_file=/path/to/loadtest.config \ |
|
||||||
--runner_cmd="gdb --args" |
|
||||||
|
|
||||||
This builds the binary and runs: |
|
||||||
|
|
||||||
gdb --args bazel-bin/.../scenario_runner -- \ |
|
||||||
--loadtest_config=/tmp/path/extracted_scenario_json.config |
|
||||||
|
|
||||||
|
|
||||||
If you have already extracted the JSON scenario using scenario_config_exporter, |
|
||||||
you can replace `--loadtest_file=loadtest.yaml` with |
|
||||||
`--scenario_file=scenario.json`. |
|
||||||
|
|
||||||
|
|
||||||
Other --runner_cmd examples: |
|
||||||
--runner_cmd="perf record -F 777 -o $(pwd)/perf.data -g --event=cpu-cycles", |
|
||||||
--runner_cmd="perf stat record -o $(pwd)/perf.stat.data", |
|
||||||
" |
|
||||||
""" |
|
||||||
|
|
||||||
|
|
||||||
import os |
|
||||||
import subprocess |
|
||||||
import sys |
|
||||||
import tempfile |
|
||||||
|
|
||||||
from absl import app |
|
||||||
from absl import flags |
|
||||||
import yaml |
|
||||||
|
|
||||||
_LOADTEST_YAML = flags.DEFINE_string( |
|
||||||
"loadtest_file", default=None, help="Path to the benchmark loadtest file" |
|
||||||
) |
|
||||||
_SCENARIO_JSON = flags.DEFINE_string( |
|
||||||
"scenario_file", default=None, help="Path to a scenario JSON file" |
|
||||||
) |
|
||||||
_RUNNER_CMD = flags.DEFINE_string( |
|
||||||
"runner_cmd", |
|
||||||
default="", |
|
||||||
help="Run the scearnio runner under a custom command (example: bazel ... --cmd='perf lock record -o $(pwd)/out')", |
|
||||||
) |
|
||||||
_RUN_FIRST = flags.DEFINE_bool( |
|
||||||
"run_first", |
|
||||||
default=False, |
|
||||||
help="Only run the first scenario in the loadtest", |
|
||||||
) |
|
||||||
_RUN_ALL = flags.DEFINE_bool( |
|
||||||
"run_all", default=False, help="Run all scenarios in the loadtest" |
|
||||||
) |
|
||||||
|
|
||||||
|
|
||||||
def run_command(filename): |
|
||||||
cmd = [ |
|
||||||
os.path.join( |
|
||||||
os.path.dirname(os.path.abspath(__file__)), |
|
||||||
"scenario_runner_cc", |
|
||||||
), |
|
||||||
"--loadtest_config", |
|
||||||
filename, |
|
||||||
] |
|
||||||
if _RUNNER_CMD.value: |
|
||||||
cmd = _RUNNER_CMD.value.split(" ") + cmd |
|
||||||
print(cmd) |
|
||||||
subprocess.run(cmd, check=True) |
|
||||||
if _RUN_FIRST.value: |
|
||||||
print("Exiting due to --run_first") |
|
||||||
sys.exit(0) |
|
||||||
|
|
||||||
|
|
||||||
def run_loadtests(): |
|
||||||
loadtests = [] |
|
||||||
with open( |
|
||||||
os.path.join( |
|
||||||
os.path.dirname(os.path.abspath(__file__)), _LOADTEST_YAML.value |
|
||||||
) |
|
||||||
) as f: |
|
||||||
loadtests = list(yaml.safe_load_all(f)) |
|
||||||
if len(loadtests) > 1 and not (_RUN_FIRST.value or _RUN_ALL.value): |
|
||||||
print( |
|
||||||
"The loadtest configuration file contains more than one loadtest. Please specify --run_first or --run_all.", |
|
||||||
file=sys.stderr, |
|
||||||
) |
|
||||||
sys.exit(1) |
|
||||||
for loadtest in loadtests: |
|
||||||
with tempfile.NamedTemporaryFile() as tmp_f: |
|
||||||
tmp_f.write( |
|
||||||
"".join(loadtest["spec"]["scenariosJSON"]).encode("utf-8") |
|
||||||
) |
|
||||||
tmp_f.flush() |
|
||||||
run_command(tmp_f.name) |
|
||||||
|
|
||||||
|
|
||||||
def run_scenario_file(): |
|
||||||
run_command(_SCENARIO_JSON.value) |
|
||||||
|
|
||||||
|
|
||||||
def main(args): |
|
||||||
if _LOADTEST_YAML.value: |
|
||||||
run_loadtests() |
|
||||||
elif _SCENARIO_JSON.value: |
|
||||||
run_scenario_file() |
|
||||||
else: |
|
||||||
"You must provide either a scenario.json or loadtest.yaml" |
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__": |
|
||||||
app.run(main) |
|
Loading…
Reference in new issue