mirror of
https://github.com/grafana/grafana.git
synced 2025-02-20 11:48:34 -06:00
* rendering: headless chrome progress * renderer: minor change * grpc: version hell * updated grpc libs * wip: minor progess * rendering: new image rendering plugin is starting to work * feat: now phantomjs works as well and updated alerting to use new rendering service * refactor: renamed renderer package and service to rendering to make renderer name less confusing (rendering is internal service that handles the renderer plugin now) * rendering: now render key is passed and render auth is working in plugin mode * removed unneeded lines from gitignore * rendering: now plugin mode supports waiting for all panels to complete rendering * fix: LastSeenAt fix for render calls, was not set which causes a lot of updates to Last Seen at during rendering, this should fix sqlite db locked issues in seen in previous releases * change: changed render tz url parameter to use proper timezone name as chrome does not handle UTC offset TZ values * fix: another update to tz param generation * renderer: added http mode to renderer service, new ini setting [rendering] server_url
100 lines
2.3 KiB
Go
100 lines
2.3 KiB
Go
package rendering
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"path/filepath"
|
|
|
|
plugin "github.com/hashicorp/go-plugin"
|
|
|
|
pluginModel "github.com/grafana/grafana-plugin-model/go/renderer"
|
|
"github.com/grafana/grafana/pkg/log"
|
|
"github.com/grafana/grafana/pkg/middleware"
|
|
"github.com/grafana/grafana/pkg/models"
|
|
"github.com/grafana/grafana/pkg/plugins"
|
|
"github.com/grafana/grafana/pkg/registry"
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
"github.com/grafana/grafana/pkg/util"
|
|
)
|
|
|
|
func init() {
|
|
registry.RegisterService(&RenderingService{})
|
|
}
|
|
|
|
type RenderingService struct {
|
|
log log.Logger
|
|
pluginClient *plugin.Client
|
|
grpcPlugin pluginModel.RendererPlugin
|
|
pluginInfo *plugins.RendererPlugin
|
|
renderAction renderFunc
|
|
|
|
Cfg *setting.Cfg `inject:""`
|
|
}
|
|
|
|
func (rs *RenderingService) Init() error {
|
|
rs.log = log.New("rendering")
|
|
return nil
|
|
}
|
|
|
|
func (rs *RenderingService) Run(ctx context.Context) error {
|
|
if rs.Cfg.RendererUrl != "" {
|
|
rs.log.Info("Backend rendering via external http server")
|
|
rs.renderAction = rs.renderViaHttp
|
|
<-ctx.Done()
|
|
return nil
|
|
}
|
|
|
|
if plugins.Renderer == nil {
|
|
rs.renderAction = rs.renderViaPhantomJS
|
|
<-ctx.Done()
|
|
return nil
|
|
}
|
|
|
|
rs.pluginInfo = plugins.Renderer
|
|
|
|
if err := rs.startPlugin(ctx); err != nil {
|
|
return err
|
|
}
|
|
|
|
rs.renderAction = rs.renderViaPlugin
|
|
|
|
err := rs.watchAndRestartPlugin(ctx)
|
|
|
|
if rs.pluginClient != nil {
|
|
rs.log.Debug("Killing renderer plugin process")
|
|
rs.pluginClient.Kill()
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
func (rs *RenderingService) Render(ctx context.Context, opts Opts) (*RenderResult, error) {
|
|
if rs.renderAction != nil {
|
|
return rs.renderAction(ctx, opts)
|
|
} else {
|
|
return nil, fmt.Errorf("No renderer found")
|
|
}
|
|
}
|
|
|
|
func (rs *RenderingService) getFilePathForNewImage() string {
|
|
pngPath, _ := filepath.Abs(filepath.Join(rs.Cfg.ImagesDir, util.GetRandomString(20)))
|
|
return pngPath + ".png"
|
|
}
|
|
|
|
func (rs *RenderingService) getURL(path string) string {
|
|
// &render=1 signals to the legacy redirect layer to
|
|
return fmt.Sprintf("%s://%s:%s/%s&render=1", setting.Protocol, rs.getLocalDomain(), setting.HttpPort, path)
|
|
}
|
|
|
|
func (rs *RenderingService) getLocalDomain() string {
|
|
if setting.HttpAddr != setting.DEFAULT_HTTP_ADDR {
|
|
return setting.HttpAddr
|
|
}
|
|
|
|
return "localhost"
|
|
}
|
|
|
|
func (rs *RenderingService) getRenderKey(orgId, userId int64, orgRole models.RoleType) string {
|
|
return middleware.AddRenderAuthKey(orgId, userId, orgRole)
|
|
}
|