Skip to content

Commit 2e2854d

Browse files
committed
Code for step 8
1 parent ddda199 commit 2e2854d

6 files changed

Lines changed: 53 additions & 2 deletions

File tree

lib/elixir_monitoring_prom/application.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ defmodule ElixirMonitoringProm.Application do
2323
nil
2424
)
2525

26+
ElixirMonitoringProm.Metrics.setup()
27+
2628
# List all child processes to be supervised
2729
children = [
2830
# Start the Ecto repository

lib/elixir_monitoring_prom/zip_codes/zip_codes.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
defmodule ElixirMonitoringProm.ZipCodes do
22
alias ElixirMonitoringProm.{Repo, ZipCodes.ZipCode}
33

4+
import Ecto.Query
5+
46
def get_zip_codes_in_radius(zip_code, radius_in_miles) do
57
# Our raw Postgres query to get all the zip codes within a radius
68
query =
@@ -30,5 +32,9 @@ defmodule ElixirMonitoringProm.ZipCodes do
3032
end
3133
end
3234

35+
def get_zip_code_info(zip) do
36+
Repo.one(from zip_code in ZipCode, where: zip_code.zip_code == ^zip)
37+
end
38+
3339
defp miles_to_meters(miles), do: miles * 1609.344
3440
end

lib/elixir_monitoring_prom_web/controllers/brewery_controller.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
defmodule ElixirMonitoringPromWeb.BreweryController do
22
use ElixirMonitoringPromWeb, :controller
33

4-
alias ElixirMonitoringProm.Breweries
4+
alias ElixirMonitoringProm.{Breweries, Metrics}
55

66
def index(conn, %{"zip_code" => zip_code, "mile_radius" => radius}) do
77
results = Breweries.get_breweries_in_radius(zip_code, String.to_integer(radius))
8+
Metrics.increment_zip_code_search(zip_code)
9+
Metrics.observe_radius_search(radius)
810

911
json(conn, results)
1012
end

lib/metrics.ex

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
defmodule ElixirMonitoringProm.Metrics do
2+
use Prometheus.Metric
3+
4+
alias ElixirMonitoringProm.{ZipCode, ZipCodes.ZipCode}
5+
6+
def setup do
7+
# Our counter for the number of searches against a particular zipcode.
8+
# Given that there is a label 'geohash' each zip code gets its own counter.
9+
Counter.new(
10+
name: :elixir_app_zip_code_search,
11+
help: "Counter for brewery zip code searches",
12+
labels: [:zip_code, :geohash]
13+
)
14+
15+
# The provided radius will fall into one of the defined buckets
16+
Histogram.new(
17+
name: :elixir_app_radius_search,
18+
buckets: [1, 2, 5, 10, 20, 50],
19+
help: "The radius that people are searching within for breweries"
20+
)
21+
end
22+
23+
def increment_zip_code_search(zip_code) do
24+
zip_code
25+
|> ElixirMonitoringProm.ZipCodes.get_zip_code_info()
26+
|> case do
27+
%ZipCode{point: %Geo.Point{coordinates: {long, lat}}} ->
28+
geo_hash = Geohash.encode(lat, long)
29+
Counter.inc(name: :elixir_app_zip_code_search, labels: [zip_code, geo_hash])
30+
31+
_ ->
32+
:noop
33+
end
34+
end
35+
36+
def observe_radius_search(radius) do
37+
Histogram.observe([name: :elixir_app_radius_search], String.to_integer(radius))
38+
end
39+
end

mix.exs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ defmodule ElixirMonitoringProm.MixProject do
5151
{:prometheus_ecto, "~> 1.4.3"},
5252
{:prometheus_phoenix, "~> 1.3.0"},
5353
{:prometheus_plugs, "~> 1.1.5"},
54-
{:prometheus_process_collector, "~> 1.4.3"}
54+
{:prometheus_process_collector, "~> 1.4.3"},
55+
{:geohash, "~> 1.0.0"}
5556
]
5657
end
5758

mix.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"file_system": {:hex, :file_system, "0.2.7", "e6f7f155970975789f26e77b8b8d8ab084c59844d8ecfaf58cbda31c494d14aa", [:mix], [], "hexpm"},
1212
"geo": {:hex, :geo, "3.1.0", "727e005262430d037e870ff364e65d80ca5ca21d5ac8eddd57a1ada72c3f83b0", [:mix], [], "hexpm"},
1313
"geo_postgis": {:hex, :geo_postgis, "3.1.0", "d06c8fa5fd140a52a5c9dab4ad6623a696dd7d99dd791bb361d3f94942442ff9", [:mix], [{:geo, "~> 3.1", [hex: :geo, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0 or ~> 4.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}], "hexpm"},
14+
"geohash": {:hex, :geohash, "1.0.2", "d02f8c974704105d3c6cc7e722647319aa601c86169693710866a550277dc41e", [:mix], [], "hexpm"},
1415
"gettext": {:hex, :gettext, "0.17.0", "abe21542c831887a2b16f4c94556db9c421ab301aee417b7c4fbde7fbdbe01ec", [:mix], [], "hexpm"},
1516
"jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"},
1617
"mime": {:hex, :mime, "1.3.1", "30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8", [:mix], [], "hexpm"},

0 commit comments

Comments
 (0)