Packages
mist
4.0.4
6.0.3
6.0.2
6.0.1
6.0.0
5.0.4
5.0.3
5.0.2
5.0.1
5.0.0
5.0.0-rc1
4.0.7
4.0.6
4.0.5
4.0.4
4.0.3
4.0.2
4.0.1
4.0.0
3.0.0
2.0.0
1.2.0
1.1.0
1.0.0
1.0.0-rc3
1.0.0-rc2
1.0.0-rc1
0.17.0
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.2
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.3
0.8.2
0.8.1
0.8.0
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.3
a misty Gleam web server
Current section
Files
Jump to
Current section
Files
src/mist/internal/telemetry.gleam
import gleam/dict.{type Dict}
import gleam/dynamic.{type Dynamic}
import gleam/erlang/atom.{type Atom}
import gleam/int
import gleam/result
import gleam/string
import logging
pub type Event {
Start
Stop
Mist
ParseRequest
ParseRequest2
DecodePacket
ConvertPath
ParseMethod
ParseHeaders
ParseRest
ParsePath
ParseTransport
ParseHost
ParsePort
BuildRequest
ReadData
Http1Handler
HttpUpgrade
Http2Handler
}
pub const events = [
[Mist, ParseRequest, Stop], [Mist, ParseRequest2, Stop],
[Mist, Http1Handler, Stop], [Mist, HttpUpgrade, Stop],
[Mist, Http2Handler, Stop], [Mist, DecodePacket, Stop],
[Mist, ConvertPath, Stop], [Mist, ParseMethod, Stop],
[Mist, ParseHeaders, Stop], [Mist, ParseRest, Stop], [Mist, ParsePath, Stop],
[Mist, ParseTransport, Stop], [Mist, ParseHost, Stop], [Mist, ParsePort, Stop],
[Mist, BuildRequest, Stop], [Mist, ReadData, Stop],
]
type TimeUnit {
Native
Microsecond
}
@external(erlang, "erlang", "convert_time_unit")
fn convert_time_unit(
time: Int,
from from_unit: TimeUnit,
to to_unit: TimeUnit,
) -> Int
pub fn log(
path: List(Event),
measurements: Dict(Atom, Dynamic),
_metadata: Dict(String, Dynamic),
_config: List(config),
) -> Nil {
let duration_string =
dict.get(measurements, atom.create_from_string("duration"))
|> result.then(fn(val) { result.replace_error(dynamic.int(val), Nil) })
|> result.map(convert_time_unit(_, Native, Microsecond))
|> result.map(fn(time) { " duration: " <> int.to_string(time) <> "μs, " })
|> result.unwrap("")
logging.log(logging.Debug, string.inspect(path) <> duration_string)
// <> " metadata: "
// <> string.inspect(metadata),
}
pub fn span(
path: List(Event),
metadata: Dict(String, Dynamic),
wrapping: fn() -> return,
) -> return {
use <- do_span(path, metadata)
let res = wrapping()
#(res, dict.new())
}
@external(erlang, "telemetry", "span")
fn do_span(
path: List(Event),
metadata: Dict(String, Dynamic),
wrapping: fn() -> #(return, Dict(String, Dynamic)),
) -> return
pub fn attach_many(
id: String,
path: List(List(Event)),
handler: fn(
List(Event),
Dict(Atom, Dynamic),
Dict(String, Dynamic),
List(config),
) ->
Nil,
) -> Nil {
do_attach_many(id, path, handler, Nil)
}
@external(erlang, "telemetry", "attach_many")
fn do_attach_many(
id: String,
path: List(List(Event)),
handler: fn(
List(Event),
Dict(Atom, Dynamic),
Dict(String, Dynamic),
List(config),
) ->
Nil,
config: Nil,
) -> Nil
@external(erlang, "telemetry", "attach")
pub fn attach(
id: String,
event: List(Event),
handler: fn(
List(Event),
Dict(Atom, Dynamic),
Dict(String, Dynamic),
List(config),
) ->
Nil,
config: Nil,
) -> Nil
pub fn configure_logger() {
attach_many("mist-logger", events, log)
}