cmd/otelinmemexporter/http.go (59 lines of code) (raw):
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
// or more contributor license agreements. Licensed under the Elastic License 2.0;
// you may not use this file except in compliance with the Elastic License 2.0.
// Package otelinmemexporter contains code for creating an in-memory OTEL exporter.
package otelinmemexporter
import (
"encoding/json"
"net/http"
"github.com/gorilla/mux"
"go.uber.org/zap"
)
type metricsStore interface {
GetAll() map[string]map[string]float64
Get(string) (map[string]float64, error)
Reset()
}
type server struct {
store metricsStore
endpoint string
logger *zap.Logger
}
func newServer(store metricsStore, endpoint string, logger *zap.Logger) *server {
return &server{
store: store,
endpoint: endpoint,
logger: logger,
}
}
func (s *server) Start() {
r := mux.NewRouter()
r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if err := json.NewEncoder(w).Encode(s.store.GetAll()); err != nil {
w.WriteHeader(http.StatusInternalServerError)
s.logger.Warn("failed to encode response", zap.Error(err))
}
}).Methods(http.MethodGet)
r.HandleFunc("/{key:.*}", func(w http.ResponseWriter, r *http.Request) {
key := mux.Vars(r)["key"]
enc := json.NewEncoder(w)
val, err := s.store.Get(key)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
if err := enc.Encode(map[string]string{"err": err.Error()}); err != nil {
s.logger.Warn("failed to encode response", zap.Error(err))
}
return
}
if err := enc.Encode(map[string]map[string]float64{key: val}); err != nil {
w.WriteHeader(http.StatusInternalServerError)
s.logger.Warn("failed to encode response", zap.Error(err))
}
}).Methods(http.MethodGet)
r.HandleFunc("/reset", func(w http.ResponseWriter, r *http.Request) {
s.store.Reset()
w.WriteHeader(http.StatusOK)
}).Methods(http.MethodPost)
go func() {
s.logger.Info("Starting http server for serving in-memory exporter API", zap.String("endpoint", s.endpoint))
if err := http.ListenAndServe(s.endpoint, r); err != nil {
s.logger.Error("failed to start server for in memory exporter", zap.Error(err))
}
}()
}