55package cmd
66
77import (
8+ "context"
89 "errors"
910 "fmt"
11+ "os"
1012 "strings"
1113 "time"
1214
1315 "github.com/dustin/go-humanize"
1416
1517 "github.com/elastic/elastic-package/internal/corpusgenerator"
18+ "github.com/elastic/elastic-package/internal/elasticsearch"
1619 "github.com/elastic/elastic-package/internal/install"
20+ "github.com/elastic/elastic-package/internal/logger"
1721 "github.com/elastic/elastic-package/internal/stack"
1822
1923 "github.com/spf13/cobra"
@@ -215,13 +219,19 @@ func getSystemCommand() *cobra.Command {
215219 cmd .Flags ().BoolP (cobraext .BenchReindexToMetricstoreFlagName , "" , false , cobraext .BenchReindexToMetricstoreFlagDescription )
216220 cmd .Flags ().DurationP (cobraext .BenchMetricsIntervalFlagName , "" , time .Second , cobraext .BenchMetricsIntervalFlagDescription )
217221 cmd .Flags ().DurationP (cobraext .DeferCleanupFlagName , "" , 0 , cobraext .DeferCleanupFlagDescription )
222+ cmd .Flags ().String (cobraext .VariantFlagName , "" , cobraext .VariantFlagDescription )
218223
219224 return cmd
220225}
221226
222227func systemCommandAction (cmd * cobra.Command , args []string ) error {
223228 cmd .Println ("Run system benchmarks for the package" )
224229
230+ variant , err := cmd .Flags ().GetString (cobraext .VariantFlagName )
231+ if err != nil {
232+ return cobraext .FlagParsingError (err , cobraext .VariantFlagName )
233+ }
234+
225235 benchName , err := cmd .Flags ().GetString (cobraext .BenchNameFlagName )
226236 if err != nil {
227237 return cobraext .FlagParsingError (err , cobraext .BenchNameFlagName )
@@ -271,7 +281,8 @@ func systemCommandAction(cmd *cobra.Command, args []string) error {
271281 return fmt .Errorf ("can't create Kibana client: %w" , err )
272282 }
273283
274- opts := system .NewOptions (
284+ withOpts := []system.OptionFunc {
285+ system .WithVariant (variant ),
275286 system .WithBenchmarkName (benchName ),
276287 system .WithDeferCleanup (deferCleanup ),
277288 system .WithMetricsInterval (metricsInterval ),
@@ -280,8 +291,17 @@ func systemCommandAction(cmd *cobra.Command, args []string) error {
280291 system .WithESAPI (esClient .API ),
281292 system .WithKibanaClient (kc ),
282293 system .WithProfile (profile ),
283- )
284- runner := system .NewSystemBenchmark (opts )
294+ }
295+
296+ esMetricsClient , err := initializeESMetricsClient (cmd .Context ())
297+ if err != nil {
298+ return fmt .Errorf ("can't create Elasticsearch metrics client: %w" , err )
299+ }
300+ if esMetricsClient != nil {
301+ withOpts = append (withOpts , system .WithESMetricsAPI (esMetricsClient .API ))
302+ }
303+
304+ runner := system .NewSystemBenchmark (system .NewOptions (withOpts ... ))
285305
286306 r , err := benchrunner .Run (runner )
287307 if err != nil {
@@ -293,14 +313,19 @@ func systemCommandAction(cmd *cobra.Command, args []string) error {
293313 return fmt .Errorf ("system benchmark is expected to return multiple reports" )
294314 }
295315
316+ reports := multiReport .Split ()
317+ if len (reports ) != 2 {
318+ return fmt .Errorf ("system benchmark is expected to return a human an a file report" )
319+ }
320+
296321 // human report will always be the first
297- human := multiReport . Split () [0 ]
322+ human := reports [0 ]
298323 if err := reporters .WriteReportable (reporters .Output (outputs .ReportOutputSTDOUT ), human ); err != nil {
299324 return fmt .Errorf ("error writing benchmark report: %w" , err )
300325 }
301326
302327 // file report will always be the second
303- file := multiReport . Split () [1 ]
328+ file := reports [1 ]
304329 if err := reporters .WriteReportable (reporters .Output (outputs .ReportOutputFile ), file ); err != nil {
305330 return fmt .Errorf ("error writing benchmark report: %w" , err )
306331 }
@@ -375,3 +400,30 @@ func generateDataStreamCorpusCommandAction(cmd *cobra.Command, _ []string) error
375400
376401 return nil
377402}
403+
404+ func initializeESMetricsClient (ctx context.Context ) (* elasticsearch.Client , error ) {
405+ address := os .Getenv (system .ESMetricstoreHostEnv )
406+ user := os .Getenv (system .ESMetricstoreUsernameEnv )
407+ pass := os .Getenv (system .ESMetricstorePasswordEnv )
408+ cacert := os .Getenv (system .ESMetricstoreCACertificateEnv )
409+ if address == "" || user == "" || pass == "" {
410+ logger .Debugf ("can't initialize metricstore, missing environment configuration" )
411+ return nil , nil
412+ }
413+
414+ esClient , err := stack .NewElasticsearchClient (
415+ elasticsearch .OptionWithAddress (address ),
416+ elasticsearch .OptionWithUsername (user ),
417+ elasticsearch .OptionWithPassword (pass ),
418+ elasticsearch .OptionWithCertificateAuthority (cacert ),
419+ )
420+ if err != nil {
421+ return nil , err
422+ }
423+
424+ if err := esClient .CheckHealth (ctx ); err != nil {
425+ return nil , err
426+ }
427+
428+ return esClient , nil
429+ }
0 commit comments