Skip to content

Commit 44d2ea7

Browse files
authored
Merge pull request #379 from robur-coop/metrics
Re-add dns-cache LRU metrics (weight, capacity)
2 parents 59146ac + 8fd645c commit 44d2ea7

File tree

5 files changed

+47
-24
lines changed

5 files changed

+47
-24
lines changed

cache/dns_cache.ml

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,17 @@ let metrics =
130130
| `Drop -> "drops"
131131
| `Insert -> "insertions"
132132
in
133-
let src = Dns.counter_metrics ~f "dns-cache" in
134-
(fun r -> Metrics.add src (fun x -> x) (fun d -> d r))
133+
let incr, get = create_counter ~f in
134+
let data (cache, thing) =
135+
incr thing;
136+
Metrics.Data.v
137+
(Metrics.uint "size" (LRU.size cache) ::
138+
Metrics.uint "weight" (LRU.weight cache) ::
139+
Metrics.uint "capacity" (LRU.capacity cache) ::
140+
get ())
141+
in
142+
let src = Metrics.Src.v ~tags:Metrics.Tags.[] ~data "dns-cache" in
143+
(fun cache r -> Metrics.add src (fun x -> x) (fun d -> d (cache, r)))
135144

136145
let empty = LRU.empty
137146

@@ -196,13 +205,13 @@ let update_ttl typ entry ~created ~now =
196205
if updated_ttl < 0l then Error `Cache_drop else Ok (with_ttl typ updated_ttl entry)
197206

198207
let get cache ts name query_type =
199-
metrics `Lookup;
208+
metrics cache `Lookup;
200209
match snd (find cache name query_type) with
201-
| Error e -> metrics `Miss; cache, Error e
210+
| Error e -> metrics cache `Miss; cache, Error e
202211
| Ok ((created, rank), entry) ->
203212
match update_ttl query_type entry ~created ~now:ts with
204-
| Ok entry' -> metrics `Hit; LRU.promote name cache, Ok (entry', rank)
205-
| Error e -> metrics `Drop; cache, Error e
213+
| Ok entry' -> metrics cache `Hit; LRU.promote name cache, Ok (entry', rank)
214+
| Error e -> metrics cache `Drop; cache, Error e
206215

207216
let find_any cache name =
208217
match LRU.find name cache with
@@ -211,9 +220,9 @@ let find_any cache name =
211220
| Some Rr_map rrs -> Ok (`Entries rrs)
212221

213222
let get_any cache ts name =
214-
metrics `Lookup;
223+
metrics cache `Lookup;
215224
match find_any cache name with
216-
| Error e -> metrics `Miss; cache, Error e
225+
| Error e -> metrics cache `Miss; cache, Error e
217226
| Ok r ->
218227
let ttl created curr =
219228
let ttl = compute_updated_ttl ~created ~now:ts curr in
@@ -223,9 +232,9 @@ let get_any cache ts name =
223232
match r with
224233
| `No_domain ((created, rank), name, soa) ->
225234
begin match ttl created soa.Soa.minimum with
226-
| Error _ as e -> metrics `Drop; e
235+
| Error _ as e -> metrics cache `Drop; e
227236
| Ok minimum ->
228-
metrics `Hit;
237+
metrics cache `Hit;
229238
Ok (`No_domain (name, { soa with Soa.minimum }), rank)
230239
end
231240
| `Entries rrs ->
@@ -242,20 +251,20 @@ let get_any cache ts name =
242251
| _ -> acc, r) rrs (Rr_map.empty, Additional)
243252
in
244253
match Rr_map.is_empty rrs with
245-
| true -> metrics `Drop; Error `Cache_drop
246-
| false -> metrics `Hit; Ok (`Entries rrs, r)
254+
| true -> metrics cache `Drop; Error `Cache_drop
255+
| false -> metrics cache `Hit; Ok (`Entries rrs, r)
247256

248257
let get_or_cname : type a . t -> int64 -> [`raw] Domain_name.t -> a Rr_map.key ->
249258
t * ([ a entry | `Alias of int32 * [`raw] Domain_name.t] * rank,
250259
[ `Cache_drop | `Cache_miss ]) result =
251260
fun cache ts name query_type ->
252-
metrics `Lookup;
261+
metrics cache `Lookup;
253262
let map_result : _ -> t * ([ a entry | `Alias of int32 * [`raw] Domain_name.t] * rank, [ `Cache_drop | `Cache_miss ]) result = function
254-
| Error e -> metrics `Miss; cache, Error e
263+
| Error e -> metrics cache `Miss; cache, Error e
255264
| Ok ((created, rank), entry) ->
256265
match update_ttl query_type entry ~created ~now:ts with
257-
| Ok entry' -> metrics `Hit; LRU.promote name cache, Ok ((entry', rank) :> [ _ entry | `Alias of int32 * [`raw] Domain_name.t ] * rank)
258-
| Error e -> metrics `Drop; cache, Error e
266+
| Ok entry' -> metrics cache `Hit; LRU.promote name cache, Ok ((entry', rank) :> [ _ entry | `Alias of int32 * [`raw] Domain_name.t ] * rank)
267+
| Error e -> metrics cache `Drop; cache, Error e
259268
in
260269
match find cache name query_type with
261270
| Some map, r ->
@@ -265,15 +274,15 @@ let get_or_cname : type a . t -> int64 -> [`raw] Domain_name.t -> a Rr_map.key -
265274
if ttl < 0l then
266275
map_result r
267276
else begin
268-
metrics `Hit;
277+
metrics cache `Hit;
269278
LRU.promote name cache, Ok (`Alias (ttl, name), rank)
270279
end
271280
| _ -> map_result r
272281
end
273282
| _, e -> map_result e
274283

275284
let get_nsec3 cache ts name =
276-
metrics `Lookup;
285+
metrics cache `Lookup;
277286
let zone_labels = Domain_name.count_labels name in
278287
let nsec3_rrs =
279288
LRU.fold (fun ename entry acc ->
@@ -300,10 +309,10 @@ let get_nsec3 cache ts name =
300309
in
301310
match nsec3_rrs with
302311
| [] ->
303-
metrics `Miss;
312+
metrics cache `Miss;
304313
cache, Error `Cache_miss
305314
| xs ->
306-
metrics `Hit;
315+
metrics cache `Hit;
307316
List.fold_right LRU.promote (List.map (fun (a, _, _, _) -> a) xs) cache,
308317
Ok xs
309318

@@ -347,13 +356,13 @@ let set cache ts name query_type rank entry =
347356
| map, Error _ ->
348357
Log.debug (fun m -> m "set: %a nothing found, adding: %a"
349358
pp_query (name, `K (K query_type)) (pp_entry query_type) entry');
350-
metrics `Insert; cache' map
359+
metrics cache `Insert; cache' map
351360
| map, Ok ((created, rank'), entry) ->
352361
Log.debug (fun m -> m "set: %a found rank %a insert rank %a: %d"
353362
pp_query (name, `K (K query_type)) pp_rank rank' pp_rank rank (compare_rank rank' rank));
354363
match update_ttl query_type entry ~created ~now:ts, compare_rank rank' rank with
355364
| Ok _, 1 -> cache
356-
| _ -> metrics `Insert; cache' map
365+
| _ -> metrics cache `Insert; cache' map
357366

358367
let remove cache name =
359368
LRU.remove name cache

dns-cli.opam

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ depends: [
3434
"ipaddr" {>= "4.0.0"}
3535
"lwt" {>= "4.0.0"}
3636
"randomconv" {>= "0.2.0"}
37+
"metrics" {>= "0.2.0"}
3738
"alcotest" {with-test}
3839
]
3940

resolver/dns_resolver.ml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,15 @@ let resolver_stats =
1212
let src = Dns.counter_metrics ~f "dns-resolver" in
1313
(fun r -> Metrics.add src (fun x -> x) (fun d -> d r))
1414

15+
let response_metric =
16+
let store = ref (0L, 0L) in
17+
let data dp =
18+
store := (Int64.succ (fst !store), Int64.add dp (snd !store));
19+
Metrics.Data.v [ Metrics.uint "mean response" (Duration.to_ms (Int64.div (snd !store) (fst !store))) ]
20+
in
21+
let src = Metrics.Src.v ~tags:Metrics.Tags.[] ~data "dns-resolver-timings" in
22+
(fun dp -> Metrics.add src (fun x -> x) (fun d -> d dp))
23+
1524
type key = [ `raw ] Domain_name.t * Packet.Question.qtype
1625

1726
let pp_key = Dns_resolver_cache.pp_question
@@ -217,6 +226,7 @@ let handle_query ?(retry = 0) t ts awaiting =
217226
Log.debug (fun m -> m "answering %a after %a %d out packets: %a"
218227
pp_key awaiting.question Duration.pp time awaiting.retry
219228
Packet.pp packet) ;
229+
response_metric time;
220230
let cs, _ = Packet.encode ?max_size awaiting.proto packet in
221231
let ttl = Packet.minimum_ttl (answer :> Packet.data) in
222232
`Answer (ttl, cs), t
@@ -491,6 +501,7 @@ let handle_delegation t ts proto sender sport req (delegation, add_data) =
491501
let packet = Packet.create ?edns ?additional (fst req.header, flags) req.question (reply :> Packet.data) in
492502
let ttl = Packet.minimum_ttl (reply :> Packet.data) in
493503
let pkt, _ = Packet.encode ?max_size proto packet in
504+
response_metric 0L;
494505
t, [ proto, sender, sport, ttl, pkt ], []
495506
(* send it out! we've a cache hit here! *)
496507
end
@@ -542,6 +553,7 @@ let handle_buf t now ts query_allowed proto sender sport buf =
542553
begin
543554
match handle_primary t.primary now ts proto sender sport res req buf with
544555
| `Reply (primary, ttl, pkt) ->
556+
response_metric 0L;
545557
Log.debug (fun m -> m "handled primary %a:%d" Ipaddr.pp sender sport) ;
546558
{ t with primary }, [ proto, sender, sport, ttl, pkt ], []
547559
| `Delegation dele ->

src/dns.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5910,7 +5910,7 @@ module Tsig_op = struct
59105910
let no_sign ?mac:_ ?max_size:_ _ _ ~key:_ _ _ = None
59115911
end
59125912

5913-
let create ~f =
5913+
let create_counter ~f =
59145914
let data : (string, int) Hashtbl.t = Hashtbl.create 7 in
59155915
(fun x ->
59165916
let key = f x in
@@ -5922,6 +5922,6 @@ let create ~f =
59225922
let counter_metrics ~f name =
59235923
let open Metrics in
59245924
let doc = "Counter metrics" in
5925-
let incr, get = create ~f in
5925+
let incr, get = create_counter ~f in
59265926
let data thing = incr thing; Data.v (get ()) in
59275927
Src.v ~doc ~tags:Metrics.Tags.[] ~data name

src/dns.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,5 +1459,6 @@ module Tsig_op : sig
14591459
end
14601460

14611461
(**/**)
1462+
val create_counter : f:('a -> string) -> ('a -> unit) * (unit -> Metrics.field list)
14621463
val counter_metrics : f:('a -> string) ->
14631464
string -> (Metrics.field list, 'a -> Metrics.Data.t) Metrics.src

0 commit comments

Comments
 (0)