Skip to content

Commit b2009aa

Browse files
aerosolzoldar
andauthored
Rely on con_cache telemetry (#4019)
* Rely on con_cache telemetry Now that sasa1977/con_cache#76 is released, we don't have to use low-level operations to emit hit/miss events. This PR also wraps cache processes with a function returning appropriate child specs lists. Ideally each cache will have its own supervisor/child specs going forward. This is an intermediate step in that direction. * Update lib/plausible/application.ex Co-authored-by: Adrian Gruntkowski <[email protected]> * Declare caches without warmers with plain child specs --------- Co-authored-by: Adrian Gruntkowski <[email protected]>
1 parent 726fe2d commit b2009aa

File tree

7 files changed

+78
-174
lines changed

7 files changed

+78
-174
lines changed

Diff for: lib/plausible/application.ex

+70-76
Original file line numberDiff line numberDiff line change
@@ -32,81 +32,56 @@ defmodule Plausible.Application do
3232
ttl_check_interval: :timer.seconds(1),
3333
global_ttl: :timer.minutes(30)
3434
),
35-
{Plausible.Site.Cache, ttl_check_interval: false},
36-
{Plausible.Cache.Warmer,
37-
[
38-
child_name: Plausible.Site.Cache.All,
39-
cache_impl: Plausible.Site.Cache,
40-
interval: :timer.minutes(15) + Enum.random(1..:timer.seconds(10)),
41-
warmer_fn: :refresh_all
42-
]},
43-
{Plausible.Cache.Warmer,
44-
[
45-
child_name: Plausible.Site.Cache.RecentlyUpdated,
46-
cache_impl: Plausible.Site.Cache,
47-
interval: :timer.seconds(30),
48-
warmer_fn: :refresh_updated_recently
49-
]},
50-
{Plausible.Shield.IPRuleCache, ttl_check_interval: false},
51-
{Plausible.Cache.Warmer,
52-
[
53-
child_name: Plausible.Shield.IPRuleCache.All,
54-
cache_impl: Plausible.Shield.IPRuleCache,
55-
interval: :timer.minutes(3) + Enum.random(1..:timer.seconds(10)),
56-
warmer_fn: :refresh_all
57-
]},
58-
{Plausible.Cache.Warmer,
59-
[
60-
child_name: Plausible.Shield.IPRuleCache.RecentlyUpdated,
61-
cache_impl: Plausible.Shield.IPRuleCache,
62-
interval: :timer.seconds(35),
63-
warmer_fn: :refresh_updated_recently
64-
]},
65-
{Plausible.Shield.CountryRuleCache, ttl_check_interval: false},
66-
{Plausible.Cache.Warmer,
67-
[
68-
child_name: Plausible.Shield.CountryRuleCache.All,
69-
cache_impl: Plausible.Shield.CountryRuleCache,
70-
interval: :timer.minutes(3) + Enum.random(1..:timer.seconds(10)),
71-
warmer_fn: :refresh_all
72-
]},
73-
{Plausible.Cache.Warmer,
74-
[
75-
child_name: Plausible.Shield.CountryRuleCache.RecentlyUpdated,
76-
cache_impl: Plausible.Shield.CountryRuleCache,
77-
interval: :timer.seconds(35),
78-
warmer_fn: :refresh_updated_recently
79-
]},
80-
{Plausible.Shield.PageRuleCache, ttl_check_interval: false, ets_options: [:bag]},
81-
{Plausible.Cache.Warmer,
82-
[
83-
child_name: Plausible.Shield.PageRuleCache.All,
84-
cache_impl: Plausible.Shield.PageRuleCache,
85-
interval: :timer.minutes(3) + Enum.random(1..:timer.seconds(10)),
86-
warmer_fn: :refresh_all
87-
]},
88-
{Plausible.Cache.Warmer,
89-
[
90-
child_name: Plausible.Shield.PageRuleCache.RecentlyUpdated,
91-
cache_impl: Plausible.Shield.PageRuleCache,
92-
interval: :timer.seconds(35),
93-
warmer_fn: :refresh_updated_recently
94-
]},
95-
{Plausible.Shield.HostnameRuleCache, ttl_check_interval: false, ets_options: [:bag]},
96-
{Plausible.Cache.Warmer,
97-
[
98-
child_name: Plausible.Shield.HostnameRuleCache.All,
99-
cache_impl: Plausible.Shield.HostnameRuleCache,
100-
interval: :timer.minutes(3) + Enum.random(1..:timer.seconds(10)),
101-
warmer_fn: :refresh_all
102-
]},
103-
{Plausible.Cache.Warmer,
104-
[
105-
child_name: Plausible.Shield.HostnameRuleCache.RecentlyUpdated,
106-
cache_impl: Plausible.Shield.HostnameRuleCache,
107-
interval: :timer.seconds(25),
108-
warmer_fn: :refresh_updated_recently
109-
]},
35+
warmed_cache(Plausible.Site.Cache,
36+
adapter_opts: [ttl_check_interval: false],
37+
warmers: [
38+
refresh_all:
39+
{Plausible.Site.Cache.All,
40+
interval: :timer.minutes(15) + Enum.random(1..:timer.seconds(10))},
41+
refresh_updated_recently:
42+
{Plausible.Site.Cache.RecentlyUpdated, interval: :timer.seconds(30)}
43+
]
44+
),
45+
warmed_cache(Plausible.Shield.IPRuleCache,
46+
adapter_opts: [ttl_check_interval: false],
47+
warmers: [
48+
refresh_all:
49+
{Plausible.Shield.IPRuleCache.All,
50+
interval: :timer.minutes(3) + Enum.random(1..:timer.seconds(10))},
51+
refresh_updated_recently:
52+
{Plausible.Shield.IPRuleCache.RecentlyUpdated, interval: :timer.seconds(35)}
53+
]
54+
),
55+
warmed_cache(Plausible.Shield.CountryRuleCache,
56+
adapter_opts: [ttl_check_interval: false],
57+
warmers: [
58+
refresh_all:
59+
{Plausible.Shield.CountryRuleCache.All,
60+
interval: :timer.minutes(3) + Enum.random(1..:timer.seconds(10))},
61+
refresh_updated_recently:
62+
{Plausible.Shield.CountryRuleCache.RecentlyUpdated, interval: :timer.seconds(35)}
63+
]
64+
),
65+
warmed_cache(Plausible.Shield.PageRuleCache,
66+
adapter_opts: [ttl_check_interval: false, ets_options: [:bag]],
67+
warmers: [
68+
refresh_all:
69+
{Plausible.Shield.PageRuleCache.All,
70+
interval: :timer.minutes(3) + Enum.random(1..:timer.seconds(10))},
71+
refresh_updated_recently:
72+
{Plausible.Shield.PageRuleCache.RecentlyUpdated, interval: :timer.seconds(35)}
73+
]
74+
),
75+
warmed_cache(Plausible.Shield.HostnameRuleCache,
76+
adapter_opts: [ttl_check_interval: false, ets_options: [:bag]],
77+
warmers: [
78+
refresh_all:
79+
{Plausible.Shield.HostnameRuleCache.All,
80+
interval: :timer.minutes(3) + Enum.random(1..:timer.seconds(10))},
81+
refresh_updated_recently:
82+
{Plausible.Shield.HostnameRuleCache.RecentlyUpdated, interval: :timer.seconds(25)}
83+
]
84+
),
11085
{Plausible.Auth.TOTP.Vault, key: totp_vault_key()},
11186
PlausibleWeb.Endpoint,
11287
{Oban, Application.get_env(:plausible, Oban)},
@@ -123,7 +98,7 @@ defmodule Plausible.Application do
12398
Location.load_all()
12499
Plausible.Geo.await_loader()
125100

126-
Supervisor.start_link(children, opts)
101+
Supervisor.start_link(List.flatten(children), opts)
127102
end
128103

129104
def config_change(changed, _new, removed) do
@@ -222,4 +197,23 @@ defmodule Plausible.Application do
222197
opts = Application.fetch_env!(:plausible, Plausible.Geo)
223198
:ok = Plausible.Geo.load_db(opts)
224199
end
200+
201+
defp warmed_cache(impl_mod, opts) when is_atom(impl_mod) and is_list(opts) do
202+
warmers = Keyword.fetch!(opts, :warmers)
203+
204+
warmer_specs =
205+
Enum.map(warmers, fn {warmer_fn, {warmer_id, warmer_opts}} ->
206+
{Plausible.Cache.Warmer,
207+
Keyword.merge(
208+
[
209+
child_name: warmer_id,
210+
cache_impl: impl_mod,
211+
warmer_fn: warmer_fn
212+
],
213+
warmer_opts
214+
)}
215+
end)
216+
217+
[{impl_mod, Keyword.fetch!(opts, :adapter_opts)} | warmer_specs]
218+
end
225219
end

Diff for: lib/plausible/cache.ex

-2
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ defmodule Plausible.Cache do
5656
# credo:disable-for-this-file Credo.Check.Refactor.LongQuoteBlocks
5757
defmacro __using__(_opts) do
5858
quote do
59-
require Logger
60-
6159
@behaviour Plausible.Cache
6260
@modes [:all, :updated_recently]
6361

Diff for: lib/plausible/cache/adapter.ex

+2-37
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@ defmodule Plausible.Cache.Adapter do
3636

3737
@spec get(atom(), any()) :: any()
3838
def get(cache_name, key) do
39-
result = ConCache.get(cache_name, key)
40-
if is_nil(result), do: miss(cache_name), else: hit(cache_name)
41-
result
39+
ConCache.get(cache_name, key)
4240
catch
4341
:exit, _ ->
4442
Logger.error("Error retrieving key from '#{inspect(cache_name)}'")
@@ -47,16 +45,7 @@ defmodule Plausible.Cache.Adapter do
4745

4846
@spec get(atom(), any(), (-> any())) :: any()
4947
def get(cache_name, key, fallback_fn) do
50-
cache = ConCache.Owner.cache(cache_name)
51-
52-
case ConCache.Operations.get(cache, key) do
53-
nil ->
54-
get_or_store_isolated(cache, cache_name, key, fallback_fn)
55-
56-
value ->
57-
hit(cache_name)
58-
value
59-
end
48+
ConCache.get_or_store(cache_name, key, fallback_fn)
6049
catch
6150
:exit, _ ->
6251
Logger.error("Error retrieving key from '#{inspect(cache_name)}'")
@@ -109,28 +98,4 @@ defmodule Plausible.Cache.Adapter do
10998
Logger.error("Error retrieving key from '#{inspect(cache_name)}'")
11099
[]
111100
end
112-
113-
defp hit(cache_name) do
114-
Plausible.Cache.Stats.record_hit(cache_name)
115-
end
116-
117-
defp miss(cache_name) do
118-
Plausible.Cache.Stats.record_miss(cache_name)
119-
end
120-
121-
defp get_or_store_isolated(cache, cache_name, key, fun) do
122-
ConCache.isolated(cache_name, key, fn ->
123-
case ConCache.Operations.get(cache, key) do
124-
nil ->
125-
new_value = fun.()
126-
ConCache.Operations.dirty_put(cache, key, new_value)
127-
miss(cache_name)
128-
new_value
129-
130-
existing ->
131-
hit(cache_name)
132-
existing
133-
end
134-
end)
135-
end
136101
end

Diff for: lib/plausible/cache/stats.ex

+4-12
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,14 @@ defmodule Plausible.Cache.Stats do
77

88
@hit :hit
99
@miss :miss
10-
@telemetry_hit [:plausible, :cache, :adapter, @hit]
11-
@telemetry_miss [:plausible, :cache, :adapter, @miss]
10+
@telemetry_hit ConCache.Operations.telemetry_hit()
11+
@telemetry_miss ConCache.Operations.telemetry_miss()
1212
@telemetry_events [@telemetry_hit, @telemetry_miss]
1313

1414
def start_link(_opts) do
1515
GenServer.start_link(__MODULE__, nil)
1616
end
1717

18-
def record_hit(cache_name) do
19-
:telemetry.execute(@telemetry_hit, %{}, %{cache_name: cache_name})
20-
end
21-
22-
def record_miss(cache_name) do
23-
:telemetry.execute(@telemetry_miss, %{}, %{cache_name: cache_name})
24-
end
25-
2618
def init(nil) do
2719
__MODULE__ =
2820
:ets.new(__MODULE__, [
@@ -43,11 +35,11 @@ defmodule Plausible.Cache.Stats do
4335
{:ok, nil}
4436
end
4537

46-
def handle_telemetry_event(@telemetry_hit, _measurments, %{cache_name: cache_name}, _) do
38+
def handle_telemetry_event(@telemetry_hit, _measurments, %{cache: %{name: cache_name}}, _) do
4739
bump(cache_name, @hit)
4840
end
4941

50-
def handle_telemetry_event(@telemetry_miss, _measurments, %{cache_name: cache_name}, _) do
42+
def handle_telemetry_event(@telemetry_miss, _measurments, %{cache: %{name: cache_name}}, _) do
5143
bump(cache_name, @miss)
5244
end
5345

Diff for: mix.exs

+1-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ defmodule Plausible.MixProject do
142142
{:ex_aws_s3, "~> 2.5"},
143143
{:sweet_xml, "~> 0.7.4"},
144144
{:zstream, "~> 0.6.4"},
145-
{:con_cache, "~> 1.0"}
145+
{:con_cache, "~> 1.1.0"}
146146
]
147147
end
148148

Diff for: mix.lock

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"combination": {:hex, :combination, "0.0.3", "746aedca63d833293ec6e835aa1f34974868829b1486b1e1cb0685f0b2ae1f41", [:mix], [], "hexpm", "72b099f463df42ef7dc6371d250c7070b57b6c5902853f69deb894f79eda18ca"},
1919
"combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"},
2020
"comeonin": {:hex, :comeonin, "5.4.0", "246a56ca3f41d404380fc6465650ddaa532c7f98be4bda1b4656b3a37cc13abe", [:mix], [], "hexpm", "796393a9e50d01999d56b7b8420ab0481a7538d0caf80919da493b4a6e51faf1"},
21-
"con_cache": {:hex, :con_cache, "1.0.0", "6405e2bd5d5005334af72939432783562a8c35a196c2e63108fe10bb97b366e6", [:mix], [], "hexpm", "4d1f5cb1a67f3c1a468243dc98d10ac83af7f3e33b7e7c15999dc2c9bc0a551e"},
21+
"con_cache": {:hex, :con_cache, "1.1.0", "45c7c6cd6dc216e47636232e8c683734b7fe293221fccd9454fa1757bc685044", [:mix], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8655f2ae13a1e56c8aef304d250814c7ed929c12810f126fc423ecc8e871593b"},
2222
"cors_plug": {:hex, :cors_plug, "3.0.3", "7c3ac52b39624bc616db2e937c282f3f623f25f8d550068b6710e58d04a0e330", [:mix], [{:plug, "~> 1.13", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "3f2d759e8c272ed3835fab2ef11b46bddab8c1ab9528167bd463b6452edf830d"},
2323
"cowboy": {:hex, :cowboy, "2.10.0", "ff9ffeff91dae4ae270dd975642997afe2a1179d94b1887863e43f681a203e26", [:make, :rebar3], [{:cowlib, "2.12.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "3afdccb7183cc6f143cb14d3cf51fa00e53db9ec80cdcd525482f5e99bc41d6b"},
2424
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},

Diff for: test/plausible/cache/stats_test.exs

-45
This file was deleted.

0 commit comments

Comments
 (0)