@@ -25,6 +25,7 @@ import (
25
25
benchcommon "github.com/elastic/elastic-package/internal/benchrunner/runners/common"
26
26
"github.com/elastic/elastic-package/internal/benchrunner/runners/pipeline"
27
27
"github.com/elastic/elastic-package/internal/benchrunner/runners/rally"
28
+ "github.com/elastic/elastic-package/internal/benchrunner/runners/stream"
28
29
"github.com/elastic/elastic-package/internal/benchrunner/runners/system"
29
30
"github.com/elastic/elastic-package/internal/cobraext"
30
31
"github.com/elastic/elastic-package/internal/common"
@@ -47,6 +48,16 @@ These benchmarks allow you to benchmark an integration corpus with rally.
47
48
48
49
For details on how to configure rally benchmarks for a package, review the [HOWTO guide](./docs/howto/rally_benchmarking.md).
49
50
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
+
50
61
#### System Benchmarks
51
62
52
63
These benchmarks allow you to benchmark an integration end to end.
@@ -68,6 +79,9 @@ func setupBenchmarkCommand() *cobraext.Command {
68
79
rallyCmd := getRallyCommand ()
69
80
cmd .AddCommand (rallyCmd )
70
81
82
+ streamCmd := getStreamCommand ()
83
+ cmd .AddCommand (streamCmd )
84
+
71
85
systemCmd := getSystemCommand ()
72
86
cmd .AddCommand (systemCmd )
73
87
@@ -381,6 +395,129 @@ func getPackageNameAndVersion(packageFromRegistry string) (string, string, error
381
395
return name , version , nil
382
396
}
383
397
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
+
384
521
func getSystemCommand () * cobra.Command {
385
522
cmd := & cobra.Command {
386
523
Use : "system" ,
0 commit comments