Simplify HTTP trace related code (#7833)
parent
c1d2b3d5c3
commit
183ec094c4
@ -1,115 +0,0 @@ |
|||||||
/* |
|
||||||
* MinIO Cloud Storage, (C) 2019 MinIO, Inc. |
|
||||||
* |
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
||||||
* you may not use this file except in compliance with the License. |
|
||||||
* You may obtain a copy of the License at |
|
||||||
* |
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* |
|
||||||
* Unless required by applicable law or agreed to in writing, software |
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, |
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
* See the License for the specific language governing permissions and |
|
||||||
* limitations under the License. |
|
||||||
*/ |
|
||||||
|
|
||||||
package cmd |
|
||||||
|
|
||||||
import ( |
|
||||||
"bytes" |
|
||||||
"context" |
|
||||||
"encoding/json" |
|
||||||
"strings" |
|
||||||
"sync" |
|
||||||
|
|
||||||
"github.com/minio/minio/cmd/logger" |
|
||||||
"github.com/minio/minio/pkg/pubsub" |
|
||||||
"github.com/minio/minio/pkg/trace" |
|
||||||
) |
|
||||||
|
|
||||||
//HTTPTraceSys holds global trace state
|
|
||||||
type HTTPTraceSys struct { |
|
||||||
peers []*peerRESTClient |
|
||||||
pubsub *pubsub.PubSub |
|
||||||
} |
|
||||||
|
|
||||||
// NewTraceSys - creates new HTTPTraceSys with all nodes subscribed to
|
|
||||||
// the trace pub sub system
|
|
||||||
func NewTraceSys(ctx context.Context, endpoints EndpointList) *HTTPTraceSys { |
|
||||||
remoteHosts := getRemoteHosts(endpoints) |
|
||||||
remoteClients, err := getRestClients(remoteHosts) |
|
||||||
if err != nil { |
|
||||||
logger.FatalIf(err, "Unable to start httptrace sub system") |
|
||||||
} |
|
||||||
|
|
||||||
ps := pubsub.New() |
|
||||||
return &HTTPTraceSys{ |
|
||||||
remoteClients, ps, |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// HasTraceListeners returns true if trace listeners are registered
|
|
||||||
// for this node or peers
|
|
||||||
func (sys *HTTPTraceSys) HasTraceListeners() bool { |
|
||||||
return sys != nil && sys.pubsub.HasSubscribers() |
|
||||||
} |
|
||||||
|
|
||||||
// Publish - publishes trace message to the http trace pubsub system
|
|
||||||
func (sys *HTTPTraceSys) Publish(traceMsg trace.Info) { |
|
||||||
sys.pubsub.Publish(traceMsg) |
|
||||||
} |
|
||||||
|
|
||||||
// Trace writes http trace to writer
|
|
||||||
func (sys *HTTPTraceSys) Trace(doneCh chan struct{}, trcAll bool) chan []byte { |
|
||||||
traceCh := make(chan []byte) |
|
||||||
go func() { |
|
||||||
defer close(traceCh) |
|
||||||
|
|
||||||
var wg = &sync.WaitGroup{} |
|
||||||
wg.Add(1) |
|
||||||
go func() { |
|
||||||
defer wg.Done() |
|
||||||
|
|
||||||
buf := &bytes.Buffer{} |
|
||||||
ch := sys.pubsub.Subscribe() |
|
||||||
defer sys.pubsub.Unsubscribe(ch) |
|
||||||
for { |
|
||||||
select { |
|
||||||
case entry := <-ch: |
|
||||||
trcInfo := entry.(trace.Info) |
|
||||||
path := strings.TrimPrefix(trcInfo.ReqInfo.Path, "/") |
|
||||||
// omit inter-node traffic if trcAll is false
|
|
||||||
if !trcAll && strings.HasPrefix(path, minioReservedBucket) { |
|
||||||
continue |
|
||||||
} |
|
||||||
buf.Reset() |
|
||||||
enc := json.NewEncoder(buf) |
|
||||||
enc.SetEscapeHTML(false) |
|
||||||
if err := enc.Encode(trcInfo); err != nil { |
|
||||||
continue |
|
||||||
} |
|
||||||
traceCh <- buf.Bytes() |
|
||||||
case <-doneCh: |
|
||||||
return |
|
||||||
} |
|
||||||
} |
|
||||||
}() |
|
||||||
|
|
||||||
for _, peer := range sys.peers { |
|
||||||
wg.Add(1) |
|
||||||
go func(peer *peerRESTClient) { |
|
||||||
defer wg.Done() |
|
||||||
ch, err := peer.Trace(doneCh, trcAll) |
|
||||||
if err != nil { |
|
||||||
return |
|
||||||
} |
|
||||||
for entry := range ch { |
|
||||||
traceCh <- entry |
|
||||||
} |
|
||||||
}(peer) |
|
||||||
} |
|
||||||
wg.Wait() |
|
||||||
}() |
|
||||||
return traceCh |
|
||||||
} |
|
Loading…
Reference in new issue