Merge pull request #1115 from letsencrypt/rpc-lag
Add metric for RPC message lag
This commit is contained in:
		
						commit
						48bd80d14e
					
				|  | @ -22,6 +22,7 @@ import ( | |||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/letsencrypt/boulder/Godeps/_workspace/src/github.com/cactus/go-statsd-client/statsd" | ||||
| 	"github.com/letsencrypt/boulder/Godeps/_workspace/src/github.com/jmhodges/clock" | ||||
| 	"github.com/letsencrypt/boulder/Godeps/_workspace/src/github.com/streadway/amqp" | ||||
| 
 | ||||
| 	"github.com/letsencrypt/boulder/cmd" | ||||
|  | @ -170,6 +171,8 @@ type AmqpRPCServer struct { | |||
| 	currentGoroutines              int64 | ||||
| 	maxConcurrentRPCServerRequests int64 | ||||
| 	tooManyRequestsResponse        []byte | ||||
| 	stats                          statsd.Statter | ||||
| 	clk                            clock.Clock | ||||
| } | ||||
| 
 | ||||
| // NewAmqpRPCServer creates a new RPC server for the given queue and will begin
 | ||||
|  | @ -186,12 +189,19 @@ func NewAmqpRPCServer(serverQueue string, maxConcurrentRPCServerRequests int64, | |||
| 		reconnectMax = time.Minute | ||||
| 	} | ||||
| 
 | ||||
| 	stats, err := statsd.NewClient(c.Statsd.Server, c.Statsd.Prefix) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return &AmqpRPCServer{ | ||||
| 		serverQueue:                    serverQueue, | ||||
| 		connection:                     newAMQPConnector(serverQueue, reconnectBase, reconnectMax), | ||||
| 		log:                            log, | ||||
| 		dispatchTable:                  make(map[string]func([]byte) ([]byte, error)), | ||||
| 		maxConcurrentRPCServerRequests: maxConcurrentRPCServerRequests, | ||||
| 		clk:   clock.Default(), | ||||
| 		stats: stats, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
|  | @ -426,6 +436,7 @@ func (rpc *AmqpRPCServer) Start(c cmd.Config) error { | |||
| 		select { | ||||
| 		case msg, ok := <-rpc.connection.messages(): | ||||
| 			if ok { | ||||
| 				rpc.stats.TimingDuration(fmt.Sprintf("RPC.MessageLag.%s", rpc.serverQueue), rpc.clk.Now().Sub(msg.Timestamp), 1.0) | ||||
| 				if rpc.maxConcurrentRPCServerRequests > 0 && atomic.LoadInt64(&rpc.currentGoroutines) >= rpc.maxConcurrentRPCServerRequests { | ||||
| 					rpc.replyTooManyRequests(msg) | ||||
| 					break // this breaks the select, not the for
 | ||||
|  |  | |||
|  | @ -129,6 +129,7 @@ func (ac *amqpConnector) publish(queueName, corrId, expiration, replyTo, msgType | |||
| 			Expiration:    expiration, | ||||
| 			ReplyTo:       replyTo, | ||||
| 			Type:          msgType, | ||||
| 			Timestamp:     ac.clk.Now(), | ||||
| 		}) | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -31,6 +31,7 @@ func setup(t *testing.T) (*amqpConnector, *MockamqpChannel, func()) { | |||
| 		}, | ||||
| 		queueName:        "fooqueue", | ||||
| 		retryTimeoutBase: time.Second, | ||||
| 		clk:              clock.NewFake(), | ||||
| 	} | ||||
| 	return &ac, mockChannel, func() { mockCtrl.Finish() } | ||||
| } | ||||
|  | @ -125,6 +126,7 @@ func TestPublish(t *testing.T) { | |||
| 			Expiration:    "3000", | ||||
| 			ReplyTo:       "replyTo", | ||||
| 			Type:          "testMsg", | ||||
| 			Timestamp:     ac.clk.Now(), | ||||
| 		}) | ||||
| 	ac.publish("fooqueue", "03c52e", "3000", "replyTo", "testMsg", []byte("body")) | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue