С концептуальной точки зрения датчик и счетчик имеют разные цели
- датчик обычно представляет состояние, обычно с целью обнаружения насыщения.
- абсолютное значениесчетчик на самом деле не имеет смысла, реальная цель - скорее вычислить эволюцию (обычно использование) с такими функциями, как
irate/rate()
, increase()
...
Эти операции эволюции требуют надежного вычисленияувеличения, которое вы не могли бы достичь с помощью датчика, потому что вам нужно обнаружить сбросы значения.
Технически счетчик имеет два важных свойства:
- он всегда начинается с 0
- он всегда увеличивается (т.е. увеличивается в коде)
Если приложение перезапускается между двумя соскобами Прометея, значение второго соскоба, вероятно, будет меньше, чем предыдущий, и увеличение может быть восстановлено (отчасти потому, что вы всегда потеряете увеличение между последним соскобом исброс).
Простой алгоритм для вычисления увеличения счетчика между скрепами от t1 до t2:
- , если
counter(t2) >= counter(t1)
, то increase=counter(t2)-counter(t1)
- , если
counter(2) < counter(t1)
затем increase=counter(t2)
В заключение, с технической точки зрения, вы можете использовать датчик вместо счетчика при условии, что вы сбрасываете его в 0 при запуске и увеличиваете его только, но ненарушение контракта приведет к неправильным значениям.
В качестве примечания, я также ожидаю, что реализация счетчика будет использовать целочисленное представление без знака, в то время как gauge будет использовать плавающую точкупредставление. Это имеет некоторые незначительные последствия для кода, такие как возможность автоматического переполнения до 0 и лучшая поддержка атомарных операций на текущем процессоре.