...

Source file src/github.com/cybertec-postgresql/pgwatch/v3/internal/webserver/metric.go

Documentation: github.com/cybertec-postgresql/pgwatch/v3/internal/webserver

     1  package webserver
     2  
     3  import (
     4  	"io"
     5  	"net/http"
     6  
     7  	jsoniter "github.com/json-iterator/go"
     8  
     9  	"github.com/cybertec-postgresql/pgwatch/v3/internal/metrics"
    10  )
    11  
    12  func (server *WebUIServer) handleMetrics(w http.ResponseWriter, r *http.Request) {
    13  	var (
    14  		err    error
    15  		params []byte
    16  		res    string
    17  	)
    18  
    19  	defer func() {
    20  		if err != nil {
    21  			http.Error(w, err.Error(), http.StatusInternalServerError)
    22  		}
    23  	}()
    24  
    25  	switch r.Method {
    26  	case http.MethodGet:
    27  		// return stored metrics
    28  		if res, err = server.GetMetrics(); err != nil {
    29  			return
    30  		}
    31  		_, err = w.Write([]byte(res))
    32  
    33  	case http.MethodPost:
    34  		// add new stored metric
    35  		if params, err = io.ReadAll(r.Body); err != nil {
    36  			return
    37  		}
    38  		err = server.UpdateMetric(r.URL.Query().Get("name"), params)
    39  
    40  	case http.MethodDelete:
    41  		// delete stored metric
    42  		err = server.DeleteMetric(r.URL.Query().Get("name"))
    43  
    44  	case http.MethodOptions:
    45  		w.Header().Set("Allow", "GET, POST, DELETE, OPTIONS")
    46  		w.WriteHeader(http.StatusNoContent)
    47  
    48  	default:
    49  		w.Header().Set("Allow", "GET, POST, DELETE, OPTIONS")
    50  		http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
    51  	}
    52  }
    53  
    54  // GetMetrics returns the list of metrics
    55  func (server *WebUIServer) GetMetrics() (res string, err error) {
    56  	var mr *metrics.Metrics
    57  	if mr, err = server.metricsReaderWriter.GetMetrics(); err != nil {
    58  		return
    59  	}
    60  	b, _ := jsoniter.ConfigFastest.Marshal(mr.MetricDefs)
    61  	res = string(b)
    62  	return
    63  }
    64  
    65  // UpdateMetric updates the stored metric information
    66  func (server *WebUIServer) UpdateMetric(name string, params []byte) error {
    67  	var m metrics.Metric
    68  	err := jsoniter.ConfigFastest.Unmarshal(params, &m)
    69  	if err != nil {
    70  		return err
    71  	}
    72  	return server.metricsReaderWriter.UpdateMetric(name, m)
    73  }
    74  
    75  // DeleteMetric removes the metric from the configuration
    76  func (server *WebUIServer) DeleteMetric(name string) error {
    77  	return server.metricsReaderWriter.DeleteMetric(name)
    78  }
    79  
    80  func (server *WebUIServer) handlePresets(w http.ResponseWriter, r *http.Request) {
    81  	var (
    82  		err    error
    83  		params []byte
    84  		res    string
    85  	)
    86  
    87  	defer func() {
    88  		if err != nil {
    89  			http.Error(w, err.Error(), http.StatusInternalServerError)
    90  		}
    91  	}()
    92  
    93  	switch r.Method {
    94  	case http.MethodGet:
    95  		// return stored Presets
    96  		if res, err = server.GetPresets(); err != nil {
    97  			return
    98  		}
    99  		_, err = w.Write([]byte(res))
   100  
   101  	case http.MethodPost:
   102  		// add new stored Preset
   103  		if params, err = io.ReadAll(r.Body); err != nil {
   104  			return
   105  		}
   106  		err = server.UpdatePreset(r.URL.Query().Get("name"), params)
   107  
   108  	case http.MethodDelete:
   109  		// delete stored Preset
   110  		err = server.DeletePreset(r.URL.Query().Get("name"))
   111  
   112  	case http.MethodOptions:
   113  		w.Header().Set("Allow", "GET, POST, PATCH, DELETE, OPTIONS")
   114  		w.WriteHeader(http.StatusNoContent)
   115  
   116  	default:
   117  		w.Header().Set("Allow", "GET, POST, PATCH, DELETE, OPTIONS")
   118  		http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
   119  	}
   120  }
   121  
   122  // UpdatePreset updates the stored preset
   123  func (server *WebUIServer) UpdatePreset(name string, params []byte) error {
   124  	var p metrics.Preset
   125  	err := jsoniter.ConfigFastest.Unmarshal(params, &p)
   126  	if err != nil {
   127  		return err
   128  	}
   129  	return server.metricsReaderWriter.UpdatePreset(name, p)
   130  }
   131  
   132  // GetPresets ret	urns the list of available presets
   133  func (server *WebUIServer) GetPresets() (res string, err error) {
   134  	var mr *metrics.Metrics
   135  	if mr, err = server.metricsReaderWriter.GetMetrics(); err != nil {
   136  		return
   137  	}
   138  	b, _ := jsoniter.ConfigFastest.Marshal(mr.PresetDefs)
   139  	res = string(b)
   140  	return
   141  }
   142  
   143  // DeletePreset removes the preset from the configuration
   144  func (server *WebUIServer) DeletePreset(name string) error {
   145  	return server.metricsReaderWriter.DeletePreset(name)
   146  }
   147