aboutsummaryrefslogtreecommitdiffstats
path: root/library/go/core/metrics/solomon/func_gauge.go
diff options
context:
space:
mode:
authorqrort <qrort@yandex-team.com>2022-11-30 23:47:12 +0300
committerqrort <qrort@yandex-team.com>2022-11-30 23:47:12 +0300
commit22f8ae0e3f5d68b92aecccdf96c1d841a0334311 (patch)
treebffa27765faf54126ad44bcafa89fadecb7a73d7 /library/go/core/metrics/solomon/func_gauge.go
parent332b99e2173f0425444abb759eebcb2fafaa9209 (diff)
downloadydb-22f8ae0e3f5d68b92aecccdf96c1d841a0334311.tar.gz
validate canons without yatest_common
Diffstat (limited to 'library/go/core/metrics/solomon/func_gauge.go')
-rw-r--r--library/go/core/metrics/solomon/func_gauge.go87
1 files changed, 87 insertions, 0 deletions
diff --git a/library/go/core/metrics/solomon/func_gauge.go b/library/go/core/metrics/solomon/func_gauge.go
new file mode 100644
index 0000000000..ce824c6fa8
--- /dev/null
+++ b/library/go/core/metrics/solomon/func_gauge.go
@@ -0,0 +1,87 @@
+package solomon
+
+import (
+ "encoding/json"
+ "time"
+
+ "go.uber.org/atomic"
+)
+
+var _ Metric = (*FuncGauge)(nil)
+
+// FuncGauge tracks float64 value returned by function.
+type FuncGauge struct {
+ name string
+ metricType metricType
+ tags map[string]string
+ function func() float64
+ timestamp *time.Time
+
+ useNameTag bool
+}
+
+func (g *FuncGauge) Name() string {
+ return g.name
+}
+
+func (g *FuncGauge) Function() func() float64 {
+ return g.function
+}
+
+func (g *FuncGauge) getType() metricType {
+ return g.metricType
+}
+
+func (g *FuncGauge) getLabels() map[string]string {
+ return g.tags
+}
+
+func (g *FuncGauge) getValue() interface{} {
+ return g.function()
+}
+
+func (g *FuncGauge) getTimestamp() *time.Time {
+ return g.timestamp
+}
+
+func (g *FuncGauge) getNameTag() string {
+ if g.useNameTag {
+ return "name"
+ } else {
+ return "sensor"
+ }
+}
+
+// MarshalJSON implements json.Marshaler.
+func (g *FuncGauge) MarshalJSON() ([]byte, error) {
+ return json.Marshal(struct {
+ Type string `json:"type"`
+ Labels map[string]string `json:"labels"`
+ Value float64 `json:"value"`
+ Timestamp *int64 `json:"ts,omitempty"`
+ }{
+ Type: g.metricType.String(),
+ Value: g.function(),
+ Labels: func() map[string]string {
+ labels := make(map[string]string, len(g.tags)+1)
+ labels[g.getNameTag()] = g.Name()
+ for k, v := range g.tags {
+ labels[k] = v
+ }
+ return labels
+ }(),
+ Timestamp: tsAsRef(g.timestamp),
+ })
+}
+
+// Snapshot returns independent copy on metric.
+func (g *FuncGauge) Snapshot() Metric {
+ return &Gauge{
+ name: g.name,
+ metricType: g.metricType,
+ tags: g.tags,
+ value: *atomic.NewFloat64(g.function()),
+
+ useNameTag: g.useNameTag,
+ }
+}