loki: add feature-toggle check to live-mode (#49012)

This commit is contained in:
Gábor Farkas 2022-06-13 08:33:46 +02:00 committed by GitHub
parent a0e5a4eba2
commit 8fd9cb4854
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 28 additions and 31 deletions

View File

@ -36,6 +36,7 @@ export interface FeatureToggles {
showFeatureFlagsInUI?: boolean; showFeatureFlagsInUI?: boolean;
publicDashboards?: boolean; publicDashboards?: boolean;
lokiLive?: boolean; lokiLive?: boolean;
lokiDataframeApi?: boolean;
swaggerUi?: boolean; swaggerUi?: boolean;
featureHighlights?: boolean; featureHighlights?: boolean;
dashboardComments?: boolean; dashboardComments?: boolean;

View File

@ -79,7 +79,7 @@ func TestPluginManager_int_init(t *testing.T) {
es := elasticsearch.ProvideService(hcp) es := elasticsearch.ProvideService(hcp)
grap := graphite.ProvideService(hcp, tracer) grap := graphite.ProvideService(hcp, tracer)
idb := influxdb.ProvideService(hcp) idb := influxdb.ProvideService(hcp)
lk := loki.ProvideService(hcp, tracer) lk := loki.ProvideService(hcp, features, tracer)
otsdb := opentsdb.ProvideService(hcp) otsdb := opentsdb.ProvideService(hcp)
pr := prometheus.ProvideService(hcp, cfg, features, tracer) pr := prometheus.ProvideService(hcp, cfg, features, tracer)
tmpo := tempo.ProvideService(hcp) tmpo := tempo.ProvideService(hcp)

View File

@ -117,6 +117,11 @@ var (
Description: "support websocket streaming for loki (early prototype)", Description: "support websocket streaming for loki (early prototype)",
State: FeatureStateAlpha, State: FeatureStateAlpha,
}, },
{
Name: "lokiDataframeApi",
Description: "use experimental loki api for websocket streaming (early prototype)",
State: FeatureStateAlpha,
},
{ {
Name: "swaggerUi", Name: "swaggerUi",
Description: "Serves swagger UI", Description: "Serves swagger UI",

View File

@ -87,6 +87,10 @@ const (
// support websocket streaming for loki (early prototype) // support websocket streaming for loki (early prototype)
FlagLokiLive = "lokiLive" FlagLokiLive = "lokiLive"
// FlagLokiDataframeApi
// use experimental loki api for websocket streaming (early prototype)
FlagLokiDataframeApi = "lokiDataframeApi"
// FlagSwaggerUi // FlagSwaggerUi
// Serves swagger UI // Serves swagger UI
FlagSwaggerUi = "swaggerUi" FlagSwaggerUi = "swaggerUi"

View File

@ -16,11 +16,13 @@ import (
"github.com/grafana/grafana/pkg/infra/httpclient" "github.com/grafana/grafana/pkg/infra/httpclient"
"github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/infra/tracing"
"github.com/grafana/grafana/pkg/services/featuremgmt"
"go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/attribute"
) )
type Service struct { type Service struct {
im instancemgmt.InstanceManager im instancemgmt.InstanceManager
features featuremgmt.FeatureToggles
plog log.Logger plog log.Logger
tracer tracing.Tracer tracer tracing.Tracer
} }
@ -31,9 +33,10 @@ var (
_ backend.CallResourceHandler = (*Service)(nil) _ backend.CallResourceHandler = (*Service)(nil)
) )
func ProvideService(httpClientProvider httpclient.Provider, tracer tracing.Tracer) *Service { func ProvideService(httpClientProvider httpclient.Provider, features featuremgmt.FeatureToggles, tracer tracing.Tracer) *Service {
return &Service{ return &Service{
im: datasource.NewInstanceManager(newInstanceSettings(httpClientProvider)), im: datasource.NewInstanceManager(newInstanceSettings(httpClientProvider)),
features: features,
plog: log.New("tsdb.loki"), plog: log.New("tsdb.loki"),
tracer: tracer, tracer: tracer,
} }

View File

@ -4,7 +4,6 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http"
"net/url" "net/url"
"os" "os"
"os/signal" "os/signal"
@ -14,6 +13,7 @@ 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(_ context.Context, req *backend.SubscribeStreamRequest) (*backend.SubscribeStreamResponse, error) { func (s *Service) SubscribeStream(_ context.Context, req *backend.SubscribeStreamRequest) (*backend.SubscribeStreamResponse, error) {
@ -82,13 +82,13 @@ func (s *Service) RunStream(ctx context.Context, req *backend.RunStreamRequest,
params := url.Values{} params := url.Values{}
params.Add("query", query.Expr) params.Add("query", query.Expr)
isV1 := false lokiDataframeApi := s.features.IsEnabled(featuremgmt.FlagLokiDataframeApi)
wsurl, _ := url.Parse(dsInfo.URL) wsurl, _ := url.Parse(dsInfo.URL)
// Check if the v2alpha endpoint exists if lokiDataframeApi {
wsurl.Path = "/loki/api/v2alpha/tail" wsurl.Path = "/loki/api/v2alpha/tail"
if !is400(dsInfo.HTTPClient, wsurl) { } else {
isV1 = true
wsurl.Path = "/loki/api/v1/tail" wsurl.Path = "/loki/api/v1/tail"
} }
@ -131,7 +131,7 @@ func (s *Service) RunStream(ctx context.Context, req *backend.RunStreamRequest,
} }
frame := &data.Frame{} frame := &data.Frame{}
if isV1 { if !lokiDataframeApi {
frame, err = lokiBytesToLabeledFrame(message) frame, err = lokiBytesToLabeledFrame(message)
} else { } else {
err = json.Unmarshal(message, &frame) err = json.Unmarshal(message, &frame)
@ -182,19 +182,3 @@ func (s *Service) PublishStream(_ context.Context, _ *backend.PublishStreamReque
Status: backend.PublishStreamStatusPermissionDenied, Status: backend.PublishStreamStatusPermissionDenied,
}, nil }, nil
} }
// if the v2 endpoint exists it will give a 400 rather than 404/500
func is400(client *http.Client, url *url.URL) bool {
req, err := http.NewRequest("GET", url.String(), nil)
if err != nil {
return false
}
rsp, err := client.Do(req)
if err != nil {
return false
}
defer func() {
_ = rsp.Body.Close()
}()
return rsp.StatusCode == 400 // will be true
}