openmetrics-parser 0.4.4

An OpenMetrics/Prometheus Text Exposition Format Parser
Documentation
sign = _{ "+" | "-" }
backslash = _{ "\\" }
dquote = _{ "\"" }
eq = _{ "=" }
comma = _{ "," }
hash = _{ "#" }
sp = _{ " " }
msp = _{ (sp)+ }

kw_type = { "TYPE" }
kw_help = { "HELP" }
kw_unit = { "UNIT" }
kw_eof = { "EOF" }
kw_counter = { "counter" }
kw_gauge = { "gauge" }
kw_histogram = { "histogram" }
kw_gaugehistogram = { "gaugehistogram" }
kw_statefulset = { "stateset" }
kw_info = { "info" }
kw_summary = { "summary" }
kw_unknown = { "unknown" }

exposition = ${ metricset ~ hash ~ sp ~ kw_eof ~ NEWLINE? }
metricset = _{ metricfamily+ }
metricfamily = ${ (metricdescriptor* ~ metric+) | (metricdescriptor+ ~ metric*) }

metricdescriptor = ${
                     (hash ~ sp ~ kw_type ~ sp ~ metricname ~ sp ~ metrictype ~ NEWLINE) | 
                     (hash ~ sp ~ kw_help ~ sp ~ metricname ~ sp ~ helpstring ~ NEWLINE) | 
                     (hash ~ sp ~ kw_unit ~ sp ~ metricname ~ (sp ~ metricunit)? ~ NEWLINE)
                   }

metric = _{ sample+ }
metrictype = @{ kw_gaugehistogram | kw_counter | kw_gauge |  kw_histogram | kw_statefulset | kw_info | kw_summary | kw_unknown }
metricunit = { metricname_char* }

sample = ${ metricname ~ labels? ~ sp ~ number ~ (sp ~ timestamp)? ~ exemplar? ~ NEWLINE }
exemplar = ${ sp ~ hash ~ sp ~ labels ~ sp ~ number ~ (sp ~ timestamp)? }
labels = { "{" ~ (label ~ (comma ~ label)*)? ~ "}" }
label = { labelname ~ eq ~ dquote ~ escapedstring ~ dquote }

number = @{ realnumber | sign ~ (^"inf" | ^"infinity") | ^"nan" }
timestamp = @{ realnumber }
realnumber = @{ sign? ~ ASCII_DIGIT+ ~ ("." ~ ASCII_DIGIT*)? ~ ("e" ~ sign? ~ ASCII_DIGIT+)? | sign? ~ ASCII_DIGIT+ }

metricname = @{ metricname_initialchar ~ metricname_char* }
metricname_char = _{ metricname_initialchar | ASCII_DIGIT }
metricname_initialchar = _{ ASCII_ALPHA | "_" | ":" }

labelname = @{ labelname_initialchar ~ labelname_char* }
labelname_char = _{ labelname_initialchar | ASCII_DIGIT }
labelname_initialchar = _{ ASCII_ALPHA | "_" }

helpstring = { helpchar* }
helpchar = _{ !("\n") ~ ANY }
escapedstring = { escapedchar* }
escapedchar = _{normalchar | (backslash ~ (backslash | "n" | dquote)?)}
normalchar = _{ !(NEWLINE | backslash | dquote) ~ ANY }