Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions lib/supavisor/client_handler.ex
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,10 @@ defmodule Supavisor.ClientHandler do
idle_timeout: opts.idle_timeout
}

Registry.register(@clients_registry, data.id, started_at: System.monotonic_time())
Registry.register(@clients_registry, data.id,
started_at: System.monotonic_time(),
app_name: data.app_name
)

cond do
data.client_ready ->
Expand All @@ -342,7 +345,7 @@ defmodule Supavisor.ClientHandler do
case Supavisor.get_pool_ranch(data.id) do
{:ok, pool_ranch} ->
Logger.metadata(proxy: true)
Registry.register(@proxy_clients_registry, data.id, [])
Registry.register(@proxy_clients_registry, data.id, app_name: data.app_name)

{:keep_state, %{data | pool_ranch: pool_ranch}, {:next_event, :internal, :connect_db}}

Expand Down Expand Up @@ -877,7 +880,7 @@ defmodule Supavisor.ClientHandler do
else: :auth_query

connection_params = %Supavisor.ConnectionParameters{
application_name: data.app_name || "Supavisor",
application_name: data.app_name,
database: db_name,
host: to_charlist(info.tenant.db_host),
sni_hostname:
Expand Down
6 changes: 3 additions & 3 deletions lib/supavisor/client_handler/protocol_helpers.ex
Original file line number Diff line number Diff line change
Expand Up @@ -113,15 +113,15 @@ defmodule Supavisor.ClientHandler.ProtocolHelpers do
@doc """
Normalizes application name from client connection.

Returns sanitized string or default "Supavisor" for invalid names.
Returns sanitized string or default "" for missing/invalid names.
"""
@spec normalize_app_name(any()) :: String.t()
def normalize_app_name(name) when is_binary(name), do: name
def normalize_app_name(nil), do: "Supavisor"
def normalize_app_name(nil), do: ""

def normalize_app_name(name) do
Logger.debug("ClientHandler: Invalid application name #{inspect(name)}")
"Supavisor"
""
end

@doc """
Expand Down
14 changes: 11 additions & 3 deletions lib/supavisor/db_handler.ex
Original file line number Diff line number Diff line change
Expand Up @@ -166,15 +166,23 @@ defmodule Supavisor.DbHandler do
%{} -> {args.id, Supavisor.Manager.get_config(args.id)}
end

proxy = Map.get(config, :proxy, false)

Helpers.set_log_level(config.log_level)
Helpers.set_max_heap_size(90)

Logger.metadata(project: config.tenant, user: config.user, mode: config.mode)

conn_params =
if proxy do
config.connection_params
else
%ConnectionParameters{config.connection_params | application_name: "Supavisor"}
end

data = %{
id: id,
sock: nil,
connection_params: config.connection_params,
connection_params: conn_params,
user: config.user,
tenant: config.tenant,
tenant_feature_flags: config.tenant_feature_flags,
Expand All @@ -184,7 +192,7 @@ defmodule Supavisor.DbHandler do
server_proof: nil,
stats: %{},
prepared_statements: MapSet.new(),
proxy: Map.get(config, :proxy, false),
proxy: proxy,
client_tls: Map.get(config, :client_tls),
client_jit: Map.get(config, :client_jit),
stream_state: MessageStreamer.new_stream_state(BackendMessageHandler),
Expand Down
77 changes: 47 additions & 30 deletions lib/supavisor/monitoring/tenant.ex
Original file line number Diff line number Diff line change
Expand Up @@ -248,28 +248,35 @@ defmodule Supavisor.PromEx.Plugins.Tenant do
event_name: [:supavisor, :connections],
description: "The total count of active clients for a tenant.",
measurement: :active,
tags: @tags
tags: @tags ++ [:app_name]
)
]
)
end

def execute_tenant_metrics do
Registry.select(Supavisor.Registry.TenantClients, [{{:"$1", :_, :_}, [], [:"$1"]}])
|> Enum.frequencies_by(&Supavisor.id(&1, upstream_tls: false))
|> Enum.each(&emit_telemetry_for_tenant/1)
Supavisor.Registry.TenantClients
|> Registry.select([{{:"$1", :_, :"$2"}, [], [{{:"$1", :"$2"}}]}])
|> Enum.frequencies_by(fn {id, meta} ->
{Supavisor.id(id, upstream_tls: false), meta[:app_name] || ""}
end)
|> Enum.each(fn {{id, app_name}, count} ->
emit_telemetry_for_tenant(id, count, app_name)
end)
end

@spec emit_telemetry_for_tenant({S.id(), non_neg_integer()}) :: :ok
@spec emit_telemetry_for_tenant(S.id(), non_neg_integer(), String.t()) :: :ok
def emit_telemetry_for_tenant(
{Supavisor.id(
type: type,
tenant: tenant,
user: user,
mode: mode,
db: db_name,
search_path: search_path
), count}
Supavisor.id(
type: type,
tenant: tenant,
user: user,
mode: mode,
db: db_name,
search_path: search_path
),
count,
app_name
) do
:telemetry.execute(
[:supavisor, :connections],
Expand All @@ -280,7 +287,8 @@ defmodule Supavisor.PromEx.Plugins.Tenant do
mode: mode,
type: type,
db_name: db_name,
search_path: search_path
search_path: search_path,
app_name: app_name
}
)
end
Expand All @@ -296,7 +304,7 @@ defmodule Supavisor.PromEx.Plugins.Tenant do
event_name: [:supavisor, :client, :connection, :lifetime],
measurement: :lifetime,
description: "How long the client connection has been alive.",
tags: @tags,
tags: @tags ++ [:app_name],
unit: {:native, :millisecond},
reporter_options: [
peep_bucket_calculator: ClientConnectionLifetimeBuckets
Expand Down Expand Up @@ -342,7 +350,8 @@ defmodule Supavisor.PromEx.Plugins.Tenant do
mode: mode,
type: type,
db_name: db_name,
search_path: search_path
search_path: search_path,
app_name: meta[:app_name] || ""
}
)
end
Expand All @@ -359,28 +368,35 @@ defmodule Supavisor.PromEx.Plugins.Tenant do
event_name: [:supavisor, :proxy, :connections],
description: "The total count of active proxy clients for a tenant.",
measurement: :active,
tags: @tags
tags: @tags ++ [:app_name]
)
]
)
end

def execute_tenant_proxy_metrics do
Registry.select(Supavisor.Registry.TenantProxyClients, [{{:"$1", :_, :_}, [], [:"$1"]}])
|> Enum.frequencies_by(&Supavisor.id(&1, upstream_tls: false))
|> Enum.each(&emit_proxy_telemetry_for_tenant/1)
Supavisor.Registry.TenantProxyClients
|> Registry.select([{{:"$1", :_, :"$2"}, [], [{{:"$1", :"$2"}}]}])
|> Enum.frequencies_by(fn {id, meta} ->
{Supavisor.id(id, upstream_tls: false), meta[:app_name] || ""}
end)
|> Enum.each(fn {{id, app_name}, count} ->
emit_proxy_telemetry_for_tenant(id, count, app_name)
end)
end

@spec emit_proxy_telemetry_for_tenant({S.id(), non_neg_integer()}) :: :ok
@spec emit_proxy_telemetry_for_tenant(S.id(), non_neg_integer(), String.t()) :: :ok
def emit_proxy_telemetry_for_tenant(
{Supavisor.id(
type: type,
tenant: tenant,
user: user,
mode: mode,
db: db_name,
search_path: search_path
), count}
Supavisor.id(
type: type,
tenant: tenant,
user: user,
mode: mode,
db: db_name,
search_path: search_path
),
count,
app_name
) do
:telemetry.execute(
[:supavisor, :proxy, :connections],
Expand All @@ -391,7 +407,8 @@ defmodule Supavisor.PromEx.Plugins.Tenant do
mode: mode,
type: type,
db_name: db_name,
search_path: search_path
search_path: search_path,
app_name: app_name
}
)
end
Expand Down
Loading
Loading