Skip to content

Commit 44edc73

Browse files
RoadRunnralbertored
authored andcommitted
extend unit abbreviations to full plural form
1 parent e57a8e4 commit 44edc73

File tree

1 file changed

+70
-1
lines changed

1 file changed

+70
-1
lines changed

apps/opentelemetry_experimental/src/otel_metric_exporter_prometheus.erl

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
%%%-------------------------------------------------------------------------
1818

1919
-module(otel_metric_exporter_prometheus).
20+
-behavior(otel_exporter).
2021

2122
-record(opts,{
2223
add_scope_info :: boolean(),
@@ -158,7 +159,75 @@ fix_unit(Unit) when is_atom(Unit) ->
158159
fix_unit("1") ->
159160
"ratio";
160161
fix_unit(Unit) ->
161-
string:replace(Unit, "/", "_per_").
162+
lists:join("_per_", [guess_unit(U) || U <- string:split(Unit, "/", all)]).
163+
164+
guess_unit(Unit) ->
165+
case try_unit(Unit) of
166+
not_found ->
167+
case try_unit_prefix(Unit) of
168+
not_found ->
169+
Unit;
170+
{Prefix, BaseUnit} ->
171+
case try_unit(BaseUnit) of
172+
not_found -> Unit;
173+
BaseUnitStr -> [Prefix, BaseUnitStr]
174+
end
175+
end;
176+
UnitStr ->
177+
UnitStr
178+
end.
179+
180+
%% https://unitsofmeasure.org/ucum
181+
182+
%% Si base units
183+
try_unit("m") -> "meters";
184+
try_unit("s") -> "seconds";
185+
try_unit("g") -> "grams";
186+
try_unit("rad") -> "radians";
187+
try_unit("K") -> "kelvin";
188+
try_unit("C") -> "coulombs";
189+
try_unit("cd") -> "candelas";
190+
191+
%% IT units
192+
try_unit("By") -> "Bytes";
193+
try_unit("bit") -> "bits";
194+
try_unit("Bd") -> "baud";
195+
196+
%% not in UCUM, but used in
197+
%% opentelemetry-collector:receiver/prometheusreceiver/internal/metricsbuilder.go
198+
try_unit("Bi") -> "bits";
199+
200+
try_unit(_) -> not_found.
201+
202+
%% IT unit prefixes
203+
try_unit_prefix([$K, $i | [_|_] = BaseUnit]) -> {"kibi", BaseUnit};
204+
try_unit_prefix([$M, $i | [_|_] = BaseUnit]) -> {"mebi", BaseUnit};
205+
try_unit_prefix([$G, $i | [_|_] = BaseUnit]) -> {"gibi", BaseUnit};
206+
try_unit_prefix([$T, $i | [_|_] = BaseUnit]) -> {"tebi", BaseUnit};
207+
208+
%% Si prefixes
209+
try_unit_prefix([$Y | [_|_] = BaseUnit]) -> {"yotta", BaseUnit};
210+
try_unit_prefix([$Z | [_|_] = BaseUnit]) -> {"zetta", BaseUnit};
211+
try_unit_prefix([$E | [_|_] = BaseUnit]) -> {"exa", BaseUnit};
212+
try_unit_prefix([$P | [_|_] = BaseUnit]) -> {"peta", BaseUnit};
213+
try_unit_prefix([$T | [_|_] = BaseUnit]) -> {"tera", BaseUnit};
214+
try_unit_prefix([$G | [_|_] = BaseUnit]) -> {"giga", BaseUnit};
215+
try_unit_prefix([$M | [_|_] = BaseUnit]) -> {"mega", BaseUnit};
216+
try_unit_prefix([$k | [_|_] = BaseUnit]) -> {"kilo", BaseUnit};
217+
try_unit_prefix([$h | [_|_] = BaseUnit]) -> {"hecto", BaseUnit};
218+
try_unit_prefix([$d, $a | [_|_] = BaseUnit]) -> {"deka", BaseUnit};
219+
try_unit_prefix([$d | [_|_] = BaseUnit]) -> {"deci", BaseUnit};
220+
try_unit_prefix([$c | [_|_] = BaseUnit]) -> {"centi", BaseUnit};
221+
try_unit_prefix([$m | [_|_] = BaseUnit]) -> {"milli", BaseUnit};
222+
try_unit_prefix([$u | [_|_] = BaseUnit]) -> {"micro", BaseUnit};
223+
try_unit_prefix([$n | [_|_] = BaseUnit]) -> {"nano", BaseUnit};
224+
try_unit_prefix([$p | [_|_] = BaseUnit]) -> {"pico", BaseUnit};
225+
try_unit_prefix([$f | [_|_] = BaseUnit]) -> {"femto", BaseUnit};
226+
try_unit_prefix([$a | [_|_] = BaseUnit]) -> {"atto", BaseUnit};
227+
try_unit_prefix([$z | [_|_] = BaseUnit]) -> {"zepto", BaseUnit};
228+
try_unit_prefix([$y | [_|_] = BaseUnit]) -> {"yocto", BaseUnit};
229+
230+
try_unit_prefix(_) -> not_found.
162231

163232
preamble(Name, Description, Unit, Data) ->
164233
[

0 commit comments

Comments
 (0)