mirror of
https://github.com/grafana/grafana.git
synced 2024-11-27 03:11:01 -06:00
30aa24a183
* Separate Tracer interface to TracerService and Tracer * Fix lint * Fix:Make it possible to start spans for both opentracing and opentelemetry in ds proxy * Add span methods, use span interface for rest of tracing * Fix logs in tracing * Fix tests that are related to tracing * Fix resourcepermissions test * Fix some tests * Fix more tests * Add TracingService to wire cli runner * Remove GlobalTracer from bus * Renaming test function * Remove GlobalTracer from TSDB * Replace GlobalTracer in api * Adjust tests to the InitializeForTests func * Remove GlobalTracer from services * Remove GlobalTracer * Remove bus.NewTest * Remove Tracer interface * Add InitializeForBus * Simplify tests * Clean up tests * Rename TracerService to Tracer * Update pkg/middleware/request_tracing.go Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com> * Initialize tracer before passing it to SQLStore initialization in commands * Remove tests for opentracing * Set span attributes correctly, remove unnecessary trace initiliazation form test * Add tracer instance to newSQLStore * Fix changes due to rebase * Add modified tracing middleware test * Fix opentracing implementation tags Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com>
158 lines
4.4 KiB
Go
158 lines
4.4 KiB
Go
//go:build integration
|
|
// +build integration
|
|
|
|
package alerting
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"net"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/grafana/grafana/pkg/infra/tracing"
|
|
"github.com/grafana/grafana/pkg/infra/usagestats"
|
|
"github.com/grafana/grafana/pkg/services/encryption/ossencryption"
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestEngineTimeouts(t *testing.T) {
|
|
usMock := &usagestats.UsageStatsMock{T: t}
|
|
tracer, err := tracing.InitializeTracerForTest()
|
|
require.NoError(t, err)
|
|
engine := ProvideAlertEngine(nil, nil, nil, nil, usMock, ossencryption.ProvideService(), setting.NewCfg(), tracer)
|
|
setting.AlertingNotificationTimeout = 30 * time.Second
|
|
setting.AlertingMaxAttempts = 3
|
|
engine.resultHandler = &FakeResultHandler{}
|
|
job := &Job{running: true, Rule: &Rule{}}
|
|
|
|
t.Run("Should trigger as many retries as needed", func(t *testing.T) {
|
|
t.Run("pended alert for datasource -> result handler should be worked", func(t *testing.T) {
|
|
// reduce alert timeout to test quickly
|
|
setting.AlertingEvaluationTimeout = 30 * time.Second
|
|
transportTimeoutInterval := 2 * time.Second
|
|
serverBusySleepDuration := 1 * time.Second
|
|
|
|
evalHandler := NewFakeCommonTimeoutHandler(transportTimeoutInterval, serverBusySleepDuration)
|
|
resultHandler := NewFakeCommonTimeoutHandler(transportTimeoutInterval, serverBusySleepDuration)
|
|
engine.evalHandler = evalHandler
|
|
engine.resultHandler = resultHandler
|
|
|
|
err := engine.processJobWithRetry(context.Background(), job)
|
|
require.Nil(t, err)
|
|
|
|
require.Equal(t, true, evalHandler.EvalSucceed)
|
|
require.Equal(t, true, resultHandler.ResultHandleSucceed)
|
|
|
|
// initialize for other tests.
|
|
setting.AlertingEvaluationTimeout = 2 * time.Second
|
|
engine.resultHandler = &FakeResultHandler{}
|
|
})
|
|
})
|
|
}
|
|
|
|
type FakeCommonTimeoutHandler struct {
|
|
TransportTimeoutDuration time.Duration
|
|
ServerBusySleepDuration time.Duration
|
|
EvalSucceed bool
|
|
ResultHandleSucceed bool
|
|
}
|
|
|
|
func NewFakeCommonTimeoutHandler(transportTimeoutDuration time.Duration, serverBusySleepDuration time.Duration) *FakeCommonTimeoutHandler {
|
|
return &FakeCommonTimeoutHandler{
|
|
TransportTimeoutDuration: transportTimeoutDuration,
|
|
ServerBusySleepDuration: serverBusySleepDuration,
|
|
EvalSucceed: false,
|
|
ResultHandleSucceed: false,
|
|
}
|
|
}
|
|
|
|
func (handler *FakeCommonTimeoutHandler) Eval(evalContext *EvalContext) {
|
|
// 1. prepare mock server
|
|
path := "/evaltimeout"
|
|
srv := runBusyServer(path, handler.ServerBusySleepDuration)
|
|
defer srv.Close()
|
|
|
|
// 2. send requests
|
|
url := srv.URL + path
|
|
res, err := sendRequest(evalContext.Ctx, url, handler.TransportTimeoutDuration)
|
|
if res != nil {
|
|
defer res.Body.Close()
|
|
}
|
|
|
|
if err != nil {
|
|
evalContext.Error = errors.New("Fake evaluation timeout test failure")
|
|
return
|
|
}
|
|
|
|
if res.StatusCode == 200 {
|
|
handler.EvalSucceed = true
|
|
}
|
|
|
|
evalContext.Error = errors.New("Fake evaluation timeout test failure; wrong response")
|
|
}
|
|
|
|
func (handler *FakeCommonTimeoutHandler) handle(evalContext *EvalContext) error {
|
|
// 1. prepare mock server
|
|
path := "/resulthandle"
|
|
srv := runBusyServer(path, handler.ServerBusySleepDuration)
|
|
defer srv.Close()
|
|
|
|
// 2. send requests
|
|
url := srv.URL + path
|
|
res, err := sendRequest(evalContext.Ctx, url, handler.TransportTimeoutDuration)
|
|
if res != nil {
|
|
defer res.Body.Close()
|
|
}
|
|
|
|
if err != nil {
|
|
evalContext.Error = errors.New("Fake result handle timeout test failure")
|
|
return evalContext.Error
|
|
}
|
|
|
|
if res.StatusCode == 200 {
|
|
handler.ResultHandleSucceed = true
|
|
return nil
|
|
}
|
|
|
|
evalContext.Error = errors.New("Fake result handle timeout test failure; wrong response")
|
|
|
|
return evalContext.Error
|
|
}
|
|
|
|
func runBusyServer(path string, serverBusySleepDuration time.Duration) *httptest.Server {
|
|
mux := http.NewServeMux()
|
|
server := httptest.NewServer(mux)
|
|
|
|
mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
|
|
time.Sleep(serverBusySleepDuration)
|
|
})
|
|
|
|
return server
|
|
}
|
|
|
|
func sendRequest(context context.Context, url string, transportTimeoutInterval time.Duration) (resp *http.Response, err error) {
|
|
req, err := http.NewRequest("GET", url, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
req = req.WithContext(context)
|
|
|
|
transport := http.Transport{
|
|
Dial: (&net.Dialer{
|
|
Timeout: transportTimeoutInterval,
|
|
KeepAlive: transportTimeoutInterval,
|
|
}).Dial,
|
|
}
|
|
client := http.Client{
|
|
Transport: &transport,
|
|
}
|
|
|
|
return client.Do(req)
|
|
}
|