Skip to content

Commit

Permalink
chore: Enhance indexer memory metrics (#9984)
Browse files Browse the repository at this point in the history
  • Loading branch information
Qwerty5Uiop committed Apr 30, 2024
1 parent 1147280 commit f2d7bd4
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
32 changes: 32 additions & 0 deletions apps/indexer/lib/indexer/memory/monitor.ex
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ defmodule Indexer.Memory.Monitor do
import Indexer.Logger, only: [process: 1]

alias Indexer.Memory.Shrinkable
alias Indexer.Prometheus.Instrumenter

defstruct limit: 0,
timer_interval: :timer.minutes(1),
Expand Down Expand Up @@ -68,6 +69,8 @@ defmodule Indexer.Memory.Monitor do
def handle_info(:check, state) do
total = :erlang.memory(:total)

set_metrics(state)

shrunk_state =
if memory_limit() < total do
log_memory(%{limit: memory_limit(), total: total})
Expand Down Expand Up @@ -202,6 +205,35 @@ defmodule Indexer.Memory.Monitor do
end)
end

@megabytes_divisor 2 ** 20
defp set_metrics(%__MODULE__{shrinkable_set: shrinkable_set}) do
total_memory =
Enum.reduce(shrinkable_set, 0, fn pid, acc ->
memory = memory(pid) / @megabytes_divisor
name = name(pid)

Instrumenter.set_memory_consumed(name, memory)

acc + memory
end)

Instrumenter.set_memory_consumed(:total, total_memory)
end

defp name(pid) do
case Process.info(pid, :registered_name) do
{:registered_name, name} when is_atom(name) ->
name
|> to_string()
|> String.split(".")
|> Enum.slice(-2, 2)
|> Enum.join(".")

_ ->
nil
end
end

defp shrinkable_memory_pairs(%__MODULE__{shrinkable_set: shrinkable_set}) do
shrinkable_set
|> Enum.map(fn pid -> {pid, memory(pid)} end)
Expand Down
6 changes: 6 additions & 0 deletions apps/indexer/lib/indexer/prometheus/instrumenter.ex
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ defmodule Indexer.Prometheus.Instrumenter do

@counter [name: :import_errors_count, help: "Number of database import errors"]

@gauge [name: :memory_consumed, labels: [:fetcher], help: "Amount of memory consumed by fetchers (MB)"]

def block_full_process(time, fetcher) do
Histogram.observe([name: :block_full_processing_duration_microseconds, labels: [fetcher]], time)
end
Expand All @@ -58,4 +60,8 @@ defmodule Indexer.Prometheus.Instrumenter do
def import_errors(error_count \\ 1) do
Counter.inc([name: :import_errors_count], error_count)
end

def set_memory_consumed(fetcher, memory) do
Gauge.set([name: :memory_consumed, labels: [fetcher]], memory)
end
end

0 comments on commit f2d7bd4

Please sign in to comment.