mirror of
https://github.com/grafana/grafana.git
synced 2025-08-02 06:02:49 +08:00
Add some basic stats for plugin preinstalls (#92220)
This commit is contained in:

committed by
GitHub

parent
dfbddd8262
commit
c20ba5b09d
@ -5,13 +5,32 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"cuelang.org/go/pkg/time"
|
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
"github.com/grafana/grafana/pkg/plugins"
|
"github.com/grafana/grafana/pkg/plugins"
|
||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||||
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore"
|
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore"
|
||||||
"github.com/grafana/grafana/pkg/setting"
|
"github.com/grafana/grafana/pkg/setting"
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
installRequestCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
|
||||||
|
Namespace: "plugins",
|
||||||
|
Name: "preinstall_total",
|
||||||
|
Help: "The total amount of plugin preinstallations",
|
||||||
|
}, []string{"plugin_id", "version"})
|
||||||
|
|
||||||
|
installRequestDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{
|
||||||
|
Namespace: "plugins",
|
||||||
|
Name: "preinstall_duration_seconds",
|
||||||
|
Help: "Plugin preinstallation duration",
|
||||||
|
Buckets: []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10, 25, 50, 100},
|
||||||
|
}, []string{"plugin_id", "version"})
|
||||||
|
|
||||||
|
once sync.Once
|
||||||
)
|
)
|
||||||
|
|
||||||
type Service struct {
|
type Service struct {
|
||||||
@ -23,7 +42,12 @@ type Service struct {
|
|||||||
failOnErr bool
|
failOnErr bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func ProvideService(cfg *setting.Cfg, features featuremgmt.FeatureToggles, pluginStore pluginstore.Store, pluginInstaller plugins.Installer) (*Service, error) {
|
func ProvideService(cfg *setting.Cfg, features featuremgmt.FeatureToggles, pluginStore pluginstore.Store, pluginInstaller plugins.Installer, promReg prometheus.Registerer) (*Service, error) {
|
||||||
|
once.Do(func() {
|
||||||
|
promReg.MustRegister(installRequestCounter)
|
||||||
|
promReg.MustRegister(installRequestDuration)
|
||||||
|
})
|
||||||
|
|
||||||
s := &Service{
|
s := &Service{
|
||||||
features: features,
|
features: features,
|
||||||
log: log.New("plugin.backgroundinstaller"),
|
log: log.New("plugin.backgroundinstaller"),
|
||||||
@ -82,6 +106,7 @@ func (s *Service) installPlugins(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
s.log.Info("Installing plugin", "pluginId", installPlugin.ID, "version", installPlugin.Version)
|
s.log.Info("Installing plugin", "pluginId", installPlugin.ID, "version", installPlugin.Version)
|
||||||
|
start := time.Now()
|
||||||
err := s.pluginInstaller.Add(ctx, installPlugin.ID, installPlugin.Version, compatOpts)
|
err := s.pluginInstaller.Add(ctx, installPlugin.ID, installPlugin.Version, compatOpts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var dupeErr plugins.DuplicateError
|
var dupeErr plugins.DuplicateError
|
||||||
@ -96,7 +121,10 @@ func (s *Service) installPlugins(ctx context.Context) error {
|
|||||||
s.log.Error("Failed to install plugin", "pluginId", installPlugin.ID, "version", installPlugin.Version, "error", err)
|
s.log.Error("Failed to install plugin", "pluginId", installPlugin.ID, "version", installPlugin.Version, "error", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
s.log.Info("Plugin successfully installed", "pluginId", installPlugin.ID, "version", installPlugin.Version)
|
elapsed := time.Since(start)
|
||||||
|
s.log.Info("Plugin successfully installed", "pluginId", installPlugin.ID, "version", installPlugin.Version, "duration", elapsed)
|
||||||
|
installRequestDuration.WithLabelValues(installPlugin.ID, installPlugin.Version).Observe(elapsed.Seconds())
|
||||||
|
installRequestCounter.WithLabelValues(installPlugin.ID, installPlugin.Version).Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||||
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore"
|
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore"
|
||||||
"github.com/grafana/grafana/pkg/setting"
|
"github.com/grafana/grafana/pkg/setting"
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -24,6 +25,7 @@ func TestService_IsDisabled(t *testing.T) {
|
|||||||
featuremgmt.WithFeatures(featuremgmt.FlagBackgroundPluginInstaller),
|
featuremgmt.WithFeatures(featuremgmt.FlagBackgroundPluginInstaller),
|
||||||
pluginstore.New(registry.NewInMemory(), &fakes.FakeLoader{}),
|
pluginstore.New(registry.NewInMemory(), &fakes.FakeLoader{}),
|
||||||
&fakes.FakePluginInstaller{},
|
&fakes.FakePluginInstaller{},
|
||||||
|
prometheus.NewRegistry(),
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
@ -48,6 +50,7 @@ func TestService_Run(t *testing.T) {
|
|||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
prometheus.NewRegistry(),
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
@ -73,6 +76,7 @@ func TestService_Run(t *testing.T) {
|
|||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
prometheus.NewRegistry(),
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
@ -102,6 +106,7 @@ func TestService_Run(t *testing.T) {
|
|||||||
return plugins.DuplicateError{}
|
return plugins.DuplicateError{}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
prometheus.NewRegistry(),
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
@ -134,6 +139,7 @@ func TestService_Run(t *testing.T) {
|
|||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
prometheus.NewRegistry(),
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
@ -157,6 +163,7 @@ func TestService_Run(t *testing.T) {
|
|||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
prometheus.NewRegistry(),
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
@ -183,6 +190,7 @@ func TestService_Run(t *testing.T) {
|
|||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
prometheus.NewRegistry(),
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
err = s.Run(context.Background())
|
err = s.Run(context.Background())
|
||||||
@ -205,6 +213,7 @@ func TestService_Run(t *testing.T) {
|
|||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
prometheus.NewRegistry(),
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.True(t, installed)
|
require.True(t, installed)
|
||||||
@ -223,6 +232,7 @@ func TestService_Run(t *testing.T) {
|
|||||||
return plugins.NotFoundError{}
|
return plugins.NotFoundError{}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
prometheus.NewRegistry(),
|
||||||
)
|
)
|
||||||
require.ErrorAs(t, err, &plugins.NotFoundError{})
|
require.ErrorAs(t, err, &plugins.NotFoundError{})
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user