@@ -5,9 +5,14 @@ defmodule Supavisor.MetricsCleaner do
55 require Logger
66
77 @ interval :timer . minutes ( 30 )
8+ @ name __MODULE__
89
910 def start_link ( args ) ,
10- do: GenServer . start_link ( __MODULE__ , args , name: __MODULE__ )
11+ do: GenServer . start_link ( __MODULE__ , args , name: @ name )
12+
13+ def clean do
14+ GenServer . cast ( @ name , :clean )
15+ end
1116
1217 def init ( _args ) do
1318 Logger . info ( "Starting MetricsCleaner" )
@@ -30,7 +35,7 @@ defmodule Supavisor.MetricsCleaner do
3035 do: Logger . warning ( "Metrics check took: #{ exec_time } ms" )
3136 end
3237
33- def handle_info ( :check , state ) do
38+ def handle_continue ( :clean , state ) do
3439 Process . cancel_timer ( state . check_ref )
3540
3641 :telemetry . span ( [ :supavisor , :metrics_cleaner ] , % { } , fn ->
@@ -41,39 +46,54 @@ defmodule Supavisor.MetricsCleaner do
4146 { :noreply , % { state | check_ref: check ( ) } }
4247 end
4348
49+ def handle_cast ( :clean , state ) do
50+ { :noreply , state , { :continue , :clean } }
51+ end
52+
53+ def handle_info ( :check , state ) do
54+ { :noreply , state , { :continue , :clean } }
55+ end
56+
4457 def handle_info ( msg , state ) do
4558 Logger . error ( "Unexpected message: #{ inspect ( msg ) } " )
4659 { :noreply , state }
4760 end
4861
49- def check , do: Process . send_after ( self ( ) , :check , @ interval )
50-
51- def loop_and_cleanup_metrics_table do
52- metrics_table = Supavisor.Monitoring.PromEx.Metrics
53- tenant_registry_table = :syn_registry_by_name_tenants
54-
55- func = fn elem , acc ->
56- with { { _ ,
57- % {
58- type: type ,
59- mode: mode ,
60- user: user ,
61- tenant: tenant ,
62- db_name: db ,
63- search_path: search_path
64- } } = key , _ } <- elem ,
65- [ ] <- :ets . lookup ( tenant_registry_table , { { type , tenant } , user , mode , db , search_path } ) do
66- Logger . warning ( "Found orphaned metric: #{ inspect ( key ) } " )
67- :ets . delete ( metrics_table , key )
68-
69- acc + 1
70- else
71- _ -> acc
72- end
73- end
62+ defp check , do: Process . send_after ( self ( ) , :check , @ interval )
7463
64+ defp loop_and_cleanup_metrics_table do
7565 { _ , tids } = Peep.Persistent . storage ( Supavisor.Monitoring.PromEx.Metrics )
7666
77- Enum . each ( List . wrap ( tids ) , & :ets . foldl ( func , 0 , & 1 ) )
67+ tids
68+ |> List . wrap ( )
69+ |> Enum . sum_by ( & clean_table / 1 )
70+ end
71+
72+ @ tenant_registry_table :syn_registry_by_name_tenants
73+
74+ defp clean_table ( tid ) do
75+ func =
76+ fn elem , acc ->
77+ with { { _ ,
78+ % {
79+ type: type ,
80+ mode: mode ,
81+ user: user ,
82+ tenant: tenant ,
83+ db_name: db ,
84+ search_path: search_path
85+ } } = key , _ } <- elem ,
86+ [ ] <-
87+ :ets . lookup ( @ tenant_registry_table , { { type , tenant } , user , mode , db , search_path } ) do
88+ Logger . warning ( "Found orphaned metric: #{ inspect ( key ) } " )
89+ :ets . delete ( tid , key )
90+
91+ acc + 1
92+ else
93+ _ -> acc
94+ end
95+ end
96+
97+ :ets . foldl ( func , 0 , tid )
7898 end
7999end
0 commit comments