From 7e90814fde935ea528fbd125b5e44ce101293f87 Mon Sep 17 00:00:00 2001 From: "Stanislav N. aka pztrn" Date: Wed, 23 Dec 2020 13:37:52 +0500 Subject: [PATCH] Return list of parsed metrics, for autodiscovery. --- internal/application/api_responder.go | 21 +++++++++++++++++++-- internal/models/metric.go | 18 +++++++++--------- internal/storage/generic.go | 2 ++ internal/storage/memory/memory.go | 11 +++++++++++ 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/internal/application/api_responder.go b/internal/application/api_responder.go index 8dc851a..a2301af 100644 --- a/internal/application/api_responder.go +++ b/internal/application/api_responder.go @@ -1,16 +1,33 @@ package application import ( + "encoding/json" + "go.dev.pztrn.name/metricator/internal/models" ) // Responds with needed data. First parameter is a type of data needed (like metric name), // second parameter is actual metric name. Second parameter also can be empty. func (a *Application) respond(rInfo *models.RequestInfo) string { - metric, err := a.storage.Get(rInfo.Metric) + // If metric was requested - return only it. + if rInfo.Metric != "" { + metric, err := a.storage.Get(rInfo.Metric) + if err != nil { + return "" + } + + return metric.GetValue() + } + + // Otherwise we should get all metrics as slice and return them as string. + // This is needed for metrics autodiscovery. + metrics := a.storage.GetAsSlice() + + metricsBytes, err := json.Marshal(metrics) if err != nil { + // ToDo: log error return "" } - return metric.GetValue() + return string(metricsBytes) } diff --git a/internal/models/metric.go b/internal/models/metric.go index dca7cf9..6a08988 100644 --- a/internal/models/metric.go +++ b/internal/models/metric.go @@ -3,21 +3,21 @@ package models // Metric is a generic metric structure. type Metric struct { // Metric name. - name string + Name string // HELP data, if present. - description string + Description string // Additional parameters, data inside "{}". - params []string + Params []string // Metric value. - value string + Value string } // NewMetric creates new structure for storing single metric data. func NewMetric(name, description string, params []string) Metric { m := Metric{ - name: name, - description: description, - params: params, + Name: name, + Description: description, + Params: params, } return m @@ -25,10 +25,10 @@ func NewMetric(name, description string, params []string) Metric { // GetValue returns metric's value. func (m *Metric) GetValue() string { - return m.value + return m.Value } // SetValue sets value for metric. func (m *Metric) SetValue(value string) { - m.value = value + m.Value = value } diff --git a/internal/storage/generic.go b/internal/storage/generic.go index 6326937..ef84278 100644 --- a/internal/storage/generic.go +++ b/internal/storage/generic.go @@ -7,6 +7,8 @@ import "go.dev.pztrn.name/metricator/internal/models" type GenericStorage interface { // Get returns data from storage by key. Get(string) (models.Metric, error) + // GetAsSlice returns all data from storage as slice. + GetAsSlice() []models.Metric // GetDoneChan returns a channel which should be used to block execution // until storage's routines are completed. GetDoneChan() chan struct{} diff --git a/internal/storage/memory/memory.go b/internal/storage/memory/memory.go index 215aebc..ce2ce57 100644 --- a/internal/storage/memory/memory.go +++ b/internal/storage/memory/memory.go @@ -46,6 +46,17 @@ func (s *Storage) Get(key string) (models.Metric, error) { return data, nil } +// GetAsSlice returns all data from storage as slice. +func (s *Storage) GetAsSlice() []models.Metric { + metrics := make([]models.Metric, 0, len(s.data)) + + for _, metric := range s.data { + metrics = append(metrics, metric) + } + + return metrics +} + // GetDoneChan returns a channel which should be used to block execution // until storage's routines are completed. func (s *Storage) GetDoneChan() chan struct{} {