Skip to content

Commit 0e5deef

Browse files
committed
feat: cache_check_count added
1 parent da7d486 commit 0e5deef

File tree

3 files changed

+58
-29
lines changed

3 files changed

+58
-29
lines changed

internal/engines/cache/cache.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"context"
55
"encoding/hex"
66

7+
api "go.opentelemetry.io/otel/metric"
8+
79
"github.com/cespare/xxhash/v2"
810

911
"github.com/Permify/permify/internal/engines"
@@ -19,15 +21,30 @@ type CheckEngineWithCache struct {
1921
schemaReader storage.SchemaReader
2022
checker invoke.Check
2123
cache cache.Cache
24+
25+
// Metrics
26+
cacheCounter api.Int64Counter
2227
}
2328

2429
// NewCheckEngineWithCache creates a new instance of EngineKeyManager by initializing an EngineKeys
2530
// struct with the provided cache.Cache instance.
26-
func NewCheckEngineWithCache(checker invoke.Check, schemaReader storage.SchemaReader, cache cache.Cache) invoke.Check {
31+
func NewCheckEngineWithCache(
32+
checker invoke.Check,
33+
schemaReader storage.SchemaReader,
34+
cache cache.Cache,
35+
meter api.Meter,
36+
) invoke.Check {
37+
// Cache Counter
38+
cacheCounter, err := meter.Int64Counter("cache_check_count", api.WithDescription("Number of permission cached checks performed"))
39+
if err != nil {
40+
panic(err)
41+
}
42+
2743
return &CheckEngineWithCache{
2844
schemaReader: schemaReader,
2945
checker: checker,
3046
cache: cache,
47+
cacheCounter: cacheCounter,
3148
}
3249
}
3350

@@ -52,6 +69,8 @@ func (c *CheckEngineWithCache) Check(ctx context.Context, request *base.Permissi
5269

5370
// If a cached result is found, handle exclusion and return the result.
5471
if found {
72+
// Increase the check count in the metrics.
73+
c.cacheCounter.Add(ctx, 1)
5574
// If the request doesn't have the exclusion flag set, return the cached result.
5675
return &base.PermissionCheckResponse{
5776
Can: res.GetCan(),
@@ -60,8 +79,7 @@ func (c *CheckEngineWithCache) Check(ctx context.Context, request *base.Permissi
6079
}
6180

6281
// Perform the actual permission check using the provided request.
63-
res, err = c.checker.Check(ctx, request)
64-
82+
cres, err := c.checker.Check(ctx, request)
6583
// Check if there's an error or the response is nil, and return the result.
6684
if err != nil {
6785
return &base.PermissionCheckResponse{
@@ -73,12 +91,12 @@ func (c *CheckEngineWithCache) Check(ctx context.Context, request *base.Permissi
7391
}
7492

7593
c.setCheckKey(request, &base.PermissionCheckResponse{
76-
Can: res.GetCan(),
94+
Can: cres.GetCan(),
7795
Metadata: &base.PermissionCheckResponseMetadata{},
7896
}, isRelational)
7997

8098
// Return the result of the permission check.
81-
return res, err
99+
return cres, err
82100
}
83101

84102
// GetCheckKey retrieves the value for the given key from the EngineKeys cache.

internal/engines/cache/cache_test.go

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ var _ = Describe("cache", func() {
4343
Expect(err).ShouldNot(HaveOccurred())
4444

4545
// Initialize a new EngineKeys struct with a new cache.Cache instance
46-
engineKeys := CheckEngineWithCache{nil, nil, cache}
46+
engineKeys := CheckEngineWithCache{nil, nil, cache, nil}
4747

4848
// Create a new PermissionCheckRequest and PermissionCheckResponse
4949
checkReq := &base.PermissionCheckRequest{
@@ -93,7 +93,7 @@ var _ = Describe("cache", func() {
9393
Expect(err).ShouldNot(HaveOccurred())
9494

9595
// Initialize a new EngineKeys struct with a new cache.Cache instance
96-
engineKeys := CheckEngineWithCache{nil, nil, cache}
96+
engineKeys := CheckEngineWithCache{nil, nil, cache, nil}
9797

9898
// Create a new PermissionCheckRequest and PermissionCheckResponse
9999
checkReq := &base.PermissionCheckRequest{
@@ -143,7 +143,7 @@ var _ = Describe("cache", func() {
143143
Expect(err).ShouldNot(HaveOccurred())
144144

145145
// Initialize a new EngineKeys struct with a new cache.Cache instance
146-
engineKeys := CheckEngineWithCache{nil, nil, cache}
146+
engineKeys := CheckEngineWithCache{nil, nil, cache, nil}
147147

148148
// Create a new PermissionCheckRequest and PermissionCheckResponse
149149
checkReq := &base.PermissionCheckRequest{
@@ -287,7 +287,7 @@ var _ = Describe("cache", func() {
287287
Expect(err).ShouldNot(HaveOccurred())
288288

289289
// Initialize a new EngineKeys struct with a new cache.Cache instance
290-
engineKeys := CheckEngineWithCache{nil, nil, cache}
290+
engineKeys := CheckEngineWithCache{nil, nil, cache, nil}
291291

292292
// Create a new PermissionCheckRequest
293293
checkReq := &base.PermissionCheckRequest{
@@ -322,7 +322,7 @@ var _ = Describe("cache", func() {
322322
Expect(err).ShouldNot(HaveOccurred())
323323

324324
// Initialize a new EngineKeys struct with a new cache.Cache instance
325-
engineKeys := CheckEngineWithCache{nil, nil, cache}
325+
engineKeys := CheckEngineWithCache{nil, nil, cache, nil}
326326

327327
// Create some new PermissionCheckRequests and PermissionCheckResponses
328328
checkReq1 := &base.PermissionCheckRequest{
@@ -513,7 +513,7 @@ var _ = Describe("cache", func() {
513513
Expect(err).ShouldNot(HaveOccurred())
514514

515515
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
516-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
516+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
517517

518518
invoker := invoke.NewDirectInvoker(
519519
schemaReader,
@@ -623,7 +623,7 @@ var _ = Describe("cache", func() {
623623
Expect(err).ShouldNot(HaveOccurred())
624624

625625
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
626-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
626+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
627627

628628
invoker := invoke.NewDirectInvoker(
629629
schemaReader,
@@ -735,7 +735,7 @@ var _ = Describe("cache", func() {
735735
Expect(err).ShouldNot(HaveOccurred())
736736

737737
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
738-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
738+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
739739

740740
invoker := invoke.NewDirectInvoker(
741741
schemaReader,
@@ -867,7 +867,7 @@ var _ = Describe("cache", func() {
867867
Expect(err).ShouldNot(HaveOccurred())
868868

869869
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
870-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
870+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
871871

872872
invoker := invoke.NewDirectInvoker(
873873
schemaReader,
@@ -991,7 +991,7 @@ var _ = Describe("cache", func() {
991991
Expect(err).ShouldNot(HaveOccurred())
992992

993993
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
994-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
994+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
995995

996996
invoker := invoke.NewDirectInvoker(
997997
schemaReader,
@@ -1108,7 +1108,7 @@ var _ = Describe("cache", func() {
11081108
Expect(err).ShouldNot(HaveOccurred())
11091109

11101110
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
1111-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
1111+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
11121112

11131113
invoker := invoke.NewDirectInvoker(
11141114
schemaReader,
@@ -1263,7 +1263,7 @@ var _ = Describe("cache", func() {
12631263
Expect(err).ShouldNot(HaveOccurred())
12641264

12651265
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
1266-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
1266+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
12671267

12681268
invoker := invoke.NewDirectInvoker(
12691269
schemaReader,
@@ -1389,7 +1389,7 @@ var _ = Describe("cache", func() {
13891389
Expect(err).ShouldNot(HaveOccurred())
13901390

13911391
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
1392-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
1392+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
13931393

13941394
invoker := invoke.NewDirectInvoker(
13951395
schemaReader,
@@ -1526,7 +1526,7 @@ var _ = Describe("cache", func() {
15261526
Expect(err).ShouldNot(HaveOccurred())
15271527

15281528
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
1529-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
1529+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
15301530

15311531
invoker := invoke.NewDirectInvoker(
15321532
schemaReader,
@@ -1654,7 +1654,7 @@ var _ = Describe("cache", func() {
16541654
Expect(err).ShouldNot(HaveOccurred())
16551655

16561656
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
1657-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
1657+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
16581658

16591659
invoker := invoke.NewDirectInvoker(
16601660
schemaReader,
@@ -1772,7 +1772,7 @@ var _ = Describe("cache", func() {
17721772
Expect(err).ShouldNot(HaveOccurred())
17731773

17741774
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
1775-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
1775+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
17761776

17771777
invoker := invoke.NewDirectInvoker(
17781778
schemaReader,
@@ -1890,7 +1890,7 @@ var _ = Describe("cache", func() {
18901890
Expect(err).ShouldNot(HaveOccurred())
18911891

18921892
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
1893-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
1893+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
18941894

18951895
invoker := invoke.NewDirectInvoker(
18961896
schemaReader,
@@ -2054,7 +2054,7 @@ var _ = Describe("cache", func() {
20542054
Expect(err).ShouldNot(HaveOccurred())
20552055

20562056
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
2057-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
2057+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
20582058

20592059
invoker := invoke.NewDirectInvoker(
20602060
schemaReader,
@@ -2206,7 +2206,7 @@ var _ = Describe("cache", func() {
22062206
Expect(err).ShouldNot(HaveOccurred())
22072207

22082208
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
2209-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
2209+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
22102210

22112211
invoker := invoke.NewDirectInvoker(
22122212
schemaReader,
@@ -2361,7 +2361,7 @@ var _ = Describe("cache", func() {
23612361
Expect(err).ShouldNot(HaveOccurred())
23622362

23632363
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
2364-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
2364+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
23652365

23662366
invoker := invoke.NewDirectInvoker(
23672367
schemaReader,
@@ -2500,7 +2500,7 @@ var _ = Describe("cache", func() {
25002500
Expect(err).ShouldNot(HaveOccurred())
25012501

25022502
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
2503-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
2503+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
25042504

25052505
invoker := invoke.NewDirectInvoker(
25062506
schemaReader,
@@ -2651,7 +2651,7 @@ var _ = Describe("cache", func() {
26512651
Expect(err).ShouldNot(HaveOccurred())
26522652

26532653
checkEngine := engines.NewCheckEngine(schemaReader, dataReader)
2654-
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
2654+
checkEngineWithCache := NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache, telemetry.NewNoopMeter())
26552655

26562656
invoker := invoke.NewDirectInvoker(
26572657
schemaReader,

pkg/cmd/serve.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,19 @@ func serve() func(cmd *cobra.Command, args []string) error {
295295
if err != nil {
296296
return err
297297
}
298-
checker = cache.NewCheckEngineWithCache(checker, schemaReader, engineKeyCache)
298+
checker = cache.NewCheckEngineWithCache(
299+
checker,
300+
schemaReader,
301+
engineKeyCache,
302+
meter,
303+
)
299304
} else {
300-
checker = cache.NewCheckEngineWithCache(checkEngine, schemaReader, engineKeyCache)
305+
checker = cache.NewCheckEngineWithCache(
306+
checkEngine,
307+
schemaReader,
308+
engineKeyCache,
309+
meter,
310+
)
301311
}
302312

303313
// Create a localChecker which directly checks without considering distributed setup.
@@ -306,6 +316,7 @@ func serve() func(cmd *cobra.Command, args []string) error {
306316
checkEngine,
307317
schemaReader,
308318
engineKeyCache,
319+
meter,
309320
)
310321

311322
// Initialize the lookupEngine, which is responsible for looking up certain entities or values.

0 commit comments

Comments
 (0)