Backend image rendering as plugin (#11966)
* 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
This commit is contained in:
+2
@@ -5,6 +5,8 @@
|
||||
// They can also be used in traditional Go test functions and even in
|
||||
// applications.
|
||||
//
|
||||
// https://smartystreets.com
|
||||
//
|
||||
// Many of the assertions lean heavily on work done by Aaron Jacobs in his excellent oglematchers library.
|
||||
// (https://github.com/jacobsa/oglematchers)
|
||||
// The ShouldResemble assertion leans heavily on work done by Daniel Jacques in his very helpful go-render library.
|
||||
|
||||
+15
-11
@@ -143,20 +143,24 @@ func (s *traverseState) render(buf *bytes.Buffer, ptrs int, v reflect.Value, imp
|
||||
if !implicit {
|
||||
writeType(buf, ptrs, vt)
|
||||
}
|
||||
structAnon := vt.Name() == ""
|
||||
buf.WriteRune('{')
|
||||
for i := 0; i < vt.NumField(); i++ {
|
||||
if i > 0 {
|
||||
buf.WriteString(", ")
|
||||
}
|
||||
anon := structAnon && isAnon(vt.Field(i).Type)
|
||||
if rendered, ok := renderTime(v); ok {
|
||||
buf.WriteString(rendered)
|
||||
} else {
|
||||
structAnon := vt.Name() == ""
|
||||
for i := 0; i < vt.NumField(); i++ {
|
||||
if i > 0 {
|
||||
buf.WriteString(", ")
|
||||
}
|
||||
anon := structAnon && isAnon(vt.Field(i).Type)
|
||||
|
||||
if !anon {
|
||||
buf.WriteString(vt.Field(i).Name)
|
||||
buf.WriteRune(':')
|
||||
}
|
||||
if !anon {
|
||||
buf.WriteString(vt.Field(i).Name)
|
||||
buf.WriteRune(':')
|
||||
}
|
||||
|
||||
s.render(buf, 0, v.Field(i), anon)
|
||||
s.render(buf, 0, v.Field(i), anon)
|
||||
}
|
||||
}
|
||||
buf.WriteRune('}')
|
||||
|
||||
|
||||
Generated
Vendored
+26
@@ -0,0 +1,26 @@
|
||||
package render
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"time"
|
||||
)
|
||||
|
||||
func renderTime(value reflect.Value) (string, bool) {
|
||||
if instant, ok := convertTime(value); !ok {
|
||||
return "", false
|
||||
} else if instant.IsZero() {
|
||||
return "0", true
|
||||
} else {
|
||||
return instant.String(), true
|
||||
}
|
||||
}
|
||||
|
||||
func convertTime(value reflect.Value) (t time.Time, ok bool) {
|
||||
if value.Type() == timeType {
|
||||
defer func() { recover() }()
|
||||
t, ok = value.Interface().(time.Time)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
var timeType = reflect.TypeOf(time.Time{})
|
||||
Reference in New Issue
Block a user