Files
ubicloud/views/postgres/overview.erb
Burak Yucesoy 22830ec69f Show AZ in in UI for AWS VMs for PG
This gives more information to our users so that they can strategically place
their application VMs in the same AZ as their PG VMs to reduce latency.
2025-07-04 14:59:44 +03:00

90 lines
3.7 KiB
Plaintext

<%
vm = @pg.representative_server.vm
%>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 p-6 database-overview">
<%
# There is a brief period after creation when the representative server does not have
# volumes attachet yet, so we take the storage size from the resource.
storage_size_gib = @pg.representative_server.storage_size_gib || @pg.target_storage_size_gib
vmr = VictoriaMetricsResource.first(project_id: @pg.representative_server.metrics_config[:project_id])
if vmr
tsdb_client = vmr.servers.first.client
query = Metrics::POSTGRES_METRICS[:disk_usage].series[0].query.gsub("$ubicloud_resource_id", @pg.ubid)
disk_usage = begin
tsdb_client.query_range(query:, start_ts: Time.now.to_i - 60 * 60, end_ts: Time.now.to_i)[0]
rescue Excon::Error::Socket => e
Clog.emit("Failed to fetch disk usage for #{@pg.ubid} from VictoriaMetrics") { Util.exception_to_hash(e) }
end
# There is a brief period after creation when the representative server does not have
# volumes attachet yet, so we take the storage size from the resource.
storage_size_gib = @pg.representative_server.storage_size_gib || @pg.target_storage_size_gib
disk_usage_subtext = if disk_usage
disk_usage_percentage = disk_usage["values"].last[1].to_f
disk_usage_gib = disk_usage_percentage * storage_size_gib / 100
subtext = "#{disk_usage_gib.round(2)} GB is used (#{disk_usage_percentage.round(2)}%)"
if disk_usage_percentage > 80
subtext = "<span class='text-red-600'>#{subtext}</span>"
end
subtext
end
end
ha_option = Option::POSTGRES_HA_OPTIONS[@pg.ha_type]
location_details, provider = if vm.aws_instance
[vm.aws_instance.az_id, "AWS"]
else
[@pg.location.ui_name, @pg.location.provider.capitalize]
end
[
["hero-cpu-chip", vm.display_size, "#{vm.vcpus} vCPU, #{vm.memory_gib} GB RAM"],
["hero-circle-stack", "#{storage_size_gib} GB", disk_usage_subtext],
["hero-square-2-stack-modified", ha_option.description, ""],
["hero-map-pin", @pg.location.display_name, "#{location_details} (#{provider})"],
["postgres-logo", "Version #{@pg.version}", ""],
].each do |icon, text, subtext|
%>
<%== part("components/icon_with_text", icon:, text:, subtext:) %>
<%
end
%>
</div>
<% @enable_echarts = true %>
<div id="metrics-container" class="p-6" data-metrics-url="<%= "#{@project_data[:path]}#{@pg.path}" %>">
<div class="md:flex md:items-center md:justify-between pb-2 lg:pb-4">
<div class="min-w-0 flex-1">
<h3 class="text-2xl font-bold leading-7 text-gray-900 sm:truncate sm:text-2xl sm:tracking-tight">Metrics Summary</h3>
</div>
</div>
<% if @pg.display_state != "creating" %>
<div class="grid grid-cols-1 xl:grid-cols-2 gap-4 border-t-0">
<% Metrics::POSTGRES_METRICS.slice(:cpu_usage, :disk_usage).each do |key, metric| %>
<div class="p-4 bg-gray-50 rounded-lg border border-gray-100">
<h4 class="text-sm font-medium text-gray-900 mb-2"><%= metric.name %></h4>
<p class="text-xs text-gray-500 mt-2"><%= metric.description %></p>
<div
class="metric-chart h-64 w-full"
id="<%= key %>-chart"
data-metric-key="<%= key %>"
data-metric-unit="<%= metric.unit %>"
>
</div>
</div>
<% end %>
</div>
<% else %>
<div class="flex flex-col items-center justify-center h-full">
<h2 class="text-2xl font-semibold text-gray-900">No metrics available</h2>
<p class="text-gray-500 mt-2">Metrics will be available once the database is running.</p>
</div>
<% end %>
</div>