core/bench/src/args/kind.rs (156 lines of code) (raw):
/* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
use super::examples::print_examples;
use super::kinds::balanced::producer::BalancedProducerArgs;
use super::kinds::balanced::producer_and_consumer_group::BalancedProducerAndConsumerGroupArgs;
use super::kinds::end_to_end::producing_consumer::EndToEndProducingConsumerArgs;
use super::kinds::end_to_end::producing_consumer_group::EndToEndProducingConsumerGroupArgs;
use super::props::BenchmarkKindProps;
use super::transport::BenchmarkTransportCommand;
use crate::args::kinds::balanced::consumer_group::BalancedConsumerGroupArgs;
use crate::args::kinds::pinned::consumer::PinnedConsumerArgs;
use crate::args::kinds::pinned::producer::PinnedProducerArgs;
use crate::args::kinds::pinned::producer_and_consumer::PinnedProducerAndConsumerArgs;
use clap::Subcommand;
use iggy::utils::byte_size::IggyByteSize;
use iggy_bench_report::benchmark_kind::BenchmarkKind;
#[derive(Subcommand, Debug)]
pub enum BenchmarkKindCommand {
#[command(
about = "Pinned producer benchmark",
long_about = "N producers sending to N separated stream-topic with single partition (one stream per one producer)",
visible_alias = "pp",
verbatim_doc_comment
)]
PinnedProducer(PinnedProducerArgs),
#[command(
about = "Pinned consumer benchmark",
visible_alias = "pc",
verbatim_doc_comment
)]
PinnedConsumer(PinnedConsumerArgs),
#[command(
about = "Pinned producer and consumer benchmark",
long_about = "N consumers polling from N separated stream-topic with single partition (one stream per one consumer)",
visible_alias = "ppc",
verbatim_doc_comment
)]
PinnedProducerAndConsumer(PinnedProducerAndConsumerArgs),
#[command(
about = "Balanced producer benchmark",
long_about = "N producers sending to M partitions in K streams with balanced partitioning kind",
visible_alias = "bp",
verbatim_doc_comment
)]
BalancedProducer(BalancedProducerArgs),
#[command(
about = "Balanced consumer group benchmark",
long_about = "N consumers assigned to M consumer groups polling from K partitions in L streams",
visible_alias = "bcg",
verbatim_doc_comment
)]
BalancedConsumerGroup(BalancedConsumerGroupArgs),
#[command(
about = "N producers sending to M partitions in K streams, L consumers polling from P consumer groups",
visible_alias = "bpcg",
verbatim_doc_comment
)]
BalancedProducerAndConsumerGroup(BalancedProducerAndConsumerGroupArgs),
#[command(
about = "N producing consumers sending and polling to/from M streams",
visible_alias = "e2e",
verbatim_doc_comment
)]
EndToEndProducingConsumer(EndToEndProducingConsumerArgs),
#[command(
about = "N producing consumers assigned to M consumer groups sending and polling to/from K streams",
visible_alias = "e2ecg",
verbatim_doc_comment
)]
EndToEndProducingConsumerGroup(EndToEndProducingConsumerGroupArgs),
#[command(about = "Print examples", visible_alias = "e", verbatim_doc_comment)]
Examples,
}
impl BenchmarkKindCommand {
pub fn as_simple_kind(&self) -> BenchmarkKind {
match self {
BenchmarkKindCommand::PinnedProducer(_) => BenchmarkKind::PinnedProducer,
BenchmarkKindCommand::PinnedConsumer(_) => BenchmarkKind::PinnedConsumer,
BenchmarkKindCommand::PinnedProducerAndConsumer(_) => {
BenchmarkKind::PinnedProducerAndConsumer
}
BenchmarkKindCommand::BalancedProducer(_) => BenchmarkKind::BalancedProducer,
BenchmarkKindCommand::BalancedConsumerGroup(_) => BenchmarkKind::BalancedConsumerGroup,
BenchmarkKindCommand::BalancedProducerAndConsumerGroup(_) => {
BenchmarkKind::BalancedProducerAndConsumerGroup
}
BenchmarkKindCommand::EndToEndProducingConsumer(_) => {
BenchmarkKind::EndToEndProducingConsumer
}
BenchmarkKindCommand::EndToEndProducingConsumerGroup(_) => {
BenchmarkKind::EndToEndProducingConsumerGroup
}
BenchmarkKindCommand::Examples => {
print_examples();
std::process::exit(0);
}
}
}
}
impl BenchmarkKindProps for BenchmarkKindCommand {
fn streams(&self) -> u32 {
self.inner().streams()
}
fn partitions(&self) -> u32 {
self.inner().partitions()
}
fn consumers(&self) -> u32 {
self.inner().consumers()
}
fn producers(&self) -> u32 {
self.inner().producers()
}
fn transport_command(&self) -> &BenchmarkTransportCommand {
self.inner().transport_command()
}
fn number_of_consumer_groups(&self) -> u32 {
self.inner().number_of_consumer_groups()
}
fn max_topic_size(&self) -> Option<IggyByteSize> {
self.inner().max_topic_size()
}
fn inner(&self) -> &dyn BenchmarkKindProps {
match self {
BenchmarkKindCommand::PinnedProducer(args) => args,
BenchmarkKindCommand::PinnedConsumer(args) => args,
BenchmarkKindCommand::PinnedProducerAndConsumer(args) => args,
BenchmarkKindCommand::BalancedProducer(args) => args,
BenchmarkKindCommand::BalancedConsumerGroup(args) => args,
BenchmarkKindCommand::BalancedProducerAndConsumerGroup(args) => args,
BenchmarkKindCommand::EndToEndProducingConsumer(args) => args,
BenchmarkKindCommand::EndToEndProducingConsumerGroup(args) => args,
BenchmarkKindCommand::Examples => {
print_examples();
std::process::exit(0);
}
}
}
fn validate(&self) {
self.inner().validate()
}
}