From 1ceca2e064dded42c3d5353aba5c32a9d0e07590 Mon Sep 17 00:00:00 2001 From: Vladislav Sukhin Date: Fri, 7 Jun 2024 20:42:03 +0300 Subject: [PATCH 01/10] feat: test workflow metrics --- cmd/api-server/main.go | 2 + internal/app/api/metrics/metrics.go | 176 +++++++++++++----- internal/app/api/v1/testsuites.go | 3 +- pkg/tcl/apitcl/v1/testworkflowexecutions.go | 2 + .../testworkflowexecutor/executor.go | 10 +- pkg/triggers/scraper.go | 2 + 6 files changed, 143 insertions(+), 52 deletions(-) diff --git a/cmd/api-server/main.go b/cmd/api-server/main.go index 99354160f68..e7970912ad8 100644 --- a/cmd/api-server/main.go +++ b/cmd/api-server/main.go @@ -599,6 +599,7 @@ func main() { resultsRepository, testWorkflowExecutionsClient, testWorkflowsClient, + metrics, serviceAccountNames, cfg.GlobalWorkflowTemplateName, cfg.TestkubeNamespace, @@ -606,6 +607,7 @@ func main() { cfg.TestkubeRegistry, cfg.EnableImageDataPersistentCache, cfg.ImageDataPersistentCacheKey, + cfg.TestkubeDashboardURI, ) // Apply Pro server enhancements diff --git a/internal/app/api/metrics/metrics.go b/internal/app/api/metrics/metrics.go index d479be2b93c..841a110c085 100644 --- a/internal/app/api/metrics/metrics.go +++ b/internal/app/api/metrics/metrics.go @@ -22,6 +22,11 @@ var testExecutionsDurationMs = promauto.NewSummaryVec(prometheus.SummaryOpts{ Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.95: 0.005, 0.99: 0.001}, }, []string{"type", "name", "result", "labels", "test_uri"}) +var testAbortCount = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "testkube_test_aborts_count", + Help: "The total number of tests aborted by type events", +}, []string{"type", "result"}) + var testSuiteExecutionsCount = promauto.NewCounterVec(prometheus.CounterOpts{ Name: "testkube_testsuite_executions_count", Help: "The total number of test suite executions", @@ -33,6 +38,11 @@ var testSuiteExecutionsDurationMs = promauto.NewSummaryVec(prometheus.SummaryOpt Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.95: 0.005, 0.99: 0.001}, }, []string{"name", "result", "labels", "testsuite_uri"}) +var testSuiteAbortCount = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "testkube_testsuite_aborts_count", + Help: "The total number of test suites aborted by type events", +}, []string{"result"}) + var testCreationCount = promauto.NewCounterVec(prometheus.CounterOpts{ Name: "testkube_test_creations_count", Help: "The total number of tests created by type events", @@ -78,10 +88,21 @@ var testTriggerBulkDeletesCount = promauto.NewCounterVec(prometheus.CounterOpts{ Help: "The total number of test trigger bulk delete events", }, []string{"result"}) -var testAbortCount = promauto.NewCounterVec(prometheus.CounterOpts{ - Name: "testkube_test_aborts_count", - Help: "The total number of tests aborted by type events", -}, []string{"type", "result"}) +var testWorkflowExecutionsCount = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "testkube_testworkflow_executions_count", + Help: "The total number of test workflow executions", +}, []string{"name", "result", "labels", "testworkflow_uri"}) + +var testWorkflowExecutionsDurationMs = promauto.NewSummaryVec(prometheus.SummaryOpts{ + Name: "testkube_testworkflow_executions_duration_ms", + Help: "The duration of test workflow executions", + Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.95: 0.005, 0.99: 0.001}, +}, []string{"name", "result", "labels", "testworkflow_uri"}) + +var testWorkflowAbortCount = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "testkube_testworkflow_aborts_count", + Help: "The total number of test workflows aborted by type events", +}, []string{"result"}) var testWorkflowCreationCount = promauto.NewCounterVec(prometheus.CounterOpts{ Name: "testkube_testworkflow_creations_count", @@ -115,50 +136,58 @@ var testWorkflowTemplateDeletesCount = promauto.NewCounterVec(prometheus.Counter func NewMetrics() Metrics { return Metrics{ - TestExecutionsCount: testExecutionsCount, - TestExecutionsDurationMs: testExecutionsDurationMs, - TestSuiteExecutionsCount: testSuiteExecutionsCount, - TestSuiteExecutionsDurationMs: testSuiteExecutionsDurationMs, - TestCreations: testCreationCount, - TestSuiteCreations: testSuiteCreationCount, - TestUpdates: testUpdatesCount, - TestSuiteUpdates: testSuiteUpdatesCount, - TestTriggerCreations: testTriggerCreationCount, - TestTriggerUpdates: testTriggerUpdatesCount, - TestTriggerDeletes: testTriggerDeletesCount, - TestTriggerBulkUpdates: testTriggerBulkUpdatesCount, - TestTriggerBulkDeletes: testTriggerBulkDeletesCount, - TestAbort: testAbortCount, - TestWorkflowCreations: testWorkflowCreationCount, - TestWorkflowUpdates: testWorkflowUpdatesCount, - TestWorkflowDeletes: testWorkflowDeletesCount, - TestWorkflowTemplateCreations: testWorkflowTemplateCreationCount, - TestWorkflowTemplateUpdates: testWorkflowTemplateUpdatesCount, - TestWorkflowTemplateDeletes: testWorkflowTemplateDeletesCount, + TestExecutionsCount: testExecutionsCount, + TestExecutionsDurationMs: testExecutionsDurationMs, + TestAbort: testAbortCount, + TestSuiteExecutionsCount: testSuiteExecutionsCount, + TestSuiteExecutionsDurationMs: testSuiteExecutionsDurationMs, + TestSuiteAbort: testSuiteAbortCount, + TestCreations: testCreationCount, + TestSuiteCreations: testSuiteCreationCount, + TestUpdates: testUpdatesCount, + TestSuiteUpdates: testSuiteUpdatesCount, + TestTriggerCreations: testTriggerCreationCount, + TestTriggerUpdates: testTriggerUpdatesCount, + TestTriggerDeletes: testTriggerDeletesCount, + TestTriggerBulkUpdates: testTriggerBulkUpdatesCount, + TestTriggerBulkDeletes: testTriggerBulkDeletesCount, + TestWorkflowExecutionsCount: testWorkflowExecutionsCount, + TestWorkflowExecutionsDurationMs: testWorkflowExecutionsDurationMs, + TestWorkflowAbort: testWorkflowAbortCount, + TestWorkflowCreations: testWorkflowCreationCount, + TestWorkflowUpdates: testWorkflowUpdatesCount, + TestWorkflowDeletes: testWorkflowDeletesCount, + TestWorkflowTemplateCreations: testWorkflowTemplateCreationCount, + TestWorkflowTemplateUpdates: testWorkflowTemplateUpdatesCount, + TestWorkflowTemplateDeletes: testWorkflowTemplateDeletesCount, } } type Metrics struct { - TestExecutionsCount *prometheus.CounterVec - TestExecutionsDurationMs *prometheus.SummaryVec - TestSuiteExecutionsCount *prometheus.CounterVec - TestSuiteExecutionsDurationMs *prometheus.SummaryVec - TestCreations *prometheus.CounterVec - TestSuiteCreations *prometheus.CounterVec - TestUpdates *prometheus.CounterVec - TestSuiteUpdates *prometheus.CounterVec - TestTriggerCreations *prometheus.CounterVec - TestTriggerUpdates *prometheus.CounterVec - TestTriggerDeletes *prometheus.CounterVec - TestTriggerBulkUpdates *prometheus.CounterVec - TestTriggerBulkDeletes *prometheus.CounterVec - TestAbort *prometheus.CounterVec - TestWorkflowCreations *prometheus.CounterVec - TestWorkflowUpdates *prometheus.CounterVec - TestWorkflowDeletes *prometheus.CounterVec - TestWorkflowTemplateCreations *prometheus.CounterVec - TestWorkflowTemplateUpdates *prometheus.CounterVec - TestWorkflowTemplateDeletes *prometheus.CounterVec + TestExecutionsCount *prometheus.CounterVec + TestExecutionsDurationMs *prometheus.SummaryVec + TestAbort *prometheus.CounterVec + TestSuiteExecutionsCount *prometheus.CounterVec + TestSuiteExecutionsDurationMs *prometheus.SummaryVec + TestSuiteAbort *prometheus.CounterVec + TestCreations *prometheus.CounterVec + TestSuiteCreations *prometheus.CounterVec + TestUpdates *prometheus.CounterVec + TestSuiteUpdates *prometheus.CounterVec + TestTriggerCreations *prometheus.CounterVec + TestTriggerUpdates *prometheus.CounterVec + TestTriggerDeletes *prometheus.CounterVec + TestTriggerBulkUpdates *prometheus.CounterVec + TestTriggerBulkDeletes *prometheus.CounterVec + TestWorkflowExecutionsCount *prometheus.CounterVec + TestWorkflowExecutionsDurationMs *prometheus.SummaryVec + TestWorkflowAbort *prometheus.CounterVec + TestWorkflowCreations *prometheus.CounterVec + TestWorkflowUpdates *prometheus.CounterVec + TestWorkflowDeletes *prometheus.CounterVec + TestWorkflowTemplateCreations *prometheus.CounterVec + TestWorkflowTemplateUpdates *prometheus.CounterVec + TestWorkflowTemplateDeletes *prometheus.CounterVec } func (m Metrics) IncAndObserveExecuteTest(execution testkube.Execution, dashboardURI string) { @@ -207,23 +236,19 @@ func (m Metrics) IncAndObserveExecuteTestSuite(execution testkube.TestSuiteExecu } slices.Sort(labels) - testSuiteName := "" - if execution.TestSuite != nil { - testSuiteName = execution.TestSuite.Name - } m.TestSuiteExecutionsCount.With(map[string]string{ "name": name, "result": status, "labels": strings.Join(labels, ","), - "testsuite_uri": fmt.Sprintf("%s/test-suites/%s", dashboardURI, testSuiteName), + "testsuite_uri": fmt.Sprintf("%s/test-suites/%s", dashboardURI, name), }).Inc() m.TestSuiteExecutionsDurationMs.With(map[string]string{ "name": name, "result": status, "labels": strings.Join(labels, ","), - "testsuite_uri": fmt.Sprintf("%s/test-suites/%s", dashboardURI, testSuiteName), + "testsuite_uri": fmt.Sprintf("%s/test-suites/%s", dashboardURI, name), }).Observe(float64(execution.DurationMs)) } @@ -340,6 +365,57 @@ func (m Metrics) IncAbortTest(testType string, failed bool) { }).Inc() } +func (m Metrics) IncAbortTestSuite() { + result := "aborted" + m.TestSuiteAbort.With(map[string]string{ + "result": result, + }).Inc() +} + +func (m Metrics) IncAndObserveExecuteTestWorkflow(execution testkube.TestWorkflowExecution, dashboardURI string) { + name := "" + status := "" + if execution.Workflow != nil { + name = execution.Workflow.Name + } + + if execution.Result != nil && execution.Result.Status != nil { + status = string(*execution.Result.Status) + } + + var labels []string + if execution.Workflow != nil { + for key, value := range execution.Workflow.Labels { + labels = append(labels, fmt.Sprintf("%s=%s", key, value)) + } + } + + slices.Sort(labels) + + m.TestWorkflowExecutionsCount.With(map[string]string{ + "name": name, + "result": status, + "labels": strings.Join(labels, ","), + "testworkflow_uri": fmt.Sprintf("%s/test-workflows/%s", dashboardURI, name), + }).Inc() + + if execution.Result != nil { + m.TestWorkflowExecutionsDurationMs.With(map[string]string{ + "name": name, + "result": status, + "labels": strings.Join(labels, ","), + "testworkflow_uri": fmt.Sprintf("%s/test-workflows/%s", dashboardURI, name), + }).Observe(float64(execution.Result.DurationMs)) + } +} + +func (m Metrics) IncAbortTestWorkflow() { + result := "aborted" + m.TestWorkflowAbort.With(map[string]string{ + "result": result, + }).Inc() +} + func (m Metrics) IncCreateTestWorkflow(err error) { result := "created" if err != nil { diff --git a/internal/app/api/v1/testsuites.go b/internal/app/api/v1/testsuites.go index 8397c717cfb..5438c2fb5d5 100644 --- a/internal/app/api/v1/testsuites.go +++ b/internal/app/api/v1/testsuites.go @@ -783,10 +783,10 @@ func (s TestkubeAPI) AbortTestSuiteHandler() fiber.Handler { execution.Status = testkube.TestSuiteExecutionStatusAborting s.Log.Infow("aborting test suite execution", "executionID", execution.Id) err := s.eventsBus.PublishTopic(bus.InternalPublishTopic, testkube.NewEventEndTestSuiteAborted(&execution)) - if err != nil { return s.Error(c, http.StatusInternalServerError, fmt.Errorf("%s: could not sent test suite abortion event: %w", errPrefix, err)) } + s.Metrics.IncAbortTestSuite() s.Log.Infow("test suite execution aborted, event sent", "executionID", c.Params("executionID")) } @@ -816,6 +816,7 @@ func (s TestkubeAPI) AbortTestSuiteExecutionHandler() fiber.Handler { return s.Error(c, http.StatusInternalServerError, fmt.Errorf("%s: could not sent test suite abortion event: %w", errPrefix, err)) } s.Log.Debugw("test suite execution aborted, event sent", "executionID", c.Params("executionID")) + s.Metrics.IncAbortTestSuite() return c.Status(http.StatusNoContent).SendString("") } diff --git a/pkg/tcl/apitcl/v1/testworkflowexecutions.go b/pkg/tcl/apitcl/v1/testworkflowexecutions.go index 0229a0491fa..acde32243b8 100644 --- a/pkg/tcl/apitcl/v1/testworkflowexecutions.go +++ b/pkg/tcl/apitcl/v1/testworkflowexecutions.go @@ -243,6 +243,7 @@ func (s *apiTCL) AbortTestWorkflowExecutionHandler() fiber.Handler { if err != nil { return s.ClientError(c, "aborting test workflow execution", err) } + s.Metrics.IncAbortTestWorkflow() c.Status(http.StatusNoContent) @@ -359,6 +360,7 @@ func (s *apiTCL) AbortAllTestWorkflowExecutionsHandler() fiber.Handler { if err != nil { return s.ClientError(c, errPrefix, err) } + s.Metrics.IncAbortTestWorkflow() } c.Status(http.StatusNoContent) diff --git a/pkg/tcl/testworkflowstcl/testworkflowexecutor/executor.go b/pkg/tcl/testworkflowstcl/testworkflowexecutor/executor.go index 496a5815818..d956534a2d7 100644 --- a/pkg/tcl/testworkflowstcl/testworkflowexecutor/executor.go +++ b/pkg/tcl/testworkflowstcl/testworkflowexecutor/executor.go @@ -27,6 +27,7 @@ import ( testworkflowsclientv1 "github.com/kubeshop/testkube-operator/pkg/client/testworkflows/v1" initconstants "github.com/kubeshop/testkube/cmd/tcl/testworkflow-init/constants" "github.com/kubeshop/testkube/cmd/tcl/testworkflow-init/data" + v1 "github.com/kubeshop/testkube/internal/app/api/metrics" "github.com/kubeshop/testkube/internal/common" "github.com/kubeshop/testkube/pkg/api/v1/testkube" "github.com/kubeshop/testkube/pkg/event" @@ -65,12 +66,14 @@ type executor struct { executionResults result.Repository testWorkflowExecutionsClient testworkflowsclientv1.TestWorkflowExecutionsInterface testWorkflowsClient testworkflowsclientv1.Interface + metrics v1.Metrics globalTemplateName string apiUrl string namespace string defaultRegistry string enableImageDataPersistentCache bool imageDataPersistentCacheKey string + dashboardURI string serviceAccountNames map[string]string } @@ -84,9 +87,10 @@ func New(emitter *event.Emitter, executionResults result.Repository, testWorkflowExecutionsClient testworkflowsclientv1.TestWorkflowExecutionsInterface, testWorkflowsClient testworkflowsclientv1.Interface, + metrics v1.Metrics, serviceAccountNames map[string]string, globalTemplateName, namespace, apiUrl, defaultRegistry string, - enableImageDataPersistentCache bool, imageDataPersistentCacheKey string) TestWorkflowExecutor { + enableImageDataPersistentCache bool, imageDataPersistentCacheKey, dashboardURI string) TestWorkflowExecutor { if serviceAccountNames == nil { serviceAccountNames = make(map[string]string) } @@ -102,6 +106,7 @@ func New(emitter *event.Emitter, executionResults: executionResults, testWorkflowExecutionsClient: testWorkflowExecutionsClient, testWorkflowsClient: testWorkflowsClient, + metrics: metrics, serviceAccountNames: serviceAccountNames, globalTemplateName: globalTemplateName, apiUrl: apiUrl, @@ -109,6 +114,7 @@ func New(emitter *event.Emitter, defaultRegistry: defaultRegistry, enableImageDataPersistentCache: enableImageDataPersistentCache, imageDataPersistentCacheKey: imageDataPersistentCacheKey, + dashboardURI: dashboardURI, } } @@ -303,6 +309,8 @@ func (e *executor) Control(ctx context.Context, testWorkflow *testworkflowsv1.Te wg.Wait() + e.metrics.IncAndObserveExecuteTestWorkflow(*execution, e.dashboardURI) + e.updateStatus(testWorkflow, execution, testWorkflowExecution) err = testworkflowcontroller.Cleanup(ctx, e.clientSet, execution.GetNamespace(e.namespace), execution.Id) if err != nil { diff --git a/pkg/triggers/scraper.go b/pkg/triggers/scraper.go index f7a07187095..e7e4bfa5507 100644 --- a/pkg/triggers/scraper.go +++ b/pkg/triggers/scraper.go @@ -155,6 +155,7 @@ func (s *Service) abortRunningTestSuiteExecutions(ctx context.Context, status *t s.logger.Errorf("trigger service: execution scraper component: error aborting test suite execution: %v", err) continue } + s.metrics.IncAbortTestSuite() s.logger.Debugf("trigger service: execution scraper component: testsuite execution %s is aborted", id) status.removeTestSuiteExecutionID(id) @@ -193,6 +194,7 @@ func (s *Service) abortRunningTestWorkflowExecutions(ctx context.Context, status s.logger.Errorf("trigger service: execution scraper component: error aborting test workflow execution: %v", err) continue } + s.metrics.IncAbortTestWorkflow() s.logger.Debugf("trigger service: execution scraper component: testworkflow execution %s is aborted", id) status.removeTestWorkflowExecutionID(id) From 0b24fe1656f50aaeda638aaba03342f23395995c Mon Sep 17 00:00:00 2001 From: Vladislav Sukhin Date: Thu, 13 Jun 2024 14:06:19 +0300 Subject: [PATCH 02/10] docs: test workflow metrics --- docs/docs/articles/metrics.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/articles/metrics.md b/docs/docs/articles/metrics.md index 7355f505b6f..2160597ce4a 100644 --- a/docs/docs/articles/metrics.md +++ b/docs/docs/articles/metrics.md @@ -4,6 +4,7 @@ The Testkube API Server exposes a `/metrics` endpoint that can be consumed by Pr * `testkube_test_executions_count` - The total number of test executions. * `testkube_testsuite_executions_count` - The total number of test suite executions. +* `testkube_testworkflow_executions_count` - The total number of test workflow executions. * `testkube_test_creations_count` - The total number of tests created by type events. * `testkube_testsuite_creations_count` - The total number of test suites created events. * `testkube_test_updates_count` - The total number of tests updated by type events. @@ -14,8 +15,11 @@ The Testkube API Server exposes a `/metrics` endpoint that can be consumed by Pr * `testkube_testtriggers_bulk_updates_count` - The total number of test trigger bulk update events. * `testkube_testtriggers_bulk_deletes_count` - The total number of test trigger bulk delete events. * `testkube_test_aborts_count` - The total number of tests aborted by type events. +* `testkube_testsuite_aborts_count` - The total number of test suites aborted by type events. +* `testkube_testworkflow_aborts_count` - The total number of test workflows aborted by type events. * `testkube_test_executions_duration_ms`- The duration of test executions. * `testkube_testsuite_executions_duration_ms`- The duration of test suite executions. +* `testkube_testworkflow_executions_duration_ms`- The duration of test workflow executions. Note: as the metrics also include labels with the associated test name (see below), no metrics are produced unless some tests were run since last api-server restart From 9898b3867b84d2dd4a9710898d6794a1405aa96d Mon Sep 17 00:00:00 2001 From: Vladislav Sukhin Date: Mon, 17 Jun 2024 16:00:45 +0300 Subject: [PATCH 03/10] feat: test trigger metrics --- internal/app/api/metrics/metrics.go | 24 ++++++++++++++++++++++++ pkg/triggers/matcher.go | 7 +++++++ pkg/triggers/watcher.go | 2 ++ 3 files changed, 33 insertions(+) diff --git a/internal/app/api/metrics/metrics.go b/internal/app/api/metrics/metrics.go index 841a110c085..028036674d3 100644 --- a/internal/app/api/metrics/metrics.go +++ b/internal/app/api/metrics/metrics.go @@ -134,6 +134,11 @@ var testWorkflowTemplateDeletesCount = promauto.NewCounterVec(prometheus.Counter Help: "The total number of test workflow template deleted events", }, []string{"result"}) +var testTriggerEventCount = promauto.NewCounterVec(prometheus.CounterOpts{ + Name: "testkube_testtrigger_event_count", + Help: "The total number of test trigger events", +}, []string{"resource", "name", "labels", "eventType", "causes"}) + func NewMetrics() Metrics { return Metrics{ TestExecutionsCount: testExecutionsCount, @@ -160,6 +165,7 @@ func NewMetrics() Metrics { TestWorkflowTemplateCreations: testWorkflowTemplateCreationCount, TestWorkflowTemplateUpdates: testWorkflowTemplateUpdatesCount, TestWorkflowTemplateDeletes: testWorkflowTemplateDeletesCount, + TestTriggerEventCount: testTriggerEventCount, } } @@ -188,6 +194,7 @@ type Metrics struct { TestWorkflowTemplateCreations *prometheus.CounterVec TestWorkflowTemplateUpdates *prometheus.CounterVec TestWorkflowTemplateDeletes *prometheus.CounterVec + TestTriggerEventCount *prometheus.CounterVec } func (m Metrics) IncAndObserveExecuteTest(execution testkube.Execution, dashboardURI string) { @@ -481,3 +488,20 @@ func (m Metrics) IncDeleteTestWorkflowTemplate(err error) { "result": result, }).Inc() } + +func (m Metrics) IncTestTriggerEventCount(resource, name, eventType string, causes []string, labels map[string]string) { + var ls []string + for key, value := range labels { + ls = append(ls, fmt.Sprintf("%s=%s", key, value)) + } + + slices.Sort(ls) + slices.Sort(causes) + m.TestTriggerEventCount.With(map[string]string{ + "resource": resource, + "name": name, + "labels": strings.Join(ls, ","), + "eventType": eventType, + "causes": strings.Join(causes, ","), + }).Inc() +} diff --git a/pkg/triggers/matcher.go b/pkg/triggers/matcher.go index 74e64209e20..51478cf50f6 100644 --- a/pkg/triggers/matcher.go +++ b/pkg/triggers/matcher.go @@ -87,6 +87,13 @@ func (s *Service) match(ctx context.Context, e *watcherEvent) error { s.logger.Infof("trigger service: matcher component: event %s matches trigger %s/%s for resource %s", e.eventType, t.Namespace, t.Name, e.resource) s.logger.Infof("trigger service: matcher component: triggering %s action for %s execution", t.Spec.Action, t.Spec.Execution) + + var causes []string + for _, cause := range e.causes { + causes = append(causes, string(cause)) + } + + s.metrics.IncTestTriggerEventCount(string(e.resource), e.name, string(e.eventType), causes, e.labels) if err := s.triggerExecutor(ctx, e, t); err != nil { return err } diff --git a/pkg/triggers/watcher.go b/pkg/triggers/watcher.go index 733abdcdeef..2daae7982d7 100644 --- a/pkg/triggers/watcher.go +++ b/pkg/triggers/watcher.go @@ -281,6 +281,8 @@ func (s *Service) podEventHandler(ctx context.Context) cache.ResourceEventHandle newPod.Namespace == s.testkubeNamespace && newPod.Labels["job-name"] != "" && newPod.Labels[testkube.TestLabelTestName] != "" && !(strings.HasSuffix(oldPod.Name, cexecutor.ScraperPodSuffix) || strings.HasSuffix(newPod.Name, cexecutor.ScraperPodSuffix)) && oldPod.Labels["job-name"] == newPod.Labels["job-name"] { + s.metrics.IncTestTriggerEventCount(string(testtrigger.ResourcePod), newPod.Name, string(testtrigger.CauseEventUpdated), + nil, newPod.Labels) s.checkExecutionPodStatus(ctx, oldPod.Labels["job-name"], []*corev1.Pod{oldPod, newPod}) } }, From 1ce800def02c427e04e893bd2c6037219b352ed0 Mon Sep 17 00:00:00 2001 From: Vladislav Sukhin Date: Mon, 17 Jun 2024 16:52:04 +0300 Subject: [PATCH 04/10] docs: test trigger metric --- docs/docs/articles/metrics.md | 1 + internal/app/api/metrics/metrics.go | 12 ++---------- pkg/triggers/matcher.go | 2 +- pkg/triggers/watcher.go | 3 +-- 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/docs/docs/articles/metrics.md b/docs/docs/articles/metrics.md index 2160597ce4a..c299259e25f 100644 --- a/docs/docs/articles/metrics.md +++ b/docs/docs/articles/metrics.md @@ -20,6 +20,7 @@ The Testkube API Server exposes a `/metrics` endpoint that can be consumed by Pr * `testkube_test_executions_duration_ms`- The duration of test executions. * `testkube_testsuite_executions_duration_ms`- The duration of test suite executions. * `testkube_testworkflow_executions_duration_ms`- The duration of test workflow executions. +* `testkube_testtrigger_event_count` - The total number of test trigger events. Note: as the metrics also include labels with the associated test name (see below), no metrics are produced unless some tests were run since last api-server restart diff --git a/internal/app/api/metrics/metrics.go b/internal/app/api/metrics/metrics.go index 028036674d3..7f7b0fbe0a2 100644 --- a/internal/app/api/metrics/metrics.go +++ b/internal/app/api/metrics/metrics.go @@ -137,7 +137,7 @@ var testWorkflowTemplateDeletesCount = promauto.NewCounterVec(prometheus.Counter var testTriggerEventCount = promauto.NewCounterVec(prometheus.CounterOpts{ Name: "testkube_testtrigger_event_count", Help: "The total number of test trigger events", -}, []string{"resource", "name", "labels", "eventType", "causes"}) +}, []string{"resource", "eventType", "causes"}) func NewMetrics() Metrics { return Metrics{ @@ -489,18 +489,10 @@ func (m Metrics) IncDeleteTestWorkflowTemplate(err error) { }).Inc() } -func (m Metrics) IncTestTriggerEventCount(resource, name, eventType string, causes []string, labels map[string]string) { - var ls []string - for key, value := range labels { - ls = append(ls, fmt.Sprintf("%s=%s", key, value)) - } - - slices.Sort(ls) +func (m Metrics) IncTestTriggerEventCount(resource, eventType string, causes []string) { slices.Sort(causes) m.TestTriggerEventCount.With(map[string]string{ "resource": resource, - "name": name, - "labels": strings.Join(ls, ","), "eventType": eventType, "causes": strings.Join(causes, ","), }).Inc() diff --git a/pkg/triggers/matcher.go b/pkg/triggers/matcher.go index 51478cf50f6..c6b42bf07f9 100644 --- a/pkg/triggers/matcher.go +++ b/pkg/triggers/matcher.go @@ -93,7 +93,7 @@ func (s *Service) match(ctx context.Context, e *watcherEvent) error { causes = append(causes, string(cause)) } - s.metrics.IncTestTriggerEventCount(string(e.resource), e.name, string(e.eventType), causes, e.labels) + s.metrics.IncTestTriggerEventCount(string(e.resource), string(e.eventType), causes) if err := s.triggerExecutor(ctx, e, t); err != nil { return err } diff --git a/pkg/triggers/watcher.go b/pkg/triggers/watcher.go index 2daae7982d7..ec95642ac45 100644 --- a/pkg/triggers/watcher.go +++ b/pkg/triggers/watcher.go @@ -281,8 +281,7 @@ func (s *Service) podEventHandler(ctx context.Context) cache.ResourceEventHandle newPod.Namespace == s.testkubeNamespace && newPod.Labels["job-name"] != "" && newPod.Labels[testkube.TestLabelTestName] != "" && !(strings.HasSuffix(oldPod.Name, cexecutor.ScraperPodSuffix) || strings.HasSuffix(newPod.Name, cexecutor.ScraperPodSuffix)) && oldPod.Labels["job-name"] == newPod.Labels["job-name"] { - s.metrics.IncTestTriggerEventCount(string(testtrigger.ResourcePod), newPod.Name, string(testtrigger.CauseEventUpdated), - nil, newPod.Labels) + s.metrics.IncTestTriggerEventCount(string(testtrigger.ResourcePod), string(testtrigger.CauseEventUpdated), nil) s.checkExecutionPodStatus(ctx, oldPod.Labels["job-name"], []*corev1.Pod{oldPod, newPod}) } }, From 70f46b2798f3f740ffc9315ab4c35724a8768018 Mon Sep 17 00:00:00 2001 From: Vladislav Sukhin Date: Mon, 17 Jun 2024 17:08:55 +0300 Subject: [PATCH 05/10] fix: unit tests --- pkg/triggers/matcher_test.go | 8 ++++++++ pkg/triggers/watcher_test.go | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/pkg/triggers/matcher_test.go b/pkg/triggers/matcher_test.go index 72d1012799f..6aac351f413 100644 --- a/pkg/triggers/matcher_test.go +++ b/pkg/triggers/matcher_test.go @@ -11,6 +11,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" testtriggersv1 "github.com/kubeshop/testkube-operator/api/testtriggers/v1" + "github.com/kubeshop/testkube/internal/app/api/metrics" "github.com/kubeshop/testkube/pkg/log" ) @@ -89,6 +90,7 @@ func TestService_matchConditionsRetry(t *testing.T) { }, triggerStatus: map[statusKey]*triggerStatus{statusKey1: triggerStatus1}, logger: log.DefaultLogger, + metrics: metrics.NewMetrics(), } err := s.match(context.Background(), e) @@ -165,6 +167,7 @@ func TestService_matchConditionsTimeout(t *testing.T) { }, triggerStatus: map[statusKey]*triggerStatus{statusKey1: triggerStatus1}, logger: log.DefaultLogger, + metrics: metrics.NewMetrics(), } err := s.match(context.Background(), e) @@ -238,6 +241,7 @@ func TestService_matchProbesMultiple(t *testing.T) { triggerStatus: map[statusKey]*triggerStatus{statusKey1: triggerStatus1}, logger: log.DefaultLogger, httpClient: http.DefaultClient, + metrics: metrics.NewMetrics(), } err = s.match(context.Background(), e) @@ -304,6 +308,7 @@ func TestService_matchProbesTimeout(t *testing.T) { triggerStatus: map[statusKey]*triggerStatus{statusKey1: triggerStatus1}, logger: log.DefaultLogger, httpClient: http.DefaultClient, + metrics: metrics.NewMetrics(), } err = s.match(context.Background(), e) @@ -409,6 +414,7 @@ func TestService_match(t *testing.T) { triggerStatus: map[statusKey]*triggerStatus{statusKey1: triggerStatus1}, logger: log.DefaultLogger, httpClient: http.DefaultClient, + metrics: metrics.NewMetrics(), } err = s.match(context.Background(), e) @@ -459,6 +465,7 @@ func TestService_matchRegex(t *testing.T) { triggerStatus: map[statusKey]*triggerStatus{statusKey1: triggerStatus1}, logger: log.DefaultLogger, httpClient: http.DefaultClient, + metrics: metrics.NewMetrics(), } err := s.match(context.Background(), e) @@ -500,6 +507,7 @@ func TestService_noMatch(t *testing.T) { triggerExecutor: testExecutorF, triggerStatus: map[statusKey]*triggerStatus{statusKey1: triggerStatus1}, logger: log.DefaultLogger, + metrics: metrics.NewMetrics(), } err := s.match(context.Background(), e) diff --git a/pkg/triggers/watcher_test.go b/pkg/triggers/watcher_test.go index d352e8d48fa..2e2df242d7e 100644 --- a/pkg/triggers/watcher_test.go +++ b/pkg/triggers/watcher_test.go @@ -12,6 +12,7 @@ import ( testtriggersv1 "github.com/kubeshop/testkube-operator/api/testtriggers/v1" faketestkube "github.com/kubeshop/testkube-operator/pkg/clientset/versioned/fake" + "github.com/kubeshop/testkube/internal/app/api/metrics" "github.com/kubeshop/testkube/pkg/event/bus" "github.com/kubeshop/testkube/pkg/log" ) @@ -35,6 +36,7 @@ func TestService_runWatcher_lease(t *testing.T) { logger: log.DefaultLogger, informers: newK8sInformers(clientset, testKubeClientset, "", []string{}), eventsBus: &bus.EventBusMock{}, + metrics: metrics.NewMetrics(), } leaseChan := make(chan bool) @@ -94,6 +96,7 @@ func TestService_runWatcher_lease(t *testing.T) { logger: log.DefaultLogger, informers: newK8sInformers(clientset, testKubeClientset, "", []string{}), eventsBus: &bus.EventBusMock{}, + metrics: metrics.NewMetrics(), } leaseChan := make(chan bool) @@ -156,6 +159,7 @@ func TestService_runWatcher_noLease(t *testing.T) { logger: log.DefaultLogger, informers: newK8sInformers(clientset, testKubeClientset, "", []string{}), eventsBus: &bus.EventBusMock{}, + metrics: metrics.NewMetrics(), } leaseChan := make(chan bool) @@ -197,6 +201,7 @@ func TestService_runWatcher_noLease(t *testing.T) { logger: log.DefaultLogger, informers: newK8sInformers(clientset, testKubeClientset, "", []string{}), eventsBus: &bus.EventBusMock{}, + metrics: metrics.NewMetrics(), } leaseChan := make(chan bool) @@ -240,6 +245,7 @@ func TestService_runWatcher_noLease(t *testing.T) { logger: log.DefaultLogger, informers: newK8sInformers(clientset, testKubeClientset, "", []string{}), eventsBus: &bus.EventBusMock{}, + metrics: metrics.NewMetrics(), } leaseChan := make(chan bool) From 9e8a59aa4ba1a6bb58fe030ce19242d8ddf3cd52 Mon Sep 17 00:00:00 2001 From: Vladislav Sukhin Date: Wed, 19 Jun 2024 15:15:34 +0300 Subject: [PATCH 06/10] fix: expand test flag --- contrib/executor/jmeterd/pkg/runner/helpers.go | 2 +- internal/app/api/metrics/metrics.go | 5 +++-- pkg/triggers/matcher.go | 2 +- pkg/triggers/watcher.go | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/contrib/executor/jmeterd/pkg/runner/helpers.go b/contrib/executor/jmeterd/pkg/runner/helpers.go index e0cdb47df93..a2544fdacbf 100644 --- a/contrib/executor/jmeterd/pkg/runner/helpers.go +++ b/contrib/executor/jmeterd/pkg/runner/helpers.go @@ -39,7 +39,7 @@ func getTestPathAndWorkingDir(fs filesystem.FileSystem, execution *testkube.Exec if arg == jmeterTestFileFlag { if (i + 1) < len(execution.Args) { if execution.Args[i+1] != "" { - testFlag = execution.Args[i+1] + testFlag = os.ExpandEnv(execution.Args[i+1]) i++ continue } diff --git a/internal/app/api/metrics/metrics.go b/internal/app/api/metrics/metrics.go index 7f7b0fbe0a2..8b1ed013ea3 100644 --- a/internal/app/api/metrics/metrics.go +++ b/internal/app/api/metrics/metrics.go @@ -137,7 +137,7 @@ var testWorkflowTemplateDeletesCount = promauto.NewCounterVec(prometheus.Counter var testTriggerEventCount = promauto.NewCounterVec(prometheus.CounterOpts{ Name: "testkube_testtrigger_event_count", Help: "The total number of test trigger events", -}, []string{"resource", "eventType", "causes"}) +}, []string{"name", "resource", "eventType", "causes"}) func NewMetrics() Metrics { return Metrics{ @@ -489,9 +489,10 @@ func (m Metrics) IncDeleteTestWorkflowTemplate(err error) { }).Inc() } -func (m Metrics) IncTestTriggerEventCount(resource, eventType string, causes []string) { +func (m Metrics) IncTestTriggerEventCount(name, resource, eventType string, causes []string) { slices.Sort(causes) m.TestTriggerEventCount.With(map[string]string{ + "name": name, "resource": resource, "eventType": eventType, "causes": strings.Join(causes, ","), diff --git a/pkg/triggers/matcher.go b/pkg/triggers/matcher.go index c6b42bf07f9..747c5cca067 100644 --- a/pkg/triggers/matcher.go +++ b/pkg/triggers/matcher.go @@ -93,7 +93,7 @@ func (s *Service) match(ctx context.Context, e *watcherEvent) error { causes = append(causes, string(cause)) } - s.metrics.IncTestTriggerEventCount(string(e.resource), string(e.eventType), causes) + s.metrics.IncTestTriggerEventCount(t.Name, string(e.resource), string(e.eventType), causes) if err := s.triggerExecutor(ctx, e, t); err != nil { return err } diff --git a/pkg/triggers/watcher.go b/pkg/triggers/watcher.go index ec95642ac45..143b7c9acc0 100644 --- a/pkg/triggers/watcher.go +++ b/pkg/triggers/watcher.go @@ -281,7 +281,7 @@ func (s *Service) podEventHandler(ctx context.Context) cache.ResourceEventHandle newPod.Namespace == s.testkubeNamespace && newPod.Labels["job-name"] != "" && newPod.Labels[testkube.TestLabelTestName] != "" && !(strings.HasSuffix(oldPod.Name, cexecutor.ScraperPodSuffix) || strings.HasSuffix(newPod.Name, cexecutor.ScraperPodSuffix)) && oldPod.Labels["job-name"] == newPod.Labels["job-name"] { - s.metrics.IncTestTriggerEventCount(string(testtrigger.ResourcePod), string(testtrigger.CauseEventUpdated), nil) + s.metrics.IncTestTriggerEventCount("", string(testtrigger.ResourcePod), string(testtrigger.CauseEventUpdated), nil) s.checkExecutionPodStatus(ctx, oldPod.Labels["job-name"], []*corev1.Pod{oldPod, newPod}) } }, From 347289dcfd868bfb962b09dec2d6af86fa6e5d7c Mon Sep 17 00:00:00 2001 From: Vladislav Sukhin Date: Tue, 25 Jun 2024 16:38:47 +0300 Subject: [PATCH 07/10] feat: slave pod options Signed-off-by: Vladislav Sukhin --- .../executor/jmeterd/build/slaves/Dockerfile | 4 +++ contrib/executor/jmeterd/pkg/slaves/utils.go | 7 ++++ .../executor/jmeterd/scripts/jmeter-server.sh | 32 +++++++++++++++++++ .../executor/jmeterd/scripts/jmeter-slaves.sh | 2 +- 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100755 contrib/executor/jmeterd/scripts/jmeter-server.sh diff --git a/contrib/executor/jmeterd/build/slaves/Dockerfile b/contrib/executor/jmeterd/build/slaves/Dockerfile index 6014293199d..adf192cbbb0 100644 --- a/contrib/executor/jmeterd/build/slaves/Dockerfile +++ b/contrib/executor/jmeterd/build/slaves/Dockerfile @@ -1,9 +1,13 @@ FROM kubeshop/jmeter:5.5 +# support logs permissions +RUN mkdir -p /logs +RUN chmod 777 /logs EXPOSE 1099 60001 ENV SSL_DISABLED true COPY ./contrib/executor/jmeterd/scripts/jmeter-slaves.sh /jmeter_slaves_entrypoint.sh +COPY ./contrib/executor/jmeterd/scripts/jmeter-server.sh /jmeter-server.sh RUN chmod +x /jmeter_slaves_entrypoint.sh ENTRYPOINT /jmeter_slaves_entrypoint.sh \ No newline at end of file diff --git a/contrib/executor/jmeterd/pkg/slaves/utils.go b/contrib/executor/jmeterd/pkg/slaves/utils.go index acdd9a36971..5d1e0237447 100644 --- a/contrib/executor/jmeterd/pkg/slaves/utils.go +++ b/contrib/executor/jmeterd/pkg/slaves/utils.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "strconv" + "strings" "github.com/pkg/errors" @@ -59,6 +60,12 @@ func getSlaveRunnerEnv(envs map[string]string, runnerExecution testkube.Executio func getSlaveConfigurationEnv(slaveEnv map[string]testkube.Variable, slavesPodNumber int) []v1.EnvVar { var envVars []v1.EnvVar for envKey, t := range slaveEnv { + if envKey == SlavesAdditionalJmeterArgs { + if !strings.Contains(t.Value, "-j") { + t.Value += " -j /data/server.log" + } + } + envVars = append(envVars, v1.EnvVar{Name: envKey, Value: t.Value}) } diff --git a/contrib/executor/jmeterd/scripts/jmeter-server.sh b/contrib/executor/jmeterd/scripts/jmeter-server.sh new file mode 100755 index 00000000000..d32e48253cd --- /dev/null +++ b/contrib/executor/jmeterd/scripts/jmeter-server.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +## 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. + +## To change the RMI/Server port: +## +## SERVER_PORT=1234 jmeter-server +## + +DIRNAME=`dirname $0` + +# If the client fails with: +# ERROR - jmeter.engine.ClientJMeterEngine: java.rmi.ConnectException: Connection refused to host: 127.0.0.1 +# then it may be due to the server host returning 127.0.0.1 as its address + +# One way to fix this is to define RMI_HOST_DEF below +#RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx + +${DIRNAME}/jmeter ${RMI_HOST_DEF} -Dserver_port=${SERVER_PORT:-1099} -s "$@" \ No newline at end of file diff --git a/contrib/executor/jmeterd/scripts/jmeter-slaves.sh b/contrib/executor/jmeterd/scripts/jmeter-slaves.sh index 72b851e8a93..0d011e3eca6 100644 --- a/contrib/executor/jmeterd/scripts/jmeter-slaves.sh +++ b/contrib/executor/jmeterd/scripts/jmeter-slaves.sh @@ -54,4 +54,4 @@ SERVER_ARGS="-Dserver.rmi.localport=60001 -Dserver_port=1099 -Jserver.rmi.ssl.di echo "Running command: jmeter-server ${SERVER_ARGS} ${SLAVES_ADDITIONAL_JMETER_ARGS}" echo -jmeter-server ${SERVER_ARGS} ${SLAVES_ADDITIONAL_JMETER_ARGS} \ No newline at end of file +/jmeter-server.sh ${SERVER_ARGS} ${SLAVES_ADDITIONAL_JMETER_ARGS} \ No newline at end of file From b19ab0c16adaf1bab32cad4024b4978bf4425ca0 Mon Sep 17 00:00:00 2001 From: Vladislav Sukhin Date: Tue, 25 Jun 2024 16:41:40 +0300 Subject: [PATCH 08/10] fix: rename log path Signed-off-by: Vladislav Sukhin --- contrib/executor/jmeterd/pkg/slaves/utils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/executor/jmeterd/pkg/slaves/utils.go b/contrib/executor/jmeterd/pkg/slaves/utils.go index 5d1e0237447..d2f5d763668 100644 --- a/contrib/executor/jmeterd/pkg/slaves/utils.go +++ b/contrib/executor/jmeterd/pkg/slaves/utils.go @@ -62,7 +62,7 @@ func getSlaveConfigurationEnv(slaveEnv map[string]testkube.Variable, slavesPodNu for envKey, t := range slaveEnv { if envKey == SlavesAdditionalJmeterArgs { if !strings.Contains(t.Value, "-j") { - t.Value += " -j /data/server.log" + t.Value += " -j /logs/server.log" } } From 5385187ed0e4af42caea0dc5bbff97f02a32411f Mon Sep 17 00:00:00 2001 From: Vladislav Sukhin Date: Tue, 25 Jun 2024 19:25:08 +0300 Subject: [PATCH 09/10] fix: remove script Signed-off-by: Vladislav Sukhin --- contrib/executor/jmeterd/build/slaves/Dockerfile | 1 - contrib/executor/jmeterd/pkg/slaves/utils.go | 10 +++++++++- contrib/executor/jmeterd/scripts/jmeter-slaves.sh | 4 ++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/contrib/executor/jmeterd/build/slaves/Dockerfile b/contrib/executor/jmeterd/build/slaves/Dockerfile index adf192cbbb0..cbdd818c0a5 100644 --- a/contrib/executor/jmeterd/build/slaves/Dockerfile +++ b/contrib/executor/jmeterd/build/slaves/Dockerfile @@ -8,6 +8,5 @@ EXPOSE 1099 60001 ENV SSL_DISABLED true COPY ./contrib/executor/jmeterd/scripts/jmeter-slaves.sh /jmeter_slaves_entrypoint.sh -COPY ./contrib/executor/jmeterd/scripts/jmeter-server.sh /jmeter-server.sh RUN chmod +x /jmeter_slaves_entrypoint.sh ENTRYPOINT /jmeter_slaves_entrypoint.sh \ No newline at end of file diff --git a/contrib/executor/jmeterd/pkg/slaves/utils.go b/contrib/executor/jmeterd/pkg/slaves/utils.go index d2f5d763668..f7e2e3f6936 100644 --- a/contrib/executor/jmeterd/pkg/slaves/utils.go +++ b/contrib/executor/jmeterd/pkg/slaves/utils.go @@ -20,6 +20,7 @@ const ( defaultSlavesCount = 0 serverPort = 1099 localPort = 60001 + logFile = "/logs/server.log" ) func getSlaveRunnerEnv(envs map[string]string, runnerExecution testkube.Execution) []v1.EnvVar { @@ -59,16 +60,23 @@ func getSlaveRunnerEnv(envs map[string]string, runnerExecution testkube.Executio func getSlaveConfigurationEnv(slaveEnv map[string]testkube.Variable, slavesPodNumber int) []v1.EnvVar { var envVars []v1.EnvVar + found := false for envKey, t := range slaveEnv { if envKey == SlavesAdditionalJmeterArgs { if !strings.Contains(t.Value, "-j") { - t.Value += " -j /logs/server.log" + t.Value += " -j " + logFile } + + found = true } envVars = append(envVars, v1.EnvVar{Name: envKey, Value: t.Value}) } + if !found { + envVars = append(envVars, v1.EnvVar{Name: SlavesAdditionalJmeterArgs, Value: " -j " + logFile}) + } + envVars = append(envVars, v1.EnvVar{Name: "SLAVE_POD_NUMBER", Value: strconv.Itoa(slavesPodNumber)}) return envVars } diff --git a/contrib/executor/jmeterd/scripts/jmeter-slaves.sh b/contrib/executor/jmeterd/scripts/jmeter-slaves.sh index 0d011e3eca6..c665a65de89 100644 --- a/contrib/executor/jmeterd/scripts/jmeter-slaves.sh +++ b/contrib/executor/jmeterd/scripts/jmeter-slaves.sh @@ -51,7 +51,7 @@ echo "********************************************************" echo SERVER_ARGS="-Dserver.rmi.localport=60001 -Dserver_port=1099 -Jserver.rmi.ssl.disable=${SSL_DISABLED}" -echo "Running command: jmeter-server ${SERVER_ARGS} ${SLAVES_ADDITIONAL_JMETER_ARGS}" +echo "Running command: jmeter ${RMI_HOST_DEF} -s ${SERVER_ARGS} ${SLAVES_ADDITIONAL_JMETER_ARGS}" echo -/jmeter-server.sh ${SERVER_ARGS} ${SLAVES_ADDITIONAL_JMETER_ARGS} \ No newline at end of file +jmeter ${RMI_HOST_DEF} -s ${SERVER_ARGS} ${SLAVES_ADDITIONAL_JMETER_ARGS} From e1ad84ca12cf2f2b79f467b8990bb0236975593e Mon Sep 17 00:00:00 2001 From: Vladislav Sukhin Date: Tue, 25 Jun 2024 19:27:47 +0300 Subject: [PATCH 10/10] fix: remove file Signed-off-by: Vladislav Sukhin --- .../executor/jmeterd/scripts/jmeter-server.sh | 32 ------------------- 1 file changed, 32 deletions(-) delete mode 100755 contrib/executor/jmeterd/scripts/jmeter-server.sh diff --git a/contrib/executor/jmeterd/scripts/jmeter-server.sh b/contrib/executor/jmeterd/scripts/jmeter-server.sh deleted file mode 100755 index d32e48253cd..00000000000 --- a/contrib/executor/jmeterd/scripts/jmeter-server.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -## 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. - -## To change the RMI/Server port: -## -## SERVER_PORT=1234 jmeter-server -## - -DIRNAME=`dirname $0` - -# If the client fails with: -# ERROR - jmeter.engine.ClientJMeterEngine: java.rmi.ConnectException: Connection refused to host: 127.0.0.1 -# then it may be due to the server host returning 127.0.0.1 as its address - -# One way to fix this is to define RMI_HOST_DEF below -#RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx - -${DIRNAME}/jmeter ${RMI_HOST_DEF} -Dserver_port=${SERVER_PORT:-1099} -s "$@" \ No newline at end of file