94 lines
2.4 KiB
Elixir
94 lines
2.4 KiB
Elixir
|
defmodule Graph.Cache do
|
||
|
@moduledoc false
|
||
|
use Nebulex.Cache,
|
||
|
otp_app: :backend,
|
||
|
adapter: Nebulex.Adapters.Local
|
||
|
|
||
|
alias Backend.{Api, Crawl, Edge, Instance, MostRecentCrawl, Repo}
|
||
|
alias __MODULE__
|
||
|
require Logger
|
||
|
import Ecto.Query
|
||
|
|
||
|
@spec get_graph(String.t() | nil) :: %{
|
||
|
nodes: [Instance.t()],
|
||
|
edges: [Edge.t()]
|
||
|
}
|
||
|
def get_graph(domain \\ nil) do
|
||
|
key =
|
||
|
if domain != nil do
|
||
|
"graph_" <> domain
|
||
|
else
|
||
|
"graph"
|
||
|
end
|
||
|
|
||
|
case Cache.get(key) do
|
||
|
nil ->
|
||
|
Appsignal.increment_counter("graph_cache.misses", 1)
|
||
|
Logger.debug("Graph cache: miss")
|
||
|
nodes = Api.list_nodes(domain)
|
||
|
edges = Api.list_edges(domain)
|
||
|
# Cache for 10 minutes
|
||
|
Cache.set(key, %{nodes: nodes, edges: edges}, ttl: 600)
|
||
|
%{nodes: nodes, edges: edges}
|
||
|
|
||
|
data ->
|
||
|
Appsignal.increment_counter("graph_cache.hits", 1)
|
||
|
Logger.debug("Graph cache: hit")
|
||
|
data
|
||
|
end
|
||
|
end
|
||
|
|
||
|
@spec get_instance_with_peers(String.t()) :: Instance.t()
|
||
|
def get_instance_with_peers(domain) do
|
||
|
key = "instance_" <> domain
|
||
|
|
||
|
case Cache.get(key) do
|
||
|
nil ->
|
||
|
Appsignal.increment_counter("instance_cache.misses", 1)
|
||
|
Logger.debug("Instance cache: miss")
|
||
|
instance = Api.get_instance_with_peers(domain)
|
||
|
# Cache for one minute
|
||
|
Cache.set(key, instance, ttl: 60)
|
||
|
instance
|
||
|
|
||
|
data ->
|
||
|
Appsignal.increment_counter("instance_cache.hits", 1)
|
||
|
Logger.debug("Instance cache: hit")
|
||
|
data
|
||
|
end
|
||
|
end
|
||
|
|
||
|
@spec get_last_crawl(String.t()) :: Crawl.t() | nil
|
||
|
def get_last_crawl(domain) do
|
||
|
key = "most_recent_crawl_" <> domain
|
||
|
|
||
|
most_recent_crawl_subquery =
|
||
|
MostRecentCrawl
|
||
|
|> select([mrc], %{
|
||
|
most_recent_id: mrc.crawl_id
|
||
|
})
|
||
|
|> where([mrc], mrc.instance_domain == ^domain)
|
||
|
|
||
|
case Cache.get(key) do
|
||
|
nil ->
|
||
|
Appsignal.increment_counter("most_recent_crawl_cache.misses", 1)
|
||
|
Logger.debug("Most recent crawl cache: miss")
|
||
|
|
||
|
crawl =
|
||
|
Crawl
|
||
|
|> join(:inner, [c], mrc in subquery(most_recent_crawl_subquery),
|
||
|
on: c.id == mrc.most_recent_id
|
||
|
)
|
||
|
|> Repo.one()
|
||
|
|
||
|
# Cache for one minute
|
||
|
Cache.set(key, crawl, ttl: 60)
|
||
|
|
||
|
data ->
|
||
|
Appsignal.increment_counter("most_recent_crawl_cache.hits", 1)
|
||
|
Logger.debug("Most recent crawl cache: hit")
|
||
|
data
|
||
|
end
|
||
|
end
|
||
|
end
|