You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2021/08/08 07:32:54 UTC

[skywalking-infra-e2e] branch main updated: Fix http trigger could not be schedule by interval (#28)

This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-infra-e2e.git


The following commit(s) were added to refs/heads/main by this push:
     new 37e1839  Fix http trigger could not be schedule by interval (#28)
37e1839 is described below

commit 37e1839d30952ca09c7362e50002c6ef28cee2cf
Author: mrproliu <74...@qq.com>
AuthorDate: Sun Aug 8 15:32:50 2021 +0800

    Fix http trigger could not be schedule by interval (#28)
---
 internal/components/trigger/http.go | 87 ++++++++++++++++++++++++++-----------
 1 file changed, 61 insertions(+), 26 deletions(-)

diff --git a/internal/components/trigger/http.go b/internal/components/trigger/http.go
index 5a4e308..ce4cbe2 100644
--- a/internal/components/trigger/http.go
+++ b/internal/components/trigger/http.go
@@ -18,6 +18,7 @@
 package trigger
 
 import (
+	"context"
 	"fmt"
 	"net/http"
 	"os"
@@ -28,10 +29,11 @@ import (
 )
 
 type httpAction struct {
-	interval time.Duration
-	times    int
-	url      string
-	method   string
+	interval      time.Duration
+	times         int
+	url           string
+	method        string
+	executedCount int
 }
 
 func NewHTTPAction(intervalStr string, times int, url, method string) Action {
@@ -50,16 +52,18 @@ func NewHTTPAction(intervalStr string, times int, url, method string) Action {
 	url = os.ExpandEnv(url)
 
 	return &httpAction{
-		interval: interval,
-		times:    times,
-		url:      url,
-		method:   strings.ToUpper(method),
+		interval:      interval,
+		times:         times,
+		url:           url,
+		method:        strings.ToUpper(method),
+		executedCount: 0,
 	}
 }
 
 func (h *httpAction) Do() error {
+	ctx := context.Background()
 	t := time.NewTicker(h.interval)
-	c := 1
+	h.executedCount = 0
 	client := &http.Client{}
 	request, err := http.NewRequest(h.method, h.url, nil)
 	if err != nil {
@@ -69,29 +73,60 @@ func (h *httpAction) Do() error {
 
 	logger.Log.Infof("Trigger will request URL %s %d times, %s seconds apart each time.", h.url, h.times, h.interval)
 
+	// execute until success
 	for range t.C {
-		logger.Log.Debugf("request URL %s the %d time.", h.url, c)
-
-		response, err := client.Do(request)
-		if err != nil {
-			logger.Log.Errorf("do request error %v", err)
-			return err
-		}
-		response.Body.Close()
-
-		logger.Log.Infof("do request %v response http code %v", h.url, response.StatusCode)
-		if response.StatusCode == http.StatusOK {
-			logger.Log.Debugf("do http action %+v success.", *h)
+		err = h.executeOnce(client, request)
+		if err == nil {
 			break
 		}
+		if !h.couldContinue() {
+			logger.Log.Errorf("do request %d times, but still failed", h.times)
+			return err
+		}
+	}
 
-		if h.times > 0 {
-			if h.times <= c {
-				return fmt.Errorf("do request %d times, but still failed", c)
+	// background interval trigger
+	go func() {
+		for {
+			select {
+			case <-t.C:
+				err = h.executeOnce(client, request)
+				if !h.couldContinue() {
+					return
+				}
+			case <-ctx.Done():
+				t.Stop()
+				return
 			}
-			c++
 		}
-	}
+	}()
 
 	return nil
 }
+
+// execute http request once time
+func (h *httpAction) executeOnce(client *http.Client, req *http.Request) error {
+	logger.Log.Debugf("request URL %s the %d time.", h.url, h.executedCount)
+	response, err := client.Do(req)
+	h.executedCount++
+	if err != nil {
+		logger.Log.Errorf("do request error %v", err)
+		return err
+	}
+	response.Body.Close()
+
+	logger.Log.Infof("do request %v response http code %v", h.url, response.StatusCode)
+	if response.StatusCode == http.StatusOK {
+		logger.Log.Debugf("do http action %+v success.", *h)
+		return nil
+	}
+	return fmt.Errorf("do request failed, response status code: %d", response.StatusCode)
+}
+
+// verify http action could continue
+func (h *httpAction) couldContinue() bool {
+	if h.times > 0 && h.times <= h.executedCount {
+		return false
+	}
+	return true
+}