From aea7bbfec869b518d14481f6f8f3a2ba9ffa8fb2 Mon Sep 17 00:00:00 2001 From: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> Date: Thu, 19 Jun 2025 14:18:23 +0200 Subject: [PATCH] Loki: Decouple some of backend dependencies on grafana (#106788) * Remove backend dependencies on core * Remove .golangci.yml changes * make update-workspace --- pkg/tsdb/loki/api.go | 7 +++-- pkg/tsdb/loki/api_mock.go | 6 ++-- pkg/tsdb/loki/healthcheck_test.go | 6 ++-- .../loki/instrumentation/instrumentation.go | 2 +- pkg/tsdb/loki/loki.go | 29 ++++++++++++------- pkg/tsdb/loki/streaming.go | 3 +- pkg/tsdb/loki/streaming_test.go | 7 ++--- 7 files changed, 33 insertions(+), 27 deletions(-) diff --git a/pkg/tsdb/loki/api.go b/pkg/tsdb/loki/api.go index 89dd9f615ef..4c1006fad33 100644 --- a/pkg/tsdb/loki/api.go +++ b/pkg/tsdb/loki/api.go @@ -15,12 +15,13 @@ import ( jsoniter "github.com/json-iterator/go" "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace" "google.golang.org/grpc/metadata" "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/tracing" - "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/promlib/converter" "github.com/grafana/grafana/pkg/tsdb/loki/instrumentation" ) @@ -29,7 +30,7 @@ type LokiAPI struct { client *http.Client url string log log.Logger - tracer tracing.Tracer + tracer trace.Tracer requestStructuredMetadata bool } @@ -39,7 +40,7 @@ type RawLokiResponse struct { 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} } diff --git a/pkg/tsdb/loki/api_mock.go b/pkg/tsdb/loki/api_mock.go index 1f9ebfcefef..a3e565bf351 100644 --- a/pkg/tsdb/loki/api_mock.go +++ b/pkg/tsdb/loki/api_mock.go @@ -7,7 +7,7 @@ import ( "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) @@ -66,7 +66,7 @@ func makeMockedAPIWithUrl(url string, statusCode int, contentType string, respon 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 { @@ -74,5 +74,5 @@ func makeCompressedMockedAPIWithUrl(url string, statusCode int, contentType stri 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) } diff --git a/pkg/tsdb/loki/healthcheck_test.go b/pkg/tsdb/loki/healthcheck_test.go index 93c2326467c..3a4d76c1591 100644 --- a/pkg/tsdb/loki/healthcheck_test.go +++ b/pkg/tsdb/loki/healthcheck_test.go @@ -12,7 +12,7 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend/datasource" "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" ) @@ -93,7 +93,7 @@ func Test_healthcheck(t *testing.T) { httpProvider := getMockProvider[*healthCheckSuccessRoundTripper]() s := &Service{ im: datasource.NewInstanceManager(newInstanceSettings(httpProvider)), - tracer: tracing.InitializeTracerForTest(), + tracer: tracing.DefaultTracer(), logger: backend.NewLoggerWith("logger", "loki test"), } @@ -111,7 +111,7 @@ func Test_healthcheck(t *testing.T) { httpProvider := getMockProvider[*healthCheckFailRoundTripper]() s := &Service{ im: datasource.NewInstanceManager(newInstanceSettings(httpProvider)), - tracer: tracing.InitializeTracerForTest(), + tracer: tracing.DefaultTracer(), logger: backend.NewLoggerWith("logger", "loki test"), } diff --git a/pkg/tsdb/loki/instrumentation/instrumentation.go b/pkg/tsdb/loki/instrumentation/instrumentation.go index 342378eaf58..6ca0a41a749 100644 --- a/pkg/tsdb/loki/instrumentation/instrumentation.go +++ b/pkg/tsdb/loki/instrumentation/instrumentation.go @@ -5,7 +5,7 @@ import ( "time" "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/promauto" ) diff --git a/pkg/tsdb/loki/loki.go b/pkg/tsdb/loki/loki.go index aa0cc4655b0..9878217ad30 100644 --- a/pkg/tsdb/loki/loki.go +++ b/pkg/tsdb/loki/loki.go @@ -22,16 +22,23 @@ import ( "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/services/featuremgmt" - ngalertmodels "github.com/grafana/grafana/pkg/services/ngalert/models" "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 { im instancemgmt.InstanceManager - tracer tracing.Tracer + tracer trace.Tracer logger log.Logger } @@ -41,7 +48,7 @@ var ( _ backend.CallResourceHandler = (*Service)(nil) ) -func ProvideService(httpClientProvider *httpclient.Provider, tracer tracing.Tracer) *Service { +func ProvideService(httpClientProvider *httpclient.Provider, tracer trace.Tracer) *Service { return &Service{ im: datasource.NewInstanceManager(newInstanceSettings(httpClientProvider)), 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) } -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 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) { dsInfo, err := s.getDSInfo(ctx, req.PluginContext) - _, fromAlert := req.Headers[ngalertmodels.FromAlertHeaderName] + _, fromAlert := req.Headers[fromAlertHeaderName] logger := s.logger.FromContext(ctx).With("fromAlert", fromAlert) if err != nil { 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{ - 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() 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 } -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( attribute.Bool("runInParallel", runInParallel), attribute.String("expr", query.Expr), diff --git a/pkg/tsdb/loki/streaming.go b/pkg/tsdb/loki/streaming.go index 5996161b554..b5487da62f5 100644 --- a/pkg/tsdb/loki/streaming.go +++ b/pkg/tsdb/loki/streaming.go @@ -13,11 +13,10 @@ import ( "github.com/gorilla/websocket" "github.com/grafana/grafana-plugin-sdk-go/backend" "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) { - if !isFeatureEnabled(ctx, featuremgmt.FlagLokiExperimentalStreaming) { + if !isFeatureEnabled(ctx, flagLokiExperimentalStreaming) { return &backend.SubscribeStreamResponse{ Status: backend.SubscribeStreamStatusPermissionDenied, }, fmt.Errorf("streaming is not supported") diff --git a/pkg/tsdb/loki/streaming_test.go b/pkg/tsdb/loki/streaming_test.go index 2492eb79dd7..0092e74306e 100644 --- a/pkg/tsdb/loki/streaming_test.go +++ b/pkg/tsdb/loki/streaming_test.go @@ -7,9 +7,8 @@ import ( "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/httpclient" + "github.com/grafana/grafana-plugin-sdk-go/backend/tracing" "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" ) @@ -17,7 +16,7 @@ func TestSubscribeStream(t *testing.T) { // Create a service instance with required dependencies service := &Service{ im: datasource.NewInstanceManager(newInstanceSettings(httpclient.NewProvider())), - tracer: tracing.InitializeTracerForTest(), + tracer: tracing.DefaultTracer(), 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) { // Create a context with the feature toggle enabled cfg := backend.NewGrafanaCfg(map[string]string{ - featuretoggles.EnabledFeatures: featuremgmt.FlagLokiExperimentalStreaming, + featuretoggles.EnabledFeatures: flagLokiExperimentalStreaming, }) ctx := backend.WithGrafanaConfig(context.Background(), cfg)