|
@@ -40,6 +40,7 @@ type Broker struct {
|
|
outgoingByteRate metrics.Meter
|
|
outgoingByteRate metrics.Meter
|
|
responseRate metrics.Meter
|
|
responseRate metrics.Meter
|
|
responseSize metrics.Histogram
|
|
responseSize metrics.Histogram
|
|
|
|
+ requestsInFlight metrics.Counter
|
|
brokerIncomingByteRate metrics.Meter
|
|
brokerIncomingByteRate metrics.Meter
|
|
brokerRequestRate metrics.Meter
|
|
brokerRequestRate metrics.Meter
|
|
brokerRequestSize metrics.Histogram
|
|
brokerRequestSize metrics.Histogram
|
|
@@ -47,6 +48,7 @@ type Broker struct {
|
|
brokerOutgoingByteRate metrics.Meter
|
|
brokerOutgoingByteRate metrics.Meter
|
|
brokerResponseRate metrics.Meter
|
|
brokerResponseRate metrics.Meter
|
|
brokerResponseSize metrics.Histogram
|
|
brokerResponseSize metrics.Histogram
|
|
|
|
+ brokerRequestsInFlight metrics.Counter
|
|
|
|
|
|
kerberosAuthenticator GSSAPIKerberosAuth
|
|
kerberosAuthenticator GSSAPIKerberosAuth
|
|
}
|
|
}
|
|
@@ -182,6 +184,7 @@ func (b *Broker) Open(conf *Config) error {
|
|
b.outgoingByteRate = metrics.GetOrRegisterMeter("outgoing-byte-rate", conf.MetricRegistry)
|
|
b.outgoingByteRate = metrics.GetOrRegisterMeter("outgoing-byte-rate", conf.MetricRegistry)
|
|
b.responseRate = metrics.GetOrRegisterMeter("response-rate", conf.MetricRegistry)
|
|
b.responseRate = metrics.GetOrRegisterMeter("response-rate", conf.MetricRegistry)
|
|
b.responseSize = getOrRegisterHistogram("response-size", conf.MetricRegistry)
|
|
b.responseSize = getOrRegisterHistogram("response-size", conf.MetricRegistry)
|
|
|
|
+ b.requestsInFlight = metrics.GetOrRegisterCounter("requests-in-flight", conf.MetricRegistry)
|
|
|
|
|
|
|
|
|
|
if b.id >= 0 {
|
|
if b.id >= 0 {
|
|
@@ -712,16 +715,19 @@ func (b *Broker) send(rb protocolBody, promiseResponse bool) (*responsePromise,
|
|
}
|
|
}
|
|
|
|
|
|
requestTime := time.Now()
|
|
requestTime := time.Now()
|
|
|
|
+
|
|
|
|
+ b.addRequestInFlightMetrics(1)
|
|
bytes, err := b.write(buf)
|
|
bytes, err := b.write(buf)
|
|
b.updateOutgoingCommunicationMetrics(bytes)
|
|
b.updateOutgoingCommunicationMetrics(bytes)
|
|
if err != nil {
|
|
if err != nil {
|
|
|
|
+ b.addRequestInFlightMetrics(-1)
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
b.correlationID++
|
|
b.correlationID++
|
|
|
|
|
|
if !promiseResponse {
|
|
if !promiseResponse {
|
|
|
|
|
|
- b.updateRequestLatencyMetrics(time.Since(requestTime))
|
|
+ b.updateRequestLatencyAndInFlightMetrics(time.Since(requestTime))
|
|
return nil, nil
|
|
return nil, nil
|
|
}
|
|
}
|
|
|
|
|
|
@@ -816,6 +822,9 @@ func (b *Broker) responseReceiver() {
|
|
|
|
|
|
for response := range b.responses {
|
|
for response := range b.responses {
|
|
if dead != nil {
|
|
if dead != nil {
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ b.addRequestInFlightMetrics(-1)
|
|
response.errors <- dead
|
|
response.errors <- dead
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
@@ -891,9 +900,12 @@ func (b *Broker) sendAndReceiveSASLHandshake(saslType SASLMechanism, version int
|
|
}
|
|
}
|
|
|
|
|
|
requestTime := time.Now()
|
|
requestTime := time.Now()
|
|
|
|
+
|
|
|
|
+ b.addRequestInFlightMetrics(1)
|
|
bytes, err := b.write(buf)
|
|
bytes, err := b.write(buf)
|
|
b.updateOutgoingCommunicationMetrics(bytes)
|
|
b.updateOutgoingCommunicationMetrics(bytes)
|
|
if err != nil {
|
|
if err != nil {
|
|
|
|
+ b.addRequestInFlightMetrics(-1)
|
|
Logger.Printf("Failed to send SASL handshake %s: %s\n", b.addr, err.Error())
|
|
Logger.Printf("Failed to send SASL handshake %s: %s\n", b.addr, err.Error())
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -902,6 +914,7 @@ func (b *Broker) sendAndReceiveSASLHandshake(saslType SASLMechanism, version int
|
|
header := make([]byte, 8)
|
|
header := make([]byte, 8)
|
|
_, err = b.readFull(header)
|
|
_, err = b.readFull(header)
|
|
if err != nil {
|
|
if err != nil {
|
|
|
|
+ b.addRequestInFlightMetrics(-1)
|
|
Logger.Printf("Failed to read SASL handshake header : %s\n", err.Error())
|
|
Logger.Printf("Failed to read SASL handshake header : %s\n", err.Error())
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -910,6 +923,7 @@ func (b *Broker) sendAndReceiveSASLHandshake(saslType SASLMechanism, version int
|
|
payload := make([]byte, length-4)
|
|
payload := make([]byte, length-4)
|
|
n, err := b.readFull(payload)
|
|
n, err := b.readFull(payload)
|
|
if err != nil {
|
|
if err != nil {
|
|
|
|
+ b.addRequestInFlightMetrics(-1)
|
|
Logger.Printf("Failed to read SASL handshake payload : %s\n", err.Error())
|
|
Logger.Printf("Failed to read SASL handshake payload : %s\n", err.Error())
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -981,9 +995,12 @@ func (b *Broker) sendAndReceiveV0SASLPlainAuth() error {
|
|
copy(authBytes[4:], []byte(b.conf.Net.SASL.AuthIdentity+"\x00"+b.conf.Net.SASL.User+"\x00"+b.conf.Net.SASL.Password))
|
|
copy(authBytes[4:], []byte(b.conf.Net.SASL.AuthIdentity+"\x00"+b.conf.Net.SASL.User+"\x00"+b.conf.Net.SASL.Password))
|
|
|
|
|
|
requestTime := time.Now()
|
|
requestTime := time.Now()
|
|
|
|
+
|
|
|
|
+ b.addRequestInFlightMetrics(1)
|
|
bytesWritten, err := b.write(authBytes)
|
|
bytesWritten, err := b.write(authBytes)
|
|
b.updateOutgoingCommunicationMetrics(bytesWritten)
|
|
b.updateOutgoingCommunicationMetrics(bytesWritten)
|
|
if err != nil {
|
|
if err != nil {
|
|
|
|
+ b.addRequestInFlightMetrics(-1)
|
|
Logger.Printf("Failed to write SASL auth header to broker %s: %s\n", b.addr, err.Error())
|
|
Logger.Printf("Failed to write SASL auth header to broker %s: %s\n", b.addr, err.Error())
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -1008,11 +1025,13 @@ func (b *Broker) sendAndReceiveV1SASLPlainAuth() error {
|
|
|
|
|
|
requestTime := time.Now()
|
|
requestTime := time.Now()
|
|
|
|
|
|
|
|
+
|
|
|
|
+ b.addRequestInFlightMetrics(1)
|
|
bytesWritten, err := b.sendSASLPlainAuthClientResponse(correlationID)
|
|
bytesWritten, err := b.sendSASLPlainAuthClientResponse(correlationID)
|
|
-
|
|
|
|
b.updateOutgoingCommunicationMetrics(bytesWritten)
|
|
b.updateOutgoingCommunicationMetrics(bytesWritten)
|
|
|
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
|
+ b.addRequestInFlightMetrics(-1)
|
|
Logger.Printf("Failed to write SASL auth header to broker %s: %s\n", b.addr, err.Error())
|
|
Logger.Printf("Failed to write SASL auth header to broker %s: %s\n", b.addr, err.Error())
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -1066,14 +1085,17 @@ func (b *Broker) sendAndReceiveSASLOAuth(provider AccessTokenProvider) error {
|
|
|
|
|
|
func (b *Broker) sendClientMessage(message []byte) (bool, error) {
|
|
func (b *Broker) sendClientMessage(message []byte) (bool, error) {
|
|
requestTime := time.Now()
|
|
requestTime := time.Now()
|
|
|
|
+
|
|
|
|
+ b.addRequestInFlightMetrics(1)
|
|
correlationID := b.correlationID
|
|
correlationID := b.correlationID
|
|
|
|
|
|
bytesWritten, err := b.sendSASLOAuthBearerClientMessage(message, correlationID)
|
|
bytesWritten, err := b.sendSASLOAuthBearerClientMessage(message, correlationID)
|
|
|
|
+ b.updateOutgoingCommunicationMetrics(bytesWritten)
|
|
if err != nil {
|
|
if err != nil {
|
|
|
|
+ b.addRequestInFlightMetrics(-1)
|
|
return false, err
|
|
return false, err
|
|
}
|
|
}
|
|
|
|
|
|
- b.updateOutgoingCommunicationMetrics(bytesWritten)
|
|
|
|
b.correlationID++
|
|
b.correlationID++
|
|
|
|
|
|
res := &SaslAuthenticateResponse{}
|
|
res := &SaslAuthenticateResponse{}
|
|
@@ -1108,17 +1130,21 @@ func (b *Broker) sendAndReceiveSASLSCRAMv1() error {
|
|
|
|
|
|
for !scramClient.Done() {
|
|
for !scramClient.Done() {
|
|
requestTime := time.Now()
|
|
requestTime := time.Now()
|
|
|
|
+
|
|
|
|
+ b.addRequestInFlightMetrics(1)
|
|
correlationID := b.correlationID
|
|
correlationID := b.correlationID
|
|
bytesWritten, err := b.sendSaslAuthenticateRequest(correlationID, []byte(msg))
|
|
bytesWritten, err := b.sendSaslAuthenticateRequest(correlationID, []byte(msg))
|
|
|
|
+ b.updateOutgoingCommunicationMetrics(bytesWritten)
|
|
if err != nil {
|
|
if err != nil {
|
|
|
|
+ b.addRequestInFlightMetrics(-1)
|
|
Logger.Printf("Failed to write SASL auth header to broker %s: %s\n", b.addr, err.Error())
|
|
Logger.Printf("Failed to write SASL auth header to broker %s: %s\n", b.addr, err.Error())
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
- b.updateOutgoingCommunicationMetrics(bytesWritten)
|
|
|
|
b.correlationID++
|
|
b.correlationID++
|
|
challenge, err := b.receiveSaslAuthenticateResponse(correlationID)
|
|
challenge, err := b.receiveSaslAuthenticateResponse(correlationID)
|
|
if err != nil {
|
|
if err != nil {
|
|
|
|
+ b.addRequestInFlightMetrics(-1)
|
|
Logger.Printf("Failed to read response while authenticating with SASL to broker %s: %s\n", b.addr, err.Error())
|
|
Logger.Printf("Failed to read response while authenticating with SASL to broker %s: %s\n", b.addr, err.Error())
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -1271,7 +1297,7 @@ func (b *Broker) receiveSASLServerResponse(res *SaslAuthenticateResponse, correl
|
|
}
|
|
}
|
|
|
|
|
|
func (b *Broker) updateIncomingCommunicationMetrics(bytes int, requestLatency time.Duration) {
|
|
func (b *Broker) updateIncomingCommunicationMetrics(bytes int, requestLatency time.Duration) {
|
|
- b.updateRequestLatencyMetrics(requestLatency)
|
|
+ b.updateRequestLatencyAndInFlightMetrics(requestLatency)
|
|
b.responseRate.Mark(1)
|
|
b.responseRate.Mark(1)
|
|
|
|
|
|
if b.brokerResponseRate != nil {
|
|
if b.brokerResponseRate != nil {
|
|
@@ -1290,13 +1316,22 @@ func (b *Broker) updateIncomingCommunicationMetrics(bytes int, requestLatency ti
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-func (b *Broker) updateRequestLatencyMetrics(requestLatency time.Duration) {
|
|
+func (b *Broker) updateRequestLatencyAndInFlightMetrics(requestLatency time.Duration) {
|
|
requestLatencyInMs := int64(requestLatency / time.Millisecond)
|
|
requestLatencyInMs := int64(requestLatency / time.Millisecond)
|
|
b.requestLatency.Update(requestLatencyInMs)
|
|
b.requestLatency.Update(requestLatencyInMs)
|
|
|
|
|
|
if b.brokerRequestLatency != nil {
|
|
if b.brokerRequestLatency != nil {
|
|
b.brokerRequestLatency.Update(requestLatencyInMs)
|
|
b.brokerRequestLatency.Update(requestLatencyInMs)
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ b.addRequestInFlightMetrics(-1)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (b *Broker) addRequestInFlightMetrics(i int64) {
|
|
|
|
+ b.requestsInFlight.Inc(i)
|
|
|
|
+ if b.brokerRequestsInFlight != nil {
|
|
|
|
+ b.brokerRequestsInFlight.Inc(i)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
func (b *Broker) updateOutgoingCommunicationMetrics(bytes int) {
|
|
func (b *Broker) updateOutgoingCommunicationMetrics(bytes int) {
|
|
@@ -1325,6 +1360,7 @@ func (b *Broker) registerMetrics() {
|
|
b.brokerOutgoingByteRate = b.registerMeter("outgoing-byte-rate")
|
|
b.brokerOutgoingByteRate = b.registerMeter("outgoing-byte-rate")
|
|
b.brokerResponseRate = b.registerMeter("response-rate")
|
|
b.brokerResponseRate = b.registerMeter("response-rate")
|
|
b.brokerResponseSize = b.registerHistogram("response-size")
|
|
b.brokerResponseSize = b.registerHistogram("response-size")
|
|
|
|
+ b.brokerRequestsInFlight = b.registerCounter("requests-in-flight")
|
|
}
|
|
}
|
|
|
|
|
|
func (b *Broker) unregisterMetrics() {
|
|
func (b *Broker) unregisterMetrics() {
|
|
@@ -1344,3 +1380,9 @@ func (b *Broker) registerHistogram(name string) metrics.Histogram {
|
|
b.registeredMetrics = append(b.registeredMetrics, nameForBroker)
|
|
b.registeredMetrics = append(b.registeredMetrics, nameForBroker)
|
|
return getOrRegisterHistogram(nameForBroker, b.conf.MetricRegistry)
|
|
return getOrRegisterHistogram(nameForBroker, b.conf.MetricRegistry)
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+func (b *Broker) registerCounter(name string) metrics.Counter {
|
|
|
|
+ nameForBroker := getMetricNameForBroker(name, b)
|
|
|
|
+ b.registeredMetrics = append(b.registeredMetrics, nameForBroker)
|
|
|
|
+ return metrics.GetOrRegisterCounter(nameForBroker, b.conf.MetricRegistry)
|
|
|
|
+}
|