@@ -179,8 +179,8 @@ func (s *Session) loopReader(tasks chan<- *Request, d *Router) (err error) {
179179func (s * Session ) loopWriter (tasks <- chan * Request ) (err error ) {
180180 defer func () {
181181 s .CloseWithError (err )
182- for _ = range tasks {
183- s .incrOpFails (nil )
182+ for r : = range tasks {
183+ s .incrOpFails (r , nil )
184184 }
185185 s .flushOpStats (true )
186186 }()
@@ -197,16 +197,16 @@ func (s *Session) loopWriter(tasks <-chan *Request) (err error) {
197197 resp = redis .NewErrorf ("ERR handle response, %s" , err )
198198 if sensitive {
199199 s .Conn .Encode (resp , true )
200- return s .incrOpFails (err )
200+ return s .incrOpFails (r , err )
201201 }
202202 }
203203 if err := p .Encode (resp ); err != nil {
204- return s .incrOpFails (err )
204+ return s .incrOpFails (r , err )
205205 }
206206 if err := p .Flush (len (tasks ) == 0 ); err != nil {
207- return s .incrOpFails (err )
207+ return s .incrOpFails (r , err )
208208 } else {
209- s .incrOpStats (r )
209+ s .incrOpStats (r , resp . Type )
210210 }
211211 if len (tasks ) == 0 {
212212 s .flushOpStats (false )
@@ -570,19 +570,29 @@ func (s *Session) incrOpTotal() {
570570 s .stats .total .Incr ()
571571}
572572
573- func (s * Session ) incrOpFails (err error ) error {
574- incrOpFails ()
575- return err
576- }
577-
578- func (s * Session ) incrOpStats (r * Request ) {
579- e := s .stats .opmap [r .OpStr ]
573+ func (s * Session ) getOpStats (opstr string ) * opStats {
574+ e := s .stats .opmap [opstr ]
580575 if e == nil {
581- e = & opStats {opstr : r . OpStr }
582- s .stats .opmap [r . OpStr ] = e
576+ e = & opStats {opstr : opstr }
577+ s .stats .opmap [opstr ] = e
583578 }
579+ return e
580+ }
581+
582+ func (s * Session ) incrOpStats (r * Request , t redis.RespType ) {
583+ e := s .getOpStats (r .OpStr )
584584 e .calls .Incr ()
585585 e .nsecs .Add (time .Now ().UnixNano () - r .Start )
586+ switch t {
587+ case redis .TypeError :
588+ e .redis .errors .Incr ()
589+ }
590+ }
591+
592+ func (s * Session ) incrOpFails (r * Request , err error ) error {
593+ e := s .getOpStats (r .OpStr )
594+ e .fails .Incr ()
595+ return err
586596}
587597
588598func (s * Session ) flushOpStats (force bool ) {
@@ -597,8 +607,8 @@ func (s *Session) flushOpStats(force bool) {
597607
598608 incrOpTotal (s .stats .total .Swap (0 ))
599609 for _ , e := range s .stats .opmap {
600- if n := e . calls . Swap ( 0 ); n != 0 {
601- incrOpStats (e . opstr , n , e . nsecs . Swap ( 0 ) )
610+ if e . calls . Get () != 0 || e . fails . Get () != 0 {
611+ incrOpStats (e )
602612 }
603613 }
604614 s .stats .flush .n ++
0 commit comments