OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Package count contains 'counter' filters for all the gae services. This | 5 // Package count contains 'counter' filters for all the gae services. This |
6 // serves as a set of simple example filters, and also enables other filters | 6 // serves as a set of simple example filters, and also enables other filters |
7 // to test to see if certain underlying APIs are called when they should be | 7 // to test to see if certain underlying APIs are called when they should be |
8 // (e.g. for the datastore mcache filter, for example). | 8 // (e.g. for the datastore mcache filter, for example). |
9 package count | 9 package count |
10 | 10 |
11 import ( | 11 import ( |
12 "fmt" | |
12 "sync/atomic" | 13 "sync/atomic" |
13 ) | 14 ) |
14 | 15 |
16 type Counter struct { | |
17 value int32 | |
18 } | |
19 | |
20 func (c *Counter) increment() { | |
21 atomic.AddInt32(&c.value, 1) | |
22 } | |
23 | |
24 func (c *Counter) Get() int { | |
iannucci
2015/08/22 01:10:51
I don't think Counter is really necessary, though
| |
25 return int(atomic.LoadInt32(&c.value)) | |
26 } | |
27 | |
15 // Entry is a success/fail pair for a single API method. It's returned | 28 // Entry is a success/fail pair for a single API method. It's returned |
16 // by the Counter interface. | 29 // by the Counter interface. |
17 type Entry struct { | 30 type Entry struct { |
18 » Successes int64 | 31 » Successes Counter |
19 » Errors int64 | 32 » Errors Counter |
33 } | |
34 | |
35 func (e *Entry) String() string { | |
36 » return fmt.Sprintf("{Successes:%d, Errors:%d}", e.Successes.Get(), e.Err ors.Get()) | |
20 } | 37 } |
21 | 38 |
22 // Total is a convenience function for getting the total number of calls to | 39 // Total is a convenience function for getting the total number of calls to |
23 // this API. It's Successes+Errors. | 40 // this API. It's Successes+Errors. |
24 func (e Entry) Total() int64 { return e.Successes + e.Errors } | 41 func (e *Entry) Total() int64 { return int64(e.Successes.Get()) + int64(e.Errors .Get()) } |
25 | 42 |
26 func (e *Entry) up(errs ...error) error { | 43 func (e *Entry) up(errs ...error) error { |
27 err := error(nil) | 44 err := error(nil) |
28 if len(errs) > 0 { | 45 if len(errs) > 0 { |
29 err = errs[0] | 46 err = errs[0] |
30 } | 47 } |
31 if err == nil { | 48 if err == nil { |
32 » » atomic.AddInt64(&e.Successes, 1) | 49 » » e.Successes.increment() |
33 } else { | 50 } else { |
34 » » atomic.AddInt64(&e.Errors, 1) | 51 » » e.Errors.increment() |
35 } | 52 } |
36 return err | 53 return err |
37 } | 54 } |
OLD | NEW |