Advisor: Avoid one GCOM request per plugin (#105180)

This commit is contained in:
Andres Martinez Gotor
2025-05-12 09:45:56 +02:00
committed by GitHub
parent cb28213f1d
commit 0d4884cb3b
13 changed files with 137 additions and 115 deletions
+4
View File
@@ -276,6 +276,10 @@ func (r *FakePluginRepo) PluginInfo(ctx context.Context, pluginID string, compat
return &repo.PluginInfo{}, nil
}
func (r *FakePluginRepo) GetPluginsInfo(ctx context.Context, compatOpts repo.CompatOpts) ([]repo.PluginInfo, error) {
return []repo.PluginInfo{}, nil
}
type fakeTracerProvider struct {
noop.TracerProvider
}
+2 -2
View File
@@ -16,8 +16,8 @@ type Service interface {
GetPluginArchiveInfo(ctx context.Context, pluginID, version string, opts CompatOpts) (*PluginArchiveInfo, error)
// PluginVersion will return plugin version based on the requested information.
PluginVersion(ctx context.Context, pluginID, version string, compatOpts CompatOpts) (VersionData, error)
// PluginInfo will return generic plugin information from grafana.com/api/plugins.
PluginInfo(ctx context.Context, pluginID string, compatOpts CompatOpts) (*PluginInfo, error)
// GetPluginsInfo will return a list of plugins from grafana.com/api/plugins.
GetPluginsInfo(ctx context.Context, compatOpts CompatOpts) ([]PluginInfo, error)
}
type CompatOpts struct {
+4 -3
View File
@@ -35,7 +35,8 @@ type ArchMeta struct {
// PluginInfo is (a subset of) the JSON response from grafana.com/api/plugins/$pluginID
type PluginInfo struct {
ID int `json:"id"`
Status string `json:"status"`
Slug string `json:"slug"`
ID int `json:"id"`
Status string `json:"status"`
Slug string `json:"slug"`
Version string `json:"version"`
}
+5 -5
View File
@@ -132,25 +132,25 @@ func (m *Manager) grafanaCompatiblePluginVersions(ctx context.Context, pluginID
return v.Versions, nil
}
func (m *Manager) PluginInfo(ctx context.Context, pluginID string, compatOpts CompatOpts) (*PluginInfo, error) {
func (m *Manager) GetPluginsInfo(ctx context.Context, compatOpts CompatOpts) ([]PluginInfo, error) {
u, err := url.Parse(m.client.grafanaComAPIURL)
if err != nil {
return nil, err
}
u.Path = path.Join(u.Path, pluginID)
body, err := m.client.SendReq(ctx, u, compatOpts)
if err != nil {
return nil, err
}
var v PluginInfo
var v struct {
Items []PluginInfo `json:"items"`
}
err = json.Unmarshal(body, &v)
if err != nil {
m.log.Error("Failed to unmarshal plugin repo response", "error", err)
return nil, err
}
return &v, nil
return v.Items, nil
}
+15 -7
View File
@@ -108,16 +108,17 @@ func TestGetPluginArchive(t *testing.T) {
}
}
func TestPluginInfo(t *testing.T) {
func TestPluginIndex(t *testing.T) {
const (
pluginID = "grafana-test-datasource"
)
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
require.Equal(t, fmt.Sprintf("/%s", pluginID), r.URL.Path)
require.Equal(t, "12.0.0", r.Header.Get("grafana-version"))
require.Equal(t, "grafana 12.0.0", r.Header.Get("User-Agent"))
w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
_, _ = fmt.Fprintf(w, `{ "id": 1, "slug": "%s", "status": "active" }`, pluginID)
_, _ = fmt.Fprintf(w, `{"items": [{ "id": 1, "slug": "%s", "status": "active" }]}`, pluginID)
}))
t.Cleanup(srv.Close)
@@ -126,11 +127,18 @@ func TestPluginInfo(t *testing.T) {
BaseURL: srv.URL,
Logger: log.NewTestPrettyLogger(),
})
pi, err := m.PluginInfo(context.Background(), pluginID, CompatOpts{})
pi, err := m.GetPluginsInfo(context.Background(), CompatOpts{
grafanaVersion: "12.0.0",
system: SystemCompatOpts{
os: "darwin",
arch: "amd64",
},
})
require.NoError(t, err)
require.Equal(t, 1, pi.ID)
require.Equal(t, pluginID, pi.Slug)
require.Equal(t, "active", pi.Status)
require.Len(t, pi, 1)
require.Equal(t, 1, pi[0].ID)
require.Equal(t, pluginID, pi[0].Slug)
require.Equal(t, "active", pi[0].Status)
}
func verifyArchive(t *testing.T, archive *PluginArchive) {