Packages
electric
0.6.2
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.16
1.4.16-beta-1
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
retired
1.1.5
retired
1.1.4
retired
1.1.3
retired
1.1.2
1.1.1
1.1.0
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.15
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-beta.23
1.0.0-beta.22
1.0.0-beta.20
1.0.0-beta.19
1.0.0-beta.18
1.0.0-beta.17
1.0.0-beta.16
1.0.0-beta.15
1.0.0-beta.14
1.0.0-beta.13
1.0.0-beta.12
1.0.0-beta.11
1.0.0-beta.10
1.0.0-beta.9
1.0.0-beta.8
1.0.0-beta.7
1.0.0-beta.6
1.0.0-beta.5
1.0.0-beta.4
1.0.0-beta.3
1.0.0-beta.2
1.0.0-beta.1
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.5.2
0.4.4
Postgres sync engine. Sync little subsets of your Postgres data into local apps and services.
Current section
Files
Jump to
Current section
Files
lib/electric/telemetry.ex
defmodule Electric.Telemetry do
use Supervisor
import Telemetry.Metrics
def start_link(init_arg) do
Supervisor.start_link(__MODULE__, init_arg, name: __MODULE__)
end
def init(_) do
children = [
{:telemetry_poller, measurements: periodic_measurements(), period: 2_000}
]
children
|> add_statsd_reporter(Application.fetch_env!(:electric, :telemetry_statsd_host))
|> add_prometheus_reporter(Application.fetch_env!(:electric, :prometheus_port))
|> Supervisor.init(strategy: :one_for_one)
end
defp add_statsd_reporter(children, nil), do: children
defp add_statsd_reporter(children, host) do
children ++
[
{TelemetryMetricsStatsd,
host: host,
formatter: :datadog,
global_tags: [instance_id: Electric.instance_id()],
metrics: statsd_metrics()}
]
end
defp add_prometheus_reporter(children, nil), do: children
defp add_prometheus_reporter(children, _) do
children ++ [{TelemetryMetricsPrometheus.Core, metrics: prometheus_metrics()}]
end
defp statsd_metrics() do
[
last_value("vm.memory.total", unit: :byte),
last_value("vm.memory.processes_used", unit: :byte),
last_value("vm.memory.binary", unit: :byte),
last_value("vm.memory.ets", unit: :byte),
last_value("vm.total_run_queue_lengths.total"),
last_value("vm.total_run_queue_lengths.cpu"),
last_value("vm.total_run_queue_lengths.io"),
summary("plug.router_dispatch.stop.duration",
tags: [:route],
unit: {:native, :millisecond}
),
summary("plug.router_dispatch.exception.duration",
tags: [:route],
unit: {:native, :millisecond}
),
summary("electric.shape_cache.create_snapshot_task.stop.duration",
unit: {:native, :millisecond}
),
summary("electric.storage.make_new_snapshot.stop.duration", unit: {:native, :millisecond}),
summary("electric.querying.stream_initial_data.stop.duration",
unit: {:native, :millisecond}
)
]
|> Enum.map(&%{&1 | tags: [:instance_id | &1.tags]})
end
defp prometheus_metrics() do
[
last_value("vm.memory.total", unit: :byte),
last_value("vm.memory.processes_used", unit: :byte),
last_value("vm.memory.binary", unit: :byte),
last_value("vm.memory.ets", unit: :byte),
last_value("vm.total_run_queue_lengths.total"),
last_value("vm.total_run_queue_lengths.cpu"),
last_value("vm.total_run_queue_lengths.io")
# distribution("plug.router_dispatch.stop.duration",
# tags: [:route],
# unit: {:native, :millisecond}
# ),
# distribution("plug.router_dispatch.exception.duration",
# tags: [:route],
# unit: {:native, :millisecond}
# ),
# distribution("electric.query.duration", unit: {:native, :millisecond}),
# distribution("electric.query.serialization_duration", unit: {:native, :millisecond}),
# distribution("electric.snapshot.storage", unit: {:native, :millisecond}),
# distribution("electric.snapshot.encoding", unit: {:native, :millisecond})
]
end
defp periodic_measurements do
[
# A module, function and arguments to be invoked periodically.
{__MODULE__, :uptime_event, []}
]
end
def uptime_event do
:telemetry.execute([:vm, :uptime], %{
total: :erlang.monotonic_time() - :erlang.system_info(:start_time)
})
end
end