Files
grafana/pkg/services/mtdsclient/mt_datasource_client_builder.go
T
Sarah ZingerandAdam Simpson 3fad863fd1 Query Service: Combine SSE handling in single tenant and multi tenant paths (#108041)
* parse via sse

I need to figure out how to handle the pipeline.execute with our own
client. I think this is important for MT reasons, just like using our
own cache (via legacy) is important.

parsing is done though!

* WIP nonsense

* horrible code but i think it works

* Add support for sql expressions config settings

* Cleanup:
- remove spew from nodes.go
- uncomment out plugin context and use in single tenant flow
- make code more readable and add comments

* Cleanup:
- create separate file for mt ds client builder
- ensure error handling is the same for both expressions and regular queries
- other cleanup

* not working but good thoughts

* WIP, vector not working for non sse

* super hacky but i think vectors work now

* delete delete delete

* Comments for future ref

* break out query handling and start test

* add prom debugger

* clean up: remove comments and commented out bits

* fix query_test

* add prom debugger

* create table-driven tests with testsdata files

* Fix test

* Add test

* go mod??

* idk

* Remove comment

* go enterprise issue maybe

* Fix codeowners

* Delete

* Remove test data

* Clean up

* logger

* Remove go changes hopefully

* idk go man

* sad

* idk i ran go mod tidy and this is what it wants

* Fix readme, with much help from adam

* some linting and testing errors

* lint

* fix lint

* fix lint register.go

* another lint

* address lint in test

* fix dead code and linters for query_test

* Go mod?

* Struggling with go mod

* Fix test

* Fix another test

* Revert headers change

* Its difficult to test this in OSS as it depends on functionality defined in enterprise, let's bring these tests back in some form in enterprise

* Fix codeowners

---------

Co-authored-by: Adam Simpson <adam@adamsimpson.net>
2025-07-17 17:22:55 -04:00

67 lines
1.8 KiB
Go

package mtdsclient
import (
"context"
"github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/registry/apis/query/clientapi"
)
type MTDatasourceClientBuilder interface {
BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool)
}
type nullBuilder struct{}
func (m *nullBuilder) BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool) {
return nil, false
}
// we use this noop for st flows
func NewNullMTDatasourceClientBuilder() MTDatasourceClientBuilder {
return &nullBuilder{}
}
type MtDatasourceClientBuilderWithClientSupplier struct {
clientSupplier clientapi.DataSourceClientSupplier
ctx context.Context
headers map[string]string
instanceConfig clientapi.InstanceConfigurationSettings
logger log.Logger
}
func (b *MtDatasourceClientBuilderWithClientSupplier) BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool) {
dsClient, err := b.clientSupplier.GetDataSourceClient(
b.ctx,
v0alpha1.DataSourceRef{
Type: pluginId,
UID: uid,
},
b.headers,
b.instanceConfig,
)
if err != nil {
b.logger.Debug("failed to get mt ds client", "error", err)
return nil, false
}
return dsClient, true
}
// TODO: I think we might be able to refactor this to just use the client supplier directly
func NewMtDatasourceClientBuilderWithClientSupplier(
clientSupplier clientapi.DataSourceClientSupplier,
ctx context.Context,
headers map[string]string,
instanceConfig clientapi.InstanceConfigurationSettings,
logger log.Logger,
) MTDatasourceClientBuilder {
return &MtDatasourceClientBuilderWithClientSupplier{
clientSupplier: clientSupplier,
ctx: ctx,
headers: headers,
instanceConfig: instanceConfig,
logger: logger,
}
}