grafana/pkg/server/module_server_test.go
owensmallwood 37d39de36d
Storage Api: Add metrics (#85316)
* Storage server runs own instrumentation server if its the sole target. Starts adding some sample metrics for now.

* adds metric for failed optimistic locks

* refactors metrics registration to own method on service for testability. Adds tests.

* Register sql storage server metrics from within the service

* fixes test

* troubleshooting drone test failures. Maybe timing when starting instrumentation server?

* Waits until instrumentation server has started. Updates tests.

* defer wont get called unless theres an error. removing.

* wait for instrumentation server to be running

* linter - close res body

* use port 3000 for metrics and removes test metric inc() call

* fixes test - updates port

* refactors module server to provide an instrumentation server module when there is no ALL or CORE target provided and running as single target

* make instrumentation server a dependency of all modules that do not run their own http server

* adds module server test

* adds tests for instrumentation service and removes old tests that aren't needed

* ignore error in test

* uses helper to start and run service

* when running wait on ctx done or http server err

* wait for http server

* removes println

* updates module server test to be integration test

* require no error in goroutine

* skips integration test when GRAFANA_TEST_DB not defined

* move http server start into start, verify returned content

* make test error when run fails

* try waiting longer and see if drone tests pass

* update integration test mysql creds to match drone

* go back to only waiting half second

* debug log drone mysql connection string

* use same db connection config as drone

* try using same hostname as drone

* cant use localhost as mysql hostname in drone tests. Need to parse it from the cfg db connection string

---------

Co-authored-by: Dan Cech <dcech@grafana.com>
2024-04-08 08:35:01 -06:00

89 lines
2.5 KiB
Go

package server
import (
"context"
"net/http"
"os"
"testing"
"time"
"cuelang.org/go/pkg/regexp"
"github.com/grafana/grafana/pkg/api"
"github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/modules"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tests/testsuite"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestMain(m *testing.M) {
testsuite.Run(m)
}
func TestIntegrationWillRunInstrumentationServerWhenTargetHasNoHttpServer(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test")
}
dbType := os.Getenv("GRAFANA_TEST_DB")
if dbType == "" {
t.Skip("skipping - GRAFANA_TEST_DB not defined")
}
if dbType == "sqlite3" {
t.Skip("skipping - sqlite not supported for storage server target")
}
testdb := db.InitTestDB(t)
cfg := testdb.Cfg
cfg.GRPCServerNetwork = "tcp"
cfg.GRPCServerAddress = "localhost:10000"
addStorageServerToConfig(t, cfg, dbType)
cfg.Target = []string{modules.StorageServer}
ms, err := InitializeModuleServer(cfg, Options{}, api.ServerOptions{})
require.NoError(t, err)
go func() {
err = ms.Run()
if err.Error() != "context canceled" {
t.Error(err)
}
}()
time.Sleep(500 * time.Millisecond) // wait for http server to be running
client := http.Client{}
res, err := client.Get("http://localhost:3000/metrics")
require.NoError(t, err)
err = res.Body.Close()
require.NoError(t, err)
assert.Equal(t, 200, res.StatusCode)
err = ms.Shutdown(context.Background(), "test over")
require.NoError(t, err)
}
func addStorageServerToConfig(t *testing.T, cfg *setting.Cfg, dbType string) {
s, err := cfg.Raw.NewSection("entity_api")
require.NoError(t, err)
_, err = s.NewKey("db_type", dbType)
require.NoError(t, err)
if dbType == "postgres" {
_, _ = s.NewKey("db_host", "localhost")
_, _ = s.NewKey("db_name", "grafanatest")
_, _ = s.NewKey("db_user", "grafanatest")
_, _ = s.NewKey("db_pass", "grafanatest")
} else {
// cant use localhost as hostname in drone tests for mysql, so need to parse it from connection string
sec, err := cfg.Raw.GetSection("database")
require.NoError(t, err)
connString := sec.Key("connection_string").String()
matches, err := regexp.FindSubmatch("(.+):(.+)@tcp\\((.+):(\\d+)\\)/(.+)\\?", connString)
require.NoError(t, err)
_, _ = s.NewKey("db_host", matches[3])
_, _ = s.NewKey("db_name", matches[5])
_, _ = s.NewKey("db_user", matches[1])
_, _ = s.NewKey("db_pass", matches[2])
}
}