|
17 | 17 | %%%-------------------------------------------------------------------------
|
18 | 18 |
|
19 | 19 | -module(otel_metric_exporter_prometheus).
|
| 20 | +-behavior(otel_exporter). |
20 | 21 |
|
21 | 22 | -record(opts,{
|
22 | 23 | add_scope_info :: boolean(),
|
@@ -158,7 +159,75 @@ fix_unit(Unit) when is_atom(Unit) ->
|
158 | 159 | fix_unit("1") ->
|
159 | 160 | "ratio";
|
160 | 161 | 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. |
162 | 231 |
|
163 | 232 | preamble(Name, Description, Unit, Data) ->
|
164 | 233 | [
|
|
0 commit comments