Loki: Decouple some of backend dependencies on grafana (#106788)
* Remove backend dependencies on core * Remove .golangci.yml changes * make update-workspace
This commit is contained in:
@@ -15,12 +15,13 @@ import (
|
|||||||
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
jsoniter "github.com/json-iterator/go"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
|
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/backend/log"
|
"github.com/grafana/grafana-plugin-sdk-go/backend/log"
|
||||||
|
"github.com/grafana/grafana-plugin-sdk-go/backend/tracing"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
|
||||||
"github.com/grafana/grafana/pkg/promlib/converter"
|
"github.com/grafana/grafana/pkg/promlib/converter"
|
||||||
"github.com/grafana/grafana/pkg/tsdb/loki/instrumentation"
|
"github.com/grafana/grafana/pkg/tsdb/loki/instrumentation"
|
||||||
)
|
)
|
||||||
@@ -29,7 +30,7 @@ type LokiAPI struct {
|
|||||||
client *http.Client
|
client *http.Client
|
||||||
url string
|
url string
|
||||||
log log.Logger
|
log log.Logger
|
||||||
tracer tracing.Tracer
|
tracer trace.Tracer
|
||||||
requestStructuredMetadata bool
|
requestStructuredMetadata bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,7 +40,7 @@ type RawLokiResponse struct {
|
|||||||
Encoding string
|
Encoding string
|
||||||
}
|
}
|
||||||
|
|
||||||
func newLokiAPI(client *http.Client, url string, log log.Logger, tracer tracing.Tracer, requestStructuredMetadata bool) *LokiAPI {
|
func newLokiAPI(client *http.Client, url string, log log.Logger, tracer trace.Tracer, requestStructuredMetadata bool) *LokiAPI {
|
||||||
return &LokiAPI{client: client, url: url, log: log, tracer: tracer, requestStructuredMetadata: requestStructuredMetadata}
|
return &LokiAPI{client: client, url: url, log: log, tracer: tracer, requestStructuredMetadata: requestStructuredMetadata}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
|
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
"github.com/grafana/grafana-plugin-sdk-go/backend/tracing"
|
||||||
)
|
)
|
||||||
|
|
||||||
type mockRequestCallback func(req *http.Request)
|
type mockRequestCallback func(req *http.Request)
|
||||||
@@ -66,7 +66,7 @@ func makeMockedAPIWithUrl(url string, statusCode int, contentType string, respon
|
|||||||
Transport: &mockedRoundTripper{statusCode: statusCode, contentType: contentType, responseBytes: responseBytes, requestCallback: requestCallback},
|
Transport: &mockedRoundTripper{statusCode: statusCode, contentType: contentType, responseBytes: responseBytes, requestCallback: requestCallback},
|
||||||
}
|
}
|
||||||
|
|
||||||
return newLokiAPI(&client, url, backend.NewLoggerWith("logger", "test"), tracing.InitializeTracerForTest(), structuredMetadata)
|
return newLokiAPI(&client, url, backend.NewLoggerWith("logger", "test"), tracing.DefaultTracer(), structuredMetadata)
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeCompressedMockedAPIWithUrl(url string, statusCode int, contentType string, responseBytes []byte, requestCallback mockRequestCallback) *LokiAPI {
|
func makeCompressedMockedAPIWithUrl(url string, statusCode int, contentType string, responseBytes []byte, requestCallback mockRequestCallback) *LokiAPI {
|
||||||
@@ -74,5 +74,5 @@ func makeCompressedMockedAPIWithUrl(url string, statusCode int, contentType stri
|
|||||||
Transport: &mockedCompressedRoundTripper{statusCode: statusCode, contentType: contentType, responseBytes: responseBytes, requestCallback: requestCallback},
|
Transport: &mockedCompressedRoundTripper{statusCode: statusCode, contentType: contentType, responseBytes: responseBytes, requestCallback: requestCallback},
|
||||||
}
|
}
|
||||||
|
|
||||||
return newLokiAPI(&client, url, backend.NewLoggerWith("logger", "test"), tracing.InitializeTracerForTest(), false)
|
return newLokiAPI(&client, url, backend.NewLoggerWith("logger", "test"), tracing.DefaultTracer(), false)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import (
|
|||||||
"github.com/grafana/grafana-plugin-sdk-go/backend/datasource"
|
"github.com/grafana/grafana-plugin-sdk-go/backend/datasource"
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
|
"github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
"github.com/grafana/grafana-plugin-sdk-go/backend/tracing"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ func Test_healthcheck(t *testing.T) {
|
|||||||
httpProvider := getMockProvider[*healthCheckSuccessRoundTripper]()
|
httpProvider := getMockProvider[*healthCheckSuccessRoundTripper]()
|
||||||
s := &Service{
|
s := &Service{
|
||||||
im: datasource.NewInstanceManager(newInstanceSettings(httpProvider)),
|
im: datasource.NewInstanceManager(newInstanceSettings(httpProvider)),
|
||||||
tracer: tracing.InitializeTracerForTest(),
|
tracer: tracing.DefaultTracer(),
|
||||||
logger: backend.NewLoggerWith("logger", "loki test"),
|
logger: backend.NewLoggerWith("logger", "loki test"),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,7 +111,7 @@ func Test_healthcheck(t *testing.T) {
|
|||||||
httpProvider := getMockProvider[*healthCheckFailRoundTripper]()
|
httpProvider := getMockProvider[*healthCheckFailRoundTripper]()
|
||||||
s := &Service{
|
s := &Service{
|
||||||
im: datasource.NewInstanceManager(newInstanceSettings(httpProvider)),
|
im: datasource.NewInstanceManager(newInstanceSettings(httpProvider)),
|
||||||
tracer: tracing.InitializeTracerForTest(),
|
tracer: tracing.DefaultTracer(),
|
||||||
logger: backend.NewLoggerWith("logger", "loki test"),
|
logger: backend.NewLoggerWith("logger", "loki test"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
"github.com/grafana/grafana-plugin-sdk-go/backend/tracing"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
"github.com/prometheus/client_golang/prometheus/promauto"
|
||||||
)
|
)
|
||||||
|
|||||||
+18
-11
@@ -22,16 +22,23 @@ import (
|
|||||||
|
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
|
"github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
|
||||||
"github.com/grafana/grafana/pkg/promlib/models"
|
"github.com/grafana/grafana/pkg/promlib/models"
|
||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
|
||||||
ngalertmodels "github.com/grafana/grafana/pkg/services/ngalert/models"
|
|
||||||
"github.com/grafana/grafana/pkg/tsdb/loki/kinds/dataquery"
|
"github.com/grafana/grafana/pkg/tsdb/loki/kinds/dataquery"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
flagLokiLogsDataplane = "lokiLogsDataplane"
|
||||||
|
flagLokiSendDashboardPanelNames = "lokiSendDashboardPanelNames"
|
||||||
|
flagLokiRunQueriesInParallel = "lokiRunQueriesInParallel"
|
||||||
|
flagLokiStructuredMetadata = "lokiStructuredMetadata"
|
||||||
|
flagLogQLScope = "logQLScope"
|
||||||
|
flagLokiExperimentalStreaming = "lokiExperimentalStreaming"
|
||||||
|
fromAlertHeaderName = "FromAlert"
|
||||||
|
)
|
||||||
|
|
||||||
type Service struct {
|
type Service struct {
|
||||||
im instancemgmt.InstanceManager
|
im instancemgmt.InstanceManager
|
||||||
tracer tracing.Tracer
|
tracer trace.Tracer
|
||||||
logger log.Logger
|
logger log.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,7 +48,7 @@ var (
|
|||||||
_ backend.CallResourceHandler = (*Service)(nil)
|
_ backend.CallResourceHandler = (*Service)(nil)
|
||||||
)
|
)
|
||||||
|
|
||||||
func ProvideService(httpClientProvider *httpclient.Provider, tracer tracing.Tracer) *Service {
|
func ProvideService(httpClientProvider *httpclient.Provider, tracer trace.Tracer) *Service {
|
||||||
return &Service{
|
return &Service{
|
||||||
im: datasource.NewInstanceManager(newInstanceSettings(httpClientProvider)),
|
im: datasource.NewInstanceManager(newInstanceSettings(httpClientProvider)),
|
||||||
tracer: tracer,
|
tracer: tracer,
|
||||||
@@ -118,7 +125,7 @@ func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceReq
|
|||||||
return callResource(ctx, req, sender, dsInfo, logger, s.tracer)
|
return callResource(ctx, req, sender, dsInfo, logger, s.tracer)
|
||||||
}
|
}
|
||||||
|
|
||||||
func callResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender, dsInfo *datasourceInfo, plog log.Logger, tracer tracing.Tracer) error {
|
func callResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender, dsInfo *datasourceInfo, plog log.Logger, tracer trace.Tracer) error {
|
||||||
url := req.URL
|
url := req.URL
|
||||||
|
|
||||||
lokiURL := fmt.Sprintf("/loki/api/v1/%s", url)
|
lokiURL := fmt.Sprintf("/loki/api/v1/%s", url)
|
||||||
@@ -169,7 +176,7 @@ func callResource(ctx context.Context, req *backend.CallResourceRequest, sender
|
|||||||
|
|
||||||
func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
||||||
dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
|
dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
|
||||||
_, fromAlert := req.Headers[ngalertmodels.FromAlertHeaderName]
|
_, fromAlert := req.Headers[fromAlertHeaderName]
|
||||||
logger := s.logger.FromContext(ctx).With("fromAlert", fromAlert)
|
logger := s.logger.FromContext(ctx).With("fromAlert", fromAlert)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Debug("Failed to get data source info", "err", err)
|
logger.Debug("Failed to get data source info", "err", err)
|
||||||
@@ -177,13 +184,13 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
|
|||||||
}
|
}
|
||||||
|
|
||||||
responseOpts := ResponseOpts{
|
responseOpts := ResponseOpts{
|
||||||
logsDataplane: isFeatureEnabled(ctx, featuremgmt.FlagLokiLogsDataplane),
|
logsDataplane: isFeatureEnabled(ctx, flagLokiLogsDataplane),
|
||||||
}
|
}
|
||||||
|
|
||||||
return queryData(ctx, req, dsInfo, responseOpts, s.tracer, logger, isFeatureEnabled(ctx, featuremgmt.FlagLokiRunQueriesInParallel), isFeatureEnabled(ctx, featuremgmt.FlagLokiStructuredMetadata), isFeatureEnabled(ctx, featuremgmt.FlagLogQLScope))
|
return queryData(ctx, req, dsInfo, responseOpts, s.tracer, logger, isFeatureEnabled(ctx, flagLokiRunQueriesInParallel), isFeatureEnabled(ctx, flagLokiStructuredMetadata), isFeatureEnabled(ctx, flagLogQLScope))
|
||||||
}
|
}
|
||||||
|
|
||||||
func queryData(ctx context.Context, req *backend.QueryDataRequest, dsInfo *datasourceInfo, responseOpts ResponseOpts, tracer tracing.Tracer, plog log.Logger, runInParallel bool, requestStructuredMetadata, logQLScopes bool) (*backend.QueryDataResponse, error) {
|
func queryData(ctx context.Context, req *backend.QueryDataRequest, dsInfo *datasourceInfo, responseOpts ResponseOpts, tracer trace.Tracer, plog log.Logger, runInParallel bool, requestStructuredMetadata, logQLScopes bool) (*backend.QueryDataResponse, error) {
|
||||||
result := backend.NewQueryDataResponse()
|
result := backend.NewQueryDataResponse()
|
||||||
|
|
||||||
api := newLokiAPI(dsInfo.HTTPClient, dsInfo.URL, plog, tracer, requestStructuredMetadata)
|
api := newLokiAPI(dsInfo.HTTPClient, dsInfo.URL, plog, tracer, requestStructuredMetadata)
|
||||||
@@ -229,7 +236,7 @@ func queryData(ctx context.Context, req *backend.QueryDataRequest, dsInfo *datas
|
|||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func executeQuery(ctx context.Context, query *lokiQuery, req *backend.QueryDataRequest, runInParallel bool, api *LokiAPI, responseOpts ResponseOpts, tracer tracing.Tracer, plog log.Logger) backend.DataResponse {
|
func executeQuery(ctx context.Context, query *lokiQuery, req *backend.QueryDataRequest, runInParallel bool, api *LokiAPI, responseOpts ResponseOpts, tracer trace.Tracer, plog log.Logger) backend.DataResponse {
|
||||||
ctx, span := tracer.Start(ctx, "datasource.loki.queryData.runQueries.runQuery", trace.WithAttributes(
|
ctx, span := tracer.Start(ctx, "datasource.loki.queryData.runQueries.runQuery", trace.WithAttributes(
|
||||||
attribute.Bool("runInParallel", runInParallel),
|
attribute.Bool("runInParallel", runInParallel),
|
||||||
attribute.String("expr", query.Expr),
|
attribute.String("expr", query.Expr),
|
||||||
|
|||||||
@@ -13,11 +13,10 @@ import (
|
|||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/data"
|
"github.com/grafana/grafana-plugin-sdk-go/data"
|
||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *Service) SubscribeStream(ctx context.Context, req *backend.SubscribeStreamRequest) (*backend.SubscribeStreamResponse, error) {
|
func (s *Service) SubscribeStream(ctx context.Context, req *backend.SubscribeStreamRequest) (*backend.SubscribeStreamResponse, error) {
|
||||||
if !isFeatureEnabled(ctx, featuremgmt.FlagLokiExperimentalStreaming) {
|
if !isFeatureEnabled(ctx, flagLokiExperimentalStreaming) {
|
||||||
return &backend.SubscribeStreamResponse{
|
return &backend.SubscribeStreamResponse{
|
||||||
Status: backend.SubscribeStreamStatusPermissionDenied,
|
Status: backend.SubscribeStreamStatusPermissionDenied,
|
||||||
}, fmt.Errorf("streaming is not supported")
|
}, fmt.Errorf("streaming is not supported")
|
||||||
|
|||||||
@@ -7,9 +7,8 @@ import (
|
|||||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/backend/datasource"
|
"github.com/grafana/grafana-plugin-sdk-go/backend/datasource"
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
|
"github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
|
||||||
|
"github.com/grafana/grafana-plugin-sdk-go/backend/tracing"
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/experimental/featuretoggles"
|
"github.com/grafana/grafana-plugin-sdk-go/experimental/featuretoggles"
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
|
||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -17,7 +16,7 @@ func TestSubscribeStream(t *testing.T) {
|
|||||||
// Create a service instance with required dependencies
|
// Create a service instance with required dependencies
|
||||||
service := &Service{
|
service := &Service{
|
||||||
im: datasource.NewInstanceManager(newInstanceSettings(httpclient.NewProvider())),
|
im: datasource.NewInstanceManager(newInstanceSettings(httpclient.NewProvider())),
|
||||||
tracer: tracing.InitializeTracerForTest(),
|
tracer: tracing.DefaultTracer(),
|
||||||
logger: backend.NewLoggerWith("logger", "loki test"),
|
logger: backend.NewLoggerWith("logger", "loki test"),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,7 +48,7 @@ func TestSubscribeStream(t *testing.T) {
|
|||||||
t.Run("when feature toggle is enabled", func(t *testing.T) {
|
t.Run("when feature toggle is enabled", func(t *testing.T) {
|
||||||
// Create a context with the feature toggle enabled
|
// Create a context with the feature toggle enabled
|
||||||
cfg := backend.NewGrafanaCfg(map[string]string{
|
cfg := backend.NewGrafanaCfg(map[string]string{
|
||||||
featuretoggles.EnabledFeatures: featuremgmt.FlagLokiExperimentalStreaming,
|
featuretoggles.EnabledFeatures: flagLokiExperimentalStreaming,
|
||||||
})
|
})
|
||||||
ctx := backend.WithGrafanaConfig(context.Background(), cfg)
|
ctx := backend.WithGrafanaConfig(context.Background(), cfg)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user