mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
loki: add feature-toggle check to live-mode (#49012)
This commit is contained in:
parent
a0e5a4eba2
commit
8fd9cb4854
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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",
|
||||||
|
@ -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"
|
||||||
|
@ -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,
|
||||||
}
|
}
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user