From 32bb9c5fc0a526e821a986c466b58a3139ec110f Mon Sep 17 00:00:00 2001 From: Thomas Roehl Date: Wed, 27 Jul 2022 18:06:41 +0200 Subject: [PATCH] Update ccMetric README and FromMetric copy --- internal/ccMetric/README.md | 53 ++++++++++++++++++++++++++--------- internal/ccMetric/ccMetric.go | 18 +++++++----- 2 files changed, 50 insertions(+), 21 deletions(-) diff --git a/internal/ccMetric/README.md b/internal/ccMetric/README.md index 1787ff0..71a3a6e 100644 --- a/internal/ccMetric/README.md +++ b/internal/ccMetric/README.md @@ -6,27 +6,52 @@ It is basically a copy of the [InfluxDB line protocol](https://github.com/influx ```golang type ccMetric struct { - name string // same as - tags []*influx.Tag // original - fields []*influx.Field // Influx - tm time.Time // line-protocol - meta []*influx.Tag + name string // Measurement name + meta map[string]string // map of meta data tags + tags map[string]string // map of of tags + fields map[string]interface{} // map of of fields + tm time.Time // timestamp } type CCMetric interface { - influx.MutableMetric // the same functions as defined by influx.MutableMetric - RemoveTag(key string) // this is not published by the original influx.MutableMetric - Meta() map[string]string - MetaList() []*inlux.Tag - AddMeta(key, value string) - HasMeta(key string) bool - GetMeta(key string) (string, bool) - RemoveMeta(key string) + ToPoint(metaAsTags map[string]bool) *write.Point // Generate influxDB point for data type ccMetric + ToLineProtocol(metaAsTags map[string]bool) string // Generate influxDB line protocol for data type ccMetric + String() string // Return line-protocol like string + + Name() string // Get metric name + SetName(name string) // Set metric name + + Time() time.Time // Get timestamp + SetTime(t time.Time) // Set timestamp + + Tags() map[string]string // Map of tags + AddTag(key, value string) // Add a tag + GetTag(key string) (value string, ok bool) // Get a tag by its key + HasTag(key string) (ok bool) // Check if a tag key is present + RemoveTag(key string) // Remove a tag by its key + + Meta() map[string]string // Map of meta data tags + AddMeta(key, value string) // Add a meta data tag + GetMeta(key string) (value string, ok bool) // Get a meta data tab addressed by its key + HasMeta(key string) (ok bool) // Check if a meta data key is present + RemoveMeta(key string) // Remove a meta data tag by its key + + Fields() map[string]interface{} // Map of fields + AddField(key string, value interface{}) // Add a field + GetField(key string) (value interface{}, ok bool) // Get a field addressed by its key + HasField(key string) (ok bool) // Check if a field key is present + RemoveField(key string) // Remove a field addressed by its key } + +func New(name string, tags map[string]string, meta map[string]string, fields map[string]interface{}, tm time.Time) (CCMetric, error) +func FromMetric(other CCMetric) CCMetric +func FromInfluxMetric(other lp.Metric) CCMetric ``` -The `CCMetric` interface provides the same functions as the `MutableMetric` like `{Add, Remove, Has}{Tag, Field}` and additionally provides `{Add, Remove, Has}Meta`. +The `CCMetric` interface provides the same functions as the `MutableMetric` like `{Add, Get, Remove, Has}{Tag, Field}` and additionally provides `{Add, Get, Remove, Has}Meta`. The InfluxDB protocol creates a new metric with `influx.New(name, tags, fields, time)` while CCMetric uses `ccMetric.New(name, tags, meta, fields, time)` where `tags` and `meta` are both of type `map[string]string`. You can copy a CCMetric with `FromMetric(other CCMetric) CCMetric`. If you get an `influx.Metric` from a function, like the line protocol parser, you can use `FromInfluxMetric(other influx.Metric) CCMetric` to get a CCMetric out of it (see `NatsReceiver` for an example). + +Although the [cc-specifications](https://github.com/ClusterCockpit/cc-specifications/blob/master/interfaces/lineprotocol/README.md) defines that there is only a `value` field for the metric value, the CCMetric still can have multiple values similar to the InfluxDB line protocol. diff --git a/internal/ccMetric/ccMetric.go b/internal/ccMetric/ccMetric.go index 661b9a4..8ad18cc 100644 --- a/internal/ccMetric/ccMetric.go +++ b/internal/ccMetric/ccMetric.go @@ -50,6 +50,7 @@ type CCMetric interface { GetField(key string) (value interface{}, ok bool) // Get a field addressed by its key HasField(key string) (ok bool) // Check if a field key is present RemoveField(key string) // Remove a field addressed by its key + String() string // Return line-protocol like string } // String implements the stringer interface for data type ccMetric @@ -217,23 +218,26 @@ func New( } // FromMetric copies the metric -func FromMetric(other ccMetric) CCMetric { +func FromMetric(other CCMetric) CCMetric { + otags := other.Tags() + ometa := other.Meta() + ofields := other.Fields() m := &ccMetric{ name: other.Name(), - tags: make(map[string]string, len(other.tags)), - meta: make(map[string]string, len(other.meta)), - fields: make(map[string]interface{}, len(other.fields)), + tags: make(map[string]string, len(otags)), + meta: make(map[string]string, len(ometa)), + fields: make(map[string]interface{}, len(ofields)), tm: other.Time(), } // deep copy tags, meta data tags and fields - for key, value := range other.tags { + for key, value := range otags { m.tags[key] = value } - for key, value := range other.meta { + for key, value := range ometa { m.meta[key] = value } - for key, value := range other.fields { + for key, value := range ofields { m.fields[key] = value } return m