tarantool / metrics

Metric collection library for Tarantool
MIT License
39 stars 23 forks source link

User may overwrite observations with special symbols #435

Open DifferentialOrange opened 1 year ago

DifferentialOrange commented 1 year ago

Due to the implementation of internal storage, it is possible to overwrite existing observations if they have two or more labels:

tarantool> c = metrics.gauge('coll')
---
...

tarantool> c:set(3, {lab = 'val', lab2 = 'val2'})
---
...

tarantool> c:collect()
---
- - label_pairs:
      lab2: val2
      lab: val
    timestamp: 1675671598982881
    value: 3
    metric_name: coll
...

tarantool> c:set(4, {['lab\tval\tlab2'] = 'val2'})
---
...

tarantool> c:collect()
---
- - label_pairs:
      "lab\tval\tlab2": val2
    timestamp: 1675671636647270
    value: 4
    metric_name: coll
...

It is highly unlikely that someone would become a victim of this bug unintentionally, but this behavior still seems a bit problematic.

Moreover, using special symbols breaks prometheus export:

# HELP coll 
# TYPE coll gauge
coll{lab    val lab2="val2"} 4
error while linting: text format parsing error in line 3: expected '=' after label name, found 'v'
filonenko-mikhail commented 1 year ago

The metric counter is code hot path. Be careful it seems that new if can decrease perf a little.