| Index: client/logdog/annotee/processor.go
|
| diff --git a/client/logdog/annotee/processor.go b/client/logdog/annotee/processor.go
|
| index 7df7a45b88a06696c45ee947d3b44dde370d3ad2..c63e43e60f0d21d7be107b8da36a424fb29c9443 100644
|
| --- a/client/logdog/annotee/processor.go
|
| +++ b/client/logdog/annotee/processor.go
|
| @@ -9,7 +9,6 @@ import (
|
| "bytes"
|
| "fmt"
|
| "io"
|
| - "net/url"
|
| "strings"
|
| "sync"
|
| "time"
|
| @@ -70,20 +69,24 @@ type Stream struct {
|
| BufferSize int
|
| }
|
|
|
| +// LinkGenerator generates links for a given log stream.
|
| +type LinkGenerator interface {
|
| + // GetLink returns a link for the specified aggregate streams.
|
| + //
|
| + // If no link could be generated, GetLink may return an empty string.
|
| + GetLink(name ...types.StreamName) string
|
| +}
|
| +
|
| // Options are the configuration options for a Processor.
|
| type Options struct {
|
| // Base is the base log stream name. This is prepended to every log name, as
|
| // well as any generate log names.
|
| Base types.StreamName
|
|
|
| - // Prefix is the log stream prefix. If this is empty, no log stream links will
|
| - // be generated.
|
| - Prefix types.StreamName
|
| -
|
| - // LogDogHost is the host name of the LogDog Coordinator instance that this
|
| - // stream will be published to. If not empty, additional links will be
|
| - // injected into the annotation stream to link to the generated LogDog logs.
|
| - LogDogHost string
|
| + // LinkGenerator generates links to alias for a given log stream.
|
| + //
|
| + // If nil, no link annotations will be injected.
|
| + LinkGenerator LinkGenerator
|
|
|
| // Client is the LogDog Butler Client to use for stream creation.
|
| Client streamclient.Client
|
| @@ -290,20 +293,6 @@ func (p *Processor) closeStepHandler(h *stepHandler) {
|
| h.finish()
|
| }
|
|
|
| -// coordinatorLink returns a link to the rendered log stream in the Coordinator.
|
| -// If no Coordinator host is configured, this will return an empty string.
|
| -func (p *Processor) coordinatorLink(name ...types.StreamName) string {
|
| - if p.o.LogDogHost == "" || p.o.Prefix == "" {
|
| - return ""
|
| - }
|
| -
|
| - links := make([]string, len(name))
|
| - for i, n := range name {
|
| - links[i] = fmt.Sprintf("s=%s", url.QueryEscape(string(p.o.Prefix.Join(n))))
|
| - }
|
| - return fmt.Sprintf("https://%s.appspot.com/v/?%s", p.o.LogDogHost, strings.Join(links, "&"))
|
| -}
|
| -
|
| type annotationCallbacks struct {
|
| *Processor
|
| }
|
| @@ -334,7 +323,7 @@ func (c *annotationCallbacks) StepLogLine(step *annotation.Step, name types.Stre
|
| return
|
| }
|
| if created {
|
| - h.maybeInjectCoordinatorLink(label, "logdog", name)
|
| + h.maybeInjectLink(label, "logdog", name)
|
| }
|
|
|
| if err := writeTextLine(s, line); err != nil {
|
| @@ -491,7 +480,7 @@ func (h *stepHandler) writeBaseStream(s *Stream, line string) error {
|
| }
|
| if created {
|
| segs := s.Name.Segments()
|
| - h.maybeInjectCoordinatorLink("stdio", segs[len(segs)-1], name)
|
| + h.maybeInjectLink("stdio", segs[len(segs)-1], name)
|
| }
|
| return writeTextLine(stream, line)
|
| }
|
| @@ -580,16 +569,12 @@ func (h *stepHandler) flushInjectedLines() []string {
|
| return lines
|
| }
|
|
|
| -func (h *stepHandler) injectAliasAnnotation(base, text, url string) {
|
| - h.injectLines(buildAnnotation("STEP_LINK", fmt.Sprintf("%s-->%s", text, base), url))
|
| -}
|
| -
|
| -func (h *stepHandler) maybeInjectCoordinatorLink(base, text string, names ...types.StreamName) {
|
| - url := h.processor.coordinatorLink(names...)
|
| - if url == "" {
|
| - return
|
| +func (h *stepHandler) maybeInjectLink(base, text string, names ...types.StreamName) {
|
| + if lg := h.processor.o.LinkGenerator; lg != nil {
|
| + if link := lg.GetLink(names...); link != "" {
|
| + h.injectLines(buildAnnotation("STEP_LINK", fmt.Sprintf("%s-->%s", text, base), link))
|
| + }
|
| }
|
| - h.injectAliasAnnotation(base, text, url)
|
| }
|
|
|
| // lineReader reads from an input stream and returns the data line-by-line.
|
|
|