@@ -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