Просмотр исходного кода

Avoid duplicate logs for in-proxy broker events

Rod Hynes 6 месяцев назад
Родитель
Сommit
94acd9457a

+ 31 - 0
psiphon/common/inproxy/broker.go

@@ -215,6 +215,22 @@ type BrokerConfig struct {
 	MaxCompartmentIDs int
 }
 
+// BrokerLoggedEvent is an error type which indicates that the broker has
+// already logged an event recording the underlying error. This may be used
+// by the outer server layer to avoid redundant logs for HandleSessionPacket
+// errors.
+type BrokerLoggedEvent struct {
+	err error
+}
+
+func NewBrokerLoggedEvent(err error) *BrokerLoggedEvent {
+	return &BrokerLoggedEvent{err: err}
+}
+
+func (e *BrokerLoggedEvent) Error() string {
+	return e.err.Error()
+}
+
 // NewBroker initializes a new Broker.
 func NewBroker(config *BrokerConfig) (*Broker, error) {
 
@@ -609,6 +625,9 @@ func (b *Broker) handleProxyAnnounce(
 		logFields.Add(transportLogFields)
 		logFields.Add(matchMetrics.GetMetrics())
 		b.config.Logger.LogMetric(brokerMetricName, logFields)
+		if retErr != nil {
+			retErr = NewBrokerLoggedEvent(retErr)
+		}
 	}()
 
 	announceRequest, err := UnmarshalProxyAnnounceRequest(requestPayload)
@@ -968,6 +987,9 @@ func (b *Broker) handleClientOffer(
 		logFields.Add(transportLogFields)
 		logFields.Add(matchMetrics.GetMetrics())
 		b.config.Logger.LogMetric(brokerMetricName, logFields)
+		if retErr != nil {
+			retErr = NewBrokerLoggedEvent(retErr)
+		}
 	}()
 
 	offerRequest, err := UnmarshalClientOfferRequest(requestPayload)
@@ -1288,6 +1310,9 @@ func (b *Broker) handleProxyAnswer(
 		}
 		logFields.Add(transportLogFields)
 		b.config.Logger.LogMetric(brokerMetricName, logFields)
+		if retErr != nil {
+			retErr = NewBrokerLoggedEvent(retErr)
+		}
 	}()
 
 	answerRequest, err := UnmarshalProxyAnswerRequest(requestPayload)
@@ -1422,6 +1447,9 @@ func (b *Broker) handleServerProxyQuality(
 		}
 		logFields.Add(transportLogFields)
 		b.config.Logger.LogMetric(brokerMetricName, logFields)
+		if retErr != nil {
+			retErr = NewBrokerLoggedEvent(retErr)
+		}
 	}()
 
 	qualityRequest, err := UnmarshalServerProxyQualityRequest(requestPayload)
@@ -1499,6 +1527,9 @@ func (b *Broker) handleClientRelayedPacket(
 		}
 		logFields.Add(transportLogFields)
 		b.config.Logger.LogMetric(brokerMetricName, logFields)
+		if retErr != nil {
+			retErr = NewBrokerLoggedEvent(retErr)
+		}
 	}()
 
 	relayedPacketRequest, err := UnmarshalClientRelayedPacketRequest(requestPayload)

+ 1 - 1
psiphon/common/inproxy/coordinator.go

@@ -60,7 +60,7 @@ func NewRoundTripperFailedError(err error) *RoundTripperFailedError {
 	return &RoundTripperFailedError{err: err}
 }
 
-func (e RoundTripperFailedError) Error() string {
+func (e *RoundTripperFailedError) Error() string {
 	return e.err.Error()
 }
 

+ 1 - 1
psiphon/common/inproxy/obfuscation.go

@@ -223,7 +223,7 @@ func NewDeobfuscationAnomoly(err error) *DeobfuscationAnomoly {
 	return &DeobfuscationAnomoly{err: err}
 }
 
-func (e DeobfuscationAnomoly) Error() string {
+func (e *DeobfuscationAnomoly) Error() string {
 	return e.err.Error()
 }
 

+ 11 - 1
psiphon/server/meek.go

@@ -652,7 +652,17 @@ func (server *MeekServer) ServeHTTP(responseWriter http.ResponseWriter, request
 				responseWriter,
 				request)
 			if err != nil {
-				log.WithTraceFields(LogFields{"error": err}).Warning("inproxyBrokerHandler failed")
+
+				var brokerLoggedEvent *inproxy.BrokerLoggedEvent
+				var deobfuscationAnomoly *inproxy.DeobfuscationAnomoly
+				alreadyLogged := std_errors.As(err, &brokerLoggedEvent) ||
+					std_errors.As(err, &deobfuscationAnomoly)
+
+				if !alreadyLogged {
+					log.WithTraceFields(
+						LogFields{"error": err}).Warning("inproxyBrokerHandler failed")
+				}
+
 				server.handleError(responseWriter, request)
 			}
 		}