@@ -25,6 +25,7 @@ import (
2525 benchcommon "github.com/elastic/elastic-package/internal/benchrunner/runners/common"
2626 "github.com/elastic/elastic-package/internal/benchrunner/runners/pipeline"
2727 "github.com/elastic/elastic-package/internal/benchrunner/runners/rally"
28+ "github.com/elastic/elastic-package/internal/benchrunner/runners/stream"
2829 "github.com/elastic/elastic-package/internal/benchrunner/runners/system"
2930 "github.com/elastic/elastic-package/internal/cobraext"
3031 "github.com/elastic/elastic-package/internal/common"
@@ -47,6 +48,16 @@ These benchmarks allow you to benchmark an integration corpus with rally.
4748
4849For details on how to configure rally benchmarks for a package, review the [HOWTO guide](./docs/howto/rally_benchmarking.md).
4950
51+ #### Stream Benchmarks
52+
53+ These benchmarks allow you to benchmark ingesting real time data.
54+ You can stream data to a remote ES cluster setting the following environment variables:
55+
56+ ELASTIC_PACKAGE_ELASTICSEARCH_HOST=https://my-deployment.es.eu-central-1.aws.foundit.no
57+ ELASTIC_PACKAGE_ELASTICSEARCH_USERNAME=elastic
58+ ELASTIC_PACKAGE_ELASTICSEARCH_PASSWORD=changeme
59+ ELASTIC_PACKAGE_KIBANA_HOST=https://my-deployment.kb.eu-central-1.aws.foundit.no:9243
60+
5061#### System Benchmarks
5162
5263These benchmarks allow you to benchmark an integration end to end.
@@ -68,6 +79,9 @@ func setupBenchmarkCommand() *cobraext.Command {
6879 rallyCmd := getRallyCommand ()
6980 cmd .AddCommand (rallyCmd )
7081
82+ streamCmd := getStreamCommand ()
83+ cmd .AddCommand (streamCmd )
84+
7185 systemCmd := getSystemCommand ()
7286 cmd .AddCommand (systemCmd )
7387
@@ -381,6 +395,129 @@ func getPackageNameAndVersion(packageFromRegistry string) (string, string, error
381395 return name , version , nil
382396}
383397
398+ func getStreamCommand () * cobra.Command {
399+ cmd := & cobra.Command {
400+ Use : "stream" ,
401+ Short : "Run stream benchmarks" ,
402+ Long : "Run stream benchmarks for the package" ,
403+ Args : cobra .NoArgs ,
404+ RunE : streamCommandAction ,
405+ }
406+
407+ cmd .Flags ().StringP (cobraext .BenchNameFlagName , "" , "" , cobraext .BenchNameFlagDescription )
408+ cmd .Flags ().String (cobraext .VariantFlagName , "" , cobraext .VariantFlagDescription )
409+ cmd .Flags ().DurationP (cobraext .BenchStreamBackFillFlagName , "" , 15 * time .Minute , cobraext .BenchStreamBackFillFlagDescription )
410+ cmd .Flags ().Uint64P (cobraext .BenchStreamEventsPerPeriodFlagName , "" , 10 , cobraext .BenchStreamEventsPerPeriodFlagDescription )
411+ cmd .Flags ().DurationP (cobraext .BenchStreamPeriodDurationFlagName , "" , 10 * time .Second , cobraext .BenchStreamPeriodDurationFlagDescription )
412+ cmd .Flags ().BoolP (cobraext .BenchStreamPerformCleanupFlagName , "" , false , cobraext .BenchStreamPerformCleanupFlagDescription )
413+ cmd .Flags ().StringP (cobraext .BenchStreamTimestampFieldFlagName , "" , "timestamp" , cobraext .BenchStreamTimestampFieldFlagDescription )
414+
415+ return cmd
416+ }
417+
418+ func streamCommandAction (cmd * cobra.Command , args []string ) error {
419+ cmd .Println ("Run stream benchmarks for the package" )
420+
421+ variant , err := cmd .Flags ().GetString (cobraext .VariantFlagName )
422+ if err != nil {
423+ return cobraext .FlagParsingError (err , cobraext .VariantFlagName )
424+ }
425+
426+ benchName , err := cmd .Flags ().GetString (cobraext .BenchNameFlagName )
427+ if err != nil {
428+ return cobraext .FlagParsingError (err , cobraext .BenchNameFlagName )
429+ }
430+
431+ backFill , err := cmd .Flags ().GetDuration (cobraext .BenchStreamBackFillFlagName )
432+ if err != nil {
433+ return cobraext .FlagParsingError (err , cobraext .BenchStreamBackFillFlagName )
434+ }
435+
436+ if backFill < 0 {
437+ return cobraext .FlagParsingError (errors .New ("cannot be a negative duration" ), cobraext .BenchStreamBackFillFlagName )
438+ }
439+
440+ eventsPerPeriod , err := cmd .Flags ().GetUint64 (cobraext .BenchStreamEventsPerPeriodFlagName )
441+ if err != nil {
442+ return cobraext .FlagParsingError (err , cobraext .BenchStreamEventsPerPeriodFlagName )
443+ }
444+
445+ if eventsPerPeriod <= 0 {
446+ return cobraext .FlagParsingError (errors .New ("cannot be zero or negative" ), cobraext .BenchStreamEventsPerPeriodFlagName )
447+ }
448+
449+ periodDuration , err := cmd .Flags ().GetDuration (cobraext .BenchStreamPeriodDurationFlagName )
450+ if err != nil {
451+ return cobraext .FlagParsingError (err , cobraext .BenchStreamPeriodDurationFlagName )
452+ }
453+
454+ if periodDuration < time .Nanosecond {
455+ return cobraext .FlagParsingError (errors .New ("cannot be a negative duration" ), cobraext .BenchStreamPeriodDurationFlagName )
456+ }
457+
458+ performCleanup , err := cmd .Flags ().GetBool (cobraext .BenchStreamPerformCleanupFlagName )
459+ if err != nil {
460+ return cobraext .FlagParsingError (err , cobraext .BenchStreamPerformCleanupFlagName )
461+ }
462+
463+ timestampField , err := cmd .Flags ().GetString (cobraext .BenchStreamTimestampFieldFlagName )
464+ if err != nil {
465+ return cobraext .FlagParsingError (err , cobraext .BenchStreamTimestampFieldFlagName )
466+ }
467+
468+ packageRootPath , found , err := packages .FindPackageRoot ()
469+ if ! found {
470+ return errors .New ("package root not found" )
471+ }
472+ if err != nil {
473+ return fmt .Errorf ("locating package root failed: %w" , err )
474+ }
475+
476+ profile , err := cobraext .GetProfileFlag (cmd )
477+ if err != nil {
478+ return err
479+ }
480+
481+ signal .Enable ()
482+
483+ esClient , err := stack .NewElasticsearchClientFromProfile (profile )
484+ if err != nil {
485+ return fmt .Errorf ("can't create Elasticsearch client: %w" , err )
486+ }
487+ err = esClient .CheckHealth (cmd .Context ())
488+ if err != nil {
489+ return err
490+ }
491+
492+ kc , err := stack .NewKibanaClientFromProfile (profile )
493+ if err != nil {
494+ return fmt .Errorf ("can't create Kibana client: %w" , err )
495+ }
496+
497+ withOpts := []stream.OptionFunc {
498+ stream .WithVariant (variant ),
499+ stream .WithBenchmarkName (benchName ),
500+ stream .WithBackFill (backFill ),
501+ stream .WithEventsPerPeriod (eventsPerPeriod ),
502+ stream .WithPeriodDuration (periodDuration ),
503+ stream .WithPerformCleanup (performCleanup ),
504+ stream .WithTimestampField (timestampField ),
505+ stream .WithPackageRootPath (packageRootPath ),
506+ stream .WithESAPI (esClient .API ),
507+ stream .WithKibanaClient (kc ),
508+ stream .WithProfile (profile ),
509+ }
510+
511+ runner := stream .NewStreamBenchmark (stream .NewOptions (withOpts ... ))
512+
513+ _ , err = benchrunner .Run (runner )
514+ if err != nil {
515+ return fmt .Errorf ("error running package stream benchmarks: %w" , err )
516+ }
517+
518+ return nil
519+ }
520+
384521func getSystemCommand () * cobra.Command {
385522 cmd := & cobra.Command {
386523 Use : "system" ,
0 commit comments