@@ -419,6 +419,11 @@ sample = value [SP timestamp] [SP start-timestamp] *exemplar LF
419419
420420value = number / "{" composite-value "}"
421421
422+ timestamp = realnumber
423+
424+ ; Lowercase st @ timestamp
425+ start-timestamp = %d115.116 "@" timestamp
426+
422427exemplar = SP HASH SP labels-in-braces SP number SP timestamp
423428
424429metricname-and-labels = metricname [labels-in-braces] / name-and-labels-in-braces
@@ -427,19 +432,25 @@ name-and-labels-in-braces = "{" metricname-utf8 *(COMMA label) "}"
427432
428433label = label-key EQ DQUOTE escaped-string DQUOTE
429434
435+ ; Number value
430436number = realnumber
431437; Case insensitive
432438number =/ [SIGN] ("inf" / "infinity")
433439number =/ "nan"
434440
435- timestamp = realnumber
436-
437- ; Not 100% sure this captures all float corner cases.
441+ ; Real floats
442+ ; Not 100% sure this captures all float corner cases
438443; Leading 0s explicitly okay
439444realnumber = [SIGN] 1*DIGIT
440445realnumber =/ [SIGN] 1*DIGIT ["." *DIGIT] [ "e" [SIGN] 1*DIGIT ]
441446realnumber =/ [SIGN] *DIGIT "." 1*DIGIT [ "e" [SIGN] 1*DIGIT ]
442447
448+ ; Integers
449+ ; Leading 0s explicitly okay
450+ integer = [SIGN] 1*"0" / [SIGN] positive-integer
451+ non-negative-integer = ["+"] 1*"0" / ["+"] positive-integer
452+ positive-integer = *"0" positive-digit *DIGIT
453+ positive-digit = "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"
443454
444455; RFC 5234 is case insensitive.
445456; Uppercase
@@ -485,9 +496,6 @@ escaped-char =/ BS normal-char
485496; Any unicode character, except newline, double quote, and backslash
486497normal-char = %x00-09 / %x0B-21 / %x23-5B / %x5D-D7FF / %xE000-10FFFF
487498
488- ; Lowercase st @ timestamp
489- start-timestamp = %d115.116 "@" timestamp
490-
491499; Composite values
492500composite-value = histogram-value / summary-value
493501
@@ -500,6 +508,15 @@ h-count = %d99.111.117.110.116 ":" number
500508h-sum = %d115.117.109 ":" number
501509
502510histogram-buckets = classic-buckets / native-buckets [ "," classic-buckets ]
511+
512+ ; bucket:[...,+Inf:v] The +Inf bucket is required.
513+ classic-buckets = %d98.117.99.107.101.116 ":" "[" [ ch-le-counts "," ] ch-pos-inf-bucket "]"
514+ ch-le-counts = (ch-neg-inf-bucket / ch-le-bucket) *("," ch-le-bucket)
515+ ch-pos-inf-bucket = "+" %d73.110.102 ":" number
516+ ch-neg-inf-bucket = "-" %d73.110.102 ":" number
517+ ch-le-bucket = realnumber ":" number
518+
519+ ; schema:3,zero_threshold:1e-128,zero_count:2,negative_spans:[1:1],negative_buckets:[2],positive_spanes:[-3:1,2:2],positive_buckets:[3,1,0]
503520native-buckets = nh-schema "," nh-zero-threshold "," nh-zero-count [ "," nh-negative-spans "," nh-negative-buckets ] [ "," nh-positive-spans "," nh-positive-buckets ]
504521
505522; schema:i
@@ -508,11 +525,11 @@ nh-schema = %d115.99.104.101.109.97 ":" integer
508525nh-zero-threshold = %d122.101.114.111 "_" %d116.104.114.101.115.104.111.108.100 ":" realnumber
509526; zero_count:x
510527nh-zero-count = %d122.101.114.111 "_" %d99.111.117.110.116 ":" number
511- ; negative_spans:[1:2,3:4] and negative_spans:[ ]
528+ ; negative_spans:[1:2,3:4] and positive_spans:[-3:1,2:2 ]
512529nh-negative-spans = %d110.101.103.97.116.105.118.101 "_" %d115.112.97.110.115 ":" "[" [nh-spans] "]"
513530nh-positive-spans = %d112.111.115.105.116.105.118.101 "_" %d115.112.97.110.115 ":" "[" [nh-spans] "]"
514- ; Spans can start from any index, even negative, however subsequent spans
515- ; can only advance the index, not decrease it.
531+ ; Spans hold offset and length. The offset can start from any index, even
532+ ; negative, however subsequent spans can only advance the index, not decrease it.
516533nh-spans = nh-start-span *("," nh-span)
517534nh-start-span = integer ":" positive-integer
518535nh-span = non-negative-integer ":" positive-integer
@@ -523,19 +540,6 @@ nh-positive-buckets = %d112.111.115.105.116.105.118.101 "_" %d98.117.99.107.101.
523540
524541nh-buckets = number *("," number)
525542
526- integer = [SIGN] 1*"0" / [SIGN] positive-integer
527- non-negative-integer = ["+"] 1*"0" / ["+"] positive-integer
528- ; Leading 0s explicitly okay.
529- positive-integer = *"0" positive-digit *DIGIT
530- positive-digit = "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"
531-
532- ; bucket:[...,+Inf:v] The +Inf bucket is required.
533- classic-buckets = %d98.117.99.107.101.116 ":" "[" [ ch-le-counts "," ] ch-pos-inf-bucket "]"
534- ch-le-counts = (ch-neg-inf-bucket / ch-le-bucket) *("," ch-le-bucket)
535- ch-pos-inf-bucket = "+" %d73.110.102 ":" number
536- ch-neg-inf-bucket = "-" %d73.110.102 ":" number
537- ch-le-bucket = realnumber ":" number
538-
539543; Summary
540544
541545; count:12.0,sum:100.0,quantile:[0.9:2.0,0.95:3.0,0.99:20.0]
0 commit comments